单片机 ds18b20温度测量 proteus仿真 下载本文

内容发布更新时间 : 2024/6/18 20:39:09星期一 下面是文章的全部内容请认真阅读。

#include sbit DQ=P3^0; unsigned int temp;

unsigned char dis[4]={0,0,0,0}; unsigned char

led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xff,0xbf}; //分别为0-9,不显示,负号 Unsigned char

led1[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点显示

void delay(unsigned int i) //如果i是unsigend char类型,则会出现错误结果 {

while(i--); }

void Init(void)//初始化 {

//unsigned char flag=0;

DQ = 0; //单片机将DQ拉低 delay(100); //精确延时 大于 480us小于960us DQ = 1; //拉高总线 delay(30);

//flag=DQ; //稍做延时后 如果flag=0则初始化成功 flag=1则初始化失败 //delay(20); }

unsigned char Read(void)//读字节 {

unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) {

DQ = 0; // 给脉冲信号 dat>>=1;

DQ = 1; // 给脉冲信号 if(DQ)

dat|=0x80; delay(5); }

return(dat); }

void Write(unsigned char dat)//写字节 {

unsigned char i=0; for (i=8; i>0; i--) {

DQ = 0;

DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } }

void Display(unsigned int temp) //显示程序 {

if(temp<=0x0800) { temp>>=4; //右移4位,相当于乘0.0625,将温度化为十进制 temp*=10; //扩大10倍,显示一位小数 dis[0]=temp/1000; //千位 dis[1]=temp00/100; //百位 dis[2]=temp000/10; //十位 dis[3]=temp000; //个位 } else { temp=~temp; temp+=1; temp>>=4; dis[0]=0x0c; //负数 dis[1]=temp0/10; //百位 dis[2]=temp0; //十位 dis[3]=0; //个位 } P2=0x01; //先片选,在段选,反过来就不能正常显示 P0=led[dis[0]]; delay(200); delay(200);

P2=0x02; P0=led[dis[1]]; delay(200); delay(200); P2=0x04; P0=led1[dis[2]]; delay(200);

delay(200); P2=0x08; P0=led[dis[3]]; delay(200); delay(200); }

main() {

unsigned char tl=0,th=0; while(1) { Init(); Write(0xCC); // 跳过读序号列号的操作 Write(0x44); // 启动温度转换 delay(100); Init(); Write(0xCC); //跳过读序号列号的操作 Write(0xBE); //读取温度寄存器等 delay(100); tl=Read(); //读取温度值低位 th=Read(); //读取温度值高位 temp=th<<8; temp|=tl; Display(temp); } }