|
- #include <reg52.h>
- #include <intrins.h>
- #include <key.h>
- #include "DS18B20.h"
- #define uint unsigned int
- #define uchar unsigned char //宏定义
- //#define BEEP P3_4 //定义蜂鸣器
- //#define hujiao P1_3
- sbit BEEP=P1^6;
- sbit hujiao=P1^3;
- sbit RS=P2^5;
- sbit RW=P2^6;
- sbit EN=P2^7;
- sbit led_h=P1^4;
- sbit led_l=P1^5;
- sbit JDQ=P1^7;
- sbit ADCS = P3^7;
- sbit ADCLK = P3^5;
- sbit ADDI = P3^6;
- sbit ADDO = P3^6;
- bit shanshuo_st; //闪烁间隔标志
- bit beep_st; //蜂鸣器间隔标志
- bit flag=0;//紧急呼叫标志
- uint abc;
- uchar x=4; //计数器
- signed char m; //温度值全局变量
- uchar n; //温度值全局变量
- uchar data disdata[5];
- uchar code LEDData[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
- uchar code table[]={0x18,0x18,0x00,0x07,0x08,0x08,0x07,0x00}; // 摄氏温度符号
- /*****初始化定时器0*****/
- void InitTimer(void)
- {
- TMOD=0x01;
- TH0=0x3c;
- TL0=0xb0; //50ms(晶振12M)
- }
- /*****定时器0中断服务程序*****/
- void timer0(void) interrupt 1
- {
- TH0=0x3c;
- TL0=0xb0;
- x++;
- }
- /*****读取温度*****/
- void check_wendu(void)
- {
- uint a,b,c;
- c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差
- a=c/100; //计算得到十位数字
- b=c/10-a*10; //计算得到个位数字
- m=c/10; //计算得到整数位
- n=c-a*100-b*10; //计算得到小数位
- if(m<0){m=0;n=0;} //设置温度显示上限
- if(m>99){m=99;n=9;} //设置温度显示上限
- }
- /*************************lcd1602程序**************************/
- void delay1ms(uint ms)//延时1毫秒(不够精确的)
- { uint i,j;
- for(i=0;i<ms;i++)
- for(j=0;j<100;j++);
- }
- void wr_com(uchar com)//写指令//
- {
- RS=0;
- RW=0;
- P0=com;
- delay1ms(1);
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void wr_dat(uchar dat)//写数据//
- {
- RS=1;
- RW=0;
- P0=dat;
- delay1ms(1);
- EN=1;
- delay1ms(1);
- EN=0;
- }
- //自定义字符集
- void Lcd_ram()
- {
- uint i,j,k=0,temp=0x40;
- for(i=0;i<1;i++)
- {
- for(j=0;j<8;j++)
- {
- wr_com(temp+j);
- wr_dat(table[k]);
- k++;
- }
- temp=temp+8;
- }
- }
- void lcd_init()//初始化设置//
- {
- wr_com(0x38);
- wr_com(0x0c);
- wr_com(0x06);
- wr_com(0x01);
- Lcd_ram();
- wr_com(0x80);
- wr_dat('S');//A
- wr_dat('m');//:
- wr_dat('o');
- wr_dat('k');
- wr_dat('e');
- wr_dat(':');
- wr_com(0x89);
- wr_dat('T');
- wr_dat(':');
- wr_com(0x8d);
- wr_dat('.');
- wr_com(0x8f);
- wr_dat(0);
-
- wr_com(0xc0);
- wr_dat('A');
- wr_dat('l');
- wr_dat('a');
- wr_dat('r');
- wr_dat('m');
- wr_dat(':');
- wr_com(0xcc);
- wr_dat('-');
- wr_com(0xcf);
- wr_dat(0);
- }
- /*****************显示函数******************************/
- void disp()//温度值显示
- {
- disdata[0]=m/10+0x30;//十位数
- disdata[1]=m%10+0x30;//个位数
- disdata[2]=n+0x30;//小数位
- disdata[3]=abc/10+0x30;//烟雾浓度
- disdata[4]=abc%10+0x30;//烟雾浓度
-
- wr_com(0x8b);
- wr_dat(disdata[0]);//显示十位
- wr_dat(disdata[1]);//显示个位
- wr_com(0x8e);
- wr_dat(disdata[2]);//显示小数位
- wr_com(0x86);
- wr_dat(disdata[3]);
- wr_dat(disdata[4]);
- }
- void baojing()
- {
- wr_com(0xca);
- wr_dat(tab[0]+0x30);
- wr_dat(tab[1]+0x30);
- wr_com(0xcd);
- wr_dat(tab[2]+0x30);
- wr_dat(tab[3]+0x30);
- wr_com(0xc6);
- wr_dat(tab[4]/10+0x30);
- wr_dat(tab[4]%10+0x30);
- }
- /*****报警子程序*****/
- void Alarm()
- {
- if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1)) BEEP=0;
- else if(abc>=nongdu&&beep_st==1) BEEP=0;
- else BEEP=1;
- if(m>=shangxian||m<xiaxian) {led_h=0;led_l=1;JDQ=0;}
- else if(abc>=nongdu) {led_h=0;led_l=1;JDQ=0;}
- else {led_h=1;led_l=0;JDQ=1;}
- if(x>=10) {beep_st=~beep_st;x=0;}
- }
- void Alarm1()
- {
- led_h=0;
- led_l=1;
- if(x>=10){beep_st=~beep_st;x=0;}
- if(beep_st==1)BEEP=0;
- else BEEP=1;
- led_h=0;
- led_l=1;
- JDQ=0;
- }
- uchar ADC0832(bit mode,bit channel) //AD转换,返回结果
- {
- uchar i,dat,ndat;
-
- ADCS = 0;//拉低CS端
- _nop_();
- _nop_();
-
- ADDI = 1; //第1个下降沿为高电平
- ADCLK = 1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK = 0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
-
- ADDI = mode; //低电平为差分模式,高电平为单通道模式。
- ADCLK = 1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK = 0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
-
- ADDI = channel; //低电平为CH0,高电平为CH1
- ADCLK = 1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK = 0;//拉低CLK端,形成下降沿3
-
- ADDI = 1;//控制命令结束(经试验必需)
- dat = 0;
- //下面开始读取转换后的数据,从最高位开始依次输出(D7~D0)
- for(i = 0;i < 8;i++)
- {
- dat <<= 1;
- ADCLK=1;//拉高时钟端
- _nop_();
- _nop_();
- ADCLK=0;//拉低时钟端形成一次时钟脉冲
- _nop_();
- _nop_();
- dat |= ADDO;
- }
- ndat = 0; //记录D0
- if(ADDO == 1)
- ndat |= 0x80;
- //下面开始继续读取反序的数据(从D1到D7)
- for(i = 0;i < 7;i++)
- {
- ndat >>= 1;
- ADCLK = 1;//拉高时钟端
- _nop_();
- _nop_();
- ADCLK=0;//拉低时钟端形成一次时钟脉冲
- _nop_();
- _nop_();
- if(ADDO==1)
- ndat |= 0x80;
- }
- ADCS=1;//拉高CS端,结束转换
- ADCLK=0;//拉低CLK端
- ADDI=1;//拉高数据端,回到初始状态
- if(dat==ndat)
- return(dat);
- else
- return 0;
- }
- /*****主函数*****/
- void main(void)
- {
- InitTimer(); //初始化定时器
- EA=1; //全局中断开关
- TR0=1;
- ET0=1; //开启定时器0
- BEEP=0;
- led_h=1;
- led_l=1;
- JDQ=1;
- check_wendu();
- check_wendu();
- delay1ms(100);
- lcd_init();//初始化显示
- while(1)
- {
- if(hujiao==0)
- {
- Delay(2000);
- do{}while(hujiao==0);
- flag=~flag;
- }
- checkkey();
- abc = ADC0832(1,0); //差分模式,CH0-CH1
- abc = abc*100/255; //转换为百分比便于显示
- // abc=abc/1000%10;
- check_wendu();
- disp();
- baojing();
- if(flag==1){Alarm1();JDQ=0;}
- else Alarm(); //报警检测
-
- if(set_st==0) wr_com(0x0c);
- if(set_st==1)
- {
- wr_com(0xc7);
- wr_com(0x0d);
- delay1ms(150);
- }
- if(set_st==2)
- {
- wr_com(0xcb);
- wr_com(0x0d);
- delay1ms(150);
- }
- if(set_st==3)
- {
- wr_com(0xce);
- wr_com(0x0d);
- delay1ms(150);
- }
- }
- }/*****END*****/
复制代码
|
|