一,代码部分
1,iic.c
复制代码
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#include "reg52.h" #include "intrins.h" sbit SDA = P2^1; sbit SCL = P2^0; #define DELAY_TIME 5 //I2C总线内部延时函数 void IIC_Delay(unsigned char i) { do{_nop_();} while(i--); } //I2C总线启动信号 void IIC_Start(void) { SDA = 1; SCL = 1; IIC_Delay(DELAY_TIME); SDA = 0; IIC_Delay(DELAY_TIME); SCL = 0; } //I2C总线停止信号 void IIC_Stop(void) { SDA = 0; SCL = 1; IIC_Delay(DELAY_TIME); SDA = 1; IIC_Delay(DELAY_TIME); } //发送应答或非应答信号 void IIC_SendAck(bit ackbit) { SCL = 0; SDA = ackbit; IIC_Delay(DELAY_TIME); SCL = 1; IIC_Delay(DELAY_TIME); SCL = 0; SDA = 1; IIC_Delay(DELAY_TIME); } //等待应答 bit IIC_WaitAck(void) { bit ackbit; SCL = 1; IIC_Delay(DELAY_TIME); ackbit = SDA; SCL = 0; IIC_Delay(DELAY_TIME); return ackbit; } //I2C总线发送一个字节数据 void IIC_SendByte(unsigned char byt) { unsigned char i; for(i=0; i<8; i++) { SCL = 0; IIC_Delay(DELAY_TIME); if(byt & 0x80) SDA = 1; else SDA = 0; IIC_Delay(DELAY_TIME); SCL = 1; byt <<= 1; IIC_Delay(DELAY_TIME); } SCL = 0; } //I2C总线接收一个字节数据 unsigned char IIC_RecByte(void) { unsigned char i, da; for(i=0; i<8; i++) { SCL = 1; IIC_Delay(DELAY_TIME); da <<= 1; if(SDA) da |= 1; SCL = 0; IIC_Delay(DELAY_TIME); } return da; }
2,smgshow.c
复制代码
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/* 程序说明: 单总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机 日 期: 2011-8-9 */ #include "reg52.h" sbit DQ = P1^4; //单总线接口 //单总线延时函数 void Delay_OneWire(unsigned int t) //STC89C52RC { while(t--); } //通过单总线向DS18B20写一个字节 void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ = 0; DQ = dat&0x01; Delay_OneWire(50); DQ = 1; dat >>= 1; } Delay_OneWire(50); } //从DS18B20读取一个字节 unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(50); } return dat; } //DS18B20设备初始化 bit init_ds18b20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(120); DQ = 0; Delay_OneWire(800); DQ = 1; Delay_OneWire(100); initflag = DQ; Delay_OneWire(50); return initflag; }
3,ds1302.c
复制代码
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#include <reg52.h> #include <intrins.h> sbit SCK = P1^7; sbit SDA = P2^3; sbit RST = P1^3; //写字节 void Write_Ds1302(unsigned char temp) { unsigned char i; for (i=0;i<8;i++) { SCK = 0; SDA = temp&0x01; temp>>=1; SCK=1; } } //向DS1302寄存器写入数据 void Write_Ds1302_Byte( unsigned char address,unsigned char dat ) { RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); Write_Ds1302(address); Write_Ds1302(dat); RST=0; } //从DS1302寄存器读出数据 unsigned char Read_Ds1302_Byte ( unsigned char address ) { unsigned char i,temp=0x00; RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); Write_Ds1302(address); for (i=0;i<8;i++) { SCK=0; temp>>=1; if(SDA) temp|=0x80; SCK=1; } RST=0; _nop_(); SCK=0; _nop_(); SCK=1; _nop_(); SDA=0; _nop_(); SDA=1; _nop_(); return (temp); }
4,main.c
复制代码
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
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473#include "reg52.h" #include "ds1302.h" #include "iic.h" #include "smgshow.h" #include "onewire.h" unsigned char hour=0x16,min=0x59,sec=0x50;//初始时间为 16:59:50 unsigned int tempture;//温度显示变量 unsigned char stat_dat=0;//数据界面切换标志位 unsigned char stat_set=0;//参数界面切换标志位 unsigned int u_rb1=0;//光敏电阻显示电压变量 unsigned char led_stat=0xff;//LED变量 unsigned char hour_t=0;//字符型小时变量 char set_hour=17;//参数界面显示变量 char set_tempture=25; char set_led=4; char set_hour_t=17;//参数界面显示变量 char set_tempture_t=25; char set_led_t=4; bit bod=0;//bright or dark bit dat_set=0;//参数显示与数据显示切换标志位 0:数据界面 1:参数界面 bit mode3=0;//LED3亮暗标志位 sbit R1=P3^2; sbit R2=P3^3; sbit C1=P4^4; sbit C2=P4^2; void Init_T0()//初始化定时器0,定时30ms,16为自动重装模式 { TMOD &=0xf0; TMOD |=0x01; TH0=(65535-30000)/256; TL0=(65535-30000)%256; EA=1; ET0=1; TR0=1; } unsigned int count=0; void Service_T0() interrupt 1 { TH0=(65535-30000)/256; TL0=(65535-30000)%256; if(bod==1) { count++; if(count>100)//3秒 { mode3=1; } } else { count=0; mode3=0; } } void Init_1302() { Write_Ds1302_Byte(0x8e,0x00);//关闭写保护 Write_Ds1302_Byte(0x80,sec);//写入初始时间 Write_Ds1302_Byte(0x82,min); Write_Ds1302_Byte(0x84,hour); Write_Ds1302_Byte(0x8e,0x80);//关闭写保护 } void Read_1302()//更新时间 { sec=Read_Ds1302_Byte(0x81); min=Read_Ds1302_Byte(0x83); hour=Read_Ds1302_Byte(0x85); } void Convert_18b20()//DS18B20开始温度转化 { init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); } void Read_18b20()//读取DS18B20温度 { int t; unsigned char LSB,MSB; init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); LSB=Read_DS18B20(); MSB=Read_DS18B20(); t=(MSB << 8) | LSB; tempture=t/16.0*10; } void Read_rd1()//读取光敏电阻电压 { unsigned char t; IIC_Start(); IIC_SendByte(0x90); IIC_WaitAck(); IIC_SendByte(0x41); IIC_WaitAck(); IIC_Start(); IIC_SendByte(0x91); IIC_WaitAck(); t=IIC_RecByte();//读取0~255 IIC_SendAck(1); IIC_Stop(); u_rb1=t/51.0*100; if(t>65)//亮暗判断 { bod=0; } else { bod=1; } } void Dat_SMGWork() { switch(stat_dat) { case 0://时间数据 Display_SMG(0,smgnotdotduanma[hour/16]); Display_SMG(1,smgnotdotduanma[hour%16]); Display_SMG(2,~0x40); Display_SMG(3,smgnotdotduanma[min/16]); Display_SMG(4,smgnotdotduanma[min%16]); Display_SMG(5,~0x40); Display_SMG(6,smgnotdotduanma[sec/16]); Display_SMG(7,smgnotdotduanma[sec%16]); break; case 1://温度数据 Display_SMG(0,0xc6); Display_SMG(5,smgnotdotduanma[tempture/100]); Display_SMG(6,smgdotduanma[tempture/10%10]); Display_SMG(7,smgnotdotduanma[tempture%10]); break; case 2://亮,暗状态显示 Display_SMG(0,0x86); Display_SMG(2,smgdotduanma[u_rb1/100]); Display_SMG(3,smgnotdotduanma[u_rb1/10%10]); Display_SMG(4,smgnotdotduanma[u_rb1%10]); Display_SMG(7,smgnotdotduanma[bod]); break; } } void Set_SMGWork()//参数显示界面 { switch(stat_set) { case 0: Display_SMG(0,0x8c); Display_SMG(1,smgnotdotduanma[1]); Display_SMG(6,smgnotdotduanma[set_hour_t/10]); Display_SMG(7,smgnotdotduanma[set_hour_t%10]); break; case 1: Display_SMG(0,0x8c); Display_SMG(1,smgnotdotduanma[2]); Display_SMG(6,smgnotdotduanma[set_tempture_t/10]); Display_SMG(7,smgnotdotduanma[set_tempture_t%10]); break; case 2: Display_SMG(0,0x8c); Display_SMG(1,smgnotdotduanma[3]); Display_SMG(7,smgnotdotduanma[set_led_t]); break; } } void Scan_KBD() { //扫描S4 R2=0; R1=C1=C2=1; if(C1==0) { Delay(500); if(C1==0) { if(dat_set==0) { dat_set=1; stat_set=0; } else { dat_set=0; stat_dat=0; set_hour=set_hour_t; set_tempture=set_tempture_t; set_led=set_led_t; } while(C1==0) { if(dat_set==0) { Dat_SMGWork(); } else { Set_SMGWork(); } } } } //扫描S5 R1=0; R2=C1=C2=1; if(C1==0) { Delay(500); if(C1==0) { if(dat_set==0)//在数据显示界面下的状态切换 { if(stat_dat==0) { stat_dat=1; } else if(stat_dat==1) { stat_dat=2; } else { stat_dat=0; } } if(dat_set==1)//在参数显示界面下的状态切换 { if(stat_set==0) { set_hour=set_hour_t; stat_set=1; } else if(stat_set==1) { set_tempture=set_tempture_t; stat_set=2; } else { set_led=set_led_t; stat_set=0; } } while(C1==0) { if(dat_set==0) { Dat_SMGWork(); } else { Set_SMGWork(); } } } } //扫描S8 R2=0; R1=C1=C2=1; if(C2==0) { Delay(500); if(C2==0) { if(dat_set==1)//在参数界面才能执行 { if(stat_set==0)//在时间参数界面 { set_hour_t--; if(set_hour_t<0) { set_hour_t=23; } } if(stat_set==1)//温度参数界面 { set_tempture_t--; if(set_tempture_t<0) { set_tempture_t=99; } } if(stat_set==2)//指示灯参数界面 { set_led_t--; if(set_led_t<4) { set_led_t=8; } } } while(C2==0) { if(dat_set==0) { Dat_SMGWork(); } else { Set_SMGWork(); } } } } //扫描S9 R1=0; R2=C1=C2=1; if(C2==0) { Delay(500); if(C2==0) { if(dat_set==1)//在参数界面才能执行 { if(stat_set==0)//在时间参数界面 { set_hour_t++; if(set_hour_t>23) { set_hour_t=0; } } if(stat_set==1)//温度参数界面 { set_tempture_t++; if(set_tempture_t>99) { set_tempture_t=0; } } if(stat_set==2)//指示灯参数界面 { set_led_t++; if(set_led_t>8) { set_led_t=4; } } } while(C2==0) { if(dat_set==0) { Dat_SMGWork(); } else { Set_SMGWork(); } } } } } void LED_Working()//LED工作函数 { hour_t=hour/16*10+hour%16; if(set_hour>hour_t) //L1工作 { led_stat &= ~0x01; HC573(4,led_stat); } else { led_stat |= 0x01; HC573(4,led_stat); } if(tempture<set_tempture*10)//L2工作 { led_stat &= ~0x02; HC573(4,led_stat); } else { led_stat |= 0x02; HC573(4,led_stat); } if(mode3==1)//当前为暗 L3工作 { led_stat &= ~0x04; HC573(4,led_stat); } else { led_stat |= 0x04; HC573(4,led_stat); } if(bod==1) { if(set_led==4)//L4工作 { led_stat &= ~0x08; HC573(4,led_stat); } else { led_stat |= 0x08; HC573(4,led_stat); } if(set_led==5)//L5工作 { led_stat &= ~0x10; HC573(4,led_stat); } else { led_stat |= 0x10; HC573(4,led_stat); } if(set_led==6)//L6工作 { led_stat &= ~0x20; HC573(4,led_stat); } else { led_stat |= 0x20; HC573(4,led_stat); } if(set_led==7)//L7工作 { led_stat &= ~0x40; HC573(4,led_stat); } else { led_stat |= 0x40; HC573(4,led_stat); } if(set_led==8)//L8工作 { led_stat &= ~0x80; HC573(4,led_stat); } else { led_stat |= 0x80; HC573(4,led_stat); } } else { led_stat |= 0xf8; HC573(4,led_stat); } } void Init_system() { HC573(4,0xff); HC573(5,0x00); Init_1302(); Init_T0(); } void main() { Init_system(); while(1) { Scan_KBD(); Read_rd1(); Convert_18b20(); Read_18b20(); Read_1302(); LED_Working(); if(dat_set==0) { Dat_SMGWork(); } else { Set_SMGWork(); } } }
二,总结
国赛加油
最后
以上就是正直眼睛最近收集整理的关于蓝桥杯国赛十一届的全部内容,更多相关蓝桥杯国赛十一届内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复