ds18b20温度采集

“盛群杯”单片机大赛设计报告
温度读取部分:
采用数字温度传感器DS18B20。

DS18B20为数字式温度传感器,无需其他外加电路,直接输出数字量。

可直接与单片机通信,读取测温数据,电路简单。

如图1.2.2 所示。

DS18B20与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,因而使用DS18B20可使系统结构更趋简单,可靠性更高。

他在测温精度、转换时间、传输距离、分辨率等方面带来了令人满意的效果
2.2.1 温度采集部分设计
本系统采用半导体温度传感器作为敏感元件。

传感器我们采用了DS18B20单总线可编程温度传感器,来实现对温度的采集和转换,直接输出数字量,可以直接和单片机进行通讯,大大简化了电路的复杂度。

DS18B20应用广泛,性能可以满足题目的设计要求。

DS18B20的测温电路如图2.2.1所示。

图2.2.1 DS18B20测温电路
(1)DSI8B20的测温功能的实现:
其测温电路的实现是依靠单片机软件的编程上。

当DSI8B20接收到温度转换命令后,开始启动转换。

转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。

单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5℃/LSB形式表示。

温度值格式如表2.2.1所示,其中“S”为标志位,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。

DSI8B20完成温度转换后,就把测得的温度值与 TH做比较,若T>TH或T<TL,则将该器件内的告警标志置位,并对主机发出的告警搜索命令做出响应。

表2.2.1 DS18B20温度值格式表
(2)、DSl820工作过程中的协议
初始化 -> RoM操作命令 -> 存储器操作命令-> 处理数据
①初始化单总线上的所有处理均从初始化开始
② ROM操作命令总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如表2.2.2所示
表2.2.2 ROM操作命令表
③存储器操作命令如表2.2.3所示
表2.2.3 存储器操作命令表
(3)温度转换算法及分析
由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。

温度高字节(MS Byte)高5位是用来保存温度的正负(标志为S的bit11~bit15),高字节(MS Byte)低3位和低字节来保存温度值(bit0 ~ bit10)。

其中低字节(LS Byte)的低4位来保存温度的小数位(bit0 ~ bit 3)。

由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。

也就说,本系统的温度精确到了0.1度。

算法核心:首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。

处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。

3.1读取DS18B20温度模块子程序
每次对DA18B20操作时多要按造DS18B20工作过程中的协议进行。

初始化-> RoM操作命令-> 存储器操作命令-> 处理数据程序流程图如图3.1.1所示。

3.2 数据处理子程序
由于DS18B20转换后的代码并不是实际的温度值,所以要进行数据处理。

由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取四舍五入,保留一位小数即可。

也就说,本系统的温度精确到了0.1度。

首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。

处理过后把DS18B20的温度Copy到单片机的RAM 中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。

数据处理子程序流程图如图3.2.1所示。

图3.1.1 读取DS18B20温度子程序流程图
温度传输调试过程:
开始时初始化成功,从机有应答。

但在读取温度时
数据读出全为0xff ,说明从机没回应,或说从机没发数据到总线上,认为传输时序有问题,因为使用的命令是没问题的
开始时通信只能一次成功,第二次即出错。

第二次初始化失败
数据传输有问题,读出的数据为0x50,0x05
重新修改时序延时后,能得到正确的温度数据,但正确的温度读数是在断点设置的情况下,得到的。

在全速运行时,却无法通信,即从机没发数据到总线或从机就没接收数据。

大致判断情况为温度转换没完成。

因为温度转换过程中,不响应总线,向总线发数据,延长时间继续调试。

但延长时间过长,编译器死机。

经过调整温度获取正确。

采取的方案为使用定时器,在开启温度,过一段时间,再去读取温度。

合集下载

DS18B20单总线温度采集实验

DS18B20单总线温度采集实验

DS18B20单总线温度采集实验一、实验目的1. 熟悉Keil IDE uVision集成开发环境软件的使用方法。

2. 学习DS18B20 单总线温度传感器的使用。

二、实验内容DS18B20 为单总线12 位(二进制)温度读数。

内部有64 位唯一的ID 编码。

工作电压从 3.0~5.5V。

测量温度范围从-55℃~125℃。

高位±0.0625℃分辨率。

三、实验要求1. 数码管显示温度数据,显示百、十、个位并保留一位小数。

2. 画出程序流程图,并独立编写C51程序。

3. 做好实验前预习,完成proteus仿真和实物搭建。

四、实验硬件电路及芯片特性DS18B20 内部框图:温度寄存器格式:DSl8B20 工作过程中的协议如下:初始化ROM 操作命令存储器操作命令处理数据初始化:单总线上的所有处理均从初始化开始。

单片机将总线拉低至少480μs 然后释放总线,DS18B20 检测到上升沿后在等待15~60μs 后拉低总线,说明器件存在。

拉低持续时间为60~240μs。

读写时序:推荐的读时序: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”命令。

温度分辩率配置:五、实验步骤1. 在Keil IDE u Vision集成开发环境下建立工程文件,编辑源文件、编译、链接并生成目标文件,仿真调试验证结果。

DS18B20温度采集与控制

DS18B20温度采集与控制

(3)发送 DS18B20 功能指令。
指令名称 温度转换
指令代码 44H
指令功能 启动 DS18B20 温度转换,最长 750ms,结果存于内部 9 字节 RAM
-1-
写暂存器
4EH
读暂存器 复制暂存器 重调 EEPROM 读供电模式
BEH 48H B8H B4H
发此命令后,可向内 RAM 发 3 个字节,1st 是 TH,2st 是 TL, 3st 配置寄存器 发此命令后,依次读出内 RAM 中 0~8 字节的内容,低位在前。 复制 2、3、4 字节的内容到 EEPROM 中 EEPROM 中的内容恢复到 2、3、4 字节 当 DS18B20 寄生供电时为“0”,外部电源供电为“1”
要想完成一次测温任务,首先需要主 MCU 指挥 DS18B20 进行一次温度转换,待转换完 成后,再让主 MCU 读取 DS18B20 内部 RAM 中的温度数据。具体操作如下:
(1)主 MCU 控制“1-Wire”总线进行复位初始化。参见“对 DS18B20 进行复位初始 化”操作。
(2)主 MCU 发送跳过 ROM 的操作(CCH)命令。 (3)主 MCU 发送转换温度的操作(44H)命令,后面释放总线至少 750 毫秒,让 DS18B20 完成转换的操作。 (4)主 MCU 发出复位操作并接收 DS18B20 的应答(存在)脉冲。 (5)主 MCU 发送跳过 ROM 的操作(CCH)命令。 (6)主 MCU 发送读取 RAM 的命令(BEH),随后主机依次读取 DS18B20 发出的从第 0 一第 8,共九个字节的数据。如果只想读取温度数据,那在读完第 0 和第 1 个数据后即丢 掉(不读)后续字节的内容。 上述操作中,涉及到主 MCU 对 DS18B20 的写(发送)操作和读(读取)操作,下文将 介绍如何完成这两种操作方法。 写操作:写操作周期最少为 60 微秒,最长不超过 120 微秒。写周期开始时,主机先把总 线拉低 1 微秒表示写周期开始。之后主机若想写 0,则继续拉低电平最少 60 微秒直至写周期 结束,然后释放总线为高电平。主机若想写 1,则拉低总线电平 1 微秒后就释放总线为高电 平,一直到写周期结束。 作为从机的 DS18B20 在检测到总线被拉低后等待 15 微秒然后从 15us 到 60us 开始对总 线采样,在采样期内总线为高电平则为 1,若采样期内总线为低电平则为 0。如下图所示。

基于DS18B20的锂动力电池单体温度采集

基于DS18B20的锂动力电池单体温度采集

基于DS18B20的锂动力电池单体温度采集1.DS18B20测温原理DS18B20测温原理如图1所示,在图1中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号发送给计数器1。

高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为计数器2的脉冲输入。

图2中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。

请点击输入图片描述计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 -55 ℃ 所对应的一个基数值。

计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。

斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值。

请点击输入图片描述由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。

系统对DS18B20的各种操作必须按协议进行。

操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。

因DS18B20采用一线通信接口,所以必须先完成ROM设定,否则记忆和控制功能将无法使用。

首先提供以下功能命令之一:1)读ROM。

2)ROM匹配。

3)搜索ROM。

4)跳过ROM。

5)报警检查。

这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。

2.基于DS18B20的锂动力电池单体温度采集锂动力电池模组主要由多个单体电芯所组成,通过合理的模组设计,可以通过有限的几个采样点来得到整个锂动力电池模组内电芯的温度。

ds18b20多路温度采集程序

ds18b20多路温度采集程序

本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。

亲测,更改端口即可使用。

(主要器件:51单片机,ds18b20,lcd显示器)附有proteus仿真图,及序列号采集程序/****上限62度下限-20度****/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit ds=P1^1;sbit rs=P1^4;sbit e=P1^6;sbit sp=P1^0;sbit d1=P1^2;sbit d2=P1^3;ucharlcdrom[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e} ,{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};unsigned char code table0[]={"TEMPERARTURE:U "}; unsigned char code table1[]={"0123456789ABCDEF"};int f[4];int tvalue;float ftvalue;uint warnl=320;uint warnh=992;/****lcd程序****/void delayms(uint ms)//延时{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void wrcom(uchar com)//写指令{delayms(1);rs=0;P3=com;delayms(1);e=1;delayms(1);e=0;}void wrdat(uchar dat)//写数据{rs=1;e=0;P3=dat;delayms(5);e=1;delayms(5);e=0;}void lcdinit()//初始化lcd {delayms(15);wrcom(0x38);delayms(5);wrcom(0x0c);delayms(5);wrcom(0x06);delayms(5);wrcom(0x01);delayms(5); }void display(uchar *p)//显示{while(*p!='\0'){wrdat(*p);p++;delayms(1);}}displayinit()//初始化显示{lcdinit();wrcom(0x80);display(table0);}/****ds18b20程序****/ void dsrst()//ds18b20复位{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit dsrd0()//读一位数据{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar dsrd()//读1个字节数据{uchar i,j,dat;dat=0;for(i=8;i>0;i--){j=dsrd0();dat=(j<<7)|(dat>>1);}return(dat);}void dswr(uchar dat)//写数据{uint i;uchar j;bit testb;for(j=8;j>0;j--){testb=dat&0x01;dat=dat>>1;if(testb){ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void tmstart()//初始化ds18b20{sp=1;d1=1;d2=1;dsrst();delayms(1);dswr(0xcc);dswr(0x44);}void read_dealtemp()//读取并处理温度{uchar i,j,t;uchar a,b;for(j=0;j<4;j++){dsrst();delayms(1);dswr(0x55);for(i=0;i<8;i++){dswr(lcdrom[j][i]);//发送64位序列号}dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0){d1=1;tvalue=~tvalue+1;wrcom(0xc0);wrdat(0x2d);if(tvalue>warnl){d2=0;sp=0;}else{d2=1;sp=1;}}else{d2=1;wrcom(0xc0);wrdat(' ');if(tvalue>warnh){d1=0;sp=0;}else{d1=1;sp=1;}}if(j==0){wrcom(0x8e); wrdat('2');}if(j==1){wrcom(0x8e);wrdat('3');}if(j==2){wrcom(0x8e);wrdat('4');}if(j==3){wrcom(0x8e);wrdat('5');}ftvalue=tvalue*0.0625;tvalue=ftvalue*10+0.5;ftvalue=ftvalue+0.05;f[j]=tvalue;//温度扩大十倍,精确到一位小数tvalue=f[j];t=tvalue/1000;wrcom(0x80+0x41);wrdat(table1[t]);//显示百位t=tvalue%1000/100;wrdat(table1[t]);//显示十位t=tvalue%100/10;wrdat(table1[t]);//显示个位wrdat(0x2e); //显示小数点儿t=tvalue%10/1;wrdat(table1[t]);//显示小数位delayms(5000);}}/****主函数****/void main(){d1=1;d2=1;sp=1;displayinit();//初始化显示while(1){tmstart();//初始化read_dealtemp();//读取温度}}/****序列号读取程序****/#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P1^1; //温度传感器信号线sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明sbit lcden = P1^6; //LCD使能信号端位声明void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init();//LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数*//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数*//***************************************************/void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 *//***************************************************/void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数*//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数*//***************************************************/uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数*//***************************************************/void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{uint i;uchar j;bit testb;for( j=1; j<=8; j++){testb = dat&0x01;dat= dat>>1;if(testb) //写1{DQ = 0;i++;i++;DQ = 1;i = 8;while(i>0)i--; }else{DQ = 0; //写0 i = 8;while(i>0)i--; DQ = 1;i++;i++;}}}/* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令*//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P3= com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据*/void LCD_WriteData(uchar dat){rs = 1; //选择LCD为写入数据状态lcden = 0;P3= dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() *//* 功能:初始化LCD,设定LCD的初始状态*/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//* *//* 显示18B20序列号*//* *//**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30);//取ASCII码elseLCD_WriteData(h+0x37);//取ASCII码if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30);//取ASCII码elseLCD_WriteData(l+0x37);//取ASCII码}。

DS18B20温度数据采集系统

DS18B20温度数据采集系统

目录摘要 (2)一、绪论 (3)二、系统方案实现 (3)2.1.设计要求 (3)2.2.设计方案论证 (3)2.3.总体设计框图 (4)三、主要硬件介绍 (4)3. 1.DS18B20 (4)3.1.1 DS18B20的主要特性 (4)3.1.2 DS18B20的外形和内部结构 (5)3.1.3 DS18B20工作原理 (6)3.1.4 高速暂存存储器 (7)3.2 AT89C51 (8)四、软件介绍 (9)4.1 功能概述 (9)4.2 系统软件流程图 (9)4.2.1程序 (9)4.2.2读出温度子程序 (10)4.2.3温度转换命令子程序 (11)4.3具体程序 (11)五、总结 (17)六、设计体会及今后的改进意见 (17)参考文献 (18)摘要本文基于DS18B20设计了一种温度数据采集系统,系统主要由AT89C51单片机,一个DS18B20 数字温度传感器以及一个液晶数码管构成。

软件方面,我们采用keil。

软件对程序进行编写以及调试,硬件方面,我们通过Proteus软件对硬件电路进行仿真以及测试,该系统结构简单,功耗较低,测温范围为- 50℃~ + 255℃。

现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。

适合于恶劣环境的现场温度测量。

该系统硬件分为3部分:DS18B20 温度测量模块、单片机模块、显示模块。

关键词:DS18B20、7SEG-MPX4液晶数码管、AT89C51一、绪论在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。

其中,温度控制也越来越重要。

在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。

采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。

因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。

ds18b20多路温度采集程序

ds18b20多路温度采集程序

本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。

亲测,更改端口即可使用。

(主要器件:51单片机,ds18b20,lcd 显示器)附有proteus仿真图,及序列号采集程序/****上限62度下限-20度****/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit ds=P1^1;sbit rs=P1^4;sbit e=P1^6;sbit sp=P1^0;sbit d1=P1^2;sbit d2=P1^3;uchar lcdrom[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}, {0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}};unsigned char code table0[]={"TEMPERARTURE:U "}; unsigned char code table1[]={"0123456789ABCDEF"};int f[4];int tvalue;float ftvalue;uint warnl=320;uint warnh=992;/****lcd程序****/void delayms(uint ms)//延时{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void wrcom(uchar com)//写指令{delayms(1);rs=0;P3=com;delayms(1);e=1;delayms(1);e=0;}void wrdat(uchar dat)//写数据{rs=1;e=0;P3=dat;delayms(5);e=1;delayms(5);e=0;}void lcdinit()//初始化lcd {delayms(15);wrcom(0x38);delayms(5);wrcom(0x0c);delayms(5);wrcom(0x06);delayms(5);wrcom(0x01);delayms(5); }void display(uchar *p)//显示{while(*p!='\0'){wrdat(*p);p++;delayms(1);}}displayinit()//初始化显示{lcdinit();wrcom(0x80);display(table0);}/****ds18b20程序****/ void dsrst()//ds18b20复位{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit dsrd0()//读一位数据{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar dsrd()//读1个字节数据{uchar i,j,dat;dat=0;for(i=8;i>0;i--){j=dsrd0();dat=(j<<7)|(dat>>1);}return(dat);}void dswr(uchar dat)//写数据{uint i;uchar j;bit testb;for(j=8;j>0;j--){testb=dat&0x01;dat=dat>>1;if(testb){ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void tmstart()//初始化ds18b20 {sp=1;d1=1;d2=1;dsrst();delayms(1);dswr(0xcc);dswr(0x44);}void read_dealtemp()//读取并处理温度{uchar i,j,t;uchar a,b;for(j=0;j<4;j++){dsrst();delayms(1);dswr(0x55);for(i=0;i<8;i++){dswr(lcdrom[j][i]);//发送64位序列号}dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0){d1=1;tvalue=~tvalue+1;wrcom(0xc0);wrdat(0x2d);if(tvalue>warnl){d2=0;sp=0;}else{d2=1;sp=1;}}else{d2=1;wrcom(0xc0);wrdat(' ');if(tvalue>warnh){d1=0;sp=0;}else{d1=1;sp=1;}}if(j==0){wrcom(0x8e);wrdat('2');}if(j==1){wrcom(0x8e);wrdat('3');}if(j==2){wrcom(0x8e);wrdat('4');}if(j==3){wrcom(0x8e);wrdat('5');}ftvalue=tvalue*0.0625; tvalue=ftvalue*10+0.5;ftvalue=ftvalue+0.05;f[j]=tvalue;//温度扩大十倍,精确到一位小数tvalue=f[j];t=tvalue/1000;wrcom(0x80+0x41);wrdat(table1[t]);//显示百位t=tvalue%1000/100;wrdat(table1[t]);//显示十位t=tvalue%100/10;wrdat(table1[t]);//显示个位wrdat(0x2e); //显示小数点儿t=tvalue%10/1;wrdat(table1[t]);//显示小数位delayms(5000);}}/****主函数****/void main(){d1=1;d2=1;sp=1;displayinit();//初始化显示while(1){tmstart();//初始化read_dealtemp();//读取温度}}/****序列号读取程序****/#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P1^1; //温度传感器信号线sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明sbit lcden = P1^6; //LCD使能信号端位声明void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init(); //LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数*//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数*//***************************************************/ void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 *//***************************************************/ void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数*//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数*//***************************************************/ uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数*//***************************************************/ void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{uint i;uchar j;bit testb;for( j=1; j<=8; j++){testb = dat&0x01;dat= dat>>1;if(testb) //写1{DQ = 0;i++;i++;DQ = 1;i = 8;while(i>0)i--;}else{DQ = 0; //写0i = 8;while(i>0)i--;DQ = 1;i++;i++;}}}/***********************************************//* LCD函数:void LCD_WriteCom()/* 功能:向LCD写入命令*//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P3= com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据*//***********************************************/void LCD_WriteData(uchar dat)rs = 1; //选择LCD为写入数据状态lcden = 0;P3= dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() *//* 功能:初始化LCD,设定LCD的初始状态*//***********************************************/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//**//* 显示18B20序列号*//*/**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30);//取ASCII码elseLCD_WriteData(h+0x37);//取ASCII码if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); //取ASCII码elseLCD_WriteData(l+0x37); //取ASCII码}。

DS18B20温度采集系统


3.单片机的晶振电路:
4.单片机的复位电路:
三、显示电路
a fg b
ed c h
1.数码管的分类
数码管按段数分为七段数码管和八段数码管,八段
数码管比七段数码管多一个发光二极管单元(多一个小 数点显示);按能显示多少个“8”可分为1位、2位、4 位等等数码管;按发光二极管单元连接方式分为共阳极 数码管和共阴极数码管。共阳数码管是指将所有发光二 极管的阳极接到一起形成公共阳极(COM)的数码管。共 阳数码管在应用时应将公共极COM接到+5V,当某一 字段发光二极管的阴极为低电平时,相应字段就点亮。 当某一字段的阴极为高电平时,相应字段就不亮。共阴 数码管是指将所有发光二极管的阴极接到一起形成公共 阴极(COM)的数码管。共阴数码管在应用时应将公共极 COM接到地线GND上,当某一字段发光二极管的阳极 为高电平时,相应字段就点亮。当某一字段的阳极为低 电平时,相应字段就不亮。
P1口、P2口(P1.0-P1.7,1-8脚;P2.0-p2.7,21-28脚): 都是上拉电阻的8位准双向I/O端口。每一位可以驱动4个LS 型TTL负载。在访问片外EPROM/ROM时,P2口可以输出高 8位地址。
P3口(P3.0-P3.7,10-17脚):P3口是一个带内部上拉电 阻的8位准双向I/O端口。P3每一位都能驱动4个LS型TTL负 载。P3口的引脚还具有第二功能。
P3口线的第二功能入下表所示
口 线 替代的第二功能 P3.0 RXD(串行口输入) P3.1 TXD(串行口输出) P3.2 INT0(外部中断0输入) P3.3 INT1(外部中断1输入) P3.4 T0(定时器0的外部输入) P3.5 T1(定时器1的外部输入) P3.6 WR(片外数据存储器“写选通控制”输出) P3.7 RD(片外数据存储器“读选通控制”输出)

基于DS18B20的无线温度采集系统

电子系统设计实践报告所用仪器、仪表目录at89s52单片机、nrl14l01收发模块、液晶显示模块实践设计任务在子站进行温度采集,然后通过无线网络发送给主站,在主站的液晶显示器上显示出子站当前的温度。

方案设计与论证1温度采集模块方案一:采用瑞士Sensirion公司研制的SHT11型智能化湿度/温度传感器,它采用CMOSens专利技术(CMOS和传感器技术的融合),外形尺寸小。

它具有I2C 总线接口,接口电路简单,并具有数字式输出、免调试、免标定、一致性好的特点。

其电路原理图如图1所示。

因其价格较贵,所以不采用此方案。

图1 SHT11电路原理图方案二:采用DALLAS公司推出的一线式数字温度传感器DS18B20,该芯片的管脚简单,无需外围硬件设备即可进行温度测量,与单片机交换信息仅需一根I/O 口线,多个DS18B20可以并联到3根或2根线上,实现多点测温。

CPU只需1根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可以节省大量的引线和逻辑电路。

温度测量范围为-55~125℃,固有测温分辨率为0.5℃,符合本设计的要求,可编程为9~12位A/D转换精度,用户可自设定非易失性的报警上下限值,支持多点组网功能。

具有负压特性,电源极性接反时,温度计不会因发热而烧毁,只是不能正常工作而已。

被测量温度用符号扩展的16位数字量方式输出,而且其体积较小,方便焊接,因此采用此方案。

其电路图如图2图2 温度采集电路图2显示电路模块方案一:单片机扫描键盘得到功率预置值,通过IOB高8位接口控制选定数码管,IOB低8位接口控制数码管显示,将该值送到LED显示器中显示。

其硬件原理如图3所示。

此方案设备体积大,功耗大,因此不采用此方案。

图3 LED硬件原理图方案二:显示器LCD 如图4所示,选用JHD1602-B,具有体积小、质量轻、功耗低等优点,单片机四条数据线与其相连,数据分两次传送;两条控制线E、R/S 控制LCD 的显示。

综合实验一 18B20温度采集实验.doc

实验一18B20温度采集实验一、实验目的1. 掌握单片机与1-wire(一线器)的通信原理与编程方法;2. 掌握LED动态显示方法;3.了解温度传感器原理;二、实验原理及实验内容1. 实验原理关于18B20工作原理请读者参考DALLAS公司资料。

89S52控制DS18B20 完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。

必须先启动DS18B20开始转换,再读出温度转换值。

本实验系统挂接一个18B20芯片,可使用默认的12位转换精度,外接供电电源,单片机与18B20接口是用单片机的P2.4。

2.实验内容a.程序要求,参考给出的流程图,在Keil编译环境下变成程序,要求采集温度,如果超出报警温度范围则报警,报警通过实验箱上的蜂鸣器实现,报警温度可以通过键盘设置,最后,生成*.HEX文件。

b.通过ISP将生成的*.HEX文件下载到单片机中,允许程序。

c.观测LCD上的显示温度数据,通过键盘操作控制报警温度。

图8-1 DS18B20温度采集系统流程图三、参考程序//DS18B20温度传感器程序 #include <reg52.h> #define Alarm 10 sbit Beep=P3^4;sbit DQ=P2^4; //数据传输线接单片机的相应的引脚 unsigned char tempL=0,tempH=0; //设全局变量 unsigned char flag=0;unsigned int temperature,negtemper; //温度值保存在temperature 里 unsigned char idata addrdat[2]={0x0,0x0};unsigned char tab[]={0xc0,0xf9,0xa4,0xb0, /* 0 1 2 3 4 */ 0x99,0x92,0x82,0xf8,0x80,0x90}; /* 5 6 7 8 9 */unsigned char tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; unsigned char dispbuf[3]={0,0,0}; unsigned char warning=20; bit on=0,off=1;//******************************//延时子程序//**void delay(unsigned int i){ while(i--);}void beep( bit i){ Beep=i;}//*****************************//初始化程序Init_DS18B20(void){ unsigned char x=0;DQ=1; //DQ先置高delay(8); //稍延时DQ=0; //发送复位脉冲delay(85); //延时(>480us)DQ=1; //拉高数据线delay(14); //等待(15~60us)x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1delay(20);} //***********************//读一个字节ReadOneChar(void) //主机数据线先从高拉至低电平1ms以上,再//使数据线升为高电平,从而产生读信号{unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期//之间必须有1ms以上的高电平恢复期unsigned char dat=0;for (i=8;i>0;i--) //一个字节有8位{DQ=1;delay(1);DQ=0;dat>>=1;DQ=1;if(DQ)dat|=0x80;delay(4);}return(dat);}//***********************//写一个字节WriteOneChar(unsigned char dat){ unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。

基于DS18B20的高精度温度采集、显示系统

2、设计分析及系统方案设计通过DS18B20进行小数11位温度转换、采集,通过单片机读取DS18B20采集到的11位温度值进行二进制到十六进制的转换,利用ZLG7290进行八位数码管显示;利用键盘进入中断来设定报警上、下限,当温度高于上限或低于下限时进入报警子程序。

利用键盘进入中断来查看当前设置的温度报警上下限值,利用ZLG7290和数码管来显示。

主程序不断循环采集温度比较,并可随时进入中断来修改温度上下限和查看温度值。

3、外围接口模块硬件电路功能描述1.DS18B20:用于测定温度,测量范围-55~+125,分辨率为0.0625℃,数据格式为二进制补码形式。

2.ZLG7290B:用于数码管动态显示驱动,键盘扫描管理。

能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键的扫描识别,其中八个键可以作为功能键使用。

接口采用I²C结构。

3.蜂鸣器:这里用作报警,为无源蜂鸣器。

设置DS18B20端口参数THI_WARNING EQU 40HTLI_WARNING EQU 41HTEMPER_FLAG EQU 42H ;温度符号位数据保存区TEMPER_POINT EQU 43H ;温度小数部分数据保存区TEMPER EQU 44H ;温度整数部分数值保存区TEMPER_H EQU 45H ;温度整数部分高位数值保存区TEMPER_L EQU 46H ;温度整数部分低位数值保存区TI_SHOW EQU 47H ;十进制温度整数部分数值保存区T_SAVE EQU 48HTEMPER_NUM EQU 60HFLAG1 BIT 00HDQ BIT P3.3;******************************;设置ZLG7290端口参数;******************************SDA BIT P1.0SCL BIT P1.1WSLA EQU 70HRSLA EQU 71HDISDA EQU 20HDISCON EQU 08H;*********************************ORG 8000HLJMP 8100HORG 8003HLJMP INT_7290;*********************************;初始化部分;*********************************ORG 8100HMOV SP,#60HCLR P1.7LCALL DELAYSETB P1.7;***************************;开中断,设置报警上下限值;**************************MOV TMOD,#11HMOV TL1,#0FCHMOV TH1,#4BHSETB TR1SETB EX0SETB EASETB IT0MOV THI_WARNING,#22HMOV TLI_WARNING,#20H;******************************************************************************;主程序部分;******************************************************************************LP1:LCALL GET_TEMPER ;从DS18B20读取温度数据LCALL TEMPER_COV ;转换读取的温度整数、符号位和小数部分数据并保存LCALL DATA_PRO;数码管显示前对要显示数据的相关处理LCALL LEDSHOW ;数码管显示程序MOV A,TEMPERCJNE A,TLI_WARNING,WAR;判断温度值是否低于报警下限值,低于则报警,不低于则判断WAR:JNC LOOP10;是否大于报警上限值LCALL BUZZL ;蜂鸣器报警程序SJMP LP1LOOP10:CJNE A,THI_WARNING,WAR1;判断温度值是否低于报警下限值,低于则报警,不低于则跳转WAR1:JC LP2LCALL BUZZH ;蜂鸣器报警程序SJMP LP1LP2: LCALL NOTWINKLE;对ZLG7290写入不闪烁控制字LJMP LP1;******************************************************************************;获取DS18B20温度值子程序;******************************************************************************GET_TEMPER:SETB DQBCD:LCALL INIT_1820 JB FLAG1,S22LJMP BCDS22:LCALL DELAY1MOV A,#0CCHLCALL WRITE_1820MOV A,#44HLCALL WRITE_1820LCALL DELAYCBA:LCALL INIT_1820 JB FLAG1,ABCLJMP CBAABC:LCALL DELAY1MOV A,#0CCHLCALL WRITE_1820MOV A,#0BEHLCALL WRITE_1820LCALL READ_18200RETWRITE_1820:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRETREAD_18200:MOV R4,#2MOV R1,#46HRE00:MOV R2,#8RE01:CLR CSETB DQNOPCLR DQNOPNOPSETB DQMOV R3,#2DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;****************************************************************************** ;DS18B20温度值提取整数部分、符号位和小数部分的子程序;******************************************************************************TEMPER_COV:MOV A,#0F0HANL A,TEMPER_LSWAP AMOV TEMPER_NUM,AMOV A,TEMPER_HANL A,#07HSWAP AADD A,TEMPER_NUMMOV TEMPER_NUM,AMOV TEMPER,TEMPER_NUMMOV A,#0FHANL A,TEMPER_LSWAP AMOV TEMPER_POINT,AMOV A,TEMPER_HANL A,#08HSWAP AMOV TEMPER_FLAG,ARET;整数和小数的位偏移数据存储;****************************************************************************** ;30H——37H为数据存储区,其中30H--33H为小数值;34H--35H为整数值,36为百位值,37为符号位值;****************************************************************************** DATA_PRO:MOV 37H,#0AHMOV A,TEMPER_FLAGJZ POSITIVEMOV A,TEMPERCPL AANL A,#7FHADD A,#01HMOV TEMPER,AMOV 37H,#0BH POSITIVE: MOV A,TEMPERCJNE A,64H,SETHUNDREDBIT SETHUNDREDBIT:JC SETHUNDREDBIT1SUBB A,#64HMOV TEMPER,AMOV 36H,#01HSJMP SET1 SETHUNDREDBIT1: MOV 36H,#00HSET1: MOV A,TEMPERMOV B,#10DIV ABMOV 34H,BMOV 35H,AMOV A,TEMPER_POINTCLR CRLC ASWAP ARR AJNZ POINT1MOV 30H,#00HMOV 31H,#00HMOV 32H,#00HMOV 33H,#00HSJMP SHOWPOINT1: DEC AJNZ POINT2MOV 30H,#05HMOV 31H,#02HMOV 32H,#06HMOV 33H,#00HSJMP SHOWPOINT2: DEC AJNZ POINT3MOV 30H,#00HMOV 31H,#05HMOV 32H,#02HMOV 33H,#01HSJMP SHOWPOINT3: DEC AJNZ POINT4MOV 30H,#05HMOV 31H,#07HMOV 32H,#08HMOV 33H,#01HSJMP SHOWPOINT4: DEC AJNZ POINT5MOV 30H,#00HMOV 31H,#00HMOV 32H,#05HMOV 33H,#02HSJMP SHOW POINT5: DEC AJNZ POINT6MOV 30H,#05HMOV 31H,#02HMOV 32H,#06HMOV 33H,#00HSJMP SHOW POINT6: DEC AJNZ POINT7MOV 30H,#00HMOV 31H,#05HMOV 32H,#07HMOV 33H,#03HSJMP SHOW POINT7:MOV 30H,#05HMOV 31H,#07HMOV 32H,#03HMOV 33H,#04H SHOW: JNC SHOW1MOV A,33HADD A,#05H MOV 33H,A SHOW1:RET;****************************************************************************** ;ZLG7290数据显示部分子程序;******************************************************************************LEDSHOW: PUSH 00H PUSH 01H PUSH 02H PUSH 03HPUSH 07MOV DPTR,#LEDSEGCLR AMOV R7,#08HMOV R0,#20HMOV R1,#30H LOOP1:MOV A,@R1MOVC A,@A+DPTR MOV @R0,AINC R1INC R0DJNZ R7,LOOP1MOV A,24HADD A,#01HMOV 24H,ALOOP: MOV R7,#08H MOV R0,#20HMOV R2,#10HMOV R3,#WSLALCALL WRNBYTLCALL DELAY0POP 07HPOP 03HPOP 02HPOP 01HPOP 00HRET;******************************************************************************;延时子程序DELAY0: PUSH 00HPUSH 01HMOV R0,#00H DELAY2: MOV R1,#00H DJNZ R1,$DJNZ R0,DELAY2POP 01HPOP 00HRET DELAY1: MOV R7,#20H DJNZ R7,$RET DELAY: PUSH 00HPUSH 01HMOV R0,#00LP: MOV R1,#00HDJNZ R1,$DJNZ R0,LPPOP 01HPOP 00HRET;****************************************************************************** ;蜂鸣器子程序;******************************************************************************BUZZL:PUSH 04H MOV R4,#200 MOV TL0,#66HMOV TH0,#0FCHSETB TR0LOOP002:JNB TF0,$CLR TF0CPL P3.4MOV TL0,#55HMOV TH0,#0FCHDJNZ R4,LOOP002LCALL TWINKLEPOP 04HRETBUZZH:PUSH 04HMOV R4,#128MOV TL0,#66HMOV TH0,#0FCHSETB TR0LOOP003:JNB TF0,$CLR TF0CPL P3.4MOV TL0,#55HMOV TH0,#0FCHDJNZ R4,LOOP003LCALL TWINKLEPOP 04HRET;****************************************************************************** ;数码管闪烁子程序;******************************************************************************TWINKLE:PUSH 00HPUSH 02HPUSH 03HPUSH 07HMOV 38H,#70HMOV 39H,#0FFHMOV R7,#02HMOV R0,#38HMOV R2,#07HMOV R3,#WSLALCALL WRNBYTMOV 3AH,#00HMOV R7,#01HMOV R0,#3AHMOV R2,#0CHMOV R3,#WSLALCALL WRNBYTPOP 07HPOP 03HPOP 02HPOP 00HRET NOTWINKLE:PUSH 00HPUSH 02HPUSH 03HPUSH 07HMOV 38H,#70HMOV 39H,#00HMOV R7,#02HMOV R0,#38HMOV R2,#07HMOV R3,#WSLALCALL WRNBYTMOV 3AH,#00HMOV R7,#01HMOV R0,#3AHMOV R2,#0CH MOV R3,#WSLA LCALL WRNBYT POP 07HPOP 03HPOP 02HPOP 00H RET;****************************************************************************** ;中断子程序;****************************************************************************** INT_7290:PUSH 00HPUSH 01HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWLCALL NOTWINKLEMOV 50H,#00HMOV 51H,#00HMOV 52H,#00HMOV 53H,#00HMOV 54H,#00HMOV 55H,#00HMOV 56H,#00HMOV 57H,#00HLOOP_1: CLR CLCALL DISP1JB P3.2,$LCALL INITREADMOV A,29HDEC ACJNE A,#0FH,DOWN ;判断是F键吗,是F关中断退出SJMP TAIL1DOWN: CJNE A,#0EH,DOWN1 ;判断是E键吗,是E显示设定的温度上限MOV A,THI_WARNINGMOV B,#10DIV ABMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,AMOV A,BMOVC A,@A+DPTRMOV 50H,AMOV 52H,#12HMOV 53H,#6EHLCALL DISP1JB P3.2,$SJMP TAIL1DOWN1:CJNE A,#0DH,DOWN2 ;判断是D键吗,是D显示设定的温度下限 MOV A,TLI_WARNINGMOV B,#10DIV ABMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,AMOV A,BMOVC A,@A+DPTRMOV 50H,AMOV 52H,#12HMOV 53H,#1CHLCALL DISP1JB P3.2,$SJMP TAIL1DOWN2: CJNE A,#0CH,DOWN3 ;判断是C键吗,是C设定的温度下限MOV 50H,#00HMOV 51H,#00HMOV 52H,#12HMOV 53H,#1CHLCALL SET_TLIMITMOV TLI_WARNING,T_SAVEJB P3.2,$SJMP TAIL1DOWN3:CJNE A,#0BH,TAIL1 ;判断是B键吗,是B设定的温度上限MOV 52H,#12HMOV 53H,#6EHLCALL SET_TLIMITMOV THI_WARNING,T_SAVEJB P3.2,$SJMP TAIL1TAIL1: CLR IE0 ;必须清标志POP PSWPOP ACCPOP 07HPOP 04HPOP 03HPOP 02HPOP 01HPOP 00HRETI;****************************************************************************** ;设置报警温度上下限值子程序;****************************************************************************** SET_TLIMIT:LCALL DISP1AGAIN:JB P3.2,$LCALL INITREADMOV A,29HDEC ACJNE A,#0FH,STEP1SJMP TAILSTEP1:CJNE A,#0DH,STEP2SJMP AGAINSTEP2:CJNE A,#0CH,STEP3 SJMP AGAINSTEP3:CJNE A,#0BH,STEP4 JNC AGAINSTEP4:CJNE A,#0AH,STEP5JNC AGAINSTEP5: MOV T_SAVE,AMOV DPTR,#LEDSEGMOVC A,@A+DPTRMOV 51H,ALCALL DISP1 AGAIN1: JB P3.2,$LCALL INITREAD NOPMOV A,29HDEC ACJNE A,#0FH,STEP11 SJMP TAILSTEP11: CJNE A,#0DH,STEP12 SJMP AGAIN1STEP12: CJNE A,#0CH,STEP13 SJMP AGAIN1 STEP13:CJNE A,#0BH,STEP14 SJMP AGAIN1 STEP14:CJNE A,#0AH,STEP15 SJMP AGAIN1STEP15: MOV 50H,AMOV A,T_SAVEMOV B,#10MUL ABADD A,50HMOV T_SAVE,AMOV A,50HMOV DPTR,#LEDSEGMOVCA,@A+DPTRMOV 50H,ALCALL DISP1TAIL:RET;****************************************************************************** ;数码管显示子程序;******************************************************************************DISP1: PUSH 00H PUSH 02HPUSH 03HPUSH 04HPUSH 07HMOV R7,#08HMOV R0,#50HMOV R2,#10HMOV R3,#WSLA LCALL WRNBYT LCALL DELAY POP 07HPOP 04HPOP 03HPOP 02HPOP 00HRET;****************************************************************************** ;读取键值子程序;******************************************************************************INITREAD:MOV R0,#29H MOV R7,#01H MOV R2,#01HMOV R3,#WSLA MOV R4,#RSLA LCALL RDADD RET;****************************************************************************** ;初始化DS18B20子程序;******************************************************************************INIT_1820:SETB DQNOPCLR DQMOV R0,#80HTSR1:DJNZ R0,TSR1SETB DQMOV R0,#25HTSR2:DJNZ R0,TSR2JNB DQ,TSR3LJMP TSR4TSR3:SETB FLAG1 LJMP TSR5TSR4:CLR FLAG1 LJMP TSR7TSR5: MOV R0,#06BH TSR6:DJNZ R0,TSR6 TSR7:SETB DQRET;*********************************;ZLG7290相关子程序;*********************************;(1)带有内部单元地址的多字节写操作子程序 WRNBYT;******************************************************************* ;通用的I2C通讯子程序(多字节写操作);入口参数R7字节数,R0:源数据块首地址;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写);WRBYT、STOP、CACK、STA;******************************************************************* WRNBYT: PUSH PSWPUSH ACCWRADD: MOV A,R3 ;取外围器件地地址(包含r/w=0)LCALL STA ;发送起始信号SLCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应MOV A,R2LCALL WRBYT ;发送内部寄存器首地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来WRDA: MOV A,@R0LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,WRADD ;如果应答不正确返回重来INC R0DJNZ R7,WRDALCALL STOPPOP ACCPOP PSWRET;(2)带有内部单元地址的多字节读操作子程序 RDADD;******************************************************************* ;通用的I2C通讯子程序(多字节读操作);入口参数R7字节数;;R0目标数据块首地址;R2从器件内部子地址;;R3器件地址(写);R4器件地址(读);WRBYT、STOP、CACK、STA、MNACK;******************************************************************* RDADD: PUSH PSW ;从PCF8563的02H单元读入7个参数PUSH ACC ;存放于20H-26H单元RDADD1: LCALL STAMOV A,R3 ;取器件地址(写)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来MOV A,R2 ;取内部地址LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来LCALL STAMOV A,R4 ;取器件地址(读)LCALL WRBYT ;发送外围地址LCALL CACK ;检测外围器件的应答信号JB F0,RDADD1 ;如果应答不正确返回重来RDN: LCALL RDBYTMOV @R0,ADJNZ R7,ACKLCALL MNACKLCALL STOPPOP ACCPOP PSWRETACK: LCALL MACKINC R0SJMP RDN;(3)I2C各个信号子程序;********************************************************************** ; 启动信号子程序S;**********************************************************************STA: SETB SDA ;启动信号S SETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPCLR SDA NOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLRET;********************************************************************** ; 停止信号子程序P;*********************************************************************STOP: CLR SDA ;停止信号P SETB SCLNOP ;产生4.7US延时NOPNOPNOPNOPSETB SDA NOP ;产生4.7US延时NOPNOPNOPNOPCLR SCLCLR SDARET;********************************************************************** ; 应答信号子程序 MACKMACK: CLR SDA ;发送应答信号ACK SETB SCLNOP ;产生4.7US延时NOPNOP NOPNOPCLR SCL SETB SDA RET;********************************************************************** ; 非应答法信号子程序MNACK;**********************************************************************MNACK:SETB SDA ;发送非应答信号NACK SETB SCLNOP ;产生4.7US延时NOPNOP NOPNOPCLR SCL CLR SDA RET;********************************************************************** ; 应答检测子程序CACK;**********************************************************************CACK: SETB SDA;应答位检测子程序SETB SCLCLR F0MOV C,SDA ;采样SDAJNC CEND;应答正确时转CENDSETB F0;应答错误时F0置一CEND: CLR SCLRET;********************************************************************** ; 发送一个字节子程序WRBYT;**********************************************************************WRBYT: PUSH 06HMOV R6,#08H;发送一个字节子程序WLP: RLC A ;(入口参数A)MOV SDA,CSETB SCLNOP ;产生4.7US延时NOP NOPNOPNOPCLR SCL DJNZ R6,WLP POP 06H RET;********************************************************************** ; 接收一个字节子程序RDBYTRDBYT: PUSH 06HMOV R6,#08H ;接收一个字节子程序RLP: SETB SDASETB SCL; *******************************************NOP ;!!!!!产生大于15微秒的延时!!!!!!NOP ;注意这是专门为ZLG7290NOP ;添加的20微秒延时部分NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOP; ********************************************MOV C,SDAMOV A,R2RLC AMOV R2,ACLR SCLDJNZ R6,RLP ;(出口参数R2)POP 06HRET;********************************************************************** LEDSEG:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H,0FEH,0F6H,00H,02H END。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档