数字温度计设计报告_第1页
数字温度计设计报告_第2页
数字温度计设计报告_第3页
数字温度计设计报告_第4页
数字温度计设计报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、电子时钟实验报告数字温度计实验报告一, 实验目的1. 学习80C52单片机的内部的定时器及各接口的功能及应用。 2. 设计任务及要求利用实验平台上LED数码管和蜂鸣器设计具有最低、最高温度查询,实时显示和报警功能的数字温度器。二,实验要求 基本要求:1:能够实时显示环境温度。2:能够保存使用时间内的最大值和最小值,能够查阅。3:有温度报警功能,能够设置报警温度。用绿灯表示正常温度,红灯表示报警同时发声。扩展功能:查询最低和最高温度时,指示灯蓝灯和黄灯分别表示当前先显示的是高温还是低温。三,实验基本原理利用单片机定时器完成报警检测功能。每隔一段时间定时器0对当前温度值进行检测,当超过设定温度30

2、度时红灯亮并发生报警。为了将时间在LED数码管上显示当前温度,采用动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。该设计采用四按键输入,当按键1(2)按下,可分别查看当前最低(最高)温度。四,实验设计分析针对要实现的功能,采用AT89S52单片机和ds18b20温度传感器进行设计,AT89S52 单片机是一款低功耗,高性能CMOS8位单片机,它有以下特点:1、拥有灵巧的8位C

3、PU和在系统可编程Flash2、晶片内部具时钟振荡器(传统最高工作频率可至 12MHz)3、内部程序存储器(ROM)为 8KB4、内部数据存储器(RAM)为 256字节5、32 个可编程I/O 口线6、8 个中断向量源7、三个 16 位定时器/计数器8、三级加密程序存储器9、全双工UART串行通道Ds18b20管脚图为:ds18b20管脚图DS18B20的引脚功能:DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地。它具有如下特点:(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 (

4、2)在使用中不需要任何外围元件。 (3)可用数据线供电,电压范围:+3.0 +5.5 V。 (4)测温范围:-55 +125 。固有测温分辨率为0.5 。 (5)通过编程可实现912位的数字读数方式。 (6)用户可自设定非易失性的报警上下限值。 (7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为温度获取程序,中断程序,显示程序,延时程序等。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹

5、配会出现意想不到的错误。首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要蜂鸣器,led灯和数码管电路等。第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连

6、接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!五,实验要求实现A.电路设计1. 整体设计此次设计主要是应用单片机来设计数字温度计,硬件部分主要分以下电路模块:输出电路用8个共阴数码管、四个led灯和蜂鸣器显示,键盘进行温度设置报警温度。电路的总体设计框架如下:单片机输入部分晶振和复位输出部分2. 分块设计模块电路主要分为:输入部分、输出部分、及温度读取电路。2.1 输入部分输入部分外电路输入部分主要用于查询当前最低和最高温度。KEY1KEY2分别控制最低和最高温度的显示。2.2 输出部分输出部分本电路的输出信号为7段

7、数码管的位选和段选信号,蜂鸣器信号,提示灯信号。本实验的数码管是共阴的,为了防止段选信号不能驱动数码管,故在P1口连接上拉电阻后,再送段选信号,以提高驱动,位选信号直接从P2口接入。程序将获得的温度实时地显示在数码管上;当温度超过设定的数值时,红灯亮,蜂鸣器响。当查询最低温度时,蓝灯亮,最高温度时绿灯亮。晶振与复位电路本实验单片机时钟用内部时钟,模块如下:温度检测模块:DQ接P1.0,用于单总线传送。温度读取模块主程序如下:sendChangeCmd(); tempValue1 = getTmpValue(); temp = abs(tempValue1); tempL=(tempL >

8、 temp ? temp :tempL ); tempH=(tempH < temp ? temp :tempH ); if(KEY1=0)temp= tempL; test1=0; EA=0; while(j-)display();EA=1; if(KEY2=0) temp= tempH; test2=0; EA=0; while(j-)display(); EA=1; 报警检测设定在中断定时器0中:void timer0() interrupt 1 /中断,温度高于3000,就报警int k=30;if(temp>3000)while(k-)beeping(); /beep=0

9、; led=0;else led=1;beep=1;display();TH0=th0; TL0=tl0; 各模块拼接组合,电路总体设计图如下:B.程序设计B.1 程序主要模块中断服务程序void timer0() interrupt 1 /中断,温度高于3000,就报警int k=30;if(temp>3000)while(k-)beeping(); /beep=0; led=0;else led=1;beep=1;display();TH0=th0; TL0=tl0; B.2主程序定时器初始化 温度转换启动 主循环(温度转换->温度处理>报警检测) void main()

10、/dio=0;Init_timer0();/*dispbuf5=0xf;dispbuf4=0xf;dispbuf3=0xf;dispbuf2=0;dispbuf1=0;dispbuf0=0;*/ sendChangeCmd(); tempValue1 = getTmpValue(); temp = abs(tempValue1); tempL=temp; tempH=temp; KEY5=0;while(1) uint j=200,k=1000;/启动温度转换 sendChangeCmd(); tempValue1 = getTmpValue(); temp = abs(tempValue1)

11、;/ if(temp>10000)while(k-)beeping(); /beep=0;/led=0;/ /temp=getTmpValue(); tempL=(tempL > temp ? temp :tempL ); tempH=(tempH < temp ? temp :tempH ); if(KEY1=0)temp= tempL; test1=0; EA=0; while(j-)display();EA=1; if(KEY2=0) temp= tempH; test2=0; EA=0; while(j-)display(); EA=1; B.3显示子程序8个数码管轮

12、流进行显示,分别显示1ms,依赖人的视觉 暂留效应,给人以数码管持续高亮的错觉。该段程序如下:void display() uchar tmp;uchar tmp1;staticuchar count;P3=0XFF;tmp=dispbitcount;tmp1=tmp;P3&=tmp;/we=0;/WEI操作/du=1;/duan操做tmp=dispbuf5-count;if(tmp1=0xf7)tmp=disptabwithdottmp;elsetmp=disptabtmp;P0=tmp;count+;if(count=6)count=0;/unsigned int temp = a

13、bs(tempValue); dispbuf0 = temp/ 10000; dispbuf1 = temp % 10000 / 1000; dispbuf2 =temp % 1000 / 100; dispbuf3 = temp % 100 / 10; dispbuf4 = temp % 10; / TH0=th0;/TL0=tl0; 程序调试本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件。程序再编译过程中可以发现错位,并及时改正,在设计时非常重要,使错误被扼杀在摇篮中。通过Keil和硬件仿真平台Proteus的联合,可以将设计效果仿真出来,根据效果,有目的的改变设计,

14、优化程序。c. 利用Keil软件实验过程截图:c.1汇编程序,并生成HEX文件c.2 利用下载线将文件调入电路板调试,运行结果如下: 下图为温度实时显示结果:下图为温度报警结果:D电路板连接实现通过软,硬件设计和仿真,基本上实现了自己想要的功能,就可以真刀真枪的干一场了。软件通过调试基本上是没问题的,但是硬件仿真过于泛泛,对电路的细节要求不是那么高,有些问题是不能发现的,最后的实现效果还是要用实物来验证的。元器件的购买是个苦活,虽然中发市场那么大,但那些元件才是我要的那个它呢?我们购买的量少,对于那些元器件厂家来说,根本不屑做我们的生意,根本不用说砍价了。经过一番“跋涉”,终于搜刮齐了元器件。

15、根据以往经验,焊接电路的布线非常重要,首先要在电路板上将线的大致走向规划好,如何美观,精简是要领。一下是本次试验的硬件电路实现五.实验总结及感想通过这几周的软、硬件设计,不仅加深了我们对理论知识的理解,培养了我们的实践动手能力,还锻炼了我们遇到问题解决问题的能力。从开始接到任务时的无从下手,到小组成员各司其职,搜集资料,学习新知识,相互讨论,分析交流,解决好问题的这个过程本身就是对我们的锻炼。此次设计课不同于一般理论课的地方就在于要求我们的并非只是单纯的懂得理论知识,更重要的是小组成员间的团结协作精神以及将理论知识用于实践的能力,由于在实际中,存在各种各样的因素,即使我们有着正确的原理图、软件

16、程序等也不一定能得出正确的结果,正如调试时产生的问题一样,这就需要我们有耐心去分析各种可能存在因素以达到解决问题的最终目的,当然这其中肯定少不了老师的指导和帮助 。这次真得要感谢我们组组长和小组成员,几周以来,我们共同度过了很多困难的时光,也共同收获了很多。通过这次课程设计我们学到了很多东西,培养了我们的自学能力,接受新事物的心态,以及遇到问题时戒骄戒躁的良好心态和虚心向同学、老师请教自己不会的问题,更重要的是小组成员间的团结协作,相互鼓励,做好分配给自己的任务,用心做每一件事而非应付过关的消极态度。从最初的连线到最终程序的不断,排错,改进,大家的能力真得提高了不少。总之,此次设计课使我们受益

17、匪浅。附:总程序#include<intrins.h>#include <math.H> /要用到取绝对值函数abs()#define uchar unsigned char #define uint unsigned intsbit KEY1=P24;sbit KEY2=P25;sbit KEY3=P26;sbit KEY4=P27;sbit KEY5=P23;sbit test1=P36;sbit test2=P37;sbit beep=P15;sbit led=P12;/sbit du=P26; /sbit dio=P25;sbit ds=P10;/sbit ds

18、=P22;int tempValue1;unsigned int temp;unsigned int tempH;unsigned int tempL;uchar code th0=(65535-3000)/256;uchar code tl0=(65535-3000)%256;uchar dispbuf6;uchar code disptab=0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x0;uchar code disptabwithdot=0xbf,0x86,0xdb,0x

19、cf,0xe6,0xed,0xfd,0xa7,0xff,0xef,0xf7,0xfc,0xb9,0xf9,0xf1;uchar code dispbit=0xfe,0xfd,0xfb,0xf7,0xef,0xdf;/1111 1110,1111 1101,1111 1011,1111 0111,1110 1111,1101 1111;/延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.void display();void beeping(); void delay(unsigned int i) unsigned int j; while(i-) for(j = 0

20、; j < 125; j+); void dsInit() /对于11.0592MHz时钟, unsigned int型的i, 作一个i+操作的时间大于1us unsigned int i; ds = 0; i = 100; /拉低约800us, 符合协议要求的480us以上 while(i>0) i-; ds = 1; /产生一个上升沿, 进入等待应答状态 i = 4; while(i>0) i-; void dsWait() unsigned int i; while(ds); while(ds); /检测到应答脉冲 i = 4; while(i > 0) i-;/

21、向DS18B20读取一位数据/读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,/之后DS18B20则会输出持续一段时间的一位数据bit readBit()/读0时序 unsigned int i; bit b; ds = 0; i+; /延时约8us, 符合协议要求至少保持1us ds = 1; i+; i+; /延时约16us, 符合协议要求的至少延时15us以上 b = ds; i = 8; while(i>0) i-; /延时约64us, 符合读时隙不低于60us要求 return b;/读取一字节数据, 通过调用readBit()来实现unsigned char

22、readByte() unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i<8; i+) j = readBit(); /最先读出的是最低位数据 dat = (j << 7) | (dat >> 1);/先把数据放在高位,然后再移到低位 return dat;/向DS18B20写入一字节数据void writeByte(unsigned char dat) unsigned int i; unsigned char j; bit b; for(j = 0; j < 8; j+) b = dat &

23、amp; 0x01; dat >>= 1; /写"1", 将DQ拉低15us后, 在15us60us内将DQ拉高, 即完成写1 if(b) ds = 0; i+; i+; /拉低约16us, 符号要求1560us内 ds = 1; i = 8; while(i>0) i-; /延时约64us, 符合写时隙不低于60us要求 else /写"0", 将DQ拉低60us120us ds = 0; i = 8; while(i>0) i-; /拉低约64us, 符号要求 ds = 1; i+; i+; /整个写0时隙过程已经超过60us

24、, 这里就不用像写1那样, 再延时64us了 /向DS18B20发送温度转换命令void sendChangeCmd() dsInit(); /初始化DS18B20, 无论什么命令, 首先都要发起初始化 dsWait(); /等待DS18B20应答 delay(1); /延时1ms, 因为DS18B20会拉低DQ 60240us作为应答信号 writeByte(0xcc); /写入跳过序列号命令字 Skip Rom writeByte(0x44); /写入温度转换命令字 Convert T/向DS18B20发送读取数据命令void sendReadCmd()EA=0;/关闭中断是因为进入显示中

25、断会影响到DS18B20的读写时序 dsInit(); dsWait(); delay(1); writeByte(0xcc); /写入跳过序列号命令字 Skip Rom writeByte(0xbe); /写入读取数据令字 Read ScratchpadEA=1;/获取当前温度值int getTmpValue() unsigned int tmpvalue; int value; /存放温度数值 float t; unsigned char low, high;EA=0; sendReadCmd(); /连续读取两个字节数据 low = readByte(); high = readByte

26、(); /将高低两个字节合成一个整形变量 /计算机中对于负数是利用补码来表示的 /若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value tmpvalue = high; tmpvalue <<= 8; tmpvalue |= low; value = tmpvalue; /使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度 t = value * 0.0625; /将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入 /如t=11.0625, 进行计数后, 得到value = 11

27、06, 即11.06 度 /如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度 value = t * 100 + (value > 0 ? 0.5 : -0.5); /大于0加0.5, 小于0减0.5 return value;EA=1;void Init_timer0()TMOD=0x01;TH0=th0;TL0=tl0;EA=1;ET0=1;TR0=1; void timer0() interrupt 1int k=30;if(temp>3000)while(k-)beeping(); /beep=0; led=0;else led=1;beep=1;display();TH0=th0; TL0=tl0; void display() uchar tmp;uchar tmp1;staticuchar count;P3=0XFF;tmp=dispbitcount;tmp1=tmp;P3&=tmp;/we=0;/WEI操作/du=1;/duan操做tmp=dispbuf5-count;if(tmp1=0xf7)tmp=disptabwithdottmp;elsetmp=disptabtmp;P0=tmp;count+;if(

温馨提示

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

评论

0/150

提交评论