历史上的今天
今天是:2024年11月11日(星期一)
2020年11月11日 | 单片机单总线挂2片ds18b20传感器,8位数码同时管显示
2020-11-11 来源:51hei
计划做个同时检测室内外温度,并用数码管显示出来的温度计。从网上找到获得ds18b20序列码的程序,用开发板1602显示出来,记录备用。下面数组str1,2就是获得的64位序列码。如果不能获得自己1820的序列码,当然以下代码就不能完成正常功能。以下代码大部分网上获得加以整理而成。第一传感器 前4位,第2传感器后4位,中间无隔断。在开发板上正常显示变化,但大于100和小于0并未实验看到。
单片机源程序如下:
#include #include #define uchar unsigned char #define uint unsigned int uchar code SEG[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code str1[]={0x28,0xff,0xdf,0xd4,0x61,0x18,0x02,0x5e}; //ROM 1 uchar code str2[]={0x28,0xaa,0x63,0x63,0x4d,0x14,0x01,0x62}; //ROM2 uchar code DIG[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar data DisplayData[4]; uint temp;//温度值 sbit DQ=P3^7; /******************************ds1820程序***************************************/ void Delay_DS18B20(int num) { while(num--) ; } void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14); x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); } unsigned char ReadOneChar(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_DS18B20(4); } return(dat); } void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } } void Matchrom(uchar a) //匹配ROM { char j; WriteOneChar(0x55); //发送匹配ROM命令 if(a==1) { for(j=0;j<8;j++) WriteOneChar(str1[j]); //发送18B20的序列号,先发送低字节 } if(a==2) { for(j=0;j<8;j++) WriteOneChar(str2[j]); //发送18B20的序列号,先发送低字节 } } uint ReadTemperature(uchar z)/*读取温度值并转换*/ { uchar LSB=0,MSB=0; signed int tp=0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 Init_DS18B20(); if(z==1) { Matchrom(1); //匹配ROM 1 } if(z==2) { Matchrom(2); //匹配RO 2 } WriteOneChar(0xBE); //读取温度寄存器 LSB=ReadOneChar(); //读低8位 MSB=ReadOneChar(); //读高8位 temp=(MSB<<8)|LSB; //得到一个16位的数 return(temp); //返回温度值 } void delay1ms(uint ms)//延时1毫秒(不够精确的) { uint i,j; for(i=0;i } /*****************显示函数******************************/ void Disp_Temperature(uchar z)//温度值显示 { float tep=0; if(temp>0) { tep=temp; temp=tep*0.0625*10+0.5; if(DisplayData[0]== 0x00) { DisplayData[0]=0x00; if(DisplayData[1]==0x00) DisplayData[1]=0x00; // } else { temp=~temp+1; tep=temp; temp=tep*0.0625*10+0.5; DisplayData[0]=0x40; } DisplayData[1]=temp/100; DisplayData[2]=temp/10%10; DisplayData[3]=temp%10; if(z==1) { P2=DIG[0]; P0=SEG[DisplayData[0]] delay1ms(1); P2 = 0xff; P2=DIG[1]; P0=SEG[DisplayData[1]] delay1ms(1); P2 = 0xff; P2=DIG[2]; P0=SEG[DisplayData[2]]|0x80 delay1ms(1); P2 = 0xff; P2=DIG[3]; P0=SEG[DisplayData[3]] delay1ms(1); P2 = 0xff; } if(z==2) { P2=DIG[4]; P0=SEG[DisplayData[0]] delay1ms(1); P2 = 0xff; P2=DIG[5]; P0=SEG[DisplayData[1]] delay1ms(1); P2 = 0xff; P2=DIG[6]; P0=SEG[DisplayData[2]]|0x80 delay1ms(1); P2 = 0xff; P2=DIG[7]; P0=SEG[DisplayData[3]] delay1ms(1); P2 = 0xff; } } } void main() { while(1) { ReadTemperature(1);//读取温度 Disp_Temperature(1);//显示 ReadTemperature(2);//读取温度 Disp_Temperature(2);//显示 } }
下一篇:单片机红外对射传感器实验详解
史海拾趣
|
无疑嵌入式系统开发是目前相当热门的领域,因为它涉及到的范围实在是太广了,从消费电子到工业应用,从8位的单片机到32位处理器,嵌入式系统俨然成为不可缺少的一环,且有愈演愈热之势。那么该如何学习和开发嵌入式系统呢?需要具备哪些知识和技能 ...… 查看全部问答> |
|
定义: typedef struct _SUPPORTED_NIC // NIC vendor ID { USHORT wVenId; // PCI Vendor ID USHORT wDevId; & ...… 查看全部问答> |
|
哪位大人做过啊,我把鼠标发送给单片机的数据,通过单片机的串口发送到PC机上查看,结果每帧只收到2字节的数据(原本应该有3字节的,中间一字节丢了),请问是什么原因呢? 如果哪位有这样的源码,麻烦发到我邮箱:mochen5460@163.com,由于公司里 ...… 查看全部问答> |
|
显卡:MIS NX7300-TD128E 350元 主板:MIS P35-Ne02-FR 550元 CPU:Intel Core 2Duo E7200(盒) 800元 内存:Kingston 2GB DDR2 800+ (盒) 160元 硬盘:希捷 320G 7200 11.16(串口/5年 盒) 360元 机箱:世纪之星 风云9号 210元 共 ...… 查看全部问答> |




