《单片机温度控制器设计毕业论文.doc》由会员分享,可在线阅读,更多相关《单片机温度控制器设计毕业论文.doc(37页珍藏版)》请在三一办公上搜索。
1、摘 要随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计论述了一种以STC89C52单片机为主控制单元。该控制系统可以实时存储相关的温度数据。系统设计了相关的硬件电路和相关应用程序。硬件电路主要包括STC89C51单片机最小系统,测温电路、实时时钟电路、LED显示以及通讯模块电路等。系统程序主要包括主程序,读出温度子程序,计算温度子程序、按键处理程序、LCD显示程序以及数据存储程序等。关键词: STC89C52单片机;DS18B20;显示电路AbstractAlong with the computer
2、 measurement and control technology of the rapid development and wide application, based on singlechip temperature gathering and control system development and application greatly improve the production of temperature in life level of control. This design STC89C52 describes a kind of mainly by MCU c
3、ontrol unit, for temperature sensor DS18B20 temperature control system. The control system can real-time storage temperature data and record related to the current time. System design related hardware circuit and related applications. STC89C52 microcontroller hardware circuit include temperature det
4、ection circuit smallest system, and real-time clock circuit, LCD display circuit, communication module circuit, etc. System programming mainly include main program, read temperature subroutine, the calculation of temperature subroutines, key processing procedures, LCD display procedures and data sto
5、rage procedures, etc. Keywords :STC89C52 microcontroller;DS18B20;display circuit第1章 51单片机结构和原理单片微型计算机简称单片机,也称为微控制器(Micro Controller Unit),英文缩写为MCU.单片机的结构及功能均是按照工业控制要求而设计的,它把微型计算机的宫格功能部件(中央处理器CPU、随机存取存储器RAM、只读存储器ROM、输入输出I/O接口、定时器/计数器以及串行通信接口等)集成在一块芯片上,构成一个完整的微型计算机,故又称为单片微型计算机。除工业领域外,单片机还广泛应用于各种民用电子、电
6、器之中。MCS-51是由美国INTEL公司20世纪80年代生产的一系列8位单片机的总称,此系列单片机包括很多型号,如:8031、8051、8751、8032、8052等,其中8051是最早最典型的产品。该系列其他单片机都是在8051的基础上进行功能的增、减改变而来的,所以人们习惯用8051来称呼系列单片机,而其中的在世纪年代末年代初是我国最流行的单片机之一。公司后来将MCS-51的核心技术授权给了其他公司,现在生产8051内核单片机的公司,主要有ATMEL、WINBOND、NXP、等。随着技术的发展,各种高性能的位、位不断出现,但以、以及等系列为典型代表的位,由于成本低、开发工具完善、易学易用
7、等特点,仍具有强大的生命力和极高的实使用价值。. 单片机的结构1.1.1 基本结构8位CPU,片内振荡器。4KB程序存储器ROM(4096个8位淹没ROM)。128字节的数据存储器RAM(128个8位淹没RAM)。21个特殊功能寄存器。32条I/O口线。外部数据存储器寻址空间为64KB。外部程序存储器寻址空间为64KB。2个16位的可编程定时/计数器。中断结构:具有5个中断源,2个优先级。一个全双工串行通信口。有位寻址功能,适于布尔处理的位处理机制。1.2.1 8051单片机引脚图图1-1 at89c51单片机第2章 相关编程与仿真软件的介绍常用的单片机语言有很多,如:汇编、C语言、BASIC
8、、C+等,对51单片机而言,使用最为广泛的还是汇编语言和C语言。有经验的程序员用汇编语言可以写出高效率的程序,但每种语言都有自己个子的特点。2.1 从标准C转向Keil CC51是专门为51系列单片机设计的,根据51单片机自身的特点进行了若干扩展,与ANSIC在语法和库函数方面存在稍许差别,但绝大部分是兼容的。但在学习中,使用最多的还是Keil C8.08 u Vision3。2.2 Keil C上机的基本方法2.2.1 uVision 3中编程的基本步骤 在uVision 3集成开发环境中创建一个新项目(Project),并为该项目选定合适的单片机型号。利用uVision 3的文件编译器编写
9、C语言(或者汇编语言)源程序文件,并将文件添加到项目中去。通过uVision 3的各种选项,配置Cx51编译器、Ax51宏编译器、BL51/Lx51连接定位器以Debug 调试器的功能。利用uVision 3的构造功能对项目中的源程序文件进行编译链接,生成绝对目标代码和可选的HEX格式的可执行文件,如果出现编译链接错误则返回上一步,修改源程序中的错误后重新构造整个项目。将没有错误的绝对目标代码装入uVision 3调试器进行仿真调试,调试成功后用编程器将可执行文件写入到单片机应用系统的程序存储器或者单片机内部的Flash ROM中。2.2.2 uVision 上机注意事项C51源程序汗汉字注释
10、内容时,删除、插入汉字会出现乱码。解决方法为:选择Edit|Configuration 菜单项,弹出界面,将C源程序文本字体选择为DotumChe , 此字体可避免出现汉字乱码现象。原版的Keil C编译器会忽略编码为0xFD的字符,当编写中文显示程序时会出现问题,应安装针对这一问题的专用补丁,许多Keil C安装包都含有该补丁程序,安装时间可根据帮助文件安装该补丁。2.3 Proteus简介Proteus是英国Labcenter公司开发的嵌入式系统仿真软件,组合了高级原理图设计工具ISIS、混合模式SPICE仿真、PCB设计以及自动布线而形成了一个完整的电子设计系统。它运行于Windows操
11、作系统上,可以仿真、分析各种模拟和数字电路,并且对机的硬件配置要求不高。2.3.1 Proteus与Keil C 的联合仿真 目前,单片机仿真软件很多,Proteus ISIS 与其他单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能够仿真单片机外围电路或没有单片机参与的其他电路的工作情况。一次在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程师的角度直接看程序运行和电路工作的过程和结果。同事,当原理图调试成功后,利用Proteus ARES软件,很容易获得PCB图,为今后的制造提供了方便。Keil是美国Keil Software公司开发的,
12、是目前世界上最好的51单片机的汇编和C语言的开发工具。它支持汇编、C语言以及混合编程,同时具备功能强大的软件仿真,在软件模拟仿真方式下不需要任何单片机硬件即可完成用户程序仿真调试;虽然Keil也提供了硬件仿真(用Monitor51协议,需要硬件支持)功能,但我们在利用它的硬件仿真功能的时候,它会受到一定的限制。如果我们将Proteus ISIS与Keil整合起来使用,充分利用各自的仿真功能,单片机软硬件的调试将变的十分有效。打开LED.dsn,删除LED设计页中的ULA2003A驱动部分,在LED设计页新建一个子电路LED_DRIVER,为该子电路见撒谎那个输入/输出端子。移动鼠标指针带子电路
13、上。按Ctrl+C计入子电路所在的设计页,原ULA2003驱动部分加上相应的端子。由于LED的驱动部分有多中方案,将来采用别的方案时不需要做任何的修改。用BUTTON元件绘出键盘的部分,并为行扫描线和列扫描线上的端子命名,此处不采用Proteus中现成的键盘模型是为了是读者更透彻的理解键盘的设计和按键识别的原理,但在商业产品的开发中可购买现成的键盘模块。第3章 基于单片机的PID温度控制系统3.1 PID温控器简介图3-1 PID温控器原理图电炉内的热电阻温度传感器测出的温度信号经运算放大器放大和模/数转换后,由8051读出电阻炉炉温,控制程序根据当前炉温和目标温度的偏差,按照一定的控制方法控
14、制开关K的开与断,提供适当的加热功率,以使炉温尽快趋近目标温度。 本设计是接口技术、应用系统设计、Proteus仿真的结合,介绍存储系统、数据采集、串口通信等知识及其在PID温控器设计中的应用于仿真,从个子系统开始,设计并逐步完善,直至整个应用系统的实现。3.2 8051存储系统扩展和PID温控器的存储系统设计3.2.1 PID温控器存储系统设计PID温控器的存储系统设计中使用了一片3-8译码器74LS138来产生各芯片所需的片选信号。要是为低电平选中6264,则C、B、A的输出应为011,由此可以计算出6264的二进制地址范围为0110 0000 0000 0000 0111 1111 11
15、11 1111,写成十六进制为0x60000x7fff,2764的地址范围为0x00000x1fff。图3-2 温控系统扩展图3.3 人机接口和PID温控器的输入/输出设计及仿真键盘和显示器是最常用的人机交互设备,在单片机系统中显示器常用笔段式LED或者多段式液晶LCD做显示设备,如微波炉、洗衣机、DVD等家用电器采用此类显示方式。输出内容较复杂的系统也有才有字符型点阵式LED、字符型LCD等,这里只介绍八段LED显示器,可用于数字和部分字符显示。3.3.1 八段LED显示器下图为笔段式八段LED数码管原理图。LED显示器有共阴极和共阳极之分,其中的每段为一个发光二极管,常用的有红绿两种。共阴
16、极LED的com公共端应接低电平,割断引脚接高电平则该段点亮,接低电平则该段熄灭。共阳极LED与其相反。图3-3 笔段式八段LED数码管原理图不考虑com端,可知共阳极显示字符0时的各段二进制编码为1100 0000 ,写成十六进制为0xC0。C语言形式给出的共阳极LED能显示的部分数字和字符编码,可直接用在C51程序中。图3-4 段位置及编号图3-5 共阳极LED图3-6 共阴极LED3.3.2 LED显示器的显示方式实际使用LED时,一般将几个八段显示器排列成一组使用,其中的一个LED显示器被称为一位。多位LED显示器的显示方式分为静态方式和动态扫描方式。静态方式中各LED的段引脚和com
17、端都独立接线,这种方式的好处是程序相对简单,显示无闪烁;缺点是功耗大。采用动态扫描时,各LED的段引脚链接在一起,而com段独立,程序是通过控制各LED的com端的电平来决定点亮某一位LED。其优点是功耗小,缺点为编程相对复杂,当CPU负担较重时可能达不到理想的刷新速度,导致效果变差。设置选通信号选中最左边LED取输入数据查表取字型码显示一个数字最右边的显示没?结束NOYES开始图3-7 试验硬件图图3-8 LED静态显示仿真图试验程序#includeabsacc.h unsigned char code LED_CODES= 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x
18、82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86, 0x8e,0xff,0x0c,0x89,0x7f,0xbf;void main() XBYTE0x0000= LED_CODES1; XBYTE0x0200= LED_CODES2; XBYTE0x0400= LED_CODES8; while(1); 图3-9 试验仿真图3.3.3 PID温控器LED显示及仿真YES关闭全部LED1ms延时取输入数据查表送取字型码送字选通信号显示一个数据是否是最后一位显示结束设置显示位数i初始化8255A开始图3-10 LED程序流程图下图为PID温控器LED显示部分的
19、Proteus仿真原理图。8255A是一个教复杂的并行接口芯片,在PID温控器主要用作I/O口扩展,用于LED的显示。在编程时应注意,由于8255A的复位时间较长,字应用程序访问8255A之前,应有足够的延时保证8255A已正确复位。图3-11 PID温控器LED显示仿真原理图图3-11中有6位动态扫描共阴极LED,它们的段引脚AG、DP是并联在一起的;引脚16位是各位LED的com端,相互独立。8255A端口C经74LS244的相同输出S0S7作为LED的段驱动信号,当某位LED各段全部点亮时,com端电流会达到120150mA,所以,选用驱动能力较强的ULN2003A作为驱动器件。8255
20、端口的经反相后的输出,作为的位选信号,排阻作为的下拉电阻。实验程序DISPLAY.H程序#define BASE 0x0000#define PORT_A (BASE)#define PORT_B (BASE+ 1)#define PORT_C (BASE+ 2)#define PORT_CONTROL (BASE+ 3)#define LEDS 6#define CA 0#define CC 1void turn_on(char led,char ChNumber,char mode);void LedsOff();void oneByone (char datas);extern void
21、 Init8255();unsigned char code Setect;unsigned char code LED_CODES;DISPLAY.C程序 #include absacc.h#include reg51.h#include display.hunsigned char code Select=0x01,0x02,0x04,0x08,0x10,0x20;unsigned char code LED_CODES=0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF,
22、0x0C,0x89,0x7F,0xBF;void Init8255()unsigned char i,j;for(j=0;j10;j+) for(i=0;i1;t1=t1;t1= t1|0x0f;P1=t1;t1=P1;t2= 0x08;t1=t1;for(i=4;i!=0;i-)t3=t2&t1; if(t3!=0)*row=i-1;break;else t2= t2 1;exit: return Result;mian源程序 #include display.h#include absacc.h#include Reg51.hextern char keyCheck(char*row,ch
23、ar*col);void main()char row,col,r; char strIndexs6=20,20,20,20,20,20; unsigned char i,k; Init8255();while(1) r=keyCheck(&row,&col);if(r= 0)strIndexs5=20;strIndexs4=20;strIndexs1=20;strIndexs0=20;elsestrIndexs5=0;strIndexs1=0;strIndexs4=row;strIndexs0=col;for(k= 6;k!=0;k-)LedsOff();for(i= 250;i!=0;i-
24、);turn_on(k-1,strIndexsk-1,CC);for(i=250;i!=0;i-);图3-17 程序仿真图第4章 PID温控器的炉温采样接口及仿真在计算机实时测量和智能化仪表等应用系统中,经常会遇到从时间到数值均连续变化的模拟量,如温度、压力、位移、速度等,与此相对应的电信号称为模拟信号。因单片机只能处理数字量,因此这些模拟电信号必须转化为离散的数字信号,才能被送给单片机进行相应的处理。将模拟信号转化为数字量的器件称为A/D转换器,简称A/D。4.4.1 A/D转化器的主要技术指标a.分辨率 分辨率是指输出数字量变化的一个相邻数码所需要输入模拟电压的变化量。习惯上用输出的二进制
25、位数或BCD码位数表示。例如,分辨率为12位的A/D转换器,表示该转化器的输出数据可以用212个二进制数进行量化。分辨率用呗分数表示如下:1/212 *100%=1/4096 *100%=0.0244%故一个满刻度为10V的12位A/D转换器能够分辨输入电压变化的最小值为2.4V。b.量化误差 量化误差是指由A/D转换器的优先分辨率多引起的误差。若不考虑其他误差的影响,一个分辨率有限的A/D转换器的阶梯状转移特性曲线与具有无限分辨率的A/D转换器转移特性曲线(直线)之间的最大误差,称为误差量化。提高分辨率能够减少量化误差。c.转换精度 转换精度是指A/D转换器的时间量化值与理想A/D转换器的差
26、值。转换精度可以分为绝对精度和相对精度,是由非线性、零点刻度、满量程刻度以及温漂等因素所引起的误差。d.转换速率 转换速率就是指能够重复进行数据转换的速度,即每秒转换的次数。而完成一次的A/D转换所需要的时间,则是转换速率的倒数。4.4.2 PID温控器A/D转换编程方法采用的是端口查询方式,先向51单片机P3.3写入1,然后读入P3口。检查P3.3是为位0,不为0则重新读入P3在检测,直到P3.3为0 ,此时表示数据转换过程已结束,读片外地址0x2XXX,P1,/RD为低电平,经74LS02反向为高电平,向ADC0808的OE送读数据的信号,ADC0808将转换结果从Out7Out0送到数据
27、总线并读入CPU。实现在LED上显示读取的A/D转换值。程序流程图如下;YES初始化8255A启动AD转换保存通道号和数据组取输入数据设置显示位数i关闭全部LED1ms延时查表送取字型码显示一个数据是否是最后一位显示结束送字选通信号开始实验硬件图实验程序DISPLAY.H程序和DISPLAY.C程序(如前)主程序ADC0808.c#include #include #include #define ADC_0808 1#define ADC0808_DATA_PORT 0x2000#define ADC0808_QUERY_PORT 0x4000#define ADC0808_START_PO
28、RT 0x2000unsigned char getData2(unsigned char ADC_Chip,unsigned char channel)unsigned char flag= 0;unsigned char value= -1;unsigned xdata ale;switch (ADC_Chip)case ADC_0808:P3= P3|0x08;XBYTEADC0808_START_PORT= channel;P3= P3&0xdf;P3= P3|0x20;P3= P3&0xdf;flag= P3;while(1)ale= 1;flag=flag & 0x08;if(fl
29、ag=0) break;flag= P3;value= XBYTEADC0808_DATA_PORT;return value;break;void dispStr(char strIndexs,unsigned char value,char channel)char i,k;for(i= 0;i3;i+)strIndexsi= value%10;value= value/10;strIndexs4= channel;LedsOff();for(i=250;i!=0;i-);for(k=6;k!=0;k-)LedsOff();for(i=250;i!=0;i-);turn_On(k-1,st
30、rIndexsk-1,CC);for(i=250;i!=0;i-);void main()unsigned char value;unsigned int k;char strIndexs6=20,20,20,20,1,12;Init8255();while(1)value= getData2(ADC_0808,1);for(k=100;k!=0;k-)dispStr(strIndexs,value,1);LedsOff();实验仿真图AD转换(总线查询方式和中断方式)读片外地址0x4XXX,P2和/RD位低电平,经74LS02反相后打开三态门74LS125,将转换是否完成的标志EOC通过数据
31、总线D7读入CPU,检查D7是否为1,若不为1,则重新读端口0x4XXX在检测,直到D7为1为止,读片外地址0x2XXX,P1,/RD为低电平,经74LS02反向为高电平,向ADC0808的OE送读数据的信号,ADC0808将转换结果从Out7Out0送到数据总线并读入CPU。开始YESNO初始化8255A启动AD转换保存通道号和数据组取输入数据设置显示位数i关闭全部LED1ms延时查表送取字型码显示一个数据是否是最后一位显示结束送字选通信号实验硬件图总线查询方式硬件图中断方式硬件图实验程序1、总线查询方式程序A、DISPLAY.H和DISPLAY.C程序同上次实验B、主程序ADZX.C#in
32、clude #include #include #define ADC_0808 1 #define ADC0808_DATA_PORT 0X2000 #define ADC0808_QUERY_PORT 0x4000 #define ADC0808_START_PORT 0x2000 unsigned char getData1(unsigned char ADC_Chip,unsigned char channel)unsigned char flag= 0; unsigned char value= -1; unsigned xdata ale; switch (ADC_Chip)cas
33、e ADC_0808:XBYTEADC0808_START_PORT=channel;P3=P3|0x08;P3=P3&0xdf;P3=P3|0x20;P3=P3&0xdf;flag=P3;while(1) ale=1;flag=flag &0x08;if(flag =0) break;flag=P3;value=XBYTEADC0808_DATA_PORT;return value;break;void dispStr (char strIndexs,unsigned char value,char channel)char i,k;for(i= 0;i3;i+) strIndexsi=va
34、lue% 10;value=value/10;strIndexs4=channel;LedsOff();for(i= 250;i!=0;i-);for(k=6;k!=0;k-)LedsOff();for(i= 250;i!=0;i-);turn_On(k-1,strIndexsk-1,CC);for(i= 250;i!=0;i-);void main()unsigned char value;unsigned int k;char strIndexs6=20,20,20,20,1,12;Init8255();while(1)value= getData1(ADC_0808,0);for(k=
35、100;k!=0;k-)dispStr(strIndexs,value,0);LedsOff();中断方式程序A、DISPLAY.H和DISPLAY.C程序同上次实验B、主程序ADC0808ZD.C#include #include #include #define ADC_0808 1 #define ADC0808_DATA_PORT 0X2000 #define ADC0808_QUERY_PORT 0x4000 #define ADC0808_START_PORT 0x2000 unsigned char value;void dispStr (char strIndexs,unsig
36、ned char value,char channel)char i,k;for(i= 0;i3;i+) strIndexsi=value% 10;value=value/10;strIndexs4=channel;LedsOff();for(i= 250;i!=0;i-);for(k=6;k!=0;k-)LedsOff();for(i= 250;i!=0;i-);turn_On(k-1,strIndexsk-1,CC);for(i= 250;i!=0;i-);void main()unsigned xdata ale;Init8255();EX1=1;IT1=1;EA=1;XBYTEADC0
37、808_START_PORT=5;P3=P3&0xdf;P3=P3|0x20;P3=P3&0xdf;while(1)ale=1;void EX1_Int() interrupt 2unsigned char value;char strIndexs6=20,20,20,20,1,12;EX1= 0;value=XBYTEADC0808_START_PORT;dispStr(strIndexs,value,5);LedsOff();EX1= 1;P3=P3&0xdf;P3=P3|0x20;P3=P3&0xdf;实验仿真图总线查询方式仿真图总线查询方式仿真图中断方式仿真图第5章 测温放大电路利用的
38、是热电阻测温的原理,金属热电阻的电阻值与其温度成线性关系,将热电阻Rt介入电桥中,设在某一温度t0时,Rt的阻值为R0,将电桥调整平衡,即R1/R0=R2/R3,此时Ul=0.当Rt的温度偏离t0而变为t时,其阻值将发生变化,电桥失去平衡,若测出此时的Ul,则可根据Ul和Rt的关系,算出在温度为t时热电阻的阻值 Rt,再根据热电阻的温度-阻值关系线,换算出热电阻的温度t0。若电桥的输出电压Ul于Rt的阻值变换成线性关系,则通过运算放大、A/D转换后可方便地将Ul转换为热电阻所测温度。程序流程图如下:YESNO开始初始化8255A通道0读入数据启动AD转换标度换算出温度值关闭所有LED1ms延时用%和/运算分别得到各位数据是第二位吗数据或上80H送选通信号查表送取字型码最后一位显示吗结束实验硬件图试验程序1、Display.h#define BASE 0x0000 #define PORT_A (BASE) #define PORT_B (BASE+ 1) #define PO