单片机课程设计实验报告——温度控制器班级:学号: 电气0806 姓名: 08291174 老师: 李长城 合作者: 姜久春李志鹏一、实验要求和目的本课程设计的课题是温度控制器。
●用电压输入的变化来模拟温度的变化,对输入的模拟电压通过ADC0832转换成数字量输出。
输入的电压为0.00V——5.00V,在三位数码显示管中显示范围为00.0——99.9。
其中0V对应00.0,5V对应99.9●单片机的控制目标是风机和加热器。
分别由两个继电器工作来模拟。
系统加了一个滞环。
适合温度为60度。
◆当显示为00.0-50.0时,继电器A闭合,灯A亮,模拟加热器工作。
◆当显示为为50.0-55.0时,保持继电器AB的动作。
◆当显示为55.0-65.0时,继电器A断开,灯A熄灭,模拟加热器停止工作。
◆当显示为65.0-70.0时,保持继电器AB的动作◆当显示为70.0-99.9时,继电器B闭合,灯B亮,模拟风机的工作。
二、实验电路涉及原件及电路图由于硬件系统电路已经给定,只需要了解它的功能,使用proteus 画出原理图就可以了。
实验设计的电路硬件有:1、AT89S52本温度控制器采用AT89C52单片机作为CPU,12MHZ晶振AT89C52的引脚结构图:AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes 的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash 存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
此外,AT89S52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
主要功能特性:•兼容MCS-51指令系统•8k可反复擦写(>1000次)ISP Flash ROM•32个双向I/O口•4.5-5.5V工作电压•3个16位可编程定时/计数器•时钟频率0-33MHz•全双工UART串行中断口线•256x8bit内部RAM•2个外部中断源•低功耗空闲和省电模式•中断唤醒省电模式•3级加密位•看门狗(WDT)电路•软件设置空闲和省电功能•灵活的ISP字节和分页编程•双数据寄存器指针89S52芯片的各引脚功能如下:GND 接地Vcc 接电源P0.0-0.7 开漏双向I/O口P2.0-2.7 内部上拉的双向I/O口P1.0-1.7 内部上拉的双向I/O口P3.0-3.7 内部上拉的双向I/O口特殊功能引脚:MOSI,MISO,SCK(P1.5,P1.6,P1.7)用于ISP编程RXD(P3.0)串行输入口TXD(P3.1) 串行输出口WR (P3.6)外部数据存储器写信号RD (P3.7)外部数据存储器读信号T0 (P3.4) 定时器0外部输入T1 (P3.5) 定时器1外部输入INT0 (P3.3) 外部中断0INT1 (P3.2) 外部中断1RST 复位ALE 地址锁存使能EA/Vpp 外部寻址使能/可编程电压PSEN 程序存储器使能XTAL1 振荡器反相放大器及内部时钟发生器的输入端XTAL2 振荡器反相放大器输出端2、ADC0832这是一个串行的AD转换芯片,实验所用的是八个管脚的芯片:芯片接口说明:· CS_ 片选使能,低电平芯片使能。
· CH0 模拟输入通道0,或作为IN+/-使用。
· CH1 模拟输入通道1,或作为IN+/-使用。
· GND 芯片参考0 电位(地)。
· DI 数据信号输入,选择通道控制。
· DO 数据信号输出,转换数据输出。
· CLK 芯片时钟输入。
· Vcc/REF 电源输入及参考电压输入(复用)。
单片机对ADC0832 的控制原理:正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。
但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI 并联在一根数据线上使用。
(见图3)当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。
当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能。
3、共阳极LED数码管三、程序设计流程本来预习中,我已经找到了一种芯片可以做AD转换的,是ADC674,但是实验要求用ADC0832的,过程不同,但是程序思路是基本不变的。
我的预习中使用了两种思路设计关于温度变化导致继电器动作的程序:采用12位AD转换器AD1674可以实现000——999的输出显示。
另外用内部定时器来产生中断,定时采集数据信息。
具体的设计思路有如下:1、思路<500?Y-----开加热,转下N-----转下>550?Y-----关加热器,转下N-----转下<650?Y-----关风机,转下N-----转下>700?Y-----开风机,结束N-----结束这种方法思维,可以任意时刻采集到的温度信号,通过单片机控制直接进行相应的继电器操作。
设输入信号量为X,相关的核心程序为:MOV 30H,#500MOV 31H.#550MOV 32H.#650MOV 33H,#700 PD0:CLR CyMOV A, #XSUBB A,30HJNC PD1MOV P1.0,#1 PD1: CLR CyMOV A, #XSUBB A,31HJC PD2MOV P1.0,#0 PD2: CLR CyMOV A, #XSUBB A,32HJNC PD3MOV P1.1,#0 PD3: CLR CyMOV A, #XSUBB A,33HJC JSMOV P1.1,#1 JS: SJMP $2、思路通过和500、550、650和700进行比较,确定在小于500时,开发加热器和大于700时,开风机。
在500——550到650——700的区间中间,需要与前一段时间采集到的信息进行比较才能确定如何对继电器发命令。
具体为:MOV 30H,#500MOV 31H.#550MOV 32H.#650MOV 33H,#700 PD0:CLR CyMOV A, #XSUBB A,30HJNC PD1 MOV P1.0,#1 PD1: CLR CyMOV A, #XSUBB A,31HJNC PD2CLR CyMOV A,#X SUBB A,@R0JNC PD2CPL P1.0 PD2: CLR CyMOV A, #XSUBB A,32HJNC PD3CLR CyMOV A,#X SUBB A,@R0JNC PD3CPL P1.1PD3: CLR CyMOV A, #XSUBB A,33HJC JSMOV P1.1,#1 JS: MOV @R0,#X SJMP $通过按照电路板画出原理图后,我觉得这个思路不是很好。
和同组的同学讨论过后,发现了同组的同学思路极其敏捷。
他通过用CJNE的语言,判断Cy的大小来进行判断温度,进而进行继电器工作,十分简便快速。
因此我们最后用了这个方法来进行编程序。
另外,还有一些需要解决的问题:◆采集数据后的算法。
设采集量为X(0~255),转换成AB.C(00.0~99.9)。
X×100÷256=AB.CX先乘100,高八位就相当于已经除了256,即AB部分;低八位再除10,获得C部分。
◆显示字形,继电器控制及继电器LED灯控制详请见程序。
需要注意的是AB.C中的B字码需要加个小数点,以及取反序的共阳码。
四、实验原理图见后附件1五、实验程序ORG 0000HLJMP MAINORG 0500HMAIN:MOV SP,#80HSETB P1.4LCALL DELAYMOV R7,#8;取8次值,存R7MOV R0,#0;和的低八位,存R0CLR CCLR AMOV R1,#0;和的高八位,存R1XIAODOU: LCALL ADMOV A,R0ADD A,R2;R2为采集值MOV R0,ACLR AADDC A,R1MOV R1,ADJNZ R7,XIAODOUMOV R6,#3;移位3次,意在除8,存R6 CHU8: CLR CMOV A,R1RRC AMOV R1,AMOV A,R0 RRC AMOV R0,ADJNZ R6,CHU8;除8后R0存平均值MOV A,R0MOV R3,ALCALL BCDLCALL DISPLAY;除8以后DISPLAY LCALL RELAYANDLEDSJMP MAINAD: MOV A,#00HMOV R2,A;数据初始化 SETB P3.3 ;CS置高 CLR P3.2 ;CLK清零 CLR P3.3 ;片选CS SETB P3.0;第一个脉冲下沉之前,DI必须置1,起始信号LCALL MC ;脉冲SETB P3.0;输入DI,设置信号为10,选择通道0单独工作LCALL MCCLR P3.0LCALL MCMOV 30H,#08H;读取8位数据ADDATA: MOV C,P3.1 ;接收MOV ACC.0,CRL ALCALL MCDJNZ 30H,ADDATA;8次之后结束数据接收 SETB P3.3 CLR P3.2 SETB P3.1MOV R2,ARETMC: SETB P3.2NOPNOPNOPCLR P3.2NOPNOPNOPRET;BCD转换成AB.CBCD: MOV A,R3MOV B,#100 MUL ABMOV 40H,A ;低八位40H MOV 41H,B ;高八位41H MOV A,41HMOV B,#10DIV ABMOV 50H,A ;A MOV 51H,B ;B MOV A,40HMOV B,#10MUL ABMOV A,BMOV 52H,A ;C;显示AB.CDISPLAY: SETB P1.5SETB P1.6SETB P1.7MOV A,50HMOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ACLR P1.5 ;显示A ;共阳极,低电平有效 LCALL DELAY SETB P1.5MOV A,51HMOV DPTR,#TABMOVC A,@A+DPTRORL A,#01HMOV P0,ACLR P1.6 ;显示B. LCALL DELAYSETB P1.6MOV A,52HMOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ACLR P1.7 ;显示C LCALL DELAYRET;继电器和LEDRELAYANDLED: CLR CMOV A,R2CJNE A,#128,JP ;50 JP: JNC JP1SETB P1.2CLR P1.0CLR P1.3SETB P1.1SJMP COMJP1: CJNE A,#141,JP10 ;55 JP10: JNC JP2CLR P1.3SETB P1.1SJMP COMJP2: CJNE A,#166,JP20 ;65 JP20: JNC JP3CLR P1.2SETB P1.0CLR P1.3SETB P1.1SJMP COMJP3: CJNE A,#179,JP30 ;70 JP30: JNC JP4CLR P1.2SETB P1.0SJMP COMJP4: CLR P1.2SETB P1.0SETB P1.3CLR P1.1COM: RETTAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H, 0FEH,0F6H ;共阳码反序DELAY: MOV R5,#02HDELAY0: MOV R4,#0FFHDELAY1: DJNZ R4,DELAY1DJNZ R5,DELAY0RETEND六、实验电路原理图仿真见后附件2七、调试过程遇到的问题以及解决办法根据原先所制的原理图,我们编写了程序,用proteus仿真,效果很理想(除了上限不能达到99.9,只到达99.2)。