|
//程序頭函數(shù)
#include <reg52.h>
//顯示函數(shù)
#include <display.h>
#include <intrins.h>
#include "eeprom52.h"
//宏定義
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1 //定義P1口為Data_ADC0809
//管腳聲明
sbit LED_R= P2^2; //紅色指示燈
sbit LED_G= P2^0; //綠色指示燈
sbit FENG = P2^5; //蜂鳴器
sbit san=P3^4; //繼電器
//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; //設(shè)置變量
//函數(shù)聲明
extern uchar ADC0809();
extern void Key();
/*
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<121;j++);
}
*/
//酒精含量變量
uchar temp=0;
//指示燈變量
uchar WARNING=25; //報(bào)警值變量
/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, WARNING);
byte_write(0x2060, a_a);
}
/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
void read_eeprom()
{
WARNING = byte_read(0x2000);
a_a = byte_read(0x2060);
}
/**************開(kāi)機(jī)自檢eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先讀
if(a_a != 1) //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
{
WARNING = 25;
a_a = 1;
write_eeprom(); //保存數(shù)據(jù)
}
}
void init() //定時(shí)器初始化函數(shù)
{
TMOD=0x01; //定時(shí)器工作方式
TL0=0xb0;
TH0=0x3c; //賦初值50ms
EA=1; //打開(kāi)中斷總開(kāi)關(guān)
ET0=1; //打開(kāi)定時(shí)器0中斷允許開(kāi)關(guān)
TR0=1; //打開(kāi)定時(shí)器0定時(shí)開(kāi)關(guān)
}
void main() //主函數(shù)
{
Init1602(); //初始化液晶函數(shù)
init_eeprom(); //開(kāi)始初始化保存的數(shù)據(jù)
init(); //初始化定時(shí)器
while(1) //進(jìn)入循環(huán)
{
temp=ADC0809(); //讀取AD數(shù)值
if(set==0) //set為0,說(shuō)明現(xiàn)在不是設(shè)置狀態(tài)
Display_1602(temp,WARNING); //顯示AD數(shù)值和報(bào)警值
if(temp<WARNING&&set==0) //AD數(shù)值小于報(bào)警值
{
flag=0; //關(guān)閉報(bào)警
}
else if(temp>WARNING&&set==0)//AD值大于報(bào)警值
{
flag=1; //打開(kāi)報(bào)警
}
Key(); //調(diào)用按鍵函數(shù)
}
}
//ADC0809讀取信息
uchar ADC0809()
{
uchar temp_=0x00;
//初始化高阻太
OE=0;
//轉(zhuǎn)化初始化
ST=0;
//開(kāi)始轉(zhuǎn)換
ST=1;
ST=0;
//外部中斷等待AD轉(zhuǎn)換結(jié)束
while(EOC==0)
//讀取轉(zhuǎn)換的AD值
OE=1;
temp_=Data_ADC0809;
OE=0;
return temp_;
}
void Key() //按鍵函數(shù)
{
if(Key1==0) //設(shè)置鍵按下
{
while(Key1==0); //按鍵松開(kāi)
FENG=0; //蜂鳴器響
set++; //設(shè)置變量加
flag=0; //關(guān)閉報(bào)警
san=1; //關(guān)閉繼電器
TR0=0; //關(guān)閉定時(shí)器
}
if(set==1) //設(shè)置報(bào)警值時(shí)
{
write_com(0x38);//屏幕初始化
write_com(0x80+0x40+13);//位置
write_com(0x0f);//打開(kāi)顯示 無(wú)光標(biāo) 光標(biāo)閃爍
write_com(0x06);//當(dāng)讀或?qū)懸粋(gè)字符是指針后一一位
FENG=1; //關(guān)閉蜂鳴器
}
else if(set>=2) //設(shè)置完成時(shí)
{
set=0; //變量清零
write_com(0x38);//屏幕初始化
write_com(0x0c);//打開(kāi)顯示 無(wú)光標(biāo) 無(wú)光標(biāo)閃爍
FENG=1; //關(guān)閉蜂鳴器
flag=1; //打開(kāi)報(bào)警
TR0=1; //打開(kāi)定時(shí)器
}
if(Key2==0&&set!=0) //設(shè)置報(bào)警值時(shí)加鍵按下
{
while(Key2==0); //按鍵松開(kāi)
FENG=0; //打開(kāi)蜂鳴器
WARNING++; //報(bào)警值加
if(WARNING>=255) //最大加到255
WARNING=0; //清零
write_com(0x80+0x40+11); //選中液晶屏上的第二行第十一列
write_data('0'+WARNING/100); //開(kāi)始顯示報(bào)警值。例如報(bào)警值是123,123除以100的商是1,加上‘0’是為了得到液晶中對(duì)應(yīng)1的顯示碼
write_data('0'+WARNING%100/10);//123除以100的余數(shù)是23,23再除以10得到的商是2
write_data('0'+WARNING%100%10);//23除以10的余數(shù)是3
write_com(0x80+0x40+13);//位置
FENG=1; //關(guān)閉蜂鳴器
write_eeprom(); //保存數(shù)據(jù)
}
if(Key3==0&&set!=0) //注釋同加按鍵
{
while(Key3==0);
FENG=0;
WARNING--;
if(WARNING<=0)
WARNING=255;
write_com(0x80+0x40+11);
write_data('0'+WARNING/100);
write_data('0'+WARNING/10%10);
write_data('0'+WARNING%10);
write_com(0x80+0x40+13);//位置
FENG=1;
write_eeprom(); //保存數(shù)據(jù)
}
}
void time1_int(void) interrupt 1 //定時(shí)器工作函數(shù)
{
uchar count; //定義計(jì)時(shí)變量
TL0=0xb0;
TH0=0x3c; //重新賦初值50ms
count++; //變量加一次就是50ms
if(count==10) //加到10次就是500ms
{
if(flag==0) //flag=0時(shí),也就是不開(kāi)啟報(bào)警
{
LED_G=0; //綠燈點(diǎn)亮
LED_R=1; //紅燈熄滅
FENG=1; //關(guān)閉蜂鳴器
san=1; //關(guān)閉繼電器
}
if(flag==1) //flag為1時(shí),也就是打開(kāi)報(bào)警
{
LED_G=1; //綠燈熄滅
LED_R=0; //紅燈點(diǎn)亮
FENG=0; //打開(kāi)蜂鳴器
san=0; //打開(kāi)繼電器
}
}
if(count==20) //計(jì)數(shù)20次,就是1s
{ //在1s時(shí),紅綠燈都是熄滅狀態(tài),蜂鳴器也是關(guān)閉狀態(tài),裝可以達(dá)到閃爍的目的
count=0; //變量清零
if(flag==0) //不是報(bào)警狀態(tài)時(shí)
{
LED_G=1;
LED_R=1;
FENG=1;
san=1; //都關(guān)閉
}
if(flag==1) //報(bào)警狀態(tài)時(shí)
{
LED_G=1;
LED_R=1;
FENG=1;
san=0; //繼電器一直吸和
}
}
}
|
|