一、设计任务与设计要求 .............................................................................. 1 二、设计原理 ................................................................................................ 1 2.1 主要硬件介绍................................................................................................. 1
2.1.1 DS18B20数字温度传感器 .................................................................. 1 2.1.2 AT89C51单片机芯片.......................................................................... 3 2.2 系统原理结构................................................................................................. 3 三、设计方案 ................................................................................................ 4 3.1 硬件部分......................................................................................................... 4
3.1.1 温度测量模块...................................................................................... 4 3.1.2 LED数码管显示模块 .......................................................................... 4 3.1.3 按键模块.............................................................................................. 5 3.1.4 系统整体结构仿真图.......................................................................... 5 3.2 软件部分......................................................................................................... 5
3.2.1DS18B20传感器程序 ........................................................................... 5 3.2.2键盘读取及确认程序........................................................................... 7 3.2.3DS18B20操作流程图 ........................................................................... 8 四、调试与性能分析 ..................................................................................... 9 4.1 proteus仿真结果 ............................................................................................. 9 4.2实物测试.......................................................................................................... 9
4.2.1正常情况............................................................................................... 9 4.2.2报警状态............................................................................................. 10 五、心得体会 .............................................................................................. 10 六、成品展示 .............................................................................................. 11 七、附录部分 .............................................................................................. 12 附件一、电路设计原理图 ............................................................................ 12 附件二、系统设计原始代码程序 ................................................................. 13
0
一、设计任务与设计要求
本设计主要利用单片机AT89C51 芯片和以美国MAXIM/DALLAS半导体公司的单总线温度传感器DS18B20相结合来实现装置周围温度的采集,其中以单片机AT89C51 芯片为核心,辅以温度传感器DS18B20和LED数码管及必要的外围电路,构成一个结构简单、测温准确、具有一定控制功能的温度监视警报装系统。
功能要求:
添加温度报警功能,通过4个按键来设置温度的上下限值,当用DS18B20测得的温度不在所设置的温度范围内,蜂鸣器开始鸣报。
二、设计原理
2.1 主要硬件介绍
2.1.1 DS18B20数字温度传感器
DS18B20 数字温度传感器提供9~12 位摄氏温度的测量,拥有非易失性用户可编程最高与最低触发点告警功能。DS18B20 通过单总线实现通信,单总线通常是DS18B20 连接到中央微控制器的一条数据线(和地)。它能够感应温度的范围为-55℃~+125℃,在-10℃~+85℃的测量的精度是±0.5℃,而且DS18B20 可以直接从数据线上获取供电(寄生电源)而不需要一个额外的外部电源。
DS18B20 使用DALLAS 独有的单总线(1—wire)协议使得总线通信只需要一根控制线,控制线需要一个较小的上拉电阻,因为所有的期间都是通过三态或开路端口连接在总线上的(DS18B20 是这种情况)。在这种总线系统中,微控制器(主器件)识别和寻址挂接在总线上具有独特64 位序列号的器件。因为每个器件拥有独特的序列号,因此挂接到总线上的器件在理论上是不受限制的,单总线(1-wire)协议包括指令的详细解释和“时隙”。这个数据表包含在单总线系统(1-WIRE BUS SYSTEM)部分。DS18B20 的另外一个特征是能够在没有外部供电的情况下工作。当总线为高的时候,电源有上拉电阻通过DQ 引脚提供,高总线信号给内部电容(Cpp)充电,这就使得总线为的时候给器件提供电源,这种从单总线上移除电源的方法跟寄生电源有关,作为一种选择,DS8B20 也可以采用引脚VDD 通过外部电源给器件供电。
DS18B20 引脚定义:
(1) GND为电源地;
(2) DQ为数字信号输入/输出端; (3)VDD 为外接供电电源输入端(在寄生电源接线方式时接地)
图2.1.1 DS18B20 引脚排列图
1
DS18B20温度测量
DS18B20 测温原理如图2.1.2所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2 的脉冲输入。计数器1 和温度寄存器被预置在-55℃所对应的一个基数值。计数器1 对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1 的预置值减到0 时,温度寄存器的值将加1,计数器1 的预置将重新被装入,计数器1 重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2 计数到0 时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2.1.2 中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器
图2.1.2 DS18B20 测温原理框图 1 的预置值。
DS18B20工作时序
DS18B20需要严格的单总线协议以确保数据的完整性。协议包括集中单总线信号类型:复位脉冲、存在脉冲、写0、写1、读0 和读1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。 和DS18B20间的任何通讯都需要以初始化序列开始。一个复位脉冲跟着一个存在脉冲表明DS18B20已经准备好发送和接收数据。在初始化序列期间,总线控制器拉低总线并保持480us以发出(TX)一个复位脉冲,然后释放总线,进入接收状态(RX)。单总线由5K上拉电阻拉到高电平。当DS18B20探测到I/O引脚上的上升沿后,等待15-60us,然后发出一个由60-240us低电平信号构成的存在脉冲DS18B20的数据读写是通过时序处理位来确认信息交换的。 有两种写时序:写1时序和写0时序。总线控制器通过写1时序写逻辑1到DS18B20,写0时序写逻辑0到DS18B20。所有写时序必须最少持续60us,包括两个写周期之间至少1us的恢复时间。当总线控制器把数据线从逻辑高电平拉到低电平的时候,写时序开始。 总线控制器要生产一个写时序,必须把数据线拉到低电平然后释放,在写时序开始后的15us释放总线。当总线被释放的时候,5K的上拉电阻将拉高总线。总控制器要生成一个写0时序,必须把数据线拉到低电平并持续保持(至少60us)。 总线控制器初始化写时序后,DS18B20在一个15us到60us的窗口内对I/O线采样。如果线上是高电平,就是写1。如果线上是低电平,就是写0。 总线控制器发起读时序时,DS18B20仅被用来传输数据给控制器。因此,总线控制器在发出读暂存器指令[BEh]或读电源模式指令[B4H]后必须立刻开始读时序,DS18B20可以提供请求信息。除此之外,总线控制器在发出发送温度转换指令[44h]或召回EEPROM指令[B8h]之后读时序。 所有读时序必须最少60us,包括两个读周期间至少1us的恢复时间。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放在总线控制器发出读时序后,DS18B20 通过拉高或拉低总线上来传输1或0。当传输逻辑0结束后,总线将被释放,通过上拉电阻回到上升沿状态。从DS18B20输出的数据在读时序的下降沿出现后15us 内有效。因
2
此,总线控制器在读时序开始后必须停止把I/O脚驱动为低电平15us,以读取I/O脚状态。
2.1.2 AT89C51单片机芯片
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。ATC9C51的引脚排列图如图2.1.3。
主要参数如下:
·与MCS-51产品指令系统完全兼容 ·4k字节可重擦写Flash闪速存储器 ·1000次擦写周期
·全静态操作:0Hz-24MHz
·三级加密程序存储器 ·128×8字节内部RAM ·32个可编程I/O口线 ·2个16位定时/计数器
·6个中断源 ·可编程串行UART通道
·低功耗空闲和掉电模 图2.1.3 AT89C51的引脚排列
2.2 系统原理结构
系统主要由硬件和软件两大部分构成,当接收到系统发出的温度转换命令后, DS18B20开始进行温度转换操作并把转化后的结果放到16 位暂存寄存器中的温度寄存器内,然后与系统进行数据通信,系统将温度读出并驱动LED数码管显示当前温度。如果温度值低于设定下限值或高于设定上限值,则自动启动报警装置。由于DS18B20单总线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。该系统整体原理结构图如下: LED温度显示 DS18B20 º AT89C51 电源 蜂鸣器 上限+键 上限-键 下限+键 下限-键
图2.2.4 系统结构原理图
3
三、设计方案
3.1 硬件部分
3.1.1 温度测量模块
温度测量传感器采用DALLAS公司DS18B20的单总线数字化温度传感器 测温范围为-55℃~125℃,可编程为9位~12位A/D转换精度,测温分辨率达到0.0625℃,采用寄生电源工作方式,CPU只需一根口线便能与DS18B20通信,占用CPU口线少,可节省大量引线和逻辑电路,接口电路如图3.1.1所示。
图3.1.1 DS18B20温度测量模块
3.1.2 LED数码管显示模块
采用LED作为显示器,尽可能的把温度等信息通过LED显示出来,速率比较快,显示更直观。
图3.1.4 LCD1602显示模块
4
3.1.3 按键模块
方案一:矩阵键盘 如果选择此方案,那么在修改温度上下限或其他功能键就可以直接从键盘输入,方便、快捷。缺点也很明显,一是浪费按键,用全键盘来实现功能不免大材小用;二是从实用性考虑,全键盘体积大,不经济不方便。
方案二:独立式按键
如果设置过多按键,将会占用较多I/O口,而且会给布线带来不便,同时浪费按键,不高效,程序繁琐。本次设计适用于按键较少的情况。
为了尽量实现按键的高效性,此次设计采用四个独立式按键,分别定义为key1(上限温度加数键)、key2(上限温度减数键)、key3(下限温度加数键)、key4(下限温度减数键)。
3.1.4 系统整体结构仿真图
图3.1.6 系统整体结构仿真图
3.2 软件部分
3.2.1DS18B20传感器程序 (1)DS18B20初始化函数
void rst_ds18b20(void) {
DQ=1;
Delay_18b20(4); DQ=0;
Delay_18b20(100);
5
DQ=1;
Delay_18b20(40); }
(2)读取DS18B20数据函数 uchar read_ds18b20(void) {
uchar i=0; uchar dat=0; for(i=8;i>0;i--) { DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80;
Delay_18b20(10); }
return(dat); }
(2)向DS18B20中写入数据函数void write_ds18b20(uchar wdata) {
uchar i=0; for(i=8;i>0;i--) { DQ=0;
DQ=wdata&0x01; Delay_18b20(10); DQ=1;
wdata>>=1; } }
(3)读取温度值并转换函数
void read_ds18b20_temp(void) {
uchar a,b; rst_ds18b20();
write_ds18b20(0xcc); write_ds18b20(0x44); rst_ds18b20();
write_ds18b20(0xcc);
// 跳过读序号列号的操作// 启动温度转换 6
write_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器) a=read_ds18b20(); b=read_ds18b20(); tvalue=b; tvalue<<=8; tvalue=tvalue|a;
tvalue=tvalue*(0.625); }
(4)温度显示函数
void Display_ds18b20() {
dispbuf[7]=Tbottom/100; dispbuf[6]=Tbottom%100/10; dispbuf[5]=16;
dispbuf[4]=tvalue/100;
dispbuf[3]=tvalue%100/10; dispbuf[2]=16;
dispbuf[1]=Ttop/100;
dispbuf[0]=Ttop%100/10; }
3.2.2键盘读取及确认程序 (1)键盘消抖函数 void keyscan() {
uchar temp=0; //临时变量 if(keytemp!=0xff) temp=keytemp; if(temp==0) {
keyup=1; //按键已经放开 keyback=0; //清除按键备份值 keyval=0; }
else if(temp==keyback&&keyup==1) //两次的检测的值一样且按键已经放开 {
keyval=temp; //存放按键值 keyup=0; }
else //按键已经执行且还没放开 keyback=temp; //把新的键值放入备份单元 }
7
(2)设置key1、key2为上限调节键,设置key3、key4为下限调节键 void Key_job() {
keyscan();
switch(keyval) { case 0x7f: if(flag==1){Ttop+=10;flag=0;}break; case 0xb7: if(flag==1){Ttop-=10;flag=0;}break; case 0xcf: if(flag==1){Tbottom+=10;flag=0;}break; case 0xdf: if(flag==1){Tbottom-=10;flag=0;}break; default:flag=1;break; } }
3.2.3DS18B20操作流程图 开始 初始化DS18B20 读DS18B20序列号 检测DS18B20N 存在?
Y
发送跳过ROM指令
温度转换 初始化DS18B20
发送DS18B20编码
读取温度数据
图3.2.1 DS18B20操作流程图
8
四、调试与性能分析
4.1 proteus仿真结果
图4.1.1 系统proteus仿真结果
如图所示,点击开始运行仿真时, LED数码管上从左到右分别显示设置温度下限为10度,中间显示DS18B02温度传感器采集温度为15度,右侧显示设置温度上限为20度。其中上限与下限值可通过按键更改。
4.2实物测试
4.2.1正常情况
图4.2.1 温度正常时显示情况
如图所示,此时温度报警下限为5度,上限为17度,而DS18B02温度传感器采集温度为13度,处于设定温度上下限之间,蜂鸣器未报警,系统工作正常。
9
4.2.2报警状态
图4.2.2温度高于上限时显示情况
如图所示,此时温度报警下限为5度,上限为11度,而DS18B02温度传感器采集温度为13度,高于设定的上限温度,蜂鸣器报警,系统工作正常。
五、心得体会
在老师的指导和同学的帮助下,经过不懈的努力,终于成功完成了此次设计任务,基本实现设计要求,读出并显示DS18B20采集的温度,能够在温度超过限定温度是通过蜂鸣器报警,并且可以实现通过按键设置温度上下限。但是系统还存在许多可以改进的地方、还有许多可以扩展的功能比如用LCD液晶显示器更精确清除的显示温度和警报信息等。
通过这次独立的系统设计经验,我加深了对单片机理论的理解,学会如何将理论应用到实践,我还明白了在设计前,要有一个清晰的思路和一套高效的设计实施方案,在设计过程中要严格按照既定大的方案执行,才不会在过程中出现混乱,比如设计的程序功能与硬件设备不符等情况。
最后,我认识到不管做什么设计,都要有坚实的理论知识作基础,其次要提高我们自己的创新思维及动手能力,希望以后通过更努力的学习和锻炼让自己获得更大的能力提升。
10
六、成品展示
11
七、附录部分
附件一、电路设计原理图
设计电路原理图
12
附件二、系统设计原始代码程序
/************************************************ DS18B20监测警报 作者:XXX 班级:XXXXXXXXXXX 功能如下:实现基本测温功能
通过四个按键,可设置高低限温度,不在所
设定温度范围内,将蜂鸣器和屏幕显示报警
*************************************************/ #include uchar code ledtable[]= {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F, 0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0xfd}; uchar dispbuf[8]; uchar keytemp=0; //定义且给扫描键值赋初始值0 uchar keyval=0; //定义且给键值赋初始值0 uchar keyback; //定义一个备份键值 bit keyup; //定义一个按键值 uint Ttop=150; uint Tbottom=50; uint tvalue; uchar flag; void Delayms(uint i) //延时函数 { uint j; for(;i>0;i--) for(j=123;j>0;j--); } void Delay_18b20(uint i) { while(i--); } 13 void Read_Key() { keytemp<<=1; if(Key_Input) { keytemp++; } } void keyscan() { if(keytemp==0xff) { keyup=1; keyback=0; keyval=0; flag=1; } else if(keytemp==keyback&&keyup==1) { keyval=keytemp; keyup=0; keyback=0; } else { keyback=keytemp; } } void Key_job() //读取键值 { keyscan(); switch(keyval) { case 0x7f: if(flag==1){Ttop+=10;flag=0;}break; case 0xb7: if(flag==1){Ttop-=10;flag=0;}break; case 0xcf: if(flag==1){Tbottom+=10;flag=0;}break; case 0xdf: if(flag==1){Tbottom-=10;flag=0;}break; default:flag=1;break; } } 14 void rst_ds18b20(void) //DS18B20初始及设置函数 { DQ=1; Delay_18b20(4); DQ=0; Delay_18b20(100); DQ=1; Delay_18b20(40); } uchar read_ds18b20(void) { uchar i=0; uchar dat=0; for(i=8;i>0;i--) { DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; Delay_18b20(10); } return(dat); } void write_ds18b20(uchar wdata) //{ uchar i=0; for(i=8;i>0;i--) { DQ=0; DQ=wdata&0x01; Delay_18b20(10); DQ=1; wdata>>=1; } } void read_ds18b20_temp(void) //{ uchar a,b; rst_ds18b20(); write_ds18b20(0xcc); write_ds18b20(0x44); rst_ds18b20(); write_ds18b20(0xcc); 向DS18B20中写入数据读取温度值 15 write_ds18b20(0xbe); a=read_ds18b20(); b=read_ds18b20(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; tvalue=tvalue*(0.625); } void Display_ds18b20() //温度显示函数 { dispbuf[7]=Tbottom/100; dispbuf[6]=Tbottom%100/10; dispbuf[5]=16; dispbuf[4]=tvalue/100; dispbuf[3]=tvalue%100/10; dispbuf[2]=16; dispbuf[1]=Ttop/100; dispbuf[0]=Ttop%100/10; } void Close_led() { uchar i; for(i=0;i<8;i++) { LEDCLK=0; LEDDIN=1; _nop_(); LEDCLK=1; } } void Warning() //温度警报函数 { if(Tbottom>tvalue) { Delayms(2); sound=0; Delayms(2); sound=1; } else if(tvalue>Ttop) { sound=0; Delayms(2); 16 sound=1; } else { sound=1; } } main() { Close_led(); read_ds18b20_temp(); Delayms(1000); read_ds18b20_temp(); sound=1; while(!0 ) { uchar j; LEDCLK=0; LEDDIN=0; _nop_(); LEDCLK=1; read_ds18b20_temp(); Display_ds18b20(); for(j=0;j<8;j++) { P0=0XFF; P0=ledtable[dispbuf[j]]; Delayms(1); P0=0XFF; Read_Key(); LEDCLK=0; LEDDIN=1; _nop_(); LEDCLK=1; } keyscan(); Key_job(); Warning(); } } 17 因篇幅问题不能全部显示,请点此查看更多更全内容