《单片机课程设计基于单片机AT89S52的数字温度计的设计.doc》由会员分享,可在线阅读,更多相关《单片机课程设计基于单片机AT89S52的数字温度计的设计.doc(16页珍藏版)》请在三一办公上搜索。
1、摘要本设计是是一个基于单片机AT89S52的数字温度计的设计,用来测量环境温度,测量范围为-50110度。整个设计系统分为4部分:单片机控制、温度传感器、数码显示以及键盘控制电路。此设计的重点在于编程,程序要实现温度的采集、转换、显示和上下限温度报警,其外围电路所用器件较少,相对简单,实现容易。由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器
2、,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。整个设计是以AT89S52为核心,通过数字温度传感器DS18B20来实现环境温度的采集和A/D转换,同时因其输出为数字形式,且为串行输出,这就方便了单片机进行数据处理,但同时也对编程提出了更高的要求。单片机把采集到的温度进行相应的转换后,使之能够方便地在数码管上输出。该设计控制器使用单片机AT89S52,测温传感器使用DALLAS18B20,用4位共阴极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。设计前先用proteus和keil进行仿真也
3、是重要的实验基础。在此次试验中,我认真按照课程设计要求,综合利用所学单片机知识完成一个单片机应用系统设计并仿真实现,从而加深对单片机软硬知识的理解,进一步熟悉和掌握单片机的内部结构和工作原理,了解单片机应用系统设计的基本方法和步骤和系统中的应用。提高了动手能力,获得初步的应用经验,并增强了对本专业的喜爱。目录1. 概述- 3 -1.1. 设计要求- 3 -1.2. 设计目的- 3 -2. 系统总体方案及硬件设计- 4 -2.1. 主控制器- 4 -2.2. 系统整体硬件电路设计- 4 -3. 软件设计- 5 -4. Proteus软件仿真- 6 -5. 课程设计体会- 7 -1. 概述1.1.
4、 设计要求1.1.1. 基本范围0-99.91.1.2. 精度误差小于0.51.1.3. LED数码直读显示1.1.4. 可以设定温度的上下限报警功能1.2. 设计目的1.2.1. 随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。 本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实
5、验室使用,可广泛用于食品库、冷库、粮库、温室大棚等需要控制温度的地方。目前,该产品已在温控系统中得到广泛的应用2. 系统总体方案及硬件设计2.1. 主控制器单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,适合便携手持式产品的设计使用。AT89S52单片机芯片具有以下特性:1)指令集合芯片引脚与Intel公司的8052兼容;2)4KB片内在系统可编程FLASH程序存储器;3)时钟频率为033MHZ;4)128字节片内随机读写存储器(RAM);5)6个中断源,2级优先级;6)2个16位定时/记数器;7)全双工串行通信接口;8)监视定时器; 9)两个
6、数据指针;2.2. 系统整体硬件电路设计系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等。3. 软件设计初始化调用显示子程序1S到?初次上电读出温度值温度计算处理显示数据刷新发温度转换开始命令NYNYY发DS18B20复位命令发跳过ROM命令发读取温度命令读取操作,CRC校验9字节完?CRC校验正?确?移入温度暂存器结束NNY 主程序流程图 读温度流程图4. Proteus软件仿真 5. 课程设计体会在技能的提高过程中少不了动手操作,通过这次的课程设计提高了综合运用所学知识,发现、提出、分析和解决实际问题的能力。在课程设计的过程中使我们对单片机的结构
7、、基本工作原理、单片机应用系统开发有了更深一步的了解,特别是在硬件设计和软件编程方面有了很大提高。在这次单片机课程设计中,使我更加了解单片机在我们学习生活中的重要性,课程设计中遇到的困难,经过上网查资料、在图书馆翻阅专业课本、和同学讨论一一解决。此次课程设计不仅巩固了以前所学过的知识,加深了我对所学知识的理解,而且学到了很多在书本上未涉及的知识,提高了自己的动手能力。软件编程过程中,由于采用汇编语言编程,所以参考了别人的设计思路,学习明白之后,对程序作了修改。在编译仿真时对软件Keiv 和Proteus有了更多的认识。在焊接的过程中也遇到了不少的问题,因为每个引脚都是不样一的,只有让各个引脚互
8、相对应,才能得出正确的结果。并且用的是铜线,所以在焊接时很麻烦稍不注意就会连线,在焊接时明显感觉到自己的动手能力比较差,通过这次的设计有了明显的提高。通过这次设计,使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为以后的能更好的融入工作当中去打下了坚实的基础。参考文献1 余发山,王福忠,等.单片机原理及应用技术.中国矿业大学出版社2 51单片机学习论坛附1:源程序代码/*程序名称:DS18B20温度测量、报警系统简要说明:DS18B20温度计,温度测量范围099.9摄氏度 可
9、设置上限报警温度、下限报警温度 即高于上限值或者低于下限值时蜂鸣器报警 默认上限报警温度为38、默认下限报警温度为5 报警值可设置范围:最低上限报警值等于当前下限报警值 最高下限报警值等于当前上限报警值 将下限报警值调为0时为关闭下限报警功能 */#include #include DS18B20.h #define uint unsigned int#define uchar unsigned char /宏定义#define SET P3_1 /定义调整键#define DEC P3_2 /定义减少键#define ADD P3_3 /定义增加键#define BEEP P3_7 /定义蜂
10、鸣器bit shanshuo_st; /闪烁间隔标志bit beep_st; /蜂鸣器间隔标志sbit DIAN = P07; /小数点uchar x=0; /计数器signed char m; /温度值全局变量uchar n; /温度值全局变量uchar set_st=0; /状态标志signed char shangxian=38; /上限报警温度,默认值为38signed char xiaxian=5; /下限报警温度,默认值为38uchar code LEDData=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00;unsig
11、ned int ReadTemperature(void);/*延时子程序*/void Delay(uint num) while( -num );/*初始化定时器0*/void InitTimer(void) TMOD=0x1; TH0=0x3c; TL0=0xb0; /50ms(晶振12M)/*定时器0中断服务程序*/void timer0(void) interrupt 1 using 0 TH0=0x3c; TL0=0xb0; x+;/*外部中断0服务程序*/void int0(void) interrupt 0using 1 EX0=0; /关外部中断0 if(DEC=0&set_s
12、t=1) shangxian-; if(shangxianxiaxian)shangxian=xiaxian; else if(DEC=0&set_st=2) xiaxian-; if(xiaxian99)shangxian=99; else if(ADD=0&set_st=2) xiaxian+; if(xiaxianshangxian)xiaxian=shangxian; /*读取温度*/void check_wendu(void) uint a,b,c; c=ReadTemperature()-5; /获取温度值并减去DS18B20的温漂误差 a=c/100; /计算得到十位数字 b=c
13、/10-a*10; /计算得到个位数字 m=c/10; /计算得到整数位 n=c-a*100-b*10; /计算得到小数位 if(m99)m=99;n=9; /设置温度显示上限 /*显示开机初始化等待画面*/Disp_init() P0 = 0x40; /显示- P2 = 0xf7; Delay(200); P2 = 0xfb; Delay(200); P2 = 0xfd; Delay(200); P2 = 0xfe; Delay(200); P2 = 0xff; /关闭显示/*显示温度子程序*/Disp_Temperature() /显示温度 P2 = 0xf7; P0 =0x39; /显示
14、C Delay(300); P2 = 0xfb; P0 =LEDDatan; /显示个位 Delay(300); P2 = 0xfd; P0 =LEDDatam%10; /显示十位 DIAN = 1; /显示小数点 Delay(300); P2 = 0xfe; P0 =LEDDatam/10; /显示百位 Delay(300); P2 = 0xff; /关闭显示/*显示报警温度子程序*/Disp_alarm(uchar baojing)P2 = 0xf7; P0 =0x39; /显示C Delay(200); P2 = 0xfb; P0 =LEDDatabaojing%10; /显示十位 De
15、lay(200); P2 = 0xfd; P0 =LEDDatabaojing/10; /显示百位 Delay(200); P2 = 0xfe; if(set_st=1)P0 =0x76; else if(set_st=2)P0 =0x38; /上限H、下限L标示 Delay(200); P2 = 0xff; /关闭显示/*报警子程序*/void Alarm() unsigned int i; for(i=0;i200;i+)/喇叭发声的时间循环,改变大小可以改变发声时间长短 Delay(80);/参数决定发声的频率,估算值 BEEP=!BEEP; BEEP=1; /喇叭停止工作,间歇的时间,
16、可更改 Delay(20000); /*主函数*/void main(void) uint z; InitTimer(); /初始化定时器 EA=1; /全局中断开关 TR0=1; ET0=1; /开启定时器0 IT0=1; IT1=1; check_wendu(); check_wendu(); for(z=0;z2)set_st=0; if(set_st=0) EX0=0; /关闭外部中断0 EX1=0; /关闭外部中断1 check_wendu(); Disp_Temperature(); if(m=shangxian) P1_0=1; else P1_0=0; if(m=shangxian)|(m=10)shanshuo_st=shanshuo_st;x=0; if(shanshuo_st) Disp_alarm(shangxian); else if(set_st=2) BEEP=1; /关闭蜂鸣器 EX0=1; /开启外部中断0 EX1=1; /开启外部中断1 if(x=10)shanshuo_st=shanshuo_st;x=0; if(shanshuo_st) Disp_alarm(xiaxian); /*END*/附2:系统原理图