单片机89S51水温控制系统
一、摘要
该系统主电路采用89S51单片机实现温度控制,加热和制冷部分由于条件限制,只采用模拟的方式。电路可实现温度的显示,设置上下限温度,超出范围报警以及和PC机通信的功能。系统测量精度和控制精度良好。我们为本系统共设计了两套程序,我主要负责其中一套程序的编写和单片机最小系统板的组建。
二、方案选择
本系统采用89S51单片机系统来实现。单片机软件编程灵活、自由度大,可用软件编程实现各种控制看法和逻辑控制。可实现数码显示和键盘设定等多种功能,系统电路框图如下: 采用以89S51为控制核心的单片机控制系统,尤其对温度控制,它可达到模拟控制所达不到的控制效果,并且可实现显示、键盘设定等多种功能,又易于扩展,大大提高了系统的智能化,也使得系统所测结果精度大大提高。故选择方案三。
三、器件选择
由于单片机最小系统板采用的是去年省赛的板子,所以受到了很多限制。如对系统精度至关重要的A/D转换换器,板子上采用的是ADC0809。因为是八位的,所以精度不高,最多只能达到0.4度左右。但考虑到已有现成的板子,采用0809同样可达到实验的目的,所以A/D部分暂不作更改。
传感器部分既可采用热敏电阻,也可采用集成的温度传感器。但由于热敏电阻的精度、重复性、可靠性都比较差,所以我们采用的集成的LM35,LM35是一个三端器件(电源、地、输出),的是NS公司生产的集成电路温度传感器系列产品之一,它具有很高工作精度和较宽的线性工作范围,该器件输出电压与摄氏温度线性成比例。LM35与用开尔文标准的线性温度传感器相比更有优越之处,LM35无需外部校准或微调,可以提供±1/4℃的常用的室温精度。其灵敏度为+10.0mV/℃,精度在+25℃时为0.5℃。精度较高,并且价格较低,每片仅售6元。较之性能较好的AD590K便宜许多,性价比高。故采用LM35而舍弃AD590K。
四、电路原理图
单片机最小系统部分:
ADC0809的A/D采样部分:
四位LED数码管显示部分:
单片机串口通信电路:
温度采集部分:
五、工作原理
具体电路原理详见本组另一成员的报告,在此仅介绍系统的软件部分,我们总共写了两份程序,其中一份为我个人独立完成。下面为程序的主要流程图。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 |
;显示区地址分别为63H,62H,61H,60H ;上限温度地址分别为2EH,2DH,2CH ;下限温度地址分别为2BH,2AH,29H ;用到的位地址有00H,01H,30H ; ===============主程序=============== ORG 0000H LJMP MAIN ORG 0003H LJMP INT0 ORG 0030H MAIN: MOV SP,#70H ;置初值 CLR P1.7 MOV R0,#40H SETB PSW.4 SETB PSW.3 SETB IT0 SETB EA SETB EX0 MOV TMOD,#20H ;波特率9600 MOV TH1,#0FDH MOV TL1,#0FDH SETB TR1 MOV SCON,#50H SETB TI CLR 30H CLR 01H SETB P1.7 CLR P1.6 CLR P1.5 MOV DPTR,#0BFFFH MOV A,#00H MOV 2EH,#0 MOV 2DH,#0 MOV 2CH,#0 MOV 2BH,#0 MOV 2AH,#0 MOV 29H,#0 MOV 62H,#0 LOOP: MOV DPTR,#0BFFFH MOVX @DPTR,A ;启动A/D转换 CLR 00H WAIT: LCALL XUAN CHAXUN:JNB P1.3,LOOP1 ;调整 JNB P1.4,LOOP2 JNB 00H,GG ;判断是否再启动 LJMP LOOP GG: LJMP WAIT ;===========上限温度调整=========== LOOP1: CLR EX0 LCALL DELAY1 JNB P1.3,$ MOV 62H,2EH MOV 61H,2DH MOV 60H,2CH JB P1.2,M2 MOV A,2EH ADD A,#01 DA A MOV 2EH,A CJNE A,#10H,M1 MOV 2EH,#00 M1: JNB P1.2,$ M2: JB P1.1,M4 MOV A,2DH ADD A,#01H DA A MOV 2DH,A CJNE A,#10H,M3 MOV 2DH,#00 M3: JNB P1.1,$ M4: JB P1.0,M5 MOV A,2CH ADD A,#01 DA A MOV 2CH,A CJNE A,#10H,M5 MOV 2CH,#00 M5: JNB P1.0,$ SETB 30H;是否显示第一位的标志位 MOV 63H,#11H ;显示“上” MOV 62H,2EH MOV 61H,2DH MOV 60H,2CH LCALL DELAY JNB P1.3,TUI ;再次中断时,退出 LJMP LOOP1 ;==========下限温度调整=========== LOOP2: CLR EX0 JNB P1.3,$  MOV 62H,2BH MOV 61H,2AH MOV 60H,29H JB P1.2,L2 MOV A,2BH ADD A,#01 DA A MOV 2BH,A CJNE A,#10H,L1 MOV 2BH,#00 L1: JNB P1.2,$ L2: JB P1.1,L4 MOV A,2AH ADD A,#01H DA A MOV 2AH,A CJNE A,#10H,L3 MOV 2AH,#00 L3: JNB P1.1,$ L4: JB P1.0,L5 MOV A,29H ADD A,#01 DA A MOV 29H,A CJNE A,#10H,L5 MOV 29H,#00 L5: JNB P1.0,$ SETB 30H;是否显示第一位的标示位 MOV 63H,#0FH ;显示“下” MOV 62H,2BH MOV 61H,2AH MOV 60H,29H LCALL DELAY JNB P1.4,TUI ;再次中断时,退出 LJMP LOOP2  TUI: MOV A,2BH CLR C CJNE A,2EH,AA;比较上限是否低于下限 MOV A,2AH CJNE A,2DH,AA CJNE A,60H,E1 LJMP E2 E1: JC SHANG_BAO LJMP E2 ;======超上限温度报警====== SHANG_BAO: SETB P1.7 SETB P1.6 CLR P1.5 LJMP X2 E2: CLR P1.5 CLR P1.6 CLR P1.7 X1: MOV A,2BH CJNE A,62H,E3 MOV A,2AH CJNE A,61H,E3 MOV A,29H CJNE A,60H,E3 LJMP E4 E3: JNC XIA_BAO LJMP E4 ;======低于下限温度报警====== XIA_BAO:SETB P1.7 SETB P1.5 CLR P1.6 LJMP X2 E4: CLR P1.5 CLR P1.6 CLR P1.7 X2: CLR 30H ACALL DELAY ;========串口通信========= MOV R3,#30H ;转ASCII码 MOV A,62H ADD A,R3 DA A MLP3: JBC TI,MLP2 ;当TI为1时清0 SJMP MLP3 MLP2: MOV SBUF,A MOV A,61H ADD A,R3 DA A  MLP5: JBC TI,MLP4 TT: MOV DPTR,#0FAFFH D2: MOVX @DPTR,A DJNZ 30H,D2 ;十位 MOV 30H,#40 MOV DPTR,#TAB0 MOV A,60H MOVC A,@A+DPTR MOV DPTR,#0FBFFH D3: MOVX @DPTR,A DJNZ 30H,D3 ;个位 RET TAB0:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H, ; 0 1 2 3 4 5 6 7 7FH,6FH,77H,7CH,39H,5EH,79H,71H ; 8 9 A B C D E F DB 76H,78H,38H,6EH,00H ,77H, ; H K L Y 无 R DELAY12: MOV R4,00H MOV R5,00H X3: DJNZ R4,$ DJNZ R5,X3 RET ;-------中断0服务程序------- INT0: PUSH A PUSH PSW MOV DPTR,#0BFFFH MOVX A,@DPTR ;读A/D转换结果 MOV 2FH,#0FFH CLR CY ;程序调整高低位 RLC A JC N1 CLR 78H MOV A,29H CJNE A,2CH,AA LJMP XXX ;正常 AA: JNC ERRO ;上限低于下限,跳转  XXX: SETB EX0 MOV A,@R0 LCALL XUAN LJMP WAIT ERRO: MOV 63H,#0EH ;显示“ERRO” MOV 62H,#15H MOV 61H,#15H MOV 60H,#0H SETB 30H SETB 01H EEEE: LCALL DELAY JNB P1.3,XX1 ;是否重新调整 JNB P1.4,XX2 LJMP EEEE XX1: LJMP LOOP1 XX2: LJMP LOOP2 ;==========显示数据转换========= Xian: MOV A,@R0 MOV B,#100 MUL AB MOV R3,A MOV A,B MOV B,#10 DIV AB MOV R1,#62H MOV @R1,A DEC R1 MOV @R1,B MOV A,R3 MOV B,#10 MUL AB DEC R1 MOV @R1,B CLR 30H ACALL DELAY MOV A,2EH CJNE A,62H,E1 MOV A,2DH CJNE A,61H,E1 MOV A,2CH SJMP MLP5  MLP4: MOV SBUF,A MOV A,#46 ;小数点 MLP8: JBC TI,MLP9 SJMP MLP8 MLP9: MOV SBUF,A MOV A,60H ADD A,R3 DA A MLP7: JBC TI,MLP6 SJMP MLP7 MLP6: MOV SBUF,A MOV A,#32 MLP10: JBC TI,MLP11 SJMP MLP10 MLP11: MOV SBUF,A RET ;==========延时加显示========= DELAY: MOV R3,#0A0H D00: ACALL DISPLAY DJNZ R3,D00 RET DISPLAY:JNB 30H,DD MOV 30H,#40 MOV DPTR,#TAB0 MOV A,63H MOVC A,@A+DPTR MOV DPTR,#0F8FFH D0: MOVX @DPTR,A DJNZ 30H,D0 ;千位 DD: MOV 30H,#40 MOV DPTR,#TAB0 MOV A,62H MOVC A,@A+DPTR MOV DPTR,#0F9FFH D1: MOVX @DPTR,A DJNZ 30H,D1 ;百位 MOV 30H,#40 MOV DPTR,#TAB0 MOV A,61H MOVC A,@A+DPTR JB 01H,TT ADD A,#80H N1: RLC A JC N2 CLR 79H N2: RLC A JC N3 CLR 7AH N3: RLC A JC N4 CLR 7BH N4: RLC A JC N5 CLR 7CH N5: RLC A JC N6 CLR 7DH N6: RLC A JC N7 CLR 7EH N7: RLC A JC N8 CLR 7FH N8: MOV A,2FH MOV @R0,A SETB 00H POP PSW POP A RETI ;=======延时======= DELAY1: MOV R6,#60 DE1: MOV R7,#248 MOV R7,$ DJNZ R6,DE1 RET END |
牛人 谢谢您
坐等大佬D盘更新,祝大佬全家福寿安康
有公众号之类的吗,之前这个网站打不开了
[…] 关于使用Change…
[…] 关于使用Functi…