首页 > 酒店新闻 > 公司新闻

DB视讯·(中国区)官方网站|c51: 巡检 DS18B20

发布时间:2025-10-17 11:22:02    次浏览

//DS1820应用,根据序列号读取温度,//实现温度巡检#includereg51.h#includeintrins.h#includectype.h//变量声明#defineucharunsignedchar#defineuintunsignedintuchardigit='0123456789ABCDEF';//序列号uchar number1[16]='2600000012345628';uchar number2[16]='1100000012345728';uchar* serial[2]={number1,number2};uchar array[8];//延时1 毫秒 程序void delayms();//延时 s 毫秒 程序void delaynms(uint);//初始化 LCDvoid InitLCD();//写LCD 指令void WriteInstruction(uchar);//写LCD 数据void WriteData(uchar);//写LCD 地址void WriteAdd(uchar);//读LCD 状态uchar BusyTest();//LCD 忙碌查询sbit LCDbusy=P1^7;//LCD 操作位 设置sbit RS=P2^2;sbit RW=P2^1;sbit E=P2^0;sbit BF=P1^7;//----- DS1820 声明 变量 函数sbit DQ=P3^0;sbit led=P3^1; //信号指示uchar TL,TH; //读取 DS1820 温度数据高位,低位//DS1820 序列号uchar dat[9];//初始化 DS1820bit InitDS1820();//读取 DS1820 一个字节uchar ReadOneChar();//写入 DS1820 一个字节WriteOneChar(uchar );//读 DS1820 温度void readtemp(uchar*);//显示 DS1820 温度void dispay();//负温度 标志uchar flag=0;//匹配 ROM void matchROM(uchar *);//main 程序void main(){uchar signal;uchar i;uchar code str[20]='Serial number is:';uchar *p;//初始化LCDInitLCD();//写地址WriteAdd(0x05);//写数据i=0;p=str;while(*p !=''){WriteData(*p);p++;}while(1){//循环读 2 个点。for(i=0;i2;i++){//读温度readtemp(serial[i]);if(flag==0)signal='-';elsesignal=' ';//显示温度WriteAdd(0x45);WriteData(signal);dispay();delaynms(2000);}}delaynms(1000);}//匹配 ROM 序列码void matchROM(uchar *p){uchar array[8];uchar i;uchar t1,t2;//序列码 转换 为8元素的数组,低字节在前。//序列码8字节,序列码写入DS18B20时,低字节在前。//例8字节序列码:12 34 56 78 90 AB CD EF//要求数组:EF CD AB 90 78 56 34 12for(i=0;i8;i++){t1=*(p+16-2*i-2); //t2=*(p+16-2*i-1);array[i]=toint(t1)*16+toint(t2);}//---匹配 ROM ---InitDS1820(); // 初始化//匹配ROM指令WriteOneChar(0x55);//发送 8字节序列号, 低位字节在前,高位字节在后for(i=0;i8;i++){//WriteOneChar(array[i]);}}//--- DS1820 程序 -----//初始化 DS1820bit InitDS1820(){uchar t;bit flag;DQ = 1;_nop_();DQ = 0;//维持600usfor(t=0;t200;t++) ;//释放总线DQ = 1;//等待15~30us,DS1820输出应答信号,//此处延时 45usfor(t=0;t15;t++);//采样应答信号flag=DQ;//应答信号维持60~240us// 此处延时 300us ,for(t=0;t100;t++);return (flag); //返回检测成功标志}//读取 DS1820 一个字符//数据的读写都是 低位在前。例写数据,D7~D0,写入顺序D0~D7。uchar ReadOneChar(){uchar i,t;uchar dat;//for(i=0;i8;i++){//dat=1;////当i=0,此时 dat 的 D7位 对应 温度 TL(TH)的 D0 位 数据//当i=1,此时 dat 的 D7位 对应 温度 TL(TH)的 D1 位 数据//当i=2,此时 dat 的 D7位 对应 温度 TL(TH)的 D2 位 数据 .....DQ=1; //c51驱动_nop_();DQ=0; //c51 驱动_nop_(); //延时1 us 释放总线DQ=1; //c51 释放总线//DS1820 准备数据_nop_();_nop_();_nop_();_nop_();_nop_();//采样if(DQ==1) //c51 采样dat|=0x80;elsedat|=0x00;//完成一个读周期需 60us ,此处延时60us.//一个循环约 3usfor(t=0;t20;t++);}return dat;}//写入 DS1820 一个字节//数据的读写都是 低位在前。例写数据,D7~D0,写入顺序D0~D7。WriteOneChar(uchar dat){uchar i,t;for(i=0;i8;i++){DQ=1; //c51 驱动_nop_();DQ=0; //c51 释放总线//从低位开始第i 位数据,传送数据到总线DQ=dat0x01;//DS1820在DQ=0 后15~60us 采样。//所以 延时 60us,for(t=0;t20;t++);//准备下一位数据 ,将数据位移动到D0位置dat=1;}}//读 温度 参数(ROM地址码)void readtemp(uchar* p){//匹配 ROMmatchROM(p);//启动温度转换,时间 750msWriteOneChar(0x44);//延时1000ms,delaynms(1000);matchROM(p);//读取温度WriteOneChar(0xbe);//TL=ReadOneChar();TH=ReadOneChar();}//显示温度void dispay(){uchar b,s,g; //表示百、十、个位uchar d1,d2; //小数第1、第2位unsigned int ti,td; //整数部分, 小数部分uchar k;k=TH0xf8;if(k==0){//正温度flag=0;ti=TH*16+TL/16; //整数部分td=TL0x0f; //截取小数部分//}else{//负温度,flag=1;ti=TH*256+TL;ti=~ti+1;ti=ti/16; //整数部分td=(~TL+1)0x0f; //截取小数部分}//计算整数部分数值g=ti%10; // 个s=(ti%100)/10; // 十b=ti/100; // 百//计算小数部分数值td=td*625 ;//小数数值 *10000,例0.1234,变成1234d1=td/1000; //小数个位d2=(td/100)%10; //小数十分位//显示 各位 数值WriteData(digit[b]);WriteData(digit[s]);WriteData(digit[g]);WriteData('.');WriteData(digit[d1]);WriteData(digit[d2]);}//------ LCD 程序 ----//初始化 LCDvoid InitLCD(){delaynms(15);WriteInstruction(0x38);// 显示模式设置delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x0d);//显示模式设置: 开显示,不显示光标,闪烁光标delaynms(5);WriteInstruction(0x06);//显示模式设置: 光标右移,文字不移动。delaynms(5);}//写 LCD 指令void WriteInstruction(uchar instruction){//LCD 忙碌,等待。while(BusyTest()==1);//写指令RS=0;RW=0;E=0;_nop_();_nop_();_nop_();//指令P1=instruction;_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();E=0;}//写LCD 数据void WriteData(uchar d){//LCD 忙碌,等待。while(BusyTest()==1);//写数据RS=1;RW=0;E=0;_nop_();_nop_();_nop_();//指令P1=d;_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();E=0;}//写地址,属于写指令void WriteAdd(uchar ad){uchar addr=ad+0x80;WriteInstruction(addr);}//读LCD 状态uchar BusyTest(){bit result;//读LCD 状态RS=0;RW=1;E=1;_nop_();_nop_();_nop_();//指令result=BF;_nop_();_nop_();_nop_();E=0;return result;}void delaynms(uint s){uint tem;for(tem=0;tems;tem++){delayms();}}//延时 1msvoid delayms(){uchar i;for(i=0;i250;i++);for(i=0;i80;i++);}原文链接:http://www.eeworld.com.cn/mcu/article_2016101430465.html