苏 州 市 职 业 大 学
课程设计
课程名称 单片机原理与应用课程设计 2011年12月 12日至 2011 年12月16日共 1 周
院 系 电子信息工程系 班 级 10电子(5)班 姓 名 王洪伟
系 主 任 张红兵 教研室主任 陆春妹 指导教师 古玉年
一、 设计任务
通过实验电路,设计一个空调温度控制器程序,其中以热敏电阻来检测
温度,而继电器控制压缩机,使其能制冷与加热。
二、 设计要求
1、显示温度范围16-32 ,用两位数码管进行显示。
2、温度设定位16-32 ,设定温度时,温度显示值闪烁(1HZ)。 3、用2个按键,一个上升键,一个下降健。
4、设定温度值每半分钟如果发生变化,则记忆在存储器24C02中。
三、 实验电路
根据设计要求,电路要用到以下几大模块:
1、 A/D转换模块:
因为单片机不能直接检温度信号,所以我们要通过A/D转换电路,把不可测的温度信号转换为电信号,使单片机能测量其信号!
图(1) A/D转换电路
2、记忆模块:
AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,
CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
而该芯片在此设计电路中起记忆作用。
图(2)AT24C02电路
3、显示模块:
本设计电路的显示部分有两片8D锁存器573和4个数码管构成,一片用于
控制LED数码管的字段,另一片用于控制数码管的字位。我们用前两位数码管显示设定的温度,后两位用于显示测量的温度,而且是动态显示。
图(3) 数码管显示电路
4、继电器模块:
继电器是一种电控制器件。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。
所以,我们用继电器模拟控制压缩机,当温度变化时,通过比较程序来控制继电器动作,以达到控制压缩机制冷或加热。
图(4)
继电器控制电路
5、按键模块:
我们此次用了两个按键,一个上升按键,一个下降按键,通过动态按键扫描程序,我们来完成此功能。
图(5) 按键电路
四、 程序流程图
开始赋初值、定义各类寄存器定时器初始程序按键处理相等、不相等则记忆该参数程序显示程序A/D转换程序按键主程序表格数据结束
五、 程序
RELAY EQU P1.3 SCL EQU P1.5 SDA EQU P1.6 DOUT EQU P1.1 CIO EQU P1.0 CS EQU P1.2 SEL0 EQU P3.5 SEL1 EQU P3.7 DISP1 EQU 30H DISP2 EQU 31H DISP3 EQU 32H DISP4 EQU 33H COUNT EQU 34H TEMP EQU 35H TEMP_SET EQU 37H SCAN EQU 20H SCAN1 EQU 20H.0 SCAN2 EQU 20H.1 SCAN3 SCAN4 SCAN5 SCAN6
EQU EQU EQU EQU
20H.2 20H.3 20H.4 20H.5
SCAN7 EQU 20H.6 TMP EQU 36H KEY_LAST EQU 38H ORG 0000H LJMP MAIN ORG 001BH AJMP DISPLAY MAIN: MOV TMOD,#10H MOV TH1,#0ECH MOV TL1,#78H SETB ET1 SETB PT1 SETB EA SETB TR1
MOV COUNT,#0 CLR SEL0 CLR SEL1
MOV DISP1,#2 MOV DISP2,#0
MOV DISP3,#0
MOV DISP4,#6 MOV R0,#00H LCALL RD_DATA CJNE A,#99,AJ
AJ: JC NO_OVER99 MOV R0,#00H MOV R1,#20 LCALL WR_DATA LCALL RD_DATA NO_OVER99:MOV TEMP_SET,A MOV TMP,A MOV B,#10 DIV AB MOV DISP2,B MOV DISP1,A WAIT: MOV A,TEMP_SET SUBB A,TEMP JC OVER0 CLR RELAY AJMP PRO
OVER0: SETB RELAY PRO: LCALL KEY_SCAN JZ PRO1_END
CJNE A,#1,NO_1KEY MOV A,TEMP_SET CJNE A,#99,AJ1 AJ1: JNC PRO_END
INC TEMP_SET AJMP PRO_END NO_1KEY: CJNE A,#2,PRO_END MOV A,TEMP_SET JZ PRO_END DEC TEMP_SET AJMP PRO_END PRO_END: MOV A,TEMP_SET MOV B,#10 DIV AB
MOV DISP2,B MOV DISP1,A PRO1_END: AJMP DS_PRO
MYDS: AJMP WAIT DS_PRO: MOV A,TMP
CJNE A,TEMP_SET,NO_XD
AJMP NO_PROSET NO_XD: MOV TMP,TEMP_SET MOV R0,#0
MOV R1,TEMP_SET LCALL WR_DATA NO_PROSET: LCALL TRANS MOV B,#10 DIV AB
MOV DISP3,A MOV DISP4,B AJMP WAIT
DISOUT1: MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A SETB SEL1 NOP
CLR SEL1 RET
DISOUT0: MOV A,SCAN MOV P0,A SETB SEL0 NOP
CLR SEL0 RET
DISPLAY: MOV TH1,#0ECH MOV TL1,#78H PUSH ACC
PUSH PSW
CJNE A,#100,NO_500MS NO_500MS: INC COUNT MOV A,COUNT CJNE A,#1,NO_DIS1 CLR SCAN1 SETB SCAN2 SETB SCAN3 SETB SCAN4 LCALL DISOUT0 MOV A,DISP1 LCALL DISOUT1 AJMP T1_END NO_DIS1: CJNE A,#2,NO_DIS2 SETB SCAN1 CLR SCAN2 SETB SCAN3
SETB SCAN4
LCALL DISOUT0 MOV A,DISP2 LCALL DISOUT1 AJMP T1_END
NO_DIS2: CJNE A,#3,NO_DIS3 SETB SCAN1 CLR SCAN3 SETB SCAN2 SETB SCAN4 LCALL DISOUT0 MOV A,DISP3 LCALL DISOUT1 AJMP T1_END NO_DIS3: MOV COUNT,#0 SETB SCAN1 SETB SCAN2 SETB SCAN3 CLR SCAN4 LCALL DISOUT0 MOV A,DISP4 LCALL DISOUT1 T1_END: POP PSW POP ACC RETI
TRANS: LCALL ADCA MOV B,A MOV TEMP,#0 MOV A,#0
LOOP0: MOV DPTR,#TAB1 MOVC A,@A+DPTR SUBB A,B JNC GET_TEMP INC TEMP MOV A,TEMP AJMP LOOP0 GET_TEMP: MOV A,TEMP RET
ADCA: MOV R3,#0FH SETB CS NOP CLR CS CLR CIO NOP
NOP
NOP NOP NOP NOP
NOP NOP NOP NOP
READA: REDA1: NOP
LCALL READA SETB CS NOP RET
MOV R4,#08H MOV C,DOUT RLC A NOP NOP SETB CIO NOP NOP NOP NOP
NOP NOP NOP NOP CLR CIO NOP NOP NOP NOP NOP NOP NOP
DJNZ R4,REDA1 NOP NOP NOP NOP SETB CS RET
KEY_SCAN: CLR SCAN5
SETB SCAN6 SETB SCAN7 LCALL DISOUT0 MOV A,P2
ANL A,#00001111B CJNE A,#0FH,MAY_KEY AJMP NO_KEY
MAY_KEY: LCALL DELAY10ms MOV A,P2
ANL A,#0FH
CJNE A,#0FH,YES_KEY AJMP NO_KEY
YES_KEY: CJNE A,#0EH,NO_KEY1 MOV A,#1
AJMP KEY_COM NO_KEY1: CJNE A,#0DH,NO_KEY2 MOV A,#2
AJMP KEY_COM NO_KEY2: CJNE A,#0BH,NO_KEY3 MOV A,#3 AJMP KEY_COM NO_KEY3: MOV A,#4
AJMP KEY_COM NO_KEY: MOV A,#0
MOV KEY_LAST,#0 AJMP KEY_END
KEY_COM:
CJNE A,KEY_LAST,KEY_FIRST MOV A,#0 AJMP KEY_END KEY_FIRST:
MOV KEY_LAST,A
AJMP KEY_END KEY_END: RET
DELAY10ms:MOV R6,#250 DEL:MOV R7,#10 DJNZ R7,$ DJNZ R6,DEL RET WR_DATA:
LCALL BSTART MOV A,#0A0H LCALL WBYTE
MOV A,R0 RD_DATA:
LCALL BSTART MOV A,#0A0H LCALL WBYTE MOV A,R0 LCALL WBYTE LCALL DELAY LCALL BSTART MOV A,#0A1H LCALL WBYTE LCALL RBYTE LCALL BSTOP RET DELAY: NOP
NOP NOP NOP RET
LCALL WBYTE MOV A,R1
LCALL WBYTE LCALL BSTOP
RET
BSTART:
CLR SCL LCALL DELAY SETB SDA LCALL DELAY SETB SCL LCALL DELAY CLR SDA LCALL DELAY CLR SCL RET BSTOP:
CLR SCL LCALL DELAY CLR SDA LCALL DELAY SETB SCL LCALL DELAY SETB SDA
LCALL DELAY CLR SCL LCALL DELAY RET WBYTE:
MOV R3,#8 WBY0:
CLR SCL RLC A RBYTE:
RBY0:
TAB: TAB1: MOV SDA,C SETB SCL
DJNZ R3,WBY0 CLR SCL LCALL DELAY SETB SCL LCALL DELAY CLR SCL LCALL DELAY RET LCALL DELAY MOV R3,#8 CLR SCL LCALL DELAY SETB SCL LCALL DELAY MOV C,SDA RLC A
DJNZ R3,RBY0 CLR SCL LCALL DELAY SETB SDA LCALL DELAY SETB SCL LCALL DELAY RET
DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H,0FFH DB 32,34,35,36,38,39,41,43,44,46 DB 48,49,51,53,55,57,59,61,63,65 DB 67,69,71,73,75,77,80,82,84,86 DB 87,,90,92,93,94,96,97,99,100 END
六、 设计心得
通过这次单片机课程设计,我对汇编程序又有了新的了解。以前编程,都是编写一些的程序,而此次编程,是我们前几次编写程序的组合体,但如何组合?这就是我在编程时遇到的第一个难题,因为我们前几次的程序都是一些个体,而且功能都有一定的局限性,所以我们要在程序中做不同的改进,以满足此次设计要求。
但是,我们在编程时会遇到一步错,步步错的问题,我就在编写程序时,因为共用了同一个寄存器,以至于我在调试程序时,数码管显示的温度没有变化。所以我们在编程时要做到细心、再细心。
在调试程序中,我的按键按下后,数据变化很大,后来经过老师的讲解,我找到问题出在那了,所以我感觉自己的知识还是很有限,以后还要好好的学习。
对我而言,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必可以算是我人生旅途上一个非常美好的回忆!