《基于单片机温度控制系统设计的显示电路设计部分课程设计任务书毕设论文.doc》由会员分享,可在线阅读,更多相关《基于单片机温度控制系统设计的显示电路设计部分课程设计任务书毕设论文.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课程设计任务书学 院专 业学生姓名班级学号课程设计题目基于单片机温度控制系统设计-显示电路设计实践教学要求与任务:1) 构成单片机温度控制系统2) 显示电路设计3) 实验调试4) THFCS-1现场总线控制系统实验5) 撰写实验报告工作计划与进度安排:1) 第12天,查阅文献,构成单片机温度控制系统2) 第34天,显示电路设计3) 第56天,实验调试4) 第79天,THFCS-1现场总线控制系统实验5) 第10天,撰写实验报告指导教师: 201 年 月 日专业负责人:201 年 月 日学院教学副院长:201 年 月 日摘 要本论文着重阐述了温度控制系统的设计方法,以AT89C51单片机作为主控
2、核心,按键、数码管等较少的辅助硬件电路相结合,采用模块设计,利用软件实现对温度进行控制。本系统具有体积小、硬件少、电路结构简单、软件功能完善,控制系统可靠,性价比较高等优点。论文主要论述了基于单片机的温度控制系统的设计过程。主要工作如下:重点论证了系统方案的选择及其实现方法;全文详细论述了系统的软、硬件电路,其中硬件部分重点介绍了单片机的基本结构和各引脚以及晶振电路、复位电路的工作原理,软件部分重点叙述主程序和子程序的C语言实现;硬件、软件电路调试过程;所有源程序均采用C语言编译,并在Keil uVision2软件里编译、调试;在Proteus环境下实现软、硬件电路仿真。实验结果证明了设计方案
3、的正确性与可行性,以此为理论基础,对我们设计彩灯电路具有很强的使用和参考价值。关键词:温度控制系统;AT89C51单片机;模块设计目录1 绪论22 系统概述32.1设计思路32.2原理分析33.系统软件设计43.1 软件设计主要思路43.2 显示程序流程图及其源代码44.系统调试74.1软件调试74.2软件仿真结果及分析8结束语9附录101 绪论在工业自动化高度发达的今天,对一些过程控制要求很高。传统的度监控一般都采用模拟电路设计。其缺点是:转换速率低,实时性差。抗干扰能力弱,特别是在高频电路中,很容易产生自激。而采用单片机控制能很好弥补以上缺点。a)精度高,实时性强,能及时发现问题。b)采用
4、数字电路,抗干扰能力强。单片微型计算机简称单片机,又称为微控制器(MCU),它的出现是计算机发展史上的一个重要里程碑,它以体积小、功能全、性价比高等诸多优点而独具特色。随着社会的发展、科技的进步,各种方便于生活的自动控制系统开始进入了人们的生活,以单片机为核心的控制系统就是其中之一。本温控系统主要以AT89C51单片机作为主控核心,18B20温度传感器和MAX7219驱动芯片为辅以及按键、数码管等较少的其它辅助硬件电路相结合,采用模块设计,利用软件实现对温度进行控制。本系统具有体积小、硬件少、电路结构简单、软件功能完善,控制系统可靠,性价比较高等优点。2 系统概述2.1设计思路运用单片机AT8
5、9C2051对可编程数字温度传感器DS18B20进行编程控制,采集实时温度。通过数码管显示该温度。并设置相应的默认工作温度,当实际温度小于默认工作温度,启动加热装置。另外,通过一些按键,可以调节工作温度,以便适合不同的场所需求。2.2原理分析AT89C2051数码管显示控制信号温度传感器温度值继电器按键 图2-2-1温度监控器结构如图1所示,首先,由单片机送出温度传感器的初始化控制信号,温度传感器进行复位操作。接着发出读温度命令,温度传感器开始工作。并将采集到的温度信号以十六进制代码形式通过AT89C2051引脚送到单片机内部。经过软件将温度信号送到MAX7219,并在数码管上显示。同时,将采
6、集的温度与设定默认温度比较,并通过AT89C2051的P1.4端口控制继电器是否工作。此外,通过外部中断程序调节默认设定温度。3.系统软件设计3.1 软件设计主要思路本系统主要有四部分组成,即温度采集环节,显示环节,继电器控制环节以及调节环节。因此程序也主要由以上四部分组成。程序首先开外中断1,并设置相关参数,其次,测试数码管显示。然后进入一个死循环,即每个三秒用18B20采集一次温度,然后用MAX7219驱动数码管显示采集温度的温度。与此同时,每次采集得到的温度都要与已设定温度进行比较,如果温度小于设定温度,那么接通继电器,是加热装置工作,否则不工作。为了保证调节的灵敏度,故把调节部分放到中
7、断之中。当程序进入中断,那么就可以通过按键增加或减小设定的默认温度,即继电器工作的零界温度。由此完成了整个温度控制系统的设计。3.2 显示程序流程图及其源代码3.2.1显示程序流程图本子程序主要通过MAX7219驱动数码管显示温度的。首先获取要现实的数据,判断数据是否大于零,如果大于0,则symbol=0;否则symbol=1,并取反且在第一位数码管中显示负号。然后,所得到的数据进行处理,并得到个位,十位及小数点后一位,将这些数据送入MAX7219中在后三位显示。如图5:数据处理并在后三位显示结束开始获取要显示数据该数据小于0数据取反并在第一位显示负号 Y N 图3-2-1 显示程序流程图3.
8、2.2显示程序部分源代码/*向MAX7219写入一个字节数据*/void Sendchar(uchar ch)uchar i,code1;_nop_();_nop_();_nop_();for(i=0;i8;i+)code1=ch&0x80;ch=ch1;if(code1)DIN=1;CLK=0;CLK=1;elseDIN=0;CLK=0;CLK=1;/*向MAX7219写入一个字(16位)*/void Sendword(uchar addr,uchar number)LOAD=0;_nop_();_nop_();_nop_();Sendchar(addr);_nop_();_nop_();_
9、nop_();Sendchar(number);_nop_();_nop_();_nop_();LOAD=1;/*MAX7219初始化*/void Start()Sendword(Scanbit,Scannum);Sendword(Decode,Demode);Sendword(Light,Lightgrade);Sendword(Lowpower,Norpw);详细程序见附录4.系统调试4.1软件调试4.1.1 单片机C语言单片机C语言程序设计不同于通用计算机应用程序设计,它必须针对具体的微控制器及外围电路来完成,为了便于学习单片机应用程序设计和系统开发,很多公司退出了单片机实验箱、仿真器和
10、开发板等,这些硬件设备可用于验证单片机程序,开发和调试单片机应用系统。开发8051单片机系统时,使用C语言会使开发周期大为缩短,开发效率大幅提高,程序可读性好且易于移植,所以使用C语言开发单片机系统已经成为必然趋势17。C语言在单片机系统开发中的优势: 用C语言编写的程序可读性强; 在不了解单片机指令系统而仅熟悉8051单片机存储结构时就可以开发单片机程序; 寄存器分配和不同存储器寻址及数据类型等细节可由编译器管理; 程序可分为多个不同的函数,这使程序设计结构化; 函数库丰富,数据处理能力强; 程序编写及调试时间大大缩短,开发效率远高于汇编语言; C语言具有模块化编程技术,已编写好的通用程序模
11、块很容易植入新程序,这进一步提高了程序开发效率。4.1.2 Keil uVision4C51单片机支持HEX文件,我采用的编译器是Keil uVision2软件,该软件是美国Keil Software 公司开发的,关于8051系列MCU的开发工具,是目前世界上最好的51单片机开发工具之一。软件本身支持数百种51系列单片机芯片,可以用来编译C源码,汇编源程序以及两者的混合编程代码,连接重定位目标文件和库文件,创建HEX文件,调试目标程序等,是一种集成化的文件管理编译环境。4.2软件仿真结果及分析 完成单片机系统仿真电路图设计后,即可开始仿真运行单片机绑定的程序文件,双击单片机,打开单片机属性窗口
12、(也可以先在单片机上单击右键,再单击左键,或者选中单片机后按下(Ctrl+E组合键),在“Program Files”项中选择对应的HEX文件。在仿真电路和程序都没有问题时,直接单击Proteus主窗口下的“运行”(Play)按钮,即可仿真运行单片机系统, 在运行过程中如果希望观察内存、24C0X、温度寄存器、时钟芯片等内部数据可在运行时单击“单步”(Step)或“暂停”(Pause)按钮,然后再“调试”(Debug)菜单中打开相应设备。如果要观察仿真电路中某些位置的电压或波形等,可向电路中添加相应的虚拟仪器,例如,电压表、示波器等。结束语通过本次的设计,使我了解了51系列单片机的基本工作原理
13、。以及对其编程的技巧和注意事项等。对自动控制原理有了一个新的认识,学到许多书本上没有的知识。特别是实际动手方面的能力。在此过程中也 遇到很多的困难,经过自己的思考,翻阅资料及老师耐心的讲解问题都 得到了解决。并且把这些经历作为宝贵的经验记录了下来。以便以后查阅。使我学以至用,把书本与实际联系起来。为我们今后的发展打下了坚实的基础。 附录一 基于单片机的温控系统完整程序代码/规定默认设定温度为T0=50度,K0键为开始设置键,K1键为加一度键,K2键为减一度键#include/MAX7219端口定义#include#define uchar unsigned char#define uint u
14、nsigned intsbit DIN=P10;sbit CLK=P11;sbit LOAD=P12;sbit JIDIANQI=P27;/继电器接口sbit K0=P32;sbit K1=P15;sbit K2=P16;sbit K3=P17;sbit DQ =P33; /DS18B20定义单片机数据引脚 #define Noop 0x00#define reg0 0x01#define reg1 0x02#define reg2 0x03#define reg3 0x04#define Decode 0x09#define Light 0x0a#define Scanbit 0x0b#de
15、fine Lowpower 0x0c#define DisplayTest 0x0f#define Lowpw 0x00#define Norpw 0x01#define Scannum 0x03#define Demode 0xff#define Lightgrade 0x0a#define Teststart 0x01#define Testend 0x00 uchar DisBuffer4=0,0,0,0;unsigned int temperature;uchar symbol;unsigned int T_MOREN=0x28; / 规定默认设定温度为T0=40度unsigned i
16、nt T_time;unsigned char key_s, key_v;void delay(unsigned int i) /延时程序 while(i-); Init_DS18B20(void) /DS18B20复位初始化 unsigned char x=0; DQ = 1; delay(8); DQ = 0; delay(80); DQ = 1; delay(14); x=DQ; delay(20);ReadOneChar(void) /读DS18B20的程序 unsigned char i=0; unsigned char dat = 0; for (i=8;i0;i-) DQ = 0
17、; dat=1; DQ = 1; if(DQ) dat|=0x80; delay(4); return(dat);WriteOneChar(unsigned char dat) /写DS18B20的子程序 unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat=1; ReadTemperature(void) /从DS18B20中读出两个字节的温度数据 unsigned char a=0; unsigned char b=0; unsigned int t=0; Init_DS18B20
18、(); WriteOneChar(0xCC); WriteOneChar(0x44); Init_DS18B20(); WriteOneChar(0xCC); WriteOneChar(0xBE); a=ReadOneChar(); b=ReadOneChar(); t=b; t=8; /进行精度转换 t=t|a;if(t0x0fff)symbol=0;elset=t+1;symbol=1; temperature=t*0.625; return(temperature); /*向MAX7219写入一个字节数据*/void Sendchar(uchar ch)uchar i,code1;_no
19、p_();for(i=0;i8;i+)code1=ch&0x80;ch=ch1;if(code1)DIN=1;CLK=0;CLK=1;elseDIN=0;CLK=0;CLK=1;/*向MAX7219写入一个字(16位)*/void Sendword(uchar addr,uchar number)LOAD=0;_nop_();Sendchar(addr);_nop_();Sendchar(number);_nop_();LOAD=1;/*MAX7219初始化*/void Start()Sendword(Scanbit,Scannum);Sendword(Decode,Demode);Sendw
20、ord(Light,Lightgrade);Sendword(Lowpower,Norpw); /温度显示-void text_start()/第一次使用数码管测试Start();Sendword(DisplayTest,Teststart);delay(3000000);Sendword(DisplayTest,Testend);temperature_view(uint temperature_x)DisBuffer1=temperature_x/100;DisBuffer2=(temperature_x%100)/10;DisBuffer3=temperature_x%10;if(sym
21、bol=0) DisBuffer0=0x0f;else DisBuffer0=0x0a;if(DisBuffer1=0x00)DisBuffer0=0x0f;if(DisBuffer1=0x00)DisBuffer1=0x0f;Sendword(reg0,DisBuffer0);Sendword(reg1,DisBuffer1);Sendword(reg2,DisBuffer2);Sendword(reg3,DisBuffer3);void delayms(uint ms)/ 延时子程序,单位为msunsigned char i;while(ms-)for(i = 0; i 120; i+);
22、bit scan_key()key_s = 0x00;key_s |= K3;key_s = 1;key_s |= K2;key_s = 1;key_s |= K1;return(key_s key_v);/INT0中断服务程序 int0() interrupt 0 using 0temperature_view(T_MOREN);key_v = 0x07;for(;)if(scan_key()delayms(10);if(scan_key()key_v = key_s;if(key_v & 0x01) = 0)/ K1加一 T_MOREN=1+T_MOREN; temperature_vie
23、w(T_MOREN);else if(key_v & 0x02) = 0)/ K2减一 T_MOREN=T_MOREN-1; temperature_view(T_MOREN);else if(key_v & 0x04) = 0)/K3退出goto EXIT; EXIT:temperature_view(T_time);void main(void) EA=1; /开中断总开关EX0=1; /允许INT0中断IT0=1; /下降沿产生中断 /延时3秒,重新测定一次温度,并用数码管显示,同时控制继电器的开关text_start();/第一次使用数码管测试while(1)T_time=ReadTemperature(); /温度值传给T_timetemperature_view(T_time);/显示温度if(T_timeT_MOREN) /判断继电器是否工作,当温度小于T0时,继电器导通JIDIANQI=1;elseJIDIANQI=0;delayms(30); /延时三秒,即每三秒扫描一次,显示一次二 基于单片机的温控系统仿真图 如下图为基于单片机的温控系统部分仿真图 图 基于单片机的温控系统仿真图