单片机课程设计之温控系统附源代码资料_第1页
单片机课程设计之温控系统附源代码资料_第2页
单片机课程设计之温控系统附源代码资料_第3页
单片机课程设计之温控系统附源代码资料_第4页
单片机课程设计之温控系统附源代码资料_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目 录一、实验任务与要求二、 总体设计三 、硬件模块介绍1. 单片机模块介绍2. 温度传感器3. 数码管4. 报警电路四 程序设计1. 温度传感器初始化程序2. 温度测量3. 数码管显示4.温度报警5、 程序流程图6、 实验调试7、 实验总结一、实验任务与要求1. 利用用单片机完成温度的测量并显示2. 了解温度传感器的工作原理3. 了解锁存器的工作原理4. 理解数码管的显示原理二、 总体设计利用单片机接收温度传感器传过来的温度值并经过数值处理以动态方式显示于数码管上,利用while函数循环检测温度值,当温度值高于设定值时启动报警电路,报警电路主要由蜂鸣器实现。三 、硬件模块介绍1.单片机模块介

2、绍实验中采用的是89C52。该单片机是INTEL公司MCS-51系列单片机中基本的产品,它采用ATMEL公司可靠的CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于89C51增强型单片机版本。具有以下特点:· 标准MCS-51内核和指令系统· 片内8kROM(可扩充64kB外部存储器)· 32个双向I/O口· 256x8bit内部RAM(可扩充64kB外部存储器)· 3个16位可编程定时/计数器·

3、; 时钟频率3.5-12/24/33MHz· 向上或向下定时计数器· 改进型快速编程脉冲算法· 6个中断源· 5.0V工作电压· 全双工串行通信口· 布尔处理器帧错误侦测· 4层优先级中断结构自动地址识别· 兼容TTL和CMOS逻辑电平· 空闲和掉电节省模式· PDIP(40)和PLCC(44)封装形式原理图如下:2.温度传感器1.概述温度传感器采用的是由美国Dallas 半导体公司生产的数字化温度传感器DS1820 。它是是世界上第一片支持 "一线总线"接口的温度传感器,在

4、其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。2.特点(1) 适应电压范围更宽,电压范围:3.05.5V,在寄生电源方式下可由数据线供电; (2) 独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯; (3) DS18B20 支持多点组网功能,多个DS18B20 可以并联在唯一的三线上,实现组网多点测温; (4) DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内; (5) 温范围55125,在-10+85时精度为±0.

5、5; (6) 可编程的分辨率为912 位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温; (7) 在9 位分辨率时最多在93.75ms 内把温度转换为数字,12 位分辨率时最多在750ms 内把温度值转换为数字,速度更快; (8) 测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC 校验码,具有极强的抗干扰纠错能力; (9) 负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。 3.结构组成DS18B20 内部结构主要由四部分组成:64 位光刻ROM、温度传感器、非挥发的温度报警触发器TH 和TL

6、、配置寄存器。DS18B20 的管脚排列如右图所示:DS18B20 引脚定义:(1) GND为电源地;(2) DQ为数字信号输入/输出端;(3)VDD 为外接供电电源输入端(在寄生电源接线方式时接地)。原理图如下:4.工作原理DS18B20 测温原理如图20所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2 的脉冲输入。计数器1 和温度寄存器被预置在55所对应的一个基数值。计数器1 对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1 的预置值减到0 时,温度寄存器的值将加1,计数器1

7、的预置将重新被装入,计数器1 重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2 计数到0 时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。低温度系数晶振高温度系数晶振计数器2斜率累加器计数器1预置比较预置=0=0温度寄存器加1停止LSB置位/清除3.数码管 数码管的作用是显示温度数值。数码管接法有共阴极接法和共阳极接法。二者接法的区别在于共电源与共地,相同字符编码显示正好相反,在本次设计中采用的是八段共阴极数码管。使用数码管时,要注意区分这两种不同的接法。为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段,因此为LED显示器提供

8、的编码正好是一个字节。根据电路连接图显示16进制数的编码显示于下图。 数码管的显示方式有两种,分别为动态显示和静态显示。动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。 静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用C

9、PU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。根据实验要求,需要实时显示当前温度值,所以采用的是动态显示方式,这里需要用到锁存器,锁存器的作用是将单片机端口分时复用。这里采用的是74HC573。左边接单片机数据输出端,右边接数码管数据输入端。LE为芯片使能端,高电平时选中该芯片工作。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。 实验中采用两个74HC573,作用分别是负责数码管的段选和位选,段选是选择亮哪段,显示什么字符。位选则是选择哪一片数码管亮。由于此温度采集系统需要至少三个数码管显示温度,必须要有位选。原理图如下:5. 报警电路报警电路则采用蜂鸣器电路负责

10、报警。如右图所示,当外界温度高于设定值时,FM置于高电平,三极管导通,蜂鸣器工作产生报警声音。四程序设计1.温度传感器初始化程序void Init_Ds18b20(void) /DS18B20初始化DQ = 1; /DQ复位,不要也可行。delay(1); /稍做延时DQ = 0; /单片机拉低总线delay(250); /精确延时,维持至少480usDQ = 1; /释放总线,即拉高了总线delay(100); /此处延时有足够,确保能让DS18B20发出存在脉冲。2.温度测量uint Get_Tmp() /获取温度get the temperaturefloat tt;uchar a,b;

11、Init_Ds18b20(); /初始化Write_One_Byte(0xcc); /忽略ROM指令Write_One_Byte(0x44); /温度转换指令Init_Ds18b20(); /初始化Write_One_Byte(0xcc); /忽略ROM指令Write_One_Byte(0xbe); /读暂存器指令a = Read_One_Byte(); /读取到的第一个字节为温度LSBb = Read_One_Byte(); /读取到的第一个字节为温度MSBtemp = b; /先把高八位有效数据赋于temptemp <<= 8; /把以上8位数据从temp低八位移到高八位tem

12、p = temp|a; /两字节合成一个整型变量tt = temp*0.0625; /得到真实十进制温度值 /因为DS18B20可以精确到0.0625度 /所以读回数据的最低位代表的是0.0625度temp = tt*10+0.5; /放大十倍 /这样使小数点后第一位也转换为可显示数字 /同时进行一个四舍五入操作。return temp;3.数码管显示void Display(uint temp) /显示程序uchar A1,A2,A3;A1 = temp/100; /百位A2 = temp%100/10; /十位A3 = temp%10; /个位dula = 0;P0 = tableA1;

13、/显示百位dula = 1; /打开段选,对应74573的锁存位,高电平不锁存dula = 0;wela = 0;P0 = 0xfe;wela = 1; /打开位选wela = 0;delay(0);dula = 0;P0 = table1A2; /显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)dula = 1;dula = 0;wela = 0;P0 = 0xfd;wela = 1;wela = 0;delay(0);P0 = tableA3; /显示个位dula = 1;dula = 0;P0 = 0xfb;wela = 1;wela = 0;del

14、ay(0);4.温度报警 if(temp>=almtemp) beepon();/若温度大于almtemp设定值,启动报警,否则关闭elsebeepoff();五.程序流程图 六.实验调试本次实验已经基本实现了温度的实时显示,精确于小数点后一位,并可以产生报警。实验效果如下:七实验总结通过本次实验,让我对80C52单片机有了更好的了解。对数码管显示,锁存器温度传感器工作原理等有了更深的理解,能够利用单片机完成温度显示报警系统的设计。附程序代码:#include <reg52.h>#include <intrins.h>#define uchar unsigned

15、char#define uint unsigned int#define almtemp 200sbit DQ = P22; /数据口define interfacesbit dula = P26; /数码管段选sbit wela = P27; /数码管位选sbit beep=P23; /报警uint temp; /温度值 variable of temperature/不带小数点unsigned char code table = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;

16、/带小数点,共阴unsigned char code table1 = 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;/*精确延时函数*/void delay(unsigned char i) while(-i); /*此延时函数针对的是12Mhz的晶振delay(0):延时518us 误差:518-2*256=6delay(1):延时7us (原帖写"5us"是错的)delay(10):延时25us 误差:25-20=5delay(20):延时45us 误差:45-40=5delay(100):延时205us 误差:2

17、05-200=5delay(200):延时405us 误差:405-400=5*/*DS18B20*/void Init_Ds18b20(void) /DS18B20初始化send reset and initialization commandDQ = 1; /DQ复位,不要也可行。delay(1); /稍做延时DQ = 0; /单片机拉低总线delay(250); /精确延时,维持至少480usDQ = 1; /释放总线,即拉高了总线delay(100); /此处延时有足够,确保能让DS18B20发出存在脉冲。uchar Read_One_Byte() /读取一个字节的数据read a b

18、yte date /读数据时,数据以字节的最低有效位先从总线移出uchar i = 0;uchar dat = 0;for(i=8;i>0;i-) DQ = 0; /将总线拉低,要在1us之后释放总线 /单片机要在此下降沿后的15us内读数据才会有效。 _nop_(); /至少维持了1us,表示读时序开始 dat >>= 1; /让从总线上读到的位数据,依次从高位移动到低位。 DQ = 1; /释放总线,此后DS18B20会控制总线,把数据传输到总线上 delay(1); /延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分 if(DQ

19、) /控制器进行采样 dat |= 0x80; /若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0 delay(10); /此延时不能少,确保读时序的长度60us。return (dat);void Write_One_Byte(uchar dat)uchar i = 0;for(i=8;i>0;i-) DQ = 0; /拉低总线 _nop_(); /至少维持了1us,表示写时序(包括写0时序或写1时序)开始 DQ = dat&0x01; /从字节的最低位开始传输 /指令dat的最低位赋予给总线,必须在拉低总线后的15us内, /因为15us后DS

20、18B20会对总线采样。 delay(10); /必须让写时序持续至少60us DQ = 1; /写完后,必须释放总线, dat >>= 1; delay(1);uint Get_Tmp() /获取温度get the temperaturefloat tt;uchar a,b;Init_Ds18b20(); /初始化Write_One_Byte(0xcc); /忽略ROM指令Write_One_Byte(0x44); /温度转换指令Init_Ds18b20(); /初始化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; /两字节合成一个整型变量tt = temp*0.0625; /得到真实十进制温度值 /因为DS18B20可以精确到0.0625度 /

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论