📄 dzsj.c
字号:
#include<at89x51.h>
#include<string.h>
#include<math.h>
#include<stdio.h>
/*ADC0809数据采集*/
unsigned char xdata *ADC;
unsigned char ADCR[3];
unsigned char I;
unsigned char F=1;
void int0() interrupt 2
{
unsigned char temp;
EX0=1;
temp=*(ADC+I);
ADCR[I]=temp;
F=1;
}
void StatADC0809(void)
{ ADC=0xFE00;
*(ADC+I)=I;
F=0;
EX0=1;
}
void ADC0809(void)
{ if(F)
{I++;
if(I>3)
I=0;
StatADC0809();
}
}
/*LCD1601液晶显示屏驱动程序*/
#define Data P0
sbit RS=P1^7;
sbit RW=P1^6;
sbit E=P2^6;
unsigned char code tab[4][8]={{"CO"},{"CH4"},{"SMOKE"},{"DANGER!!"}};
void delay(unsigned int k)
{
unsigned int i,j;
for(i=k;i>0;i--)
for(j=50;j>0;j--) ;
}
unsigned char ReadStatus(void)
{
Data=0xFF;
RS=0;
RW=1;
E=1;
while(Data&0x80);
return(Data);
delay(2);
E=0;
}
void wr_com(unsigned char com)
{
ReadStatus();
Data=com;
RS=0;
RW=0;
E=1;
delay(2);
E=0;
}
void wr_dat(unsigned char dat)
{
ReadStatus();
Data=dat;
RS=1;
RW=0;
E=1;
delay(2);
E=0;
}
void LCD_Init(void)
{
Data=0x0;
wr_com(0x38);
delay(5);
wr_com(0x38);
delay(5);
wr_com(0x38);
delay(5);
wr_com(0x38);
wr_com(0x08);
wr_com(0x01);
wr_com(0x06);
wr_com(0x0C);
}
void GotoY(unsigned char y)
{
y&=0x0F;
wr_com(y);
do{
y=ReadStatus();
}while((y&0x80)==0x80);
}
void disp(unsigned char y,unsigned char _char)
{
GotoY(y);
wr_dat(_char);
}
/*按键扫描程序*/
unsigned char K1,K2;
sbit key1=P1^1;
sbit key2=P1^2;
unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9'};
void delay10ms(void)
{unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void Key1(void)
{if(key1==0)
{delay10ms();
if(key1==0)
{K1++;
if(K1==11)
{K1=0;}
while(key1==0);
}
}
switch(K1)
{
case 0:
GotoY(4);
break;
case 1:
GotoY(5);
break;
case 2:
GotoY(7);
break;
case 3:
GotoY(8);
break;
case 4:
GotoY(0xA);
break;
case 5:
GotoY(0xB);
break;
}
}
void Key2(void)
{ K2=0;
while(1)
{
if(key2==0)
{
delay10ms();
delay10ms();
if(key2==0)
{
K2++;
if(K2==10)K2=0;
Key1();
wr_dat(table[K2]);
}
}
}
}
/*用定时器T0每50ms中断一次*/
unsigned char second=45,minute=58,hour=12,day=29,month=11,year=07;
unsigned char n_50m_second; /*多少个50毫秒的变量*/
unsigned char days_of_month; /*该月多少天的变量*/
unsigned char calculate_days(void) /*计算本月有多少天*/
{
unsigned int temp;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31; /*1、3、5、7、8、10、12月为31天*/
break;
case 4:
case 6:
case 9:
case 11:
return 30; /*4、6、9、11月为30天*/
break;
case 2:
temp=2000+year; /*因为year中保存的是年的最后两位,所以要加上2000*/
if((((temp%4)==0)&&((temp%100)!=0))||((temp%400)==0))
{
return 29; /*闰年2月为29天*/
}
else
{
return 28; /*平年2月为28天*/
}
}
}
void timer0_isr(void) interrupt 1 using 1 /*定时器0中断处理函数*/
{
TL0=0xB9;
TH0=0x3C; /*定时器重装。定时50mS中断一次*/
n_50m_second++;
if(n_50m_second>=20) /*1秒到*/
{
n_50m_second=0; /*清50毫秒计数*/
second++; /*秒加1*/
if(second==60) /*如果秒到60*/
{
second=0; /*秒清0*/
minute++; /*分加1*/
if(minute==60) /*如果分到60*/
{
minute=0; /*分清0*/
hour++; /*小时加1*/
if(hour==24) /*如果小时到24*/
{
hour=0; /*小时清零*/
day++; /*天加1*/
days_of_month=calculate_days();/*计算本月有多少天*/
if(day>days_of_month) /*如果天大于本月最后一天*/
{
day=1; /*天置1*/
month++; /*月加1*/
if(month>12) /*如果月大于12*/
{
month=1; /*月置1*/
year++; /*年加1*/
if(year>=100) /*如果年大于100*/
{
year=0; /*年清零*/
}
}
}
}
}
}
}
}
void disp_timer(void)
{
disp(4,hour/10+48);
disp(5,hour%10+48);
disp(6,':');
disp(7,minute/10+48);
disp(8,minute%10+48);
disp(9,':');
disp(0xA,second/10+48);
disp(0xB,second%10+48);
Key2();
}
/*数据处理*/
sbit fm=P1^0;
unsigned char flag;
unsigned char COSJ[3],CH4SJ[3],SmokeSJ[3];
unsigned char _co,_ch4,_smoke;
unsigned char co,ch4,smo;
int a,b;
void disp_wx(void) /*lcd第二行中间显示"DANGER!!"*/
{
disp(7,tab[3][0]);
disp(8,tab[3][1]);
disp(9,tab[3][2]);
disp(0xA,tab[3][3]);
disp(0xB,tab[3][4]);
disp(0xC,tab[3][5]);
disp(0xD,tab[3][6]);
disp(0xE,tab[3][7]);
}
void un_disp(unsigned int i)
{
switch(i)
{case 0:
disp(3,tab[0][0]);
disp(4,tab[0][1]);/*lcd显示"CO"*/
disp_wx();
break;
case 1:
disp(2,tab[1][0]);
disp(3,tab[1][1]);
disp(4,tab[1][2]);/*lcd显示"CH4"*/
disp_wx();
break;
case 2:
disp(1,tab[2][0]);
disp(2,tab[2][1]);
disp(3,tab[2][2]);
disp(4,tab[2][3]);
disp(5,tab[2][4]);/*lcd显示"SMOKE"*/
disp_wx();
break;
}
}
void delay02s(void)
{
unsigned char i;
for(i=20;i>0;i++)
{delay10ms();}
}
lag(unsigned char x,unsigned char y)
{ int flag;
if(x>y) flag=1;
else flag=0;
return(flag);
}
void get_data()
{
_co=0;_ch4=0;_smoke=0;//_humidity=0;
for(a=0;a<3;a++)
{
COSJ[a]=ADCR[0];
CH4SJ[a]=ADCR[1];
SmokeSJ[a]=ADCR[2];
//HumiditySJ[a]=ADCR[3];
delay02s();
delay02s();
}
for(b=0;b<3;b++)
{
_co=_co+COSJ[b];
_ch4=_ch4+CH4SJ[b];
_smoke=_smoke+SmokeSJ[b];
//_humidity=_humidity+HumiditySJ[b];
}
}
void hand_data()
{
unsigned char bz[3];//标准量
get_data();
co=_co/3;
ch4=_ch4/3;
smo=_smoke/3;
//hum=_humidity/3;
if(lag(bz[0],co)==1)
{ fm=0;
un_disp(0);}
else if(lag(bz[1],ch4)==1)
{ fm=0;
un_disp(1);}
else if(lag(bz[2],smo)==1)
{ fm=0;
un_disp(2);}
else { fm=0;
disp_timer();//显示时间
}
}
/*主函数*/
void system_initial(void) //系统初始化
{
TMOD=0x11; //定时器工作在模式1
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
EX0=1;
IT0=0;
EA=1; //开总中断
}
void main(void)
{
system_initial();
LCD_Init();
while(1)
{
ADC0809();
hand_data();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -