西安郵電大学单片机课程设计报告书院(系)名称:自动化学院学生姓名:谢宝龙张文琪吕鹏赵越专业名称:自动化专业班级:自动化0902班时间:2012年6月4日至2012年6月15日目录摘要 (2)1 概述 (3)1.1 课程设计的意义 (3)1.2设计的任务和要求 (3)2. 开发平台介绍 (3)2.1 STC89C52RC 微处理器芯片 (3)2.2 Keil uvision3编程软件 (4)2.3 Protues 7.5 (5)3. 系统整体架构 (6)3.1.一个反馈模块:温度传感器 (6)3.2.一个显示模块:四位共阳极数码管 (6)3.3系统主要硬件架构图 (7)4.方案实现 (7)4.1设计思路 (7)4.2硬件设计方案 (8)4.3软件设计方案 (10)5.实验心得 (15)摘要随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术。
现在,我们都知道,随着温室气体的增加,温度也随之升高,尤其到了夏季一些比较干燥的区域,很多火灾事故会不时的发生,所以防火设备的开发与应用也就迫在眉睫。
本设计主要是介绍了一个基于STC89C52RC单片机的测温报警系统,详细的描述了利用温度传感器DS18B20来开发测温系统的过程,重点对传感器在单片机上的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是数字温度传感器DS18B20的数据采集过程。
对各部分的电路也一一进行了介绍,该系统可以方便的实现温度采集和显示,并可根据需要在软件里面任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。
DS18B20与STC89C52结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
关键词:单片机STC89C52 DS18B20 温度传感器1 概述温度测控与报警系统1.1 课程设计的意义单片机课程设计过程中,我们通过查阅资料、接口设计、程序设计、安装调试等环节,完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用。
使我们不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。
使我们了解和掌握单片机应用系统的软硬件设计过程、方法及实现,强化单片机应用电路的设计与分析能力。
提高我们在单片机应用方面的实践技能和科学作风;培育我们综合运用理论知识解决问题的能力,实现理论结合实际,学以至用的原则。
1.2设计的任务和要求1、基本范围-50℃-110℃2、精度误差小于0.5℃3、LED数码直读显示4、设置上下线温度报警2. 开发平台介绍2.1 STC89C52RC 微处理器芯片STC89C52RC是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52RC为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口。
俗称单片机。
下图是芯片的管脚图2.2 Keil 3 C51编程软件Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
使用过程:1. 新建工程文件:Project New project2.新建C文件:File New file 保存为 .c文件3.点击鼠标右键点击ADD files to…将.c文件添加到Souce Group 12.3 Protues 7.5Protues软件具有其它EDA工具软件(例:multisim)的功能。
这些功能是:(1)原理布图(2)PCB自动或人工布线(3)SPICE电路仿真革命性的特点:(1)互动的电路仿真。
用户甚至可以实时采用诸如RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。
(2)仿真处理器及其外围电路。
可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。
还可以直接在基于原理图的虚拟原型上编程,再配合显示及输出,能看到运行后输入输出的效果。
配合系统配置的虚拟逻辑分析仪、示波器等,Protues建立了完备的电子设计开发环境。
3. 系统整体架构3.1.一个反馈模块:温度传感器DS18B20实物图3.2.一个显示模块:四位共阳极数码管3.3系统主要硬件架构图4.方案实现4.1设计思路该设计一个基于STC89C52RC单片机的最小系统,并采用一只温度传感器DS18B20,该传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。
通过温度传感器得到温度值并显示在四位共阳极的数码管上。
当温度大于30度或者小于25度时,系统会自动报警。
温度报警电路设计总体设计方框图如图所示,控制器采用单片机STC89C52RC微处理器,温度传感器采用DS18B20,用4位LED数码管以串口传送数据实现温度显示。
图2.2—1 总体设计方框图4.2硬件设计方案4.2.1单片机最小系统STC89C52RC四位LEDDS18B20 温 度 传 感 器单片机复位时钟振荡 报警指示灯蜂鸣器4.2.2 Protues 仿真图4.2.3 Altium designer 原理图Altium Designer 原理图4.3软件设计方案4.1.1 软件设计第一步:.针对本设计的详细设计:需要实时测得温度并显示在数码管上。
然后必须设定预先的处理判断机制,当参数出现不同情况的时候,CPU 可以做出正确的操作。
实现考虑到会出现的各种情况,将这些全部写入执行函数中。
并在后期的调试中及时发现问题并第一时间修复。
第二步:编码在软件编写阶段,对数据结构、算法分析和模块实现等方面的设计要求,开始具体的编写程序工作,分别实现各模块的功能,从而实现对目标系统的功能、性能、接口、界面等方面的要求。
第三步:测试测试编写好的系统。
交给用户使用,用户使用后一个一个的确认每个功能。
在后期的程序总成阶段发现各个子程序嵌套后的冲突较多。
4.1.2 软件流程图主程序流程图初始化 读取温度 判断是否到达预警读出温度值温度计算处理显示数据刷新 发温度转换开始命令 N Y 调用显示子程序 蜂鸣器报警主程序:编程时遇到的最大问题是数码管消影。
#include <reg52.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned intsbit dq=P3^7; //温度传感器信号线sbit beep=P1^5; //蜂鸣器uint temp=0,n=0;float f_temp=0.0;unsigned char code table[]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f, //共阳极带小数点的编码共阴极不用取反~0xbf,~0x86,~0xdb,~0xcf,~0xe6,~0xed,~0xfd,~0x87,~0xff,~0xef}; //不带小数点的编码unsigned char code table1[]={0x01,0x02,0x04};void delay(uint z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void dqreset(void) //18B20复位,初始化函数{uint i;dq=0;i=103;while(i>0)i--;dq=1;i=4;while(i>0)i--;}bit tempreadbit(void) //读1位函数{uint i;bit dat;dq=0;i++; //i++ 起延时作用dq=1;i++;i++;dat=dq;i=8;while(i>0) i--;return (dat);}uchar tempread(void) //读1个字节uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);}void tempwritebyte(uchar dat) //向18B20写一个字节数据{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++;}}}void DS18B20_tempchange(void) //DS18B20 开始获取温度并转换{dqreset();delay(1);tempwritebyte(0xcc); // 写跳过读ROM指令tempwritebyte(0x44); // 写温度转换指令uint DS18B20_get_temp() //读取寄存器中存储的温度数据{uchar a,b;dqreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); //读低8位b=tempread(); //读高8位temp=b;temp<<=8; //两个字节组合为1个字temp=temp|a;f_temp=temp*0.0625; //温度在寄存器中为12位分辨率位0.0625°temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入f_temp=f_temp+0.05;return temp; //temp是整型}////////////////////显示程序//////////////////////////void display(uchar dat){P0=table[dat];P2=table1[n];n++;if(n==3) n=0;delay(1);P2=0;//消影很重要}void DS18B20_dis_temp(uint t){uchar i;i=t/100;display(i);i=t%100/10;display(i+10); //多小数点i=t%100%10;display(i);}//////////////////////////////////////////////void warn(uint s,uchar led) //蜂鸣器报警声音,s控制音调{uchar i;i=s;beep=0;P1=led;while(i--){DS18B20_dis_temp(DS18B20_get_temp());}P1=0xff;beep=1;}void DS18B20_deal(uint t){uchar i;if((t>250)&&(t<=270)) //大于25度小于27度warn(40,0xde);else if(t<=250) //小于25度warn(10,0xde);else if((t<320)&&(t>=300)) //小于32度大于30度warn(40,0xde);else if(t>=320) //大于32度warn(10,0xede);else{i=40;while(i--){DS18B20_dis_temp(DS18B20_get_temp());}}}void main(){uchar j;while(1){DS18B20_tempchange();for(j=10;j>0;j--){DS18B20_dis_temp(DS18B20_get_temp());}DS18B20_deal(temp);}}5.实验心得对于我们团队每个成员来说,都应明确自己所善长和能胜任的方面,并且每个人都应自发地承接自己所擅长的任务,遇到问题时要与大家一起商量和讨论,找出切实可行的解决方案,这样才能避免团队的短板效应,可以最大化的发挥每个人的作用,发挥出团队的真正能力,更好的更快的完成课设题目。