
// ds18b20用1602显示,精确小数点后一位 //
// PROTEUS仿真通过 //
/*********************************************/
#include #include #define uchar unsigned char #define uint unsigned int sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; sbit dq=P3^3; uchar bai,shi,ge,xiaoshu,fuhao,temp; uchar th_temp,tl_temp; void delay_us1602(uchar z); void delay_ms(uint z); void init(); void write_com(uchar com); void write_date(uchar date); void delay_us(uchar z); void ds18b20_init(); void write_byte(uchar dat); uchar read_byte(); void display(); void convert_temp(); /********************1602显示部分***************************/ void delay_us1602(uchar z) { while(z--) _nop_(); } void delay_ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void init() { write_com(0x01); delay_ms(50); write_com(0x38); delay_ms(50); write_com(0x0c); delay_ms(50); write_com(0x06); delay_ms(50); } void write_com(uchar com) { rs=0; rw=0; P0=com; delay_us1602(5); e=0; delay_us1602(5); e=1; delay_us1602(5); e=0; } void write_date(uchar date) { rs=1; rw=0; P0=date; delay_us1602(5); e=0; delay_us1602(5); e=1; delay_us1602(5); e=0; } /*****************************DS18B20部分***********************************/ void delay_us(uchar z) { while(z--); { _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); } } void ds18b20_init() { uchar flag; dq=1; delay_us(2); dq=0; delay_us(80); dq=1; delay_us(2); flag=dq; delay_us(40); } void write_byte(uchar dat) { uchar i,value; dq=1; for(i=0;i<8;i++) { dq=0; value=dat&0x01; if(value==0) { dq=0; delay_us(10); } else { dq=1; delay_us(10); } dq=1; dat=dat>>1; } } uchar read_byte() { uchar i, value; dq=1; for(i=0;i<8;i++) { dq=0; value=value>>1; dq=1; delay_us(1); if(dq==1) value=value|0x80; delay_us(10); } return value; } void display() { write_com(0x84); write_date(fuhao); if(bai!=0) //百位为0不显示 { write_date(bai+0x30); write_date(shi+0x30); } else if(bai==0&&shi!=0) { write_date(shi+0x30); } write_date(ge+0x30); write_date(0x2e); write_date(xiaoshu+0x30); write_date(0x43); write_date(0x20); } void convert_temp() { uint c; ds18b20_init(); write_byte(0xcc); write_byte(0x44); delay_ms(300); ds18b20_init(); write_byte(0xcc); write_byte(0xbe); tl_temp=read_byte(); th_temp=read_byte(); if((th_temp&0xf0)!=0xf0) { fuhao=0x2b; //正数处理 c=th_temp*256+tl_temp; c=c/16; //c=((tl_temp&0xf0)>>4)|(th_temp<<4); bai=c/100; shi=c/10%10; ge=c%10; xiaoshu=(tl_temp&0x0f)*10*0.0625; } else { fuhao=0x2d; //负数处理 temp=((tl_temp&0xf0)>>4)|(th_temp<<4); temp=~temp; if((tl_temp&0x0f)==0x00) { temp=temp+1; } bai=temp/100; shi=temp/10%10; ge=temp%10; xiaoshu=((~(tl_temp&0x0f)&0x0f)+1)*10*0.0625; xiaoshu=xiaoshu%10; //精确到小数点后一位 } } /***************************************************************/ void main() { init(); while(1) { convert_temp(); display(); } }
