//程序頭函數(shù)
#include <reg52.h>
//顯示函數(shù)
#include <display.h>
#include <intrins.h>
#include "eeprom52.h"
#include "temp.h"
//宏定義
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1
//管腳聲明
sbit P34=P3^4;//溫度
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; //設(shè)置按鍵
sbit Key2=P2^7; //加
sbit Key3=P3^7; //減
bit bdata flag;//指示燈和蜂鳴器閃爍報(bào)警標(biāo)志位
uchar set; //設(shè)置標(biāo)志位
//函數(shù)聲明
extern uchar ADC0809();
extern void Key();
//酒精含量變量
unsigned int temp=0;
unsigned int 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ù)
}
}
//初始化函數(shù)
void init()
{
TMOD=0x01; //定時(shí)器0方式1
TL0=0xb0;
TH0=0x3c;
TL1=65000/256;
TH1=65000/256; //賦初值
EA=1; //開(kāi)總中斷
ET0=1; //允許定時(shí)器0中斷
TR0=1; //定時(shí)器0開(kāi)
}
//主函數(shù)
void main()
{
Init1602(); //1602初始化
init_eeprom(); //開(kāi)始初始化保存的數(shù)據(jù)
init(); //初始化函數(shù)
while(1)//主循環(huán)
{
if(set==0) //如果沒(méi)有按下設(shè)置(默認(rèn)set是0,就是正常顯示狀態(tài))
{
temp=ADC0809(); //讀取酒精值
Display_1602(temp,WARNING,ReadTemperature()); //顯示酒精值
}
if(temp<WARNING&&set==0) //如果實(shí)際的酒精值小于報(bào)警值且在正常顯示狀態(tài)下
{
flag=0; //執(zhí)行下面flag=0的(主要就是綠燈閃,關(guān)蜂鳴器和繼電器)
}
else if(temp>WARNING&&set==0) //如果實(shí)際的酒精值大于報(bào)警值且在正常顯示狀態(tài)下
{
flag=1; //執(zhí)行下面flag=1的(主要就是紅燈閃,開(kāi)蜂鳴器和繼電器)
}
Key();//按鍵掃描
}
}
//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_;
}
//按鍵函數(shù)
void Key()
{
if(Key1==0) //如果設(shè)置按鍵按下
{
while(Key1==0);//等待按鍵釋放
FENG=0; //蜂鳴器響
set++; //設(shè)置的變量加1
flag=0; //綠燈閃
TR0=0; //關(guān)定時(shí)器0
write_com(0x0f);//打開(kāi)顯示 無(wú)光標(biāo) 光標(biāo)閃爍
write_com(0x80+15);//位置
// write_com(0x06);//當(dāng)讀或?qū)懸粋(gè)字符是指針后一一位
FENG=1; //蜂鳴器關(guān)
}
if(set>=2) //又按了下設(shè)置
{
set=0; //正常顯示狀態(tài)
// write_com(0x38);//屏幕初始化
write_com(0x0c);//打開(kāi)顯示 無(wú)光標(biāo) 無(wú)光標(biāo)閃爍
FENG=1; //蜂鳴器關(guān)
flag=1; //紅燈閃
TR0=1; //定時(shí)器0開(kāi)
}
if(Key2==0&&set!=0) //在設(shè)置的狀態(tài)下按下加
{
while(Key2==0); //等待按鍵釋放
FENG=0; //蜂鳴器響
WARNING++; //報(bào)警值加1
if(WARNING>=255) //如果報(bào)警值大于等于255
WARNING=0; //報(bào)警值歸零
write_com(0x80+13);
write_data('0'+WARNING/100);
write_data('0'+WARNING/10%10);
write_data('0'+WARNING%10); //顯示報(bào)警值
//write_com(0x80+0x40+13);//調(diào)整位置
FENG=1; //蜂鳴器關(guān)
write_eeprom(); //保存數(shù)據(jù)
}
if(Key3==0&&set!=0) //在設(shè)置的狀態(tài)下按下減
{
while(Key3==0); //等待按鍵釋放
FENG=0; //蜂鳴器響
WARNING--; //報(bào)警值減1
if(WARNING<=0) //如果報(bào)警值小于等于0
WARNING=255; //那么報(bào)警值為255
write_com(0x80+13);
write_data('0'+WARNING/100);
write_data('0'+WARNING/10%10);
write_data('0'+WARNING%10);
//write_com(0x80+0x40+13);//調(diào)整位置
FENG=1; //蜂鳴器關(guān)
write_eeprom(); //保存數(shù)據(jù)
}
}
void time1_int(void) interrupt 1 //定時(shí)器中斷0
{
uchar count;
TL0=0xb0;
TH0=0x3c; //重賦初值50ms
count++; ///溢出值加1
if(count==10) //如果時(shí)間到半秒
{
if(flag==0) //如果flag為0
{
LED_G=0; //綠燈亮
LED_R=1; //紅燈滅
FENG=1; //蜂鳴器關(guān)
}
if(flag==1) //如果flag為1
{
LED_G=1; //綠燈關(guān)
LED_R=0; //紅燈亮
FENG=0; //蜂鳴器開(kāi)
}
}
if(count==20) //如果時(shí)間到1秒
{
count=0; //溢出值清零
if(flag==0) //如果flag為0
{
LED_G=1; //綠燈關(guān)
LED_R=1; //紅燈滅
FENG=1; //蜂鳴器關(guān)
}
if(flag==1) //如果flag為1
{
LED_G=1; //綠燈關(guān)
LED_R=1; //紅燈滅
FENG=1; //蜂鳴器關(guān)
}
}
}
|