1 #include
2
3 #include "LEDDisplay.h"
4 #include "Temperature.h"
5 #include "Pins.h"
6
7
8 #define Delay_REF 12 //设置每一个点显示的时间长度(1~20)
9 #define LED_PWDDEFAULT 9 // LED的调光值 1~9
10
11 #define DT_P2M0SET 0x00 // 0000 0000
12 #define DT_P2M1SET 0x00 // 0000 0000
13 #define DT_P0M0SET 0xf0 // 1111 0000
14 #define DT_P0M1SET 0x00 // 0000 0000
15
16
17 // 数码管
18 // 12 ~ 9
19 ***it DT_COM1 = P0 ^ 4;
20 ***it DT_COM2 = P0 ^ 5;
21 ***it DT_COM3 = P0 ^ 6;
22 ***it DT_COM4 = P0 ^ 7;
23 // 8 ~ 1
24 ***it DT_DpyA = P2 ^ 0;
25 ***it DT_DpyB = P2 ^ 1;
26 ***it DT_DpyC = P2 ^ 2;
27 ***it DT_DpyD = P2 ^ 3;
28 ***it DT_DpyE = P2 ^ 4;
29 ***it DT_DpyF = P2 ^ 5;
30 ***it DT_DpyG = P2 ^ 6;
31 ***it DT_DpyDP = P2 ^ 7;
32 sfr DT_Dpy = 0xA0; // P2
33
34
35 void Delay (unsigned int);
36 void Dis_Off (void);
37 void displayHH1 (unsigned char);
38 void displayHH2 (unsigned char);
39 void displayHH3 (unsigned char);
40 void displayHH4 (unsigned char);
41
42
43
44 data unsigned char Led_PWM; // 调光 1 ~ 9
45
46 unsigned char code NumData[]={
47 //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, (None) E, R
48 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x00, 0x79, 0x77
49 };
50 unsigned int Sec = 0;
51
52
53 void InitView(void){
54 P0M0 = DT_P0M0SET;
55 P0M1 = DT_P0M1SET;
56 P2M0 = DT_P2M0SET;
57 P2M1 = DT_P2M1SET;
58 //Dis_Off();
59 Led_PWM = LED_PWDDEFAULT;
60 }
61
62 void DisplayTemperature(unsigned int t){
63 // 无效温度显示 ERR 字样
64 if (t != VAL_ERRTEMPERATURE){
65 displayHH4(NumData[t / 1000]);
66 displayHH3(NumData[t / 100 % 10] + 0x80);
67 displayHH2(NumData[t / 10 % 10]);
68 displayHH1(NumData[t % 10]);
69 }
70 else {
71 // 无效温度显示 ERR 字样
72 //displayHH4(NumData[10]);
73 displayHH3(NumData[11]);
74 displayHH2(NumData[12]);
75 displayHH1(NumData[12]);
76 }
77 }
78
79
80
81 void Delay (unsigned int count){
82 unsigned int i;
83 while( count-- != 0){
84 for(i = 0; i < Delay_REF; i++);
85 }
86 }
87
88 void Dis_Off (void){
89 DT_COM1 = 0;
90 DT_COM2 = 0;
91 DT_COM3 = 0;
92 DT_COM4 = 0;
93
94 DT_Dpy = 0xFF;
95 /*
96 DT_DpyA = 1;
97 DT_DpyB = 1;
98 DT_DpyC = 1;
99 DT_DpyD = 1;
100 DT_DpyE = 1;
101 DT_DpyF = 1;
102 DT_DpyG = 1;
103 DT_DpyG = 1;
104 */
105 Delay(10-Led_PWM);
106 }
107
108 void displayHH1 (unsigned char d){
109 if(d & 0x01){
110 DT_COM1 = 1;DT_DpyA = 0;} Delay(Led_PWM); Dis_Off();
111
112 if(d & 0x02){
113 DT_COM1 = 1;DT_DpyB = 0;} Delay(Led_PWM); Dis_Off();
114
115 if(d & 0x04){
116 DT_COM1 = 1;DT_DpyC = 0;} Delay(Led_PWM); Dis_Off();
117
118 if(d & 0x08){
119 DT_COM1 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();
120
121 if(d & 0x10){
122 DT_COM1 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();
123
124 if(d & 0x20){
125 DT_COM1 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();
126
127 if(d & 0x40){
128 DT_COM1 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();
129
130 if(d & 0x80){
131 DT_COM1 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
132 }
133
134 void displayHH2 (unsigned char d){
135 if(d & 0x01){
136 DT_COM2 = 1;DT_DpyA = 0;}Delay(Led_PWM);Dis_Off();
137
138 if(d & 0x02){
139 DT_COM2 = 1;DT_DpyB = 0;}Delay(Led_PWM);Dis_Off();
140
141 if(d & 0x04){
142 DT_COM2 = 1;DT_DpyC = 0;}Delay(Led_PWM);Dis_Off();
143
144 if(d & 0x08){
145 DT_COM2 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();
146
147 if(d & 0x10){
148 DT_COM2 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();
149
150 if(d & 0x20){
151 DT_COM2 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();
152
153 if(d & 0x40){
154 DT_COM2 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();
155
156 if(d & 0x80){
157 DT_COM2 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
158 }
159
160 void displayHH3 (unsigned char d){
161 if(d & 0x01){
162 DT_COM3 = 1;DT_DpyA = 0;}Delay(Led_PWM);Dis_Off();
163
164 if(d & 0x02){
165 DT_COM3 = 1;DT_DpyB = 0;}Delay(Led_PWM);Dis_Off();
166
167 if(d & 0x04){
168 DT_COM3 = 1;DT_DpyC = 0;}Delay(Led_PWM);Dis_Off();
169
170 if(d & 0x08){
171 DT_COM3 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();
172
173 if(d & 0x10){
174 DT_COM3 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();
175
176 if(d & 0x20){
177 DT_COM3 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();
178
179 if(d & 0x40){
180 DT_COM3 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();
181
182 if(d & 0x80){
183 DT_COM3 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
184 }
185
186 void displayHH4 (unsigned char d){
187 if(d & 0x01){
188 DT_COM4 = 1;DT_DpyA = 0;}Delay(Led_PWM);Dis_Off();
189
190 if(d & 0x02){
191 DT_COM4 = 1;DT_DpyB = 0;}Delay(Led_PWM);Dis_Off();
192
193 if(d & 0x04){
194 DT_COM4 = 1;DT_DpyC = 0;}Delay(Led_PWM);Dis_Off();
195
196 if(d & 0x08){
197 DT_COM4 = 1;DT_DpyD = 0;}Delay(Led_PWM);Dis_Off();
198
199 if(d & 0x10){
200 DT_COM4 = 1;DT_DpyE = 0;}Delay(Led_PWM);Dis_Off();
201
202 if(d & 0x20){
203 DT_COM4 = 1;DT_DpyF = 0;}Delay(Led_PWM);Dis_Off();
204
205 if(d & 0x40){
206 DT_COM4 = 1;DT_DpyG = 0;}Delay(Led_PWM);Dis_Off();
207
208 if(d & 0x80){
209 DT_COM4 = 1;DT_DpyDP = 0;}Delay(Led_PWM);Dis_Off();
210 }
-----
1 #include
2
3 #include "PilotLamp.h"
4
5 // LED 指示灯
6 ***it Lamp_Work = P0 ^ 1; // 继电器工作状态亮
7 ***it Lamp_Auto = P0 ^ 2; // 温控模式
8 ***it Lamp_Hand = P0 ^ 3; // 手控模式
9
10
11 void InitPilotLamp(void){
12 }
13
14 void DisplayPilotLamp(unsigned char Val){
15 // 指示灯状态
16 // 第一位 继电器工作状态,灯亮工作状态,灯灭停止制冷
17 // 第二位 是否为自动模式
18 // 第三位 温控器故障
19 if (Val & 0x01)
20 Lamp_Work = 1;
21 else
22 Lamp_Work = 0;
23
24 if (Val & 0x02)
25 Lamp_Auto = 1;
26 else
27 Lamp_Auto = 0;
28
29 Lamp_Hand = ~Lamp_Auto;
30
31 }
------------------
1 #include
2
3 #include "Relays.h"
4 #include "Pins.h"
5
6
7 ***it RelayCool1 = P1 ^ 3;
8 ***it RelayCool2 = P1 ^ 4;
9
10
11 void InitRealys(void){}
12
13 void UpdateRelays(unsigned char Val){
14 // 例:值 0x03 (0000 0011)
15 // 开启第一、第二 继电器
16 if (Val){
17 RelayCool1 = 0;
18 RelayCool2 = 0;
19 }
20 else {
21 RelayCool1 = 1;
22 RelayCool2 = 1;
23 }
24 }
-------------------
1 DSSP SEGMENT CODE ;程序段
2
3 PUBLIC GetTemperature ;入口地址,跳转到DL标号处执行汇编程序 GetTemperature
4
5 RSEG DSSP ;程序段
6
7 IN EQU 0CBH ; P5.3 引脚地址
8 FLAG1 EQU 05H ;DS18B20器件存在标志
9 TTL EQU 07H ;温度读出值(高位在TTL-1中,低位在TTL中)
10 ;TTL_H EQU 06H ;温度读出值(高位在TTL-1中,低位在TTL中)
11
12
13 ; 这是DS18B20复位初始化子程序
14 INIT_1820:
15 SETB IN
16 NOP
17 CLR IN
18 ;主机发出延时537微秒的复位低脉冲
19 MOV R1,#18;#3
20 TSR1:
21 MOV R0,#107
22 DJNZ R0,$
23 DJNZ R1,TSR1
24 SETB IN;然后拉高数据线
25 NOP
26 NOP
27 NOP
28 NOP;12倍
29 NOP
30 NOP
31 NOP
32 NOP
33 NOP
34 NOP
35 NOP
36 NOP
37 NOP
38 NOP
39 NOP
40 NOP
41 NOP
42 NOP
43 NOP
44 NOP
45 NOP
46 NOP
47 NOP
48 NOP
49 NOP
50 NOP
51 NOP
52 NOP
53 NOP
54 NOP
55 NOP
56 NOP
57 NOP
58 NOP
59 NOP
60 NOP
61 NOP
62 NOP
63 NOP
64 MOV R0,#0DEH;#25H
65 TSR2:
66 JNB IN,TSR3;等待DS18B20回应
67 DJNZ R0,TSR2
68 LJMP TSR4 ; 延时
69 TSR3:
70 SETB FLAG1 ; 置标志位,表示DS1820存在
71 LJMP TSR5
72 TSR4:
73 CLR FLAG1 ; 清标志位,表示DS1820不存在
74 LJMP TSR7
75 TSR5:
76 MOV R7,#6
77 TSR6:
78 MOV R0,#117
79 DJNZ R0,$ ; 时序要求延时一段时间 */
80 DJNZ R7,TSR6 ; 时序要求延时一段时间 */
81 TSR7:
82 SETB IN
83 RET
84
85 GetTemperature:
86 DS1820PRO:
87 ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
88 SETB IN
89 LCALL INIT_1820;先复位DS18B20
90 JB FLAG1,TSS2
91 jmp BCD33 ; 判断DS1820是否存在?若DS18B20不存在则返回
92 TSS2:
93 MOV A,#0CCH ; 跳过ROM匹配
94 LCALL WRITE_1820
95 MOV A,#44H ; 发出温度转换命令
96 LCALL WRITE_1820
97 CALL DL1MS
98 SETB IN
99 LCALL INIT_1820 ;准备读温度前先复位
100 MOV A,#0CCH ; 跳过ROM匹配
101 LCALL WRITE_1820
102 MOV A,#0BEH ; 发出读温度命令
103 LCALL WRITE_1820
104 LCALL READ_18200; 将读出的温度数据保存到35H/36H
105
106
107 BCD33:
108 JB FLAG1,BCD44
109 mov R6, #080H
110 mov R7,#00H
111 JMP TORET
112
113 BCD44:
114
115 ;温度转换程序:精确到:0.06 ;
116 ; 小数温度查表获取。
117 MOV DPTR,#TABB
118 MOV A, TTL
119 ANL A,#0FH
120 MOVC A,@A+DPTR
121 MOV R3, A;
122 ; 整数温度转换
123 MOV A,TTL
124 MOV B,TTL-1
125 MOV C,B.0
126 RRC A
127 MOV C,B.1
128 RRC A
129 MOV C,B.2
130 RRC A
131 MOV C,B.3
132 RRC A
133 ; 拼接整数位和小数位温度 整数*100 + 小数位值
134 MOV B, #100
135 MUL AB
136 MOV R4,B ;保存积的高8位
137 ADD A,R3 ;
138 MOV R7,A
139 CLR A
140 ADDC A,R4 ;加上进位,
141 MOV R6,A
142
143
144 TORET:
145 RET
146
147
148 ;--------------------------------写DS18B20的子程序(有具体的时序要求)
149 WRITE_1820:
150 MOV R2,#8;一共8位数据
151 CLR C
152 WR1:
153 CLR IN
154 MOV R3,#36;#6
155 DJNZ R3,$
156 RRC A
157 MOV IN,C
158 MOV R3,#192;#23
159 DJNZ R3,$
160 SETB IN
161 NOP
162 NOP
163 NOP
164 NOP
165 NOP
166 NOP
167 NOP
168 NOP
169 NOP
170 NOP
171 NOP
172 NOP
173 DJNZ R2,WR1
174 SETB IN
175 RET
176
177 ;-----------------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
178 READ_18200:
179 MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
180 MOV R1,#TTL ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
181 RE00:
182 MOV R2,#8;数据一共有8位
183 RE01:
184 CLR C
185 SETB IN
186 NOP
187 NOP
188 NOP
189 NOP
190 NOP
191 NOP
192 NOP
193 NOP
194 NOP
195 NOP
196 NOP
197 NOP
198 NOP
199 NOP
200 NOP
201 NOP
202 NOP
203 NOP
204 NOP
205 NOP
206 NOP
207 NOP
208 NOP
209 NOP
210 NOP
211 NOP
212 CLR IN
213 NOP
214 NOP
215 NOP
216 NOP
217 NOP
218 NOP
219 NOP
220 NOP
221 NOP
222 NOP
223 NOP
224 NOP
225 NOP
226 NOP
227 NOP
228 NOP
229 NOP
230 NOP
231 NOP
232 NOP
233 NOP
234 NOP
235 NOP
236 NOP
237 NOP
238 NOP
239 NOP
240 NOP
241 NOP
242 NOP
243 NOP
244 NOP
245 NOP
246 NOP
247 NOP
248 NOP
249 NOP
250 NOP
251 NOP
252 SETB IN
253 MOV R3,#54;#9
254 RE10:
255 DJNZ R3,RE10
256 MOV C,IN
257 MOV R3,#138;#23
258 RE20:
259 DJNZ R3,RE20
260 RRC A
261 DJNZ R2,RE01
262 MOV @R1,A
263 DEC R1
264 DJNZ R4,RE00
265 RET
266
267 DL1MS:
268 MOV R7,#6
269 DL1MS2:
270 MOV R6,#255
271 DJNZ R6,$
272 DJNZ R7,DL1MS2
273 RET
274
275 TABB:
276 ; 小数位温度0~F的查表值,18B20的最小温控精度 0.0625, 只保留两位小数
277
278 DB 00H, 06H, 0CH, 12H, 19H, 1FH, 25H, 2BH, 32H
279 DB 56H, 3EH, 44H, 4BH, 51H, 57H, 5DH
280
281
282 END
|