//此为用18B20做传感器,三个数码管做显示的,并可设定温度,高低两个 温度值,到点后可报警输出;*/ /*作者:祝富龙 */ /*日期:07年10月30日*/ /*资源配置:P0作显示数据输出,P1.0, P1.1, P1.2 分别控制三个数码管 P1.3为18B20数据,P1.4,P1.5用于到设定值时的控制信号输出,P2.0,P2.1,P2.2分别分按键UP,SET,DOWN*/
#include "AT89X51.H" #include <intrins.h> #define nop10us _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); #define uchar unsigned char #define uint unsigned int #define up P2_0 //上调 #define set P2_1// 设定 #define down P2_2 //下调 sbit one=P1^0;//个位显示 sbit two=P1^1;//十位显示 sbit three=P1^2;//符号显示 sbit DQ=P1^3; //18B20数据位 delay11us(uint n); //11us延时函数 delay10ms(uchar n);//10ms延时函数 bit b20init(); //18b20初始化函数 b20write(uchar n);//写18b20函数 key(); //按键判断 处理程序 b20read(); //读18b20函数 display(); //显示温度函数 zhuanhuan();//转换一次温度,并读出温度放在buf中 shangdianinit();//上电初始化 uchar displaytable[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60}; uint temp,buf,baojingzhi=100,fuhao; //存放温度数据 uchar rr,num=0; //定时中断计数
//*********** 主程序 **************************** main() { shangdianinit();//上电初始化 while(1) { display(); zhuanhuan();//转换一次温度,并读出温度放在buf中 fuhao=buf&0xf800; if(fuhao==0xf800) three=0; else three=1; buf=buf&0x7ff; key();//按键判断 处理程序 } }
//********* 18b20初始化函数 ********************** bit b20init() { DQ=0; delay11us(60); DQ=1; nop10us;nop10us;nop10us;nop10us; if(DQ==1) { return 0; } else { nop10us;nop10us;nop10us;nop10us;nop10us;nop10us;nop10us;nop10us;nop10us;nop10us; DQ=1; delay11us(50); return 1; } }
//********** 写18b20函数 ************ b20write(uchar n) { uint i; for(i=0;i<8;i++) { DQ=0; nop10us; DQ=n&0x01; n=n>>1; nop10us;nop10us;nop10us;nop10us;nop10us;nop10us; DQ=1; _nop_();_nop_(); } }
//******** 读18b20函数 ******************** b20read() { uchar i; uint n; for(i=0;i<16;i++) { DQ=0; _nop_(); _nop_(); DQ=1; _nop_();_nop_();_nop_(); n=n>>1; if(DQ==0) { n=n&0x7fff; } else { n=n|0x8000; } nop10us;nop10us;nop10us;nop10us;nop10us;nop10us; DQ=1; _nop_(); _nop_(); } buf=n; }
//********** 显示温度函数 ***************** display() { uchar a,b,i; temp=buf * 0.0625; if(temp>100) { a=8;b=8; } else { a=temp/10; b=temp%10; } for(i=10;i>0;i--) { P0=displaytable; one=0; delay11us(150); one=1; P0=displaytable[a]; two=0; delay11us(150); two=1; } }
//******** 10us延时函数 *********** delay11us(uint n) { for(;n>0;n--);
}
//******** 10ms延时函数 ******* delay10ms(uchar n) { unsigned int i; for(;n>0;n--) for(i=1250;i>0;i--) ; } //************ 按键判断 处理程序 ***************** key() { if(0xff!=P2) {delay11us(800); if(0xff!=P2) { if(set==0) { EA=0; TR0=0; while(!set); while(1) { display(); display(); if(set==0) {delay11us(800); if(set==0) {while(!set); goto loop; } } if(up==0) { delay11us(800); if(up==0) {while(!up); if(temp<60&&temp>0) buf=buf+10; baojingzhi=temp+1; } } if(down==0) { delay11us(2000); if(down==0) {while(!down); if(temp<60&&temp>0) buf=buf-10; baojingzhi=temp-1; } } display(); display(); delay10ms(50); } } } } else loop:display(); EA=1; TR0=1; }
//************ 定时中断函数 ******************** time0() interrupt 1 using 0 { EA=0; TR0=0; TH0=0x3c; TL0=0xb0; num++; if(num==20) { if(three) { if(temp>baojingzhi) P1_4=0; else P1_4=1; } else { if(temp>baojingzhi) P1_5=0; else P1_5=1; } num=0; } EA=1; TR0=1; }
zhuanhuan() { while(b20init()==0);//等待18B20初始化 b20write(0xcc); b20write(0x44); for(rr=0;rr<40;rr++) display(); while(b20init()==0);//等待18B20初始化 b20write(0xcc); b20write(0xbe); b20read(); }
shangdianinit()// shangdianinit();//上电初始化 { P1=0xff; P2=0xff; TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; TR0=1; while(b20init()==0);//等待18B20初始化 b20write(0xcc);//跳过ROM b20write(0x44);//发出温度转换命令 delay10ms(70) ; while(b20init()==0);//等待18B20初始化 b20write(0xcc); b20write(0xbe); //发出读温度命令 b20read(); //读温度数据 buf=buf&0x7ff; display(); }
|