ds18b20 单片机数码管显示原理图和程序
DS18B20原理及程序编写

DS18B20原理及程序编写(一)概述DS18B20为单总线12位(二进制)温度读数。
内部有64位唯一的ID编码。
工作电压从3.0~5.5V。
测量温度范围从-55℃~125℃。
最高±0.0625℃分辩率。
其内部结构如下图所示。
DS18B20的核心功能是直接数字温度传感器。
温度传感器可以配置成9、10、11和12位方式。
相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。
默认的分辨率为12位。
DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。
主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。
接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。
如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。
DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。
地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。
DS18B20内部寄存器映射如下图所示。
配置寄存器的格式如表2和表3所示。
DS18B20内部寄存器映射表1 温度寄存器的格式表2 配置寄存器的格式表3 温度分辨率配置DS18B20使用单总线工作方式,其通信协议以电平的高平时间作为依据,其基本时序有复位时序,写时序、读时序。
//********************************************************************** //** 文件名:DS18B20.c//** 说明:DS18B20驱动程序文件//----------------------------------------------------------------------//** 单位://** 创建人:张雅//** 创建时间:2010-01-20//** 联系方式:QQ:276564402//** 版本:V1.0//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯片:AT89S52//** 时钟:11.0592MHz//** 其它:这个文档为18B20的驱动程序,引用了数码管的驱动。
(完整版)DS18B20的工作原理

DS18B20的工作原理:DS18B20单线数字温度传感器是DALLAS半导体公司开发的适配微处理器的智能温度传感器。
它具有3脚TO-92小体积封装形式。
温度测量范围为-55℃--+125℃,可进行9-12位的编程,分辨率可达0.0625。
被测温度用符号扩展的16位数字量方式串行输出。
工作电压支持3V-5.5V,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少。
DS18B20采用3脚TO-92封装,引脚排列如图:DQ:数字信号端;GND:电源地;VDD:电源输入端DS18B20的内部框图如图:主要由寄生电源、64位激光ROM与单线接口、温度传感器、高速暂存器、触发寄存器、存储与控制逻辑、8位循环冗余校验码发生器组成。
测温电路原理:低温度系数振荡器用于产生稳定的频率f,振荡频率受温度的影响很小,高温度系数振荡器将被测温度转化成频率信号,随温度变化其振荡频率明显改变。
图中还隐含着计数门,当计数门打开时,DS18B20就对低温度振荡器产生的时钟脉冲进行计数,进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定。
每次测量前,首先将-55℃所对应的基数分别置入减法计数器、温度寄存器中。
在计数门关闭之前若计数器已减至零,温度寄存器中的数值就增加0.5℃。
然后,计数器依斜率累加器的状态置入新的数值,再对时钟计数,然后减至零,温度寄存器值又增加0.5℃。
只要计数门仍未关闭,就重复上诉过程,直至温度寄存器值达到被测温度值。
温度传感器的应用背景:当今社会已经完全进入了电子信息化,温度控制器在各行各业中已经得到了充分的利用。
具有对温度进行实时监控的功能,保证机器,测量仪器等等的正常运坐,他最大的特点是能实时监控周围温度的高低,并能同时控制电机运作来改变温度。
现阶段运用于国内大部分家庭,系统效率越来越高,成本也越来越低。
并可以根据其性质进行相应的改进运用于不同场合进行温度监测控制,比如仓库里、汽车里、电脑等等,带来大量的经济效益。
DS18B20原理及应用实例(源程序+原理图+Proteus仿真)

2、DS18B20 结构:如右图所示,DS18B20 有三只引脚,
VCC、DQ 和 GND。DQ 为数字信号输入/输出端(DQ 一般接控制器(单片机)的一个 I/O 口上,由于单总线为开漏所以需要外接一个 4.7K 的上拉电阻) ;GND 为电源地;VDD 为外 接供电电源输入端 (在寄生电源接线方式时接地) 。 DS18B20 内部结构主要由四部分组成: 64 位光刻 ROM、温度传感器、非挥发的温度报警触发器 TH 和 TL、配置寄存器。 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列 码。64位光刻ROM的排列是:开始8位是产品类型标号,接着的48位是该DS18B20自身的序 列号,最后8位是前面56位的CRC校验码(循环冗余校验码)。光刻ROM的作用是使每一个 DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 温度传感器可完成对温度的测量,以12位转化为例,用16位符号扩展的二进制补码读 数形式提供。 RAM数据暂存器,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。如 下图所示, 当温度转换命令发布后, 经转换所得的温度值以二字节补码形式存放在暂存器的 第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,第2、3 字节是用户EEPROM(常用于温度报警值储存)的镜像,用户用来设置最高报警和最低报 警值,在上电复位时其值将被刷新。第4个字节则是用户第3个EEPROM的镜像,用来配置 9~12位的转换精度(即分辨率) 。第5、6、7个字节为计算机自身使用。第8个字节为前8个字 节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警 值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
DS18B20单片机数码管显示原理图和程序

最近天气热了,想要是做个能显示温度的小设备就好了,于是想到DIY个电子温度计,网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。
作为单片机小虾的我做这个用了2天时间,当然是下班后,做工不行见谅了。
主要元件用到了单片机STC89C54RD+,DB18B20温度传感器,4为共阳数码管,PNPS8550三极管等。
先上原理图:洞洞板布局图:然后就是实物图了:附上源程序:程序是别人写的,我只是自己修改了下,先谢谢原程序者的无私奉献。
#include"reg52.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P3^4; //温度数据口sbit wx1=P2^0; //位选1sbit wx2=P2^1; //位选2sbit wx3=P2^2; //位选3sbit wx4=P2^3; //位选4unsigned int temp, temp1,temp2, xs;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, //共阳数码管0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};/******延时程序*******/void delay1(unsigned int m){unsigned int i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}void delay(unsigned int m) //温度延时程序{while(m--);}void Init_DS18B20(){unsigned char x=0;DQ = 1; //DQ复位ds18b20通信端口delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(4);x=DQ; //稍做延时后如果x=0那么初始化成功x=1那么初始化失败delay(20);}/***********ds18b20读一个字节**************/uchar ReadOneChar(){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(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0; //从高电平拉至低电平时,写周期的开始DQ = dat&0x01; //数据的最低位先写入delay(5); //60us到120us延时DQ = 1;dat>>=1; //从最低位到最高位传入}}/**************读取ds18b20当前温度************/void ReadTemperature(){unsigned char a=0;unsigned b=0;unsigned t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作/WriteOneChar(0x44); // 启动温度转换delay(5); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度存放器等〔共可读9个存放器〕前两个就是温度/ delay(5);a=ReadOneChar(); //读取温度值低位/b=ReadOneChar(); //读取温度值高位/temp1=b<<4; //高8位中后三位数的值temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值temp1室温整数值temp2=a&0x0f; //小数的值temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值zhenshuxs=temp2*0.0625*10; //小数位,假设为0.5那么算为5来显示xs小数xiaoshu }void wenduxianshi(){wx1=0;P0=table[temp/10]; //显示百位delay1(5);wx1=1;wx2=0;P0=table[temp%10]+0x80; //显示十位加上0x80就显示小数点了。
DS18B20温度传感器设计原理图及c程序代码

/*******************代码部分**********************//*************** writer:shopping.w ******************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit DQ = P3^3;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar code Temp_Disp_Title[]={"Current Temp : "};uchar Current_Temp_Display_Buffer[]={" TEMP: "};uchar code Temperature_Char[8] ={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};uchar code df_Table[]=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};uchar CurrentT = 0;uchar Temp_Value[]={0x00,0x00}; uchar Display_Digit[]={0,0,0,0};bit DS18B20_IS_OK = 1;void DelayXus(uint x){uchar i;while(x--){for(i=0;i<200;i++);}}bit LCD_Busy_Check(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN=0;return result;}void Write_LCD_Command(uchar cmd) {while(LCD_Busy_Check());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void Write_LCD_Data(uchar dat){while(LCD_Busy_Check());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void LCD_Initialise(){Write_LCD_Command(0x01);DelayXus(5);Write_LCD_Command(0x38);DelayXus(5);Write_LCD_Command(0x0c);DelayXus(5);Write_LCD_Command(0x06);DelayXus(5);}void Set_LCD_POS(uchar pos){Write_LCD_Command(pos|0x80); }void Delay(uint x){while(--x);}uchar Init_DS18B20(){uchar status;DQ = 1;Delay(8);DQ = 0;Delay(90);DQ = 1;Delay(8);DQ = 1;return status;}uchar ReadOneByte(){uchar i,dat=0;DQ = 1;_nop_();for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;_nop_();_nop_();if(DQ)dat |= 0X80;Delay(30);DQ = 1;}return dat;}void WriteOneByte(uchar dat) {uchar i;for(i=0;i<8;i++){DQ = 0;DQ = dat& 0x01;Delay(5);DQ = 1;dat >>= 1;}}void Read_Temperature(){if(Init_DS18B20()==1)DS18B20_IS_OK=0;else{WriteOneByte(0xcc);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0xbe);Temp_Value[0] = ReadOneByte();Temp_Value[1] = ReadOneByte();DS18B20_IS_OK=1;}}void Display_Temperature(){uchar i;uchar t = 150, ng = 0;if((Temp_Value[1]&0xf8)==0xf8){Temp_Value[1] = ~Temp_Value[1];Temp_Value[0] = ~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng = 1;}Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);Display_Digit[3] = CurrentT/100;Display_Digit[2] = CurrentT%100/10;Display_Digit[1] = CurrentT%10;Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';Current_Temp_Display_Buffer[10] = '.';Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';if(Display_Digit[3] == 0)Current_Temp_Display_Buffer[7] = ' ';if(Display_Digit[2] == 0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8] = ' ';if(ng){if(Current_Temp_Display_Buffer[8] == ' ')Current_Temp_Display_Buffer[8] = '-';else if(Current_Temp_Display_Buffer[7] == ' ')Current_Temp_Display_Buffer[7] = '-';elseCurrent_Temp_Display_Buffer[6] = '-';}Set_LCD_POS(0x00);for(i=0;i<16;i++){Write_LCD_Data(Temp_Disp_Title[i]);}Set_LCD_POS(0x40);for(i=0;i<16;i++){Write_LCD_Data(Current_Temp_Display_Buffer[i]);}Set_LCD_POS(0x4d);Write_LCD_Data(0x00);Set_LCD_POS(0x4e);Write_LCD_Data('C');}void main(){LCD_Initialise();Read_Temperature();Delay(50000);Delay(50000);while(1){Read_Temperature();if(DS18B20_IS_OK)Display_Temperature();DelayXus(100);}}。
DS18B20的传感器数码管显示的设计原理及程序

以下是原理图:以下是原理图的程序设计:#include <reg52.h>#include<math.h>#define uchar unsigned charsbit DQ=P1^6;unsigned char tempL=0;unsigned char tempH=0;unsigned int tempa;uchar display_data[4]={0};uchar flag_fu=0; //温度正负值标志位float temperature; //温度值void DS18_delay(int useconds)//延时函数{int s;for (s=0; s<useconds;s++);}unsigned char Init_DS18B20(void){unsigned char x=0;DQ=0; //发送复位脉冲DS18_delay(29); //延时(>480ms)DQ=1; //拉高数据线DS18_delay(3); //等待(15~60ms) 等待存在脉冲x=DQ; //获得存在信号(用于判断是否有器件)DS18_delay(25); // 等待时间隙结束return(x); //返回存在信号,0 = 器件存在, 1 = 无器件}ReadOneChar(void)//读一个字节{unsigned char i=0;unsigned char dat=0;for (i=8;i>0;i--){DQ=1;DS18_delay(1);DQ=0;dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值) DQ=1;if(DQ)dat|=0x80;DS18_delay(4);}return(dat);}WriteOneChar(unsigned char dat){unsigned char i=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;DS18_delay(5);DQ=1;dat>>=1;}DS18_delay(4);}unsigned int ReadTemperature(void){Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0x44);DS18_delay(125);Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0xbe);tempL=ReadOneChar();tempH=ReadOneChar();tempa=((tempH*256)+tempL);if(tempa&0x8000){tempa=~tempa;tempa+=1;flag_fu=1;}else{flag_fu=0;}//温度转换,把高低位做相应的运算转化为实际温度temperature=tempa*0.625*8;DS18_delay(200);return temperature ;}void display(){unsigned char code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f,0xff};P3=0x01;P2=dis[display_data[0]];DS18_delay(10);P3=0x02;P2=dis[display_data[1]];DS18_delay(10);P3=0x04;P2=dis[display_data[2]]+0x80;DS18_delay(10);P3=0x08;P2=dis[display_data[3]];DS18_delay(10);}void main(){unsigned int temp;uchar i;while(1){temp=ReadTemperature();if(flag_fu==0){ if(temp>=1000){display_data[0]=temp/1000;display_data[1]=(temp/100)%10;display_data[2]=(temp/10)%10;display_data[3]=temp%10;}else if(temp>=100){display_data[0]=12;display_data[1]=temp/100;display_data[2]=(temp%100)/10;display_data[3]=temp%10;}else{ display_data[0]=12;display_data[1]=12;display_data[2]=temp/10;display_data[3]=temp%10;}}else{ if(abs(temp)>100){display_data[0]=10;display_data[1]=abs(temp)/100;display_data[2]=(abs(temp)%100)/10;display_data[3]=abs(temp)%10;}else{display_data[0]=12;display_data[1]=10;display_data[2]=abs(temp)/10;display_data[3]=abs(temp)%10;}}for(i=0;i<250;i++)display();}}。
DS18B20工作原理及时序

DS18B20原理与分析DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
可以分别在93.75 ms和750 ms 内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
1.DS18B20简介(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压范围:+3.0~ +5.5 V。
(4)测温范围:-55 ~+125 ℃。
固有测温分辨率为0.5 ℃。
(5)通过编程可实现9~12位的数字读数方式。
(6)用户可自设定非易失性的报警上下限值。
(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
DS18B20的测温原理DS18B20的测温原理如图2所示,图中低温度系数晶振的振荡频率受温度的影响很小〔1〕,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值。
DS18B20中文资料+C程序

DS18B20中文资料+C程序18b20温度传感器应用解析温度传感器的种类众多,在应用与高精度、高可靠性的场合时dallas(达拉斯)公司生产的ds18b20温度传感器当仁不让。
超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得ds18b20更受欢迎。
对于我们普通的电子爱好者来说,ds18b20的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。
了解其工作原理和应用可以拓宽您对单片机开发的思路。
ds18b20的主要特征:全系列数字温度切换及输入。
??一流的单总线数据通信。
最高12位分辨率,精度可达土0.5摄氏度。
12十一位分辨率时的最小工作周期为750毫秒。
??可选择真菌工作方式。
检测温度范围为c55°c~+125°c(c67°f~+257°f)??内置eeprom,限温报警功能。
64十一位光刻rom,内置产品序列号,便利多机了变。
??多样PCB形式,适应环境相同硬件系统。
ds18b20芯片PCB结构:ds18b20引脚功能:gnd电压地dq单数据总线vdd电源电压nc空插槽ds18b20工作原理及应用领域:ds18b20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。
其一个工作周期可分为两个部分,即温度检测和数据处理。
在讲解其工作流程之前我们有必要了解18b20的内部存储器资源。
18b20共有三种形态的存储器资源,它们分别是:rom只读存储器,用作放置ds18b20id编码,其前8位就是单线系列编码(ds18b20的编码就是19h),后面48位就是芯片唯一的序列号,最后8位就是以上56的位的crc码(缓存校验)。
数据在出产时设置无可奈何用户修改。
ds18b20共64十一位rom。
ram数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,ds18b20共9个字节ram,每个字节为8位。
第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户eeprom(常用于温度报警值储存)的镜像。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值temp1室温整数值
temp2=a&0x0f; //小数的值
temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值zhenshu
xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示xs小数xiaoshu
{
unsigned char x=0;
DQ = 1; //DQ复位ds18b20通信端口
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时大于480us
DQ = 1; //拉高总线
delay(4);
x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(20);
}
/***********ds18b20读一个字节**************/
uchar ReadOneChar()
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //高电平拉成低电平时读周期开始
先上原理图:
洞洞板布局图:
然后就是实物图了:
附上源程序:程序是别人写的,我只是自己修改了下,先谢谢原程序者的无私奉献。
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^4; //温度数据口
sbit wx1=P2^0; //位选1
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度/
delay(5);
a=ReadOneChar(); //读取温度值低位/
b=ReadOneChar(); //读取温度值高位/
最近天气热了,想要是做个能显示温度的小设备就好了,于是想到DIY个电子温度计,网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。作为单片机小虾的我做这个用了2天时间,当然是下班后,做工不行见谅了。
主要元件用到了单片机STC89C54RD+,DB18B20温度传感器,4为共阳数码管,PNPS8550三极管等。
/******延时程序*******/
void delay1(unsigned int m)
{
unsigned int i,j;
for(i=m;i>0;i--)
for(j=110;j>0;j--);
}
void delay(unsigned int m) //温度延时程序
{
while(m--);
}
void Init_DS18B20()
delay1(5);
wx3=1;
wx4=0;
P0=table[12]; //显示C字符
delay1(5);
wx4=1;
}
void main()
{
while(1)
{
ReadTemperature();
wenduxianshi();
}
}
for (i=8; i>0; i--)
{
DQ = 0; //从高电平拉至低电平时,写周期的开始
DQ = dat&0x01; //数据的最低位先写入
delay(5); //60us到120us延时
DQ = 1;
dat>>=1; //从最低位到最高位传入
}
}
/**************读取ds18b20当前温度************/
}
void wenduxianshi()
{
wx1=0;
P0=table[temp/10]; //显示百位
delay1(5);
wx1=1;
wx2=0;
P0=table[temp%10]+0x80; //显示十位加上0x80就显示小数点了。
delay1(5);
wx2=1;
wx3=0;
P0=table[xs%10]; //显示个位
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //
delay(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
void ReadTemperature()
{
unsigned char a=0;
unsigned b=0;
unsigned t=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作/
WriteOneChar(0x44); //启动温度转换
delay(5); // this message is wery important
sbit wx2=P2^1; //位选2
sbit wx3=P2^2; //位选3
sbit wx4=P2^3; //位选4
unsigned int temp, temp1,temp2, xs;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, //共阳数码管
0x92,0x82,0xf8,