dbs18b20三个数码管显示

合集下载

18B20温度传感器数码管显示

18B20温度传感器数码管显示

南京航空航天大学金城学院课题任务报告题目一个单片机实现温度传感网络并用数码管显示的设计系部自动化系专业自动化学生姓名XXX 学号XXXXXX 指导教师XX 职称XX 毕设地点南京XXXX大学2013年12月14日课题任务书学生姓名XXX 学号XXXXXXX 系部自动化系题目一个单片机实现温度传感网络并用数码管显示的设计题目来源其他题目性质系统设计类别设计个人单篇内容解释:DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化,低功耗,高性能,抗干扰能力强,易配微处理器等优点,可直接将温度转化成数字信号处理器处理。

测量的温度范围是—55~125℃,测温误差0.5℃。

可编程分辨率9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃和0.0625℃。

相较热电偶传感器而言可实现高精度测温。

对热电偶温度传感器来说该项目实现的过程为:靠光敏电阻检测光照的大小,光的改变最终改变电阻的大小,给电阻外加一个电压,就改变了电压的大小,再用PCF8951AD转换器件检测电压的变化并转换为数字信号,再传到单片机上作一定的处理后去控制相应的数码管显示出当时的温度。

而对DS18B20来说过程则简单的多了,热电偶电阻传感器一直到单片机之前的部分都可以用一个DS18B20来代替了,真正的实现了数字化。

单片机后面的部分则两者是一样的!DS18B20与热电阻温度传感器相比价格上,来说要贵出很多!所以在温度的测量精度要求不是很高的话可以选择热电阻温度传感器,实验者应则情而定。

本实验由于就要用到一个DS18B20故此选用DS18B20!对于本次实验的的开发板,DS18B20测得温度数字信号后通过“一线总线”由J10或J48指针用单根杜邦线传输到单片机的P1.3口,P0口接到J3排针,P2.2和P2.3分别接到J2的锁存器。

由单片机内部微处理器处理后发到数码管作出相应的显示!实验步骤:实验之前先看本次实验的开发板(裸板)的样图。

DS18B20单片机数码管显示原理图和程序

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温度传感器应用解析

DS18B20温度传感器应用解析

DS18B20温度传感器应用解析温度传感器的种类众多,在应用与高精度、高可靠性的场合时DALLA S(达拉斯)公司生产的DS18B20温度传感器当仁不让。

超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B 20更受欢迎。

对于我们普通的电子爱好者来说,DS18B20的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。

了解其工作原理和应用可以拓宽您对单片机开发的思路。

DS18B20的主要特征:全数字温度转换及输出。

先进的单总线数据通信。

最高12位分辨率,精度可达土0.5摄氏度。

12位分辨率时的最大工作周期为750毫秒。

可选择寄生工作方式。

检测温度范围为–55°C ~+125°C (–67°F ~+257°F)内置EEPROM,限温报警功能。

64位光刻ROM,内置产品序列号,方便多机挂接。

多样封装形式,适应不同硬件系统。

DS18B20芯片封装结构:DS18B20引脚功能:·GND 电压地·DQ 单数据总线·VDD 电源电压·NC 空引脚DS18B20工作原理及应用:DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。

其一个工作周期可分为两个部分,即温度检测和数据处理。

在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。

18B20共有三种形态的存储器资源,它们分别是:ROM 只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。

数据在出产时设置不由用户更改。

DS18B20共64位ROM。

RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,D S18B20共9个字节RAM,每个字节为8位。

第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。

DS18B20的传感器数码管显示的设计原理及程序

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数码管显示温度

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit w1=P2^4;sbit w2=P2^5;sbit w3=P2^6;sbit w4=P2^7;sbit DQ=P3^7;uint temp;float f_temp; //温度值variable of temperaturebit flag;uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef };//uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0x4f,0x79,0x24,0x70,0x19,0x12,0x02,0x78,0x00,0x10};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command {uint i;DQ = 0; //单片机拉低总线i=70;while(i>0)i--;DQ = 1; //释放总线,即拉高了总线i=4;while(i>0)i--;}bit Read_One_bit() //读取一个字节的数据read a byte date//读数据时,数据以字节的最低有效位先从总线移出{uint i;bit dat;DQ=0;i++;DQ=1;i++;i++;dat=DQ;i=3;while(i>0)i--;return (dat);}uchar Read_One_Byte(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=Read_One_bit();dat=(j<<7)|(dat>>1);}return (dat);}void Write_One_Byte(uchar dat){uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){DQ=0;i++;i++;DQ=1;i=5;while(i>0)i--;}else{DQ=0;i=5;while(i>0)i--;DQ=1;i++;i++;}}}void tmpchange(void){uchar f;Init_Ds18b20();f=70;while(f>0)f--;delay(1);Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0x44); //温度转换指令}uint Get_Tmp() //获取温度get the temperature{uchar a,b,f;Init_Ds18b20(); //初始化f=70;while(f>0)f--;Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0xbe); //温度转换指令a = Read_One_Byte(); //读取到的第一个字节为温度LSBb = Read_One_Byte(); //读取到的第一个字节为温度MSBtemp = b; //先把高八位有效数据赋于temptemp <<= 8; //把以上8位数据从temp低八位移到高八位temp = temp|a; //两字节合成一个整型变量f_temp = temp*0.0625; //temp = f_temp*10+0.5; //放大十倍f_temp=f_temp+0.5; // //同时进行一个四舍五入操作。

ds18b20测温度数码管显示

ds18b20测温度数码管显示

#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char//-------函数声明-------void init();void disp();void delay(uint x);void delayms(uint x);uchar rst_ds18b20();void write_byte(uchar com);uchar read_byte();void read_temperature();void calculate_temperature();uchar code table[] = {0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0xA7,0xFF,0xEF,0xC0,0x00}; uchar code bitsel[] = {0x7f,0xbf,0xdf,0xef};uchar smg[4];sbit DQ=P1^0;sbit led=P1^5;uchar ready;bit ds18b20_is_ok;uchar temperature_value[2];//-----------主函数-----------void main(){init();while(1){if(ready == 0){led = 0;}read_temperature();if(ds18b20_is_ok == 1){calculate_temperature();// rst_ds18b20();}}}//-------------初始化--------------void init(){rst_ds18b20();TMOD = 0x01;TH0 = (65536-5000)/256;TL0 = (65536-5000)%256;EA = 1;ET0 = 1;TR0 = 1;}//-------------显示函数-------------void disp(){uchar i;if(i == 1){P0 = table[smg[i]];}else{P0 = table[smg[i]] & 0x7f;}P2 = bitsel[i];i++;if( i == 4 ){i = 0;}}//------------定时计数器0中断------------ void timer0() interrupt 1{TH0 = (65536-5000)/256;TL0 = (65536-5000)%256;disp();}//--------------延时大约1ms---------------- void delayms(uint x)uchar i;while(x--){for(i=0;i<120;i++);}}//-----------------大约延时9us---------------------- void delay(uint x){while(--x);}//----------------DS18B20复位------------------- uchar rst_ds18b20(){DQ=0;delay(60);DQ=1;delay(8);ready=DQ;delay(30);DQ=1;return ready;}//------------------写一字节--------------------- void write_byte(uchar com){uchar i;for(i=0;i<8;i++){DQ=0;DQ=com&0x01;delay(5);DQ=1;com>>=1;}delay(5);}//----------------读一字节------------------------- uchar read_byte()uchar i,value=0;for(i=0;i<8;i++){value>>=1;DQ=0;DQ=1;delay(1);if(DQ==1){value|=0x80;}delay(6);}return value;}//-------------------读暂存器-----------------------void read_temperature(){if(ready==0){rst_ds18b20();write_byte(0xcc);write_byte(0x44);delayms(750);rst_ds18b20();write_byte(0xcc);write_byte(0xbe);temperature_value[0]=read_byte();temperature_value[1]=read_byte();rst_ds18b20();ds18b20_is_ok=1;}else{ds18b20_is_ok=0;}}//-------------------------计算温度值-------------------------- void calculate_temperature(){uint temperature;uchar flag;temperature=temperature_value[1]*256+temperature_value[0];if(temperature_value[1]>0xf8){temperature=~temperature+1;flag=10;}else{flag = 11;}temperature=temperature*0.625;smg[0] = temperature%10;smg[1] = temperature/10%10;smg[2] = temperature/100%10;smg[3] = flag;}。

18b20测温数码管显示实验--精确到小数点后4位

18b20测温数码管显示实验--精确到小数点后4位

18b20测温数码管显示实验--精确到小数点后4位//滑国虎于09.9.20完成////DS18B20的读写程序,数据脚P1.5 ////温度传感器18B20程序,采用器件默认的12位转化 ////最大转化时间750微秒,显示温度-55到+125度,显示精度 // //为0.1度,显示采用4位LED共阳显示测温值 ////P0口为段码输入,P27~P21为位选 ///***************************************************/#include "reg51.h"#include "intrins.h" //_nop_();延时函数用 #define Disdata P0 //段码输出口 #define discan P2 //扫描口 #define uchar unsigned char #define uint unsigned intsbit DQ=P1^5; //温度输入口 sbit DIN=P0^7; //LED小数点控制 uint h;uint temp;//uchar codedis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x bf};//共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮""-"uchar code scan_con[7]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd}; //列扫描控制字uchar data temp_data[2]={0x00,0x00}; //读出温度暂放 uchar data display[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用/*****************11us延时函数*************************///void delay(uint t) //11us{for (;t>0;t--);}///****************DS18B20复位函数************************/ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;delay(50); //550 usDQ=1;delay(6); //66 uspresence=DQ; //presence=0 复位成功,继续下一步}delay(45); //延时500 uspresence=~DQ;}DQ=1; //拉高电平 }/****************DS18B20写命令函数************************/ //向1-WIRE 总线上写1个字节void write_byte(uchar val){uchar i;for(i=8;i>0;i--){DQ=1;_nop_();_nop_(); //从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 usDQ=val&0x01; //最低位移出delay(6); //66 usval=val/2; //右移1位}DQ=1;delay(1);}/****************DS18B20读1字节函数************************/ //从总线上取1个字节uchar read_byte(void){uchar i;uchar value=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 usDQ=1;_nop_();_nop_();_nop_();_nop_(); //4 usif(DQ)value|=0x80;delay(6); //66 us}DQ=1;return(value);}/****************显示扫描函数***************************/ scan(){char k;for(k=0;k<7;k++) //4位LED扫描控制{Disdata=dis_7[display[k]]; //数据显示 P0if (k==2){DIN=0;} //小数点显示 P0.7discan=scan_con[k]; //位选 P2delay(150);discan=0xff;}}/****************读出温度函数************************/ //read_temp(){ow_reset(); //总线复位delay(200);write_byte(0xcc); //发命令write_byte(0x44); //发转换命令ow_reset();delay(1);write_byte(0xcc); //发命令write_byte(0xbe);temp_data[0]=read_byte(); //读温度值的低字节temp_data[1]=read_byte(); //读温度值的高字节temp=temp_data[1];temp=temp&0x0f; //去掉符号位temp=temp<<8; //temp为16位temp=temp|temp_data[0]; // 两字节合成一个整型变量。

DS18B20温度检测仪表(数码管显示)doc资料

DS18B20温度检测仪表(数码管显示)doc资料

目录第1章绪论 (1)1.1 选题目的 (1)1.2 设计要求 (1)第2章电路结构及工作原理 (2)2.1 电路方框图 (2)2.1.1 电路图 (2)2.1.2 系统流程 (3)2.2芯片介绍 (5)2.2.1 DS18B20 (5)2.2.1.1 DS18B20的工作原理 (5)2.2.1.2 DS18B20的使用方法 (6)2.2.2 AT89C51 (8)2.2.2.1 AT89C51简介 (8)第3章整机工作原理 (10)第4章系统调试与分析 (12)4.1 系统的调试 (12)4.2系统的分析 (12)结论 (13)收获和体会 (14)致谢 (15)参考文献 (16)附录一元件清单 (17)课程设计任务书年月日第1章绪论1.1 选题目的随着人们生活水平的不断提高,单片机技术已经普及到我们生活,工作,科研等各个领域。

单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本文利用单片机结合传感器技术开发设计,把传感器理论与单片机实际应用有机结合,详细地讲述了利用温度传感器DS18B20测量环境温度,设置上下报警温度,当温度不在设置范围内是,可以报警。

同时51单片机在现代电子产品中广泛应用以及其技术已经非常成熟,DS18B20可以直接读出被测温度值,而且采用一线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。

1.2 设计要求(1)设计题目和设计指标测量温度范围为0-100℃。

并通过数码管显示(2)设计功能利用DS18B20实现温度采集,并用数码管显示第2章 电路结构及工作原理2.1 电路方框图图2-1 电路方框图2.1.1 电路图2.1.2 系统流程图2-3 读DS18B20的子程序图2-4 读转换温度子程序2.2芯片介绍2.2.1 DS18B202.2.1.1 DS18B20的工作原理当DS18B20接收到温度转换命令后,开始启动转换。

DS18B20和数码管的使用

DS18B20和数码管的使用

DS18B20和数码管的使用1温度传感器DS18B20的使用:DS1820 是这样测温的:用一个高温度系数的振荡器确定一个门周期,内部计数器在这个门周期内对一个低温度系数的振荡器的脉冲进行计数来得到温度值。

计数器被预置到对应于-55℃的一个值。

如果计数器在门周期结束前到达0,则温度寄存器(同样被预置到-55℃)的值增加,表明所测温度大于-55℃。

同时,计数器被复位到一个值,这个值由斜坡式累加器电路确定,斜坡式累加器电路用来补偿感温振荡器的抛物线特性。

然后计数器又开始计数直到 0,如果门周期仍未结束,将重复这一过程。

斜坡式累加器用来补偿感温振荡器的非线性,以期在测温时获得比较高的分辨力。

这是通过改变计数器对温度每增加一度所需计数的的值来实现的。

因此,要想获得所需的分辨力,必须同时知道在给定温度下计数器的值和每一度的计数值。

DS1820 内部对此计算的结果可提供 0.5℃的分辨力。

温度以 16bit 带符号位扩展的二进制补码形式读出,表 1 给出了温度值和输出数据的关系。

数据通过单线接口以串行方式传输。

DS1820 测温范围-55℃~+125℃,以 0.5℃递增。

如用于华氏温度,必须要用一个转换因子查找表。

注意 DS1820 内温度表示值为1/2℃LSB,如下所示 9bit 格式:最高有效(符号)位被复制充满存储器中两字节温度寄存器的高 MSB 位,由这种“符号位扩展”产生出了示于表 1 的 16bit 温度读数。

可用下述方法获得更高的分辨力。

首先,读取温度值,将 0.5℃位(LSB)从读取的值中截去,这个值叫做 TEMP_READ。

然后读取计数器中剩余的值,这个值是门周期结束后保留下来的值(COUNT_REMAIN)。

最后,我们用到在这个温度下每度的计数值(COUNT_PER_C)。

用户可以用下面的公式计算实际温度值:1 Ds1820 用 9 位存贮温值度最高位为符号位下图为 18b20 的温度存储方式负温度S=1 正温度 S=0 如 00AAH为+85 ,0032H为 25 FF92H为 552 Ds18b20用 12 位存贮温值度最高位为符号位下图为 18b20 的温度存储方式负温度S=1 正温度 S=0 如0550H为+85 0191H为 25.0625 ,FC90H为-55在我们编写的程序中,由于数码管只有四位能够显示,因此我们决定保留一位小数位,而以12位贮藏温度值的最小分度值为0.0625,即2-4。

用DS18B20测量室温并在数码管上显示

用DS18B20测量室温并在数码管上显示
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
}
}
if(temper & BIT9)
{
dN[4] += 2;
dN[5] += 3;
if(dN[4] >= 10)
{
dN[4] -= 10;
码管位选变量
uchar cnt = 2;
void Disp_Numb(uint temper);
/****************主函数****************/
void main(void)
{
uchar i;
WDTCTL=WDTPW+WDTHOLD;
/*************************************************
程序功能:用DS18B20测量室温并在数码管上显示。
-------------------------------------------------
测试说明:观察显示温度数值。
*************************************************/
功 能:看门狗定时器中断服务函数,进行数码
管动态扫描
参 数:无
返回值 :无
********************************************/
#pragma vector = WDT_VECTOR

18b20 温度热水器控制数码管显示操作说明

18b20 温度热水器控制数码管显示操作说明

18b20 温度控制数码管显示操作说明
本设计系统是18b20温度报警系统数码管显示,水温值,设置一个温度值,当低于设定值继电器吸合,控制外接加热装置加热。

高于高温设定温度,继电器断开,停止加热。

1.功能测量温度然后控制继电器输出
2.最左边的按键按下是设定
3.显示带H的是设置一个高温
4.按设定键两下显示带L的是低温
5.右边两个键是加键减键
6.设定好后如果测得的温度小于低温继电器吸合
7.测得的温度大于低温小于高温也吸合
8.大于高温时就断开
9.温度传感器在主控板上用手握住温度传感器就会升温
第一次按下“设定”进入温度设置:
按下“加、减”键可设置高温报警,最高设置成99.0度,
最低可设置成比低温报警高0.1度。

第二次按下“确定键”进入正常温度显示:
1.正常温度显示界面
当前温度11.3度
2.温度设置界面
高混报警值17.4度。

DS18B20温度传感器和数码管显示例程

DS18B20温度传感器和数码管显示例程

//DS18B20温度传感器和数码管显示//编程时间:连线表: CPU=stc89C52 SysClock=12MHz// LEDLE= 控制位高电平有效 LEDSEG=P2 KEYBOARD=P3 LEDWEI=,LED高到底//**********************************************************//DS18B20//**********************************************************//连线表: CPU=stc89C52 SysClock=12MHz *//单总线: TMDAT=////**********************************************************#include <>#define uchar unsigned char#define uint unsigned intuchar discount=0;//显示扫描位计数uchar last=0;//最终温度值uchar itcount=0x13;//定时器延时计数uchar seg[4];//数码管显示暂存uchar tem[2];//读取温度暂存uchar flag=0;//温度正负标志位/********************LED引脚定义********************/sfr LEDSEG=0x80;//P2sfr LEDWEI=0xA0;//P3/********************DS18B20引脚定义********************/sbit TMDAT=P1^0; //温度传感器数据位/********************DS18B20函数定义*******************/void dmsec(uint count);//延时(count)毫秒void tmreset(void); //产生复位信号void tmpre(void); //检测器件应答信号bit tmrbit(void); //从总线读一个bituchar tmrbyte(void); //从总线读一个字节void mwbyte(uchar dat);//向总线写一个字节void tmstart(void); //启动一次温度转换uchar tmrtemp(void); //读取温度数据/********************LED函数定义*******************/uchar * uchartodectoseg(uchar unm);//字符转换为十进制然后转换为数码管段表void disp(uchar *seg);//显示函数void delay_ms(uint t); //延时函数/************************************************/uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0xc6};/*************数码表*******0 1 2 3 4 5 6 7 8 9 无显示 C**************/ /************************************************/uchar * uchartodectoseg(uchar unm){uchar x00,xx,x0,x,n;x00=unm/100;//取百位xx=unm%100;//取余x0=xx/10;//取十位x=xx%10;//取余即取个位n=0;seg[n]=table[x00];n++;seg[n]=table[x0];n++;seg[n]=table[x];n++;seg[n]=table[11];//最后一位显示摄氏度符号Cif(flag==1)seg[0]=0x40;//显示负号‘-’if(seg[0]==table[0])seg[0]=table[10]; //如果百位为零则不显示if((seg[0]==table[0])&(seg[1]==table[0]))seg[1]=table[10];//如果百位为零且十位为零则十位不显示return seg;}/***************************************************/ /******DELAY***************************/void delay_ms(uint t){uint m,n;for(m=0;m<t;m++){for(n=0;n<950;n++);}}/******************************************//*********************显示LEDSEG*****************************/void disp(uchar *seg){uchar wei[]={0x08,0x04,0x02,0x01};//位扫描码//LEDSEG=seg[10];LEDWEI =wei[discount];LEDSEG = seg[discount];delay_ms(1);discount++;if(discount==4){ delay_ms(1);discount=0;//LEDSEG=seg[10];LEDWEI=wei[discount];LEDSEG=seg[discount];}//检测是否扫描完,扫描完的话则重新置初值}/*********************************************************//*****************DS18B20函数体定义****************/void dmsec(uint count) {uint i;while(count--){for(i=0;i<125;i++){} }}void tmreset(void){uint i;TMDAT=0;i=103;while(i>0) i--;TMDAT=1;i=4;while(i>0) i--;}void tmpre(void){uint i;while(TMDAT);while(~TMDAT);i=4;while(i>0) i--;}bit tmrbit(void){uint i;bit dat;TMDAT=0;i++;TMDAT=1;i++;i++;dat=TMDAT;i=8;while(i>0) i--;return(dat);}uchar tmrbyte(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){ j=tmrbit();dat=(j<<7)|(dat>>1); }return(dat);}void tmwbyte(uchar dat) {uint i;uchar j;bit testb;for(j=1;j<=8;j++){ testb=dat & 0x01; dat=dat>>1;if(testb){ TMDAT=0;i++; i++;TMDAT=1;i=8;while(i>0) i--; }else{ TMDAT=0;i=8;while(i>0) i--; TMDAT=1;i++; i++;}}}void tmstart(void){tmreset();tmpre();dmsec(1);tmwbyte(0xcc);tmwbyte(0x44);}uchar tmrtemp(void){uchar y1,y2,y3;tmreset();tmpre();dmsec(1);tmwbyte(0xcc);tmwbyte(0xbe);tem[0]=tmrbyte();tem[1]=tmrbyte();if(tem[1]>127){tem[1]=(255-tem[1]);tem[0]=(255-tem[0]);flag=1;} //负温度求补码y1=tem[0]>>4;y2=tem[1]<<4;y3=y1|y2;return(y3);}/*********************************************************/void main(){TMOD=0X01;TL0=0XB0;TH0=0X3C;EA=1;ET0=1;TR0=1;dmsec(1);tmstart();while(1){uchartodectoseg(last);disp(seg);}}void time0() interrupt 1{TL0=0XB0;TH0=0X3C;//定时50msitcount--;if(itcount==0){last=tmrtemp();dmsec(1);tmstart();itcount=0x13;}}。

DS18B20高精度多点温度检测显示系统

DS18B20高精度多点温度检测显示系统

AP I函数是 LCD501_PutChar函数 ,注意在函数中的
温度值必须转换成对应的 ASC II码才能正常显示 ,
uiShi、uiGe、uiShi_d分别存放温度十位数 、个位数和
十分 位 的 ASC II码 , 而 小 数 点“. ”的 ASC II码 为
0x2e,则显示温度的程序代码如下 :
表 1 D S18B20温度的高低字节存放
高 8位 S S S S S 26 25 24 低 8位 23 22 21 20 2 - 1 2 - 2 2 - 3 2 - 4
DS18B20 的 转 换 精 度 为 9 位 到 12 位 (可 设 定 ) ,必须通过暂存器序号为 4 的配置寄存器进行 设置 ,配置寄存器的各位如表 2所示 。
前面两个数分别代表在液晶屏上的列号和行 号 [2]。
4 测温及液晶显示软件设计
由于温度是以数字的形式显示 ,数字和字符的
该系统在凌阳 μπnSPTM IDE 集成开发环境下利用 C语言程 序结合汇编编写 ,主要包括系 统主程序 , DS18B20驱动程序 , 汉字字模生成文件 , SPLC501的 AP I函数等组成 。为了能在液 晶屏上 显示 各设 备的 中文 名 称 ,可利用凌阳公司提供的汉 字字模生成软件 DM Tool生成
0)位置 [ 2 ] ,则显示的代码为 :
LCD501_B itmap ( 0, 0, ( unsigned int3 ) encoding_00) ;
LCD501_B itmap ( 16, 0, ( unsigned int3 ) encoding_01) ;
图 3 SPCE061A 与 SPLC501的接口
[ 4EH ]
Read Scratchpad (读暂存存储器 )

用LED数码管和DS18B20设计的温度显示器

用LED数码管和DS18B20设计的温度显示器

%单片机课程设计说明书用LED 数码管和DS18B20设计的温度显示器…专业电气工程及其自动化学生姓名 、管通班级 B 电气081学号02指导教师 张兰红完成日期\2011年 6 月 23 日*目录1.概述 (1)课题设计背景和意义 (1)课题设计内容 (1)2.课程方案设计 (2)系统总体设计要求 (2)系统模块结构论证 (2)方案一 (2)方案二 (2)3.系统硬件设计 (5)总体设计 (5)单片机最小运行系统 (5)温度传感器(DS18B20)电路 (6)七段数码管显示电路 (7)驱动电路 (8)4.系统软件设计 (8)程序结构分析 (8)系统程序流图 (9)5.软硬件联调 (12)软硬件调试中出现的问题及解决措施 (12)实物图 (13)调试结果 (14)结束语 (15)参考文献 (16)附录 (17)附录1:基于单片机的温度显示系统设计原理图 (18)附录2:基于单片机的温度显示系统设计PCB图 (19)附录3:proteus仿真图 (20)附录4:基于单片机的温度显示系统设计C语言程序清单 (21)附录5: 基于单片机的温度显示系统设计元器件目录表 (25)1.概述课题设计背景和意义由于现代工艺越来越多的需要对实时温度进行监测和控制,而且需要的精度越来越高。

所以温度控制系统国内外许多有关人员的重视,得到了十分广泛的应用。

温度控制系统发展迅速,而且成果显著。

由于单片微处理器的性能日益提高、价格又不断降低,使其性能价格比的优势非常明显。

“用LED数码管和DS18B20设计的温度显示器”课程设计,主要设计以一个单片机为控制核心的温度自动测量系统,一方面,本次设计是一个单片机系统,对它的设计和制作可以灵活运用在单片机课程中所学的知识,并使之得到巩固和提高。

另一方面,它的测温部分采用了美国Dallas半导体公司的DS18B20一线式数字式温度传感器,DS18B20是最新一代的测温器件,具有许多优点,它正在逐步取代传统的测温元件——热敏电阻和热电偶。

DS18B20温度控制数码管显示(汇编非常详细)

DS18B20温度控制数码管显示(汇编非常详细)

D S18B20温度控制数码管显示(汇编非常详细)-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN; DS18B20温度控制数码管显示(汇编非常详细)*;* 1、= → 进入设定温度报警值 TL 状态: *;* L--20 *;* 2、→ 进入设定温度报警值 TH 状态: *;* H--28 *;* 3、→ 返回 *;* 4、设定过程:→加键(UP),→减键(DOWN),可快速调。

* ;* **TIMER_L DATA 23HTIMER_H DATA 24HTIMER_COUN DATA 25HTEMPL DATA 26HTEMPH DATA 27HTEMP_TH DATA 28HTEMP_TL DATA 29HTEMPHC DATA 2AHTEMPLC DATA 2BHTEMP_ZH DATA 2CHBEEP EQUDATA_LINE EQURELAY EQUFLAG1 EQUFLAG2 EQU;-------------------------------------------------K1 EQUK2 EQUK3 EQUK4 EQU;=================================================ORG 0000HJMP MAINORG 000BHAJMP INT_T0;--------------------------------------------------MAIN: MOV SP,#30HMOV TMOD,#01H ;T0,方式1MOV TIMER_L,#00H ;50ms定时值MOV TIMER_H,#4CHMOV TIMER_COUN,#00H ;中断计数MOV IE,#82H ;EA=1,ET0=1LCALL READ_E2;LCALL RE_18B20MOV 20H,#00HSETB BEEPSETB RELAYMOV 7FH,#0AH ;熄灭符CALL RESET ;复位与检测DS18B20JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在JMP STARTMAIN1: CALL RESETJB FLAG1,STARTLCALL BEEP_BL ;DS18B20错误,报警JMP MAIN1START:MOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#044H ; 发出温度转换命令CALL WRITECALL RESETMOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#0BEH ; 发出读温度命令CALL WRITECALL READ ;读温度数据CALL CONVTEMPCALL DISPBCDCALL DISP1CALL SCANKEYLCALL TEMP_COMPJMP MAIN1;===================================================== ;DS18B20 复位与检测子程序;FLAG1=1 OK, FLAG1=0 ERROR;====================================================== RESET:SETB DATA_LINENOPCLR DATA_LINEMOV R0,#64H ;主机发出延时600微秒的复位低脉冲MOV R1,#03HRESET1: DJNZ R0,$MOV R0,#64HDJNZ R1,RESET1SETB DATA_LINE ;然后拉高数据线NOPMOV R0,#25HRESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回应DJNZ R0,RESET2JMP RESET4 ; 延时RESET3: SETB FLAG1 ; 置标志位,表示DS1820存在JMP RESET5RESET4: CLR FLAG1 ; 清标志位,表示DS1820不存在JMP RESET6RESET5: MOV R0,#064HDJNZ R0,$ ; 时序要求延时一段时间RESET6: SETB DATA_LINERET;=========================================================== ;;=========================================================== WRITE: MOV R2,#8 ;一共8位数据CLR CYWR1:CLR DATA_LINE ;开始写入DS18B20总线要处于复位(低)状态 MOV R3,#09DJNZ R3,$ ;总线复位保持18微妙以上RRC A ;把一个字节DATA 分成8个BIT环移给CMOV DATA_LINE,C ;写入一个BITMOV R3,#23DJNZ R3,$ ;等待46微妙SETB DATA_LINE ;重新释放总线NOPDJNZ R2,WR1 ;写入下一个BITSETB DATA_LINERET;============================================================ ;从DS18B20中读出温度低位、高位和报警值TH、TL;存入26H、27H、28H、29H;============================================================ READ: MOV R4,#4 ; 将温度高位和低位从DS18B20中读出MOV R1,#26H ; 存入26H、27H、28H、29HRE00: MOV R2,#8RE01: CLR CSETB DATA_LINENOPNOPCLR DATA_LINE ;读前总线保持为低NOPNOPNOPSETB DATA_LINE ;开始读总线释放MOV R3,#09 ;延时18微妙DJNZ R3,$MOV C,DATA_LINE ;从DS18B20总线读得一个BITMOV R3,#23DJNZ R3,$ ;等待46微妙RRC A ;把读得的位值环移给ADJNZ R2,RE01 ;读下一个BITMOV @R1,AINC R1DJNZ R4,RE00RET;--------------------------------------------;200ms对闪动标记取反一次;--------------------------------------------INT_T0:PUSH ACCPUSH PSWMOV TL0,TIMER_LMOV TH0,TIMER_HINC TIMER_COUNMOV A,TIMER_COUNCJNE A,#04H,INT_ENDMOV TIMER_COUN,#00HCPL FLAG2INT_END:POP PSWPOP ACCRETI;========================================================== ;重新对 DS18B20 初始化;将设定的温度报警值写入 DS18B20;========================================================== RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#4EH ;写暂存寄存器LCALL WRITEMOV A,TEMP_TH ;TH(报警上限)LCALL WRITEMOV A,TEMP_TL ;TL(报警下限)LCALL WRITEMOV A,#7FH ;12位精确度LCALL WRITERET;====================================================;功能键扫描子程序;==================================================== SCANKEY:MOV P1,#0F0HJB K1,SCAN_K2CALL BEEP_BLSCAN_K1: CALL ALERT_TLCALL ALERT_PLAYJB K1,SCAN_K1CALL BEEP_BLSCAN_K11: CALL ALERT_THCALL ALERT_PLAYJB K1,SCAN_K11CALL BEEP_BLSCAN_K2: JB K2,SCAN_K3CALL BEEP_BLSCAN_K3: JB K3,SCAN_K4CALL BEEP_BLLCALL RESET_ALERTLCALL RE_18B20LCALL WRITE_E2SCAN_K4: JB K4,SCAN_ENDCALL BEEP_BLSCAN_END: RET;================================================ ;设置温度报警值;================================================ RESET_ALERT:CALL ALERT_TLCALL ALERT_PLAYJNB K3,$ ;K3为位移键SETB TR0RESET_TL:CALL ALERT_PLAYJNB FLAG2,R_TL01mov 75H,7fh ;送入熄灭符mov 76H,7fhCALL ALERT_PLAYJMP R_TL02R_TL01: CALL ALERT_TLmov 75h,7Eh ;送设定值mov 76h,7DhCALL ALERT_PLAY ;显示设定值R_TL02: JNB K1,K011AJNB K2,K011BJNB K3,RESET_THJMP RESET_TLK011A:INC TEMP_TLMOV A,TEMP_TLCJNE A,#120,K012A ;没有到设定上限值,转MOV TEMP_TL,#0K012A: CALL TL_DELJMP RESET_TLK011B:DEC TEMP_TLMOV A,TEMP_TLCJNE A,#00H,K012B ;没有到设定下限值,转MOV TEMP_TL,#119K012B: CALL TL_DELJMP RESET_TL;-------------------------------------------------------RESET_TH:CALL BEEP_BLJNB K3,$RESET_TH1:CALL ALERT_PLAYJNB FLAG2,R_TH01mov 75H,7fh ;送入熄灭符mov 76H,7fhCALL ALERT_PLAYJMP R_TH02R_TH01: CALL ALERT_THmov 75h,7Eh ;mov 76h,7DhCALL ALERT_PLAYR_TH02: JNB K1,K021AJNB K2,K021BJNB K3,K002JMP RESET_TH1K021A:INC TEMP_THMOV A,TEMP_THCJNE A,#120,K022A ;没有到设定上限值,转 MOV TEMP_TH,#0K022A: CALL TH_DELJMP RESET_TH1K021B:DEC TEMP_TH ;减1MOV A,TEMP_THCJNE A,#00H,K022B ;没有到设定下限值,转 MOV TEMP_TH,#119K022B: CALL TH_DELJMP RESET_TH1K002: CALL BEEP_BLCLR TR0 ;关闭中断RET;-----------------------------------------------------;键延时子程序;多次调用报警值显示程序来延时;-----------------------------------------------------TL_DEL: ;报警低值延时MOV R2,#0AHTL_DEL1: CALL ALERT_TLCALL ALERT_PLAYDJNZ R2,TL_DEL1RETTH_DEL: ;报警高值延时MOV R2,#0AHTH_DEL1: CALL ALERT_THCALL ALERT_PLAYDJNZ R2,TH_DEL1RET;==================================================== ;实时温度值与设定报警温度值 TH、TL 比较子程序;当实际温度大于 TH 的设定值时,显示“H”,继电器关闭。

18B20数字温度显示系统

18B20数字温度显示系统
ORL P0,#50H
CALL T1MS
MOV P0,43H
ORL P0,#40H
MOV TH0,#LOW(65536-10000) ;定时器10MS中断
MOV TL0,#HIGH(65536-10000)
RETI
T1MS: mov r5,#00h ;延时子程序
tt: mov r6,#9
djnz r6,$
;温度转换程序:精确到:0.06 ;
TRANS12:MOV A,30H
ANL A,#0F0H
MOV 3AH,A
MOV A,31H
ANL A,#0FH
ORL A,3AH
SWAP A
MOV B,#10
DIV AB
MOV 43H,A
MOV 42H,B ;
MOV DPTR,#TABB
MOV A,30H
ANL A,#0FH
NOP
NOP
NOP
NOP
NOP
SETB DAT
MOV R6,#30
DJNZ R6,$
RET
;读一位数据程序
READ: SETB DAT ;先复位至少1US产生读起始信号
NOP
NOP
CLR DAT
NOP
NOP
SETB DAT ;置位DAT准备接收数据
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,DAT
4、用一条4PIN的排线,把JP22接到P0口的JP51的P0.4,P0.5,P0.6,07四个端口。(即插入P0口的下半部份)。
5、用一条8PIN的排线。把38译码部份的输出端JP25,接到数码管部份的显示位口JP8。
在本系统中,为了简化程序,采用了74LS47(数码管译码)74LS138(三八译码)。即P0口的P0.0,P0.1,P0.2,P0.3四个端口接到74LS47进行硬件数码管译码,然后输出到数码管部分的数据口JP5。P0.4,P0.5,P.0.6三个端口接到74LS138进行38译码,然后输出到数码管的位控制JP8.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;本次程序使用12MHZ,机器周期为1us
DQ BIT P2.3 ; 1 wire line
swpH equ 0E7H
swpL equ 40H
WDLSB DATA 30H ;
WDMSB DA TA 31H ;
;***************************************************************
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TMR0 ; Timer0 isr
;********************************************************
; Timer0 Interrupt Service Routine
TMR0: MOV TH0,#swpH ;轮流送温度值的高低两位到数码管,21H,22H开始均为00H
MOV TL0,#swpL ;数码管显示顺序,高中低
JB 21H,DSL
JB 22H,DSL1
MOV P0,41H ;显示41H内容,数码管最高位
ORL P0,#01000000B
SJMP EXIT1
DSL:
MOV P0,43H
ORL P0,#00010000B ;显示43H内容,数码管最低位
MOV P2,#0FFH ;小数点关闭
SJMP EXIT
DSL1:
MOV P0,42H
ORL P0,#00100000B ;显示42H内容,数码管中位
MOV P2,#0FBH ;小数点亮
CPL 22H
EXIT:
CPL 21H
RETI
EXIT1:
CPL 22H
RETI
; Main program
MAIN:
TOINIT:
CLR EA ;关中断
MOV TMOD,#01H ;方式1
MOV TH0,#swpH
MOV TL0,#swpL
SETB EA ;中断T0初始化
SETB ET0
SETB TR0
;***********************************************************
;
MOV R2,#3
MOV R0,#41H ;
OVER:
MOV @R0,#00H ;使数码管内容都为0
INC R0
DJNZ R2,OVER
LOOP:
LCALL DSWD ;读取DS1820的内容
SJMP LOOP
;**********************************************************
; Read a temperature from the DS18B20
DSWD:
LCALL RSTSNR ; Init of the DS18B20 对DS18B20复位为使能与它联系
复位过后F0=0
JNB F0,KEND ;打开中断
MOV R0,#0CCH ;跳过ROM
LCALL SEND_BYTE ;发送命令0CCH的8位
MOV R0,#44H ;温度变换
LCALL SEND_BYTE ; 发送命令44H
SETB EA ; 打开中断
MOV 48H,#1
SS2:
MOV 49H,#255
SS1:
MOV 4AH,#255
SS0: DJNZ 4AH,SS0
DJNZ 49H,SS1
DJNZ 48H,SS2 ;延时1+1+1+(255*2+1)*255+2=130310us
CLR EA ;进入读时序禁用任何中断
LCALL RSTSNR ;F0为0
JNB F0,KEND ;打开中断
MOV R0,#0CCH ;跳过ROM
LCALL SEND_BYTE ;发送字节,也就是传送命令0CCH的8位
MOV R0,#0BEH ;读暂存存储器
LCALL SEND_BYTE ; 发送读取的暂存器中数据的命令0BEH的8位
LCALL READ_BYTE ; Read the low byte from scratchpad
MOV WDLSB,A ; Save the temperature (low byte) 存入温度低字节
LCALL READ_BYTE ; Read the high byte from scratchpad
MOV WDMSB,A ; Save the temperature (high byte) 存入温度高字节
LCALL TRANS12 ;数据处理
KEND:
SETB EA
RET
;**********************************************************
;
TRANS12:
MOV A,30H ;30H存从1820取的温度值
MOV 3BH,A ;保存低字节为后面取小数做准备
ANL A,#0F0H
MOV 3AH,A
MOV A,31H
ANL A,#0FH
ORL A,3AH
SWAP A ;数据高低位交换,为数码管显示高低位正确
MOV B,#10 ;转换为10进制,取低位
DIV AB
MOV 42H,B ; 除10 取余数
MOV b,#10
DIV ab
MOV 41H,B ;除10 取余数
MOV A,3BH
ANL A,#0FH
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;小数处理
MOV 43H,A
RET
;*************************************************
; Send a byte to the 1 wire line ;发送字节给总线
SEND_BYTE: ;
MOV A,R0
MOV R5,#8
SEN3: CLR C
RRC A
JC SEN1
LCALL WRITE_0 ;C为0就写0
SEN1: LCALL WRITE_1 ;C为1就写1
SEN2: DJNZ R5,SEN3 ; 传送字节的8位
RET
;*************************************************
; Read a byte from the 1 wire line
READ_BYTE:
MOV R5,#8
READ1: LCALL READ ;调用读时序,开始读数据RRC A
DJNZ R5,READ1 ; 8位数据读完
MOV R0,A
RET
;*************************************************
; Reset 1 wire line 复位,就是初始化为与ds1820联系RSTSNR: SETB DQ
NOP
NOP
CLR DQ
MOV R6,#250 ;
DJNZ R6,$
MOV R6,#50
DJNZ R6,$ ;保持低电平600us
SETB DQ ; ;DQ=1 进入接收状态
MOV R6,#15
DJNZ R6,$ ;保持高电平30us
CALL CHCK ;
MOV R6,#60
DJNZ R6,$ ;发出存在脉冲,保持低电平120us
SETB DQ
RET
;*************************************************
; low level subroutines
CHCK: MOV C,DQ ;就是通过DQ来判别ds18b20的存在JC RST0
SETB F0 ;对标志位操作
SJMP CHCK0
RST0: CLR F0 ; F0是用户标志位,主要用来判断温度传感器的存在CHCK0: RET
;*************************************************
WRITE_0: ;写0时序
MOV R6,#30
DJNZ R6,$ ;1+1+30*2=62us
SETB DQ
RET
;*************************************************
WRITE_1: ;写1时序
CLR DQ
NOP
NOP
NOP
NOP
NOP
SETB DQ ;DQ为高电平开始写1
MOV R6,#30
DJNZ R6,$
RET
;*************************************************
READ: SETB DQ ; 读时序
NOP
NOP
CLR DQ
NOP
NOP
SETB DQ ; 从此时刻开始读时间隙
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,DQ ;读到的位放入C中
MOV R6,#23
DJNZ R6,$
RET
;**********************************************
DELAY10: MOV R4,#10 ;延时程序
D2: MOV R5,#20
DJNZ R5,$
DJNZ R4,D2 ;延时1+1+(30*2+1)*30+2=1834us
RET
TAB1: DB 00H,01H,01H,02H,02H,03H,03H DB 04H,05H,06H,06H,07H,07H,08H
DB 08H,09H
END。

相关文档
最新文档