第16页
附录2 程序清单
//程序头函数 #include
#include
#define uint unsigned int #define uchar unsigned char #define Data_ADC0809 P1 //管脚声明
sbit LED_R= P2^2; //红指示灯 sbit LED_G= P2^0; //绿色指示灯 sbit FENG = P2^5; //蜂鸣器 //ADC0809 sbit ST=P3^3; sbit EOC=P3^6; sbit OE=P3^2; //按键
sbit Key1=P2^6; //设置按键 sbit Key2=P2^7; //加 sbit Key3=P3^7; //减
bit bdata flag;//指示灯和蜂鸣器闪烁报警标志位 uchar set; //设置标志位 //函数声明
第17页
extern uchar ADC0809(); extern void Key(); //酒精含量变量 uchar temp=0;
uchar WARNING=25; // 初始报警值 //初始化函数 void init() {
TMOD=0x01; //定时器0方式1
TL0=0xb0;
TH0=0x3c; //赋初值 EA=1; //开总中断
ET0=1; //允许定时器0中断
TR0=1; //定时器0开 } //主函数 void main() {
Init1602(); init();
//1602初始化
//初始化函数
while(1)//主循环
{temp=ADC0809(); //读取酒精值
if(set==0) //如果没有按下设置(默认set是0,就是正常显示状态) Display_1602(temp,WARNING); //显示酒精值
if(temp else if(temp>WARNING&&set==0) //若实际的酒精值大于报警值且在正常显示 第18页 flag=0; //执行下面flag=0的(主要就是绿灯闪,关蜂鸣器和继电器) 状态下 } //ADC0809读取信息 uchar ADC0809() { uchar temp_=0x00; //初始化高阻太 } {flag=1; //执行下面flag=1的(主要就是红灯闪,开蜂鸣器和继电器) } Key();//按键扫描 OE=0; } //按键函数 void Key() { if(Key1==0) //如果设置按键按下 第19页 //转化初始化 ST=0; //开始转换 ST=1; ST=0; //外部中断等待AD转换结束 while(EOC==0) //读取转换的AD值 OE=1; temp_=Data_ADC0809; OE=0; return temp_; { } if(set==1)//此时设置报警值 { write_com(0x38);//屏幕初始化 write_com(0x80+0x40+13);//位置 write_com(0x0f);//打开显示 无光标 光标闪烁 write_com(0x06);//当读或写一个字符是指针后一一位 FENG=1; //蜂鸣器关 while(Key1==0);//等待按键释放 FENG=0; //蜂鸣器响 set++; //设置的变量加1 flag=0; //绿灯闪 TR0=0; //关定时器0 } else if(set>=2) //又按了下设置 { } if(Key2==0&&set!=0) //在设置的状态下按下加 { while(Key2==0); //等待按键释放 FENG=0; //蜂鸣器响 set=0; //正常显示状态 write_com(0x38);//屏幕初始化 write_com(0x0c);//打开显示 无光标 无光标闪烁 FENG=1; flag=1; //蜂鸣器关 //红灯闪 TR0=1; //定时器0开 WARNING++; //报警值加1 if(WARNING>=255) //如果报警值大于等于255 第20页