自动售水机
1.题目
算是一次对模块化编程的练习
注意点:ad读取值是光敏电阻的电压。所以通道取0x01
2.代码
main.c
******************************************************************************
* 文件名:自动售水机
* 描 述:
* 作 者:思索与猫
* 日 期: 19/3/16
* 备 注:
*
******************************************************************************
#include<stc15f2k60s2.h>
#include<sys.h>
uchar ad_value; //ad值
bit ad_flag;
void main()
{
CloseFucker();
pcf859_init();
Timer0Init();
while(1)
{
ad_value = read_pcf859(); //读取ad值
ad_value = ad_value*500/255.0f;
if(ad_value < 125)
{
ad_flag = 1; //标志位,L2亮
}
else
{
ad_flag =0; //L2灭
}
KeyDriver();
ShowTable();
}
}
sys.h
#ifndef __SYS_H_
#define __SYS_H_
#include<stc15f2k60s2.h>
#include<iic.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//初始化
void CloseFucker();
void Timer0Init();
//显示
void Display();
void ShowTable();
void ShowLed(uchar led_dat);
//按键
void KeyDriver();
void KeyAction(uchar key_value);
void KeyScan();
extern uchar Table[];
extern uchar code duan[];
extern uchar mode;
extern uchar num;
extern uint price;
extern bit OpenWater;
extern uchar led_dat;
extern uchar ad_value;
extern bit ad_flag;
#endif
sys.c
#include<sys.h>
void Timer0Init() //[email protected]
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x40;
TH0 = 0xA2;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void T0_time() interrupt 1
{
static uint count = 0;
TL0 = 0x40;
TH0 = 0xA2;
KeyScan();
Display();
if(OpenWater == 1) //出水
{
if(++count == 50)
{
count = 0;
num++; //100ms 10mL
if(num == 9999)
{
OpenWater = 0;
}
}
}
else
{
count = 0;
}
if(OpenWater) //led灯控制
{
if(ad_flag)
{
ShowLed(0xfc);
}
else
{
ShowLed(0xfe);
}
}
else
{
if(ad_flag)
{
ShowLed(0xfd);
}
else
{
ShowLed(0xff);
}
}
}
void CloseFucker()
{
P2 = P2&0x1f|0xa0;
P0 = 0xaf;
P2 = P2&0x1f;
}
key.c
#include<sys.h>
sbit Key_In_1 = P3^0;
sbit Key_In_2 = P3^1;
sbit Key_In_3 = P3^2;
sbit Key_In_4 = P3^3;
uchar KeySta[4] = {1, 1, 1, 1};
uchar KeyCodeMap[4] = {7, 6, 5, 4};
bit OpenWater = 0;
void KeyDriver()
{
uchar i = 0;
static uchar KeyBack[4] = {1, 1, 1, 1};
for(i=0; i<4; i++)
{
if(KeySta[i] != KeyBack[i])
{
if(KeySta[i] != 0)
{
KeyAction(KeyCodeMap[i]);
}
}
KeyBack[i] = KeySta[i];
}
}
void KeyAction(uchar key_value)
{
if(OpenWater == 0&&key_value == 7) //按下S7出水
{
OpenWater = 1;
mode = 0;
num = 0; //清0
P2 = P2&0x1f|0xa0; //开继电器
P0 = 0x10;
P2 = P2&0x1f;
}
else if(OpenWater == 1&&key_value == 6) //按下S6停止出水
{
OpenWater = 0;
mode = 1;
P2 = P2&0x1f|0xa0; //关继电器
P0 = 0xaf;
P2 = P2&0x1f;
price = num/2; //计算价格
}
}
void KeyScan()
{
uchar i = 0;
static uchar KeyBuf[4] = {0xff, 0xff, 0xff, 0xff};
KeyBuf[0] = KeyBuf[0]<<1|Key_In_1;
KeyBuf[1] = KeyBuf[1]<<1|Key_In_2;
KeyBuf[2] = KeyBuf[2]<<1|Key_In_3;
KeyBuf[3] = KeyBuf[3]<<1|Key_In_4;
for(i=0; i<4; i++)
{
if(KeyBuf[i] == 0xff)
{
KeySta[i] = 1;
}
else if(KeyBuf[i] == 0x00)
{
KeySta[i] = 0;
}
else
{
;
}
}
}
display.c
#include<sys.h>
uchar code duan[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; //10black,11-
uchar Table[8];
uchar mode = 0;
uchar num = 0;
uint price;
void Display()
{
static uchar index = 0;
P2 = P2&0x1f|0xe0;
P0 = 0xff;
P2 = P2&0x1f;
P2 = P2&0x1f|0xc0;
P0 = 1<<index;
P2 = P2&0x1f;
P2 = P2&0x1f|0xe0;
P0 = ~duan[Table[index]];
P2 = P2&0x1f;
index++;
index &= 0x07;
}
void ShowTable()
{
if(mode == 0) //出水界面
{
Table[0] = 10; //0.50
Table[1] = 12;
Table[2] = 5;
Table[3] = 0;
Table[4] = num/1000;
Table[5] = num/100%10+12;
Table[6] = num/10%10;
Table[7] = num%10;
}
else if(mode == 1) //计价界面
{
Table[0] = 10; //0.50
Table[1] = 12;
Table[2] = 5;
Table[3] = 0;
Table[4] = price/1000;
Table[5] = price/100%10+12;
Table[6] = price/10%10;
Table[7] = price%10;;
}
}
void ShowLed(uchar led_dat)
{
P2 = P2&0x1f|0x80;
P0 = led_dat;
P2 = P2&0x1f;
}
iic.h
#ifndef _IIC_H
#define _IIC_H
#include "stc15f2k60s2.h"
#include "intrins.h"
#define somenop Delay5us()
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(unsigned char ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
void Delay5us();
void pcf859_init();
unsigned char read_pcf859();
#endif
iic.c
#include "iic.h"
void Delay5us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 12;
while (--i);
}
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
void IIC_Ack(unsigned char ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}
void pcf859_init()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01); //光敏电阻通道0x01
IIC_WaitAck();
IIC_Stop();
}
unsigned char read_pcf859() //读取AD值
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
return dat;
}