《程序(用于打印)》由会员分享,可在线阅读,更多相关《程序(用于打印)(9页珍藏版)》请在金锄头文库上搜索。
1、/* 温度测控 单片机 89s52 晶振 11.054M 传感器 DS18B202011.6.28 */ #include #include #include unsigned char code tab=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19; /不带小数点 09 unsigned char code tab1=0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x18;/带小数点 09sbit scn=P00; /串行通信控制 sbit DQ=P01; / DS18B20 的数据线 sbit
2、 up=P10; / 增大按键 sbit down=P11; / 减小按键 sbit out=P12; / 确认按键 sbit rezu=P13; / 热阻丝控制 sbit fan=P14; / 风扇控制 sbit bell=P15; / 报警铃控制unsigned char temperature=25; / 键盘设置起始值 unsigned char temp0=0; / 设定值 unsigned char tempH=0; / 报警温度高限值 unsigned char tempL=0; / 报警温度底限值 unsigned char temp1=0; / DS18B20 读出的低字节
3、unsigned char temp2=0; / DS18B20 读出的高字节 unsigned char temp_led=0; / 处理后温度值,主要用于显示,还用于 控制 unsigned char m=0; /键盘设置值计数器,m=3 时说明一组设置数据设置完成void key(); void int0(); void led_display(unsigned char j,unsigned char i,unsigned char fuzheng); void read_temp(); void delay_18B20(unsigned int i); /精确延时 void dela
4、y500ms(); / 延时 0.5s void delay1();/ 延时 1s void init_DS18B20(); unsigned char readonechar(); void writeonechar(unsigned char dat); void zhixing();void main() scn=1; SCON=0x00; EA=1; EX0=1; IT0=1; led_display(25,0,0); while(1) key(); led_display(temp0,0,0); delay1();/延时 1sread_temp();zhixing();delay1(
5、);/延时 1s /*键盘设置程序(设置 temp0,tempH,tempL 三个值)*/ void key() while(!(m=3)while(up=0)|(down=0)else temperature-;led_display(temperature,0,0);delay500ms(); /延时 0.5s if(out=0)if(m=0) temp0=temperature; temperature=25;/加上此句后,重新设置是从 25 开始。不加 有记忆功能 m+; else if(m=1) tempH=temperature; temperature=25;/加上此句后,重新设
6、置是从 25 开始。不加 有记忆功能 m+; else if(m=2) tempL=temperature;temperature=25;/加上此句后,重新设置是从 25 开始。不加 有记忆功能m+; else ; while(!out); /确保按一次确认键,确认只执行一次(即 m+只执行一次)led_display(temperature,0,0); /*读取 DS18B20 输出温度值并处理*/ void read_temp() unsigned char temp10,xiaoshu,tt,a; init_DS18B20(); writeonechar(0xcc); writeonec
7、har(0x44); delay_18B20(100);/此延时异常重要 init_DS18B20(); writeonechar(0xcc); writeonechar(0xbe); temp1=readonechar(); temp2=readonechar(); if(!(temp2 temp10=temp1 if(temp10=8) xiaoshu=5; else xiaoshu=0; temp2=4; temp_led=temp2+temp1; tt=0;/为正数 else temp2 temp10=temp1 if(temp10=8) xiaoshu=0; else xiaoshu
8、=5; temp2=4; a=temp1+temp2; temp_led=128-a; tt=1; /为负数 led_display(temp_led,xiaoshu,tt); /*LED 显示*/void led_display(unsigned char j,unsigned char i,unsigned char fuzheng) unsigned char bai,shi,ge,k,p,q,o; bai=j/100; shi=j%100/10; ge=j%10; if(fuzheng) k=0xfd; else k=tabbai; p=tabshi; q=tab1ge; o=tabi
9、;SBUF=k; while(!TI); TI=0; SBUF=p; while(!TI); TI=0; SBUF=q; while(!TI); TI=0;SBUF=o; while(!TI); TI=0; /* DS18B20 相关子程序*/*DS18B20 初始化程序*/ void init_DS18B20() unsigned char x=0;DQ = 1; /DQ 复位delay_18B20(8); /稍做延时DQ = 0; /单片机将 DQ 拉低delay_18B20(80); /精确延时 大于 480usDQ = 1; /拉高总线delay_18B20(14);x=DQ; /稍做
10、延时后 如果 x=0 则初始化成功 x=1 则初 始化失败delay_18B20(20); /*从 DS18B20 读一字节*/ unsigned char readonechar() unsigned char i=0; unsigned char dat = 0; for (i=8;i0;i-)DQ = 0; / 给脉冲信号dat=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);return(dat); /*向 DS18B20 写一字节*/ void writeonechar(unsigned char dat) unsigned char
11、i=0;for (i=8; i0; i-)DQ = 0;DQ = datdelay_18B20(5);DQ = 1;dat=1; /*执行程序*/ void zhixing() if(temp_ledtempL) if(temp_ledtemp0+2) fan=0; bell=1;/开风扇 else if(temp_ledtempH) bell=0;/报警 fan=0; rezu=1; else bell=0;/报警 fan=1; rezu=0; /*小延时程序*/ void delay_18B20(unsigned int i) while(i-); /*大延时程序*/ void delay1() unsigned char h,i,j,k;for(h=5;h0;h-)for(i=4;i0;i-)for(j=116;j0;j-)for(k=214;k0;k-); void delay500ms()unsigned char i,j,k;for(i=15;i0;i-)for(j=202;j0;j-)for(k=81;k0;k-); /* 重新设置是采用中断来实现的。当然,也可使用扫描。*/ void int0() interrupt 0 m=0;led_display(25,0,0);