这个是仿真图电路图:
//晶振12mhz #include <reg51.h> sbit RS=P2^0; // RS数据和指令 sbit RW=P2^1; //读和写 sbit EN=P2^2; //读取时能 sbit busy=P0^7; sbit DQ=P3^4;
#define uchar unsigned char #define uint unsigned int uchar temp_value; unsigned char show1[]="18B20"; unsigned char show2[]="temperature"; unsigned char tab[]={0+'0',1+'0',2+'0',3+'0',4+'0',5+'0',6+'0',7+'0',8+'0',9+'0'}; void delay_18B20(uint i) { while(i--); } void Init_DS18B20(void) { uchar x=0; DQ = 1; //DQ复位 delay_18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay_18B20(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); } uchar ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); } return(dat); } void WriteOneChar(uchar dat) { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } } void ReadTemp(void) { uchar a=0; uchar b=0; uchar t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(100); a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 temp_value=b<<4; temp_value+=(a&0xf0)>>4; } void time1(void) { unsigned char i; for(i=0;i<20;i++) { TMOD = 0x01; TH0 = 0x3C; TL0 = 0x0B0; TR0 = 1; while(!TF0); TF0=0; TH0=0x3c; TL0=0x0b0; TR0=1; } } void wait() //等待繁忙 { P0=0xff; do { EN=0; RS=0; RW=1; EN=1; }while(busy==1); EN=0; } void writecmd(unsigned char k) //写命令 { wait(); RS=0; RW=0; P0=k; EN=1; EN=0; } void writedat(unsigned char p) //写数据 { wait(); RS=1; RW=0; P0=p; EN=1; EN=0; } void init1602() //1602初始化 { writecmd(0x38); writecmd(0x0c); writecmd(0x06); writecmd(0x01); } void main() { unsigned char *p;
init1602(); p=show1; writecmd(0x80); while(*p!='\0') //读到字符末尾结束 { writedat(*p); ++p; } p=show2; writecmd(0xc0); while(*p!='\0') { writedat(*p); ++p; } writedat(' '); writecmd(0x06); writecmd(0xcc); while(1) { ReadTemp(); writecmd(0xcc); writedat(tab[(int)temp_value/10]); writecmd(0xcd); writedat(tab[(int)temp_value%10]); time1(); } }
|