1、DS18B20温度测量报警 设定温度上下限DS18B20温度测量报警 设定温度上下限 分类: 单片机 2011-10-07 19:42 719人阅读 评论(1) 收藏 举报 #include #include uchar DQ; uchar k;sbit ds=P24; /温度传感器引脚;sbit beep=P20; /蜂鸣器uint temp;float ftemp; uchar g1=22,g2=24,d1=20,d2=18;sbit b=P23; /定义按键;sbit a=P22; /定义按键;sbit E=P27;/使能信号;sbit RW=P26;/读写选择 写指令 RS=0;RW=
2、0;D0D7指令码;E高脉冲;sbit RS=P25;/数据/命令选择 写数据 RS=1;RW=0;D0D7数据;E高脉冲uchar code table1=DS18B20 OK ! ;uchar code table2=TEMP IS: . ;/自定义字符显示C ;uchar code table8 = 0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00 ;uchar code table3=DS18B20 ERR0R !;uchar code table4=PLEASE CHECK !;uchar code table7=set standard ;uchar
3、code table8= tempreture ! ;uchar code table5=G1= ,G2= .;uchar code table6=D1= ,D2= .;void delay(uint z) /延时函数uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void write_com(uchar com) /液晶写指令;P1=com;RS=0;RW=0;E=1;delay(5);E=0;delay(5);void write_date(uchar date) /液晶写数据;P1=date;RS=1;RW=0;E=1;delay(5);E=0;delay
4、(5);void chushi()uchar f;write_com(0x80);f=0;while(table7f!=0)write_date(table7f);f+;write_com(0x80+0x40);f=0;while(table8f!=0)write_date(table8f);f+;void init() /液晶初始化状态;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);chushi();dsreset(void) /DS18B20复位 初始化函数uint i;ds=0;i=103;while(i0
5、) i-;ds=1;i=4;while(i0) i-;DQ=ds;i=4;while(i0) i-;return DQ;bit tempreadbit(void) /读一位数据函数uint i;bit dat;ds=0;i+;ds=1;i+;i+;dat=ds;i=8;while(i0) i-;return(dat);uchar tempread(void) /读一个字节数据函数uchar i,j,dat;dat=0;for(i=1;i=8;i+)j=tempreadbit();dat=(j1);return(dat);void tempwritebyte(uchar dat) /写一个字节数
6、据函数uint i;uchar j;bit testb;for(j=1;j1;if(testb) /写1ds=0;i+;i+;ds=1;i=8;while(i0) i-;else /写0ds=0;i=8;while(i0) i-;ds=1;i+;i+; void tempchange(void) /DS18B20 开始获取温度并转换dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0x44);uint get_temp() /读取寄存器中存储的温度数据uchar a,b;dsreset();delay(1);tempwritebyte(0
7、xcc);tempwritebyte(0xbe);a=tempread();b=tempread();temp=b;temp=8;temp=temp|a;ftemp=temp*0.0625;temp=ftemp*10+0.5;ftemp=ftemp+0.05;return temp;void init_com(void) /串口初始化;PCON=0x00;SCON=0x50;TMOD=0x20;TH1=0xfd;TL1=0xfd;TR1=1;void comm(char *parr) /串口发送;doSBUF=*parr+;while(!TI);TI=0;while(*parr!=0);voi
8、d zdy() /自定义字符显示C; uchar i;write_com(0x40);for(i=0;i9;i+)write_date(tablei);write_com(0x80+0x40+14);write_date(0x00);void ok() /温度传感器存在显示温度;uchar i;write_com(0x80);for(i=0;i16;i+)write_date(table1i);write_com(0x80+0x40);for(i=0;i16;i+)write_date(table2i);void error() /温度传感器不存在 显示错误;uchar i;write_com
9、(0x80);for(i=0;i16;i+)write_date(table3i);write_com(0x80+0x40);for(i=0;i16;i+)write_date(table4i);void display() /液晶显示温度;write_com(0x80+0x40+10);write_date(temp/100+0x30);write_com(0x80+0x40+11);write_date(temp%100/10+0x30);write_com(0x80+0x40+13);write_date(temp%100%10+0x30); void fmq(uint i) /蜂鸣器滴
10、答;beep=0;delay(i);beep=1;void dywd(uchar add,uchar date) /定义温度 液晶显示;uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);void di() /蜂鸣器滴答;beep=0;delay(100);beep=1; uint keyscan() /按键扫描,调标准温度;uchar f;if(a=0)delay(10);if(a=0)k+;while(!a);di();write_com(0x80)
11、;f=0;while(table5f!=0)write_date(table5f);f+;write_com(0x80+0x40);f=0;while(table6f!=0)write_date(table6f);f+;dywd(4,g1);dywd(12,g2);dywd(4+0x40,d1);dywd(12+0x40,d2);if(k=1)write_com(0x80+5); write_com(0x0f); if(k=2)write_com(0x80+13); write_com(0x0f); if(k=3)write_com(0x80+0x40+5); write_com(0x0f);
12、 if(k=4)write_com(0x80+0x40+13); write_com(0x0f); if(k=5)write_com(0x0c);if(k!=0)if(b=0)delay(10);if(b=0)while(!b);di();if(k=1)g1-;if(g1=0)g1=60;dywd(4,g1);write_com(0x80+5);if(k=2)g2-;if(g1=0)g2=60;dywd(12,g2);write_com(0x80+13);if(k=3)d1-;if(g1=0)d1=60;dywd(4+0x40,d1);write_com(0x80+0x40+5);if(k=4
13、)d2-;if(g1=0)d2=60;dywd(12+0x40,d2);write_com(0x80+0x40+13);return g1;return g2;return d1;return d2;void warn(uint temp) /温度报警;uchar a=d2,b=d1,c=g1,d=g2;if(temp=a*10) /灯 1,2 亮;P0=0xfc;fmq(250);display(); else if(temp=a*10) /灯 3 亮;P0=0xfb;fmq(20);display(); else if(temp=a*10) /灯 4,5 亮;P0=0xe7;display
14、();beep=1; if(tempc*10)&(temp=d*10) /灯 7,8 亮;P0=0x3f;fmq(250);display(); void main() /主函数uchar buff4;init_com(); /串口初始化;init(); /液晶初始化状态;dsreset(); /DS18B20复位 初始化函数; tempchange(); /DS18B20 开始获取温度并转;get_temp(); /读取寄存器中存储的温度数据while(1)keyscan(); if(k=5)ok(); /温度传感器存在程序;dotempchange();sprintf(buff,%f,ftemp);comm(buff); /串口发送;zdy();warn(get_temp();while(!DQ); error(); /温度传感器不存在程序;dofmq(1);dsreset();P0=0x00;while(DQ);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1