13届蓝桥杯(单片机)

简介: 13届蓝桥杯(单片机)

一.首先这套题目难度还可以,不是那么的简单,我也做了好一会,主要是不会操作蜂鸣器!

下面就直接贴代码了。想要工程文件的可以到博主的资源中下载(免费)点点关注就行!

主函数main.c

1. #include "dmx.h"
2. #include "onewire.h"
3. void main()
4. {
5. 
6. Init_System();
7. 
8. 
9. while(1)
10. {
11.    if(flag_t)
12.    {
13.      temp=Read_temp();
14.      flag_t=0;
15.    }
16. 
17.   scan_kbd(); //扫描按键
18.   key_real(); //按键操作
19.   Read_time(); //读时间
20.   SMG_show();  //赋值显示
21.   led_work();  //led和继电器
22. 
23. 
24. }
25. 
26. 
27. }

二.  然后就是配置文件了 也是程序核心

1. #include <STC15F2K60S2.H>
2. #include "dmx.h"
3. #include "onewire.h"
4. #include "ds1302.h"
5. 
6. unsigned char mod1=0; //界面切换
7.  bit mod2=0;  //模式切换
8. unsigned int temp=0;  //温度
9. unsigned int para=23;  //温度参数
10. unsigned int key_num=20;  //按键值
11. unsigned int count=0;   //计数获取温度
12. bit flag_L1=0;            //点亮L1标志位
13. bit flag_L3=0;           //点亮L3标志位
14. unsigned int count_L1=0;  //L1计数
15. unsigned int count_L3=0;  //L3计数
16.  bit flag_temp=0;         //获取温度标志位
17.  bit flag_t=0;            //时间满足标志位
18. bit flag_jdq_t=0;           //时间控制继电器标志位
19. bit flag_jdq_w=0;         //温度控制继电器标志位
20. 
21. unsigned char stat_jdq=0xaf;  
22. unsigned count_jdq=0;
23. unsigned char stat_led=0xff;
24. unsigned char Read_ds1302[3]={0}; 
25. unsigned char tp[8]={12,2,10,0,0,11,0,0};
26. unsigned char Read[8]={10,10,10,10,10,10,10,10};
27. unsigned char segbuff[8]={10,10,10,10,10,11,0,1};
28. unsigned char segtab[]={0xc0, //0
29. 0xf9, //1
30. 0xa4, //2
31. 0xb0, //3
32. 0x99, //4
33. 0x92, //5
34. 0x82, //6
35. 0xf8, //7
36. 0x80, //8
37. 0x90, //9
38. 0xff, // 
39. 0xbf, //-
40. 0xc1   //U  12
41.   };
42. 
43. void time0()   //1ms
44. {
45.     TMOD=0x11;
46.   TH0=(0-1000)/256;
47.   TL0=(0-1000)%256;
48.   TR0=1;
49.   ET0=1;
50.   EA=1;
51.   TH1=(0-5000)/256;
52.   TL1=(0-5000)%256;
53.   TR1=1;
54.   ET1=1;
55. 
56. }
57. void Timer3() interrupt 3  //5ms
58. {
59. 
60.   TH1=(0-5000)/256; 
61.     TL1=(0-5000)%256;
62. if(flag_L1)
63.   {   
64.  stat_led=stat_led&0xfe;    
65.   if(++count_L1==1000)
66.   { 
67.     flag_L1=0;
68.     stat_led=stat_led|0x01;
69.     count_L1=0;
70. 
71.   }
72.   }
73.     if(flag_L3)
74.   {
75.      if(++count_L3==20)count_L3=0;
76.      if(count_L3<=10)
77.       stat_led&=0xfb;
78. else stat_led|=0x04;     
79. 
80.   }
81.   else  stat_led|=0x04;
82. 
83.    if( mod2==1)
84.    {  
85.      if(flag_jdq_t)
86.      {
87.       stat_jdq=0x1f;
88.      if(++count_jdq==1000)
89.      {
90.        count_jdq=0;
91.        flag_jdq_t=0;
92.        stat_jdq=0xaf;
93. 
94.      } 
95.      }
96. 
97. 
98.    }
99.    else flag_jdq_t=0;
100. 
101. 
102. 
103. 
104. 
105. }
106. 
107. void Timer0() interrupt 1
108. {
109.    TH0=(0-2000)/256;
110.   TL0=(0-2000)%256;
111.   segs();
112.   count++;
113.  if(count==150)
114.  {
115.    flag_t=1;
116.    count=0;
117.  }
118. 
119. }
120. 
121. void led_work()
122. {
123. 
124. 
125. 
126.   if(Read_ds1302[2]==0x00&&Read_ds1302[1]==0x00)
127.   {  
128.     if(mod2==1)flag_jdq_t=1;
129.     else flag_jdq_t=0;
130. 
131.     flag_L1=1;
132. 
133.   }
134. 
135.   if(mod1==0) stat_led=stat_led&0xfd;
136.   else  stat_led=stat_led|0x02;
137. 
138. if(mod2==0 )
139.   {
140.     if( temp/10>para) {stat_jdq=0x1f; flag_jdq_w=1;}
141.     else
142.     {stat_jdq=0xaf;
143.       flag_jdq_w=0;
144.     }
145.   }
146.   if(flag_jdq_t || flag_jdq_w)
147.   {
148.      flag_L3=1;
149. 
150.   }
151.   else flag_L3=0;
152. 
153. 
154. 
155.    P2=P2&0x1f|0x80;
156.    P0=stat_led;
157. 
158.    P2=P2&0x1f|0xa0;
159.    P0=stat_jdq;
160. 
161. 
162. }
163. 
164. 
165. void scan_kbd()
166. {
167.  static char kbd_state = 0;
168.  unsigned char kbd_press;
169.  char row;
170.  switch(kbd_state){
171. 
172.    case state_0:
173.   kbd_io=0x0f;P42=0;P44=0;
174.    kbd_press=kbd_io;
175. if(kbd_press != kbd_maskrow)
176.    kbd_state=state_1;
177.  break;
178. 
179.     case state_1:
180.       kbd_press=kbd_io;
181.     if(kbd_press!=kbd_maskrow)
182.     {
183.        if((kbd_io&0x08)==0)  row=4;            
184.        if((kbd_io&0x04)==0)  row=5;              
185.        if((kbd_io&0x02)==0)  row=6;                   
186.        if((kbd_io&0x01)==0)  row=7;   
187. 
188. 
189.       kbd_io=0xf0;P42=1;P44=1;
190.       if(P44==0)key_num=row;
191.       if(P42==0)key_num=row+4;
192.       if((kbd_io&0x20)==0)key_num=row+8;
193.       if((kbd_io&0x10)==0)key_num=row+12; 
194. 
195.       while((!(kbd_io&0x10))&&(row==5)&&(mod1==1))
196.       {
197.         tp[3]=Read_ds1302[1]>>4;
198.         tp[4]=Read_ds1302[1]%16;
199.         tp[6]=Read_ds1302[2]>>4;
200.         tp[7]=Read_ds1302[2]%16;
201.         flag_temp=1;
202. 
203. 
204. 
205.       }
206.       flag_temp=0;
207. 
208.        kbd_state=state_2;
209. 
210.     }
211.     else {
212.            kbd_state=state_0;
213.     }
214.     break;
215. 
216.     case state_2:
217.      kbd_io=0x0f; P42=0; P44=0;
218.     kbd_press=kbd_io;
219.     if(kbd_press==0x0f)kbd_state=state_0;
220.       break;
221. 
222.     default :
223.       break;
224.   }
225. 
226. 
227. }
228. void key_real()
229. {
230. 
231.  switch(key_num) 
232.  {
233. 
234.    case 12:
235.       if(++mod1==3)mod1=0;
236.       break;
237. 
238.    case 13:
239.         mod2=~mod2;
240.          break;
241.    case 16:
242.        if(mod1==2)
243.        {  
244.            para+=10;
245.          if(para>99)para=0;
246. 
247.        }
248.          break;
249.    case 17:  
250. if(mod1==2)
251.         {         
252.           para-=10;
253.           if(para<10)
254.             para=99;
255.         }
256.         break;
257.    default :break;
258. 
259. 
260.  }
261. 
262.    key_num=20;
263. 
264. 
265. 
266. }
267. void Slect_fun(unsigned char n)
268. {
269. 
270.  P2=P2&0x1f;
271. 
272.  switch(n)
273.  {
274.    case 0:P2|=0x00; break;
275.    case 4:P2|=0x80; break;
276.    case 5:P2|=0xa0; break;
277.    case 6:P2|=0xc0; break;
278.    case 7:P2|=0xe0; break;
279.    default : break; 
280. 
281. 
282. 
283.  }
284. 
285. }
286. void Init_System()
287. { 
288.  unsigned char i;
289.  Slect_fun(4);P0=0xff;
290.  Slect_fun(5);P0=0xaf;
291.  for(i=0;i<3;i++)
292.  {
293.    Read_temp();
294. 
295.  }
296.  time0();
297.  Init_ds1302();
298. 
299. }
300. void segs()
301. {
302.  static unsigned char wei=0;
303.  Slect_fun(7);
304.  P0=0xff;
305. 
306.  Slect_fun(6);
307.  P0=1<<wei;
308. 
309.  Slect_fun(7);
310.  if(!flag_temp)
311.  {
312.  P0=segtab[segbuff[wei]];
313.  }
314. 
315.  else P0=segtab[tp[wei]];
316.  wei++;
317.  if(wei==8)wei=0;
318. 
319.  Slect_fun(0);
320. 
321. }
322. void Init_ds1302()
323. {
324. 
325. 
326. Write_Ds1302_Byte(0x8e,0x00);
327. Write_Ds1302_Byte(0x84,0x23);
328. Write_Ds1302_Byte(0x82,0x59);
329. Write_Ds1302_Byte(0x80,0x50);
330. Write_Ds1302_Byte(0x8e,0x80);
331. 
332. 
333. }
334. void Read_time()
335. {
336. 
337.  Read_ds1302[0]=Read_Ds1302_Byte(0x85);
338.  Read_ds1302[1]=Read_Ds1302_Byte(0x83);
339.  Read_ds1302[2]=Read_Ds1302_Byte(0x81);
340. 
341. 
342. }
343. void SMG_show()
344. {
345.  if(mod1==0)
346.  { 
347.      segbuff[0]=12;
348.      segbuff[1]=1;
349.      segbuff[2]=10;
350.      segbuff[3]=10;
351.      segbuff[4]=10;
352.      segbuff[7]=temp%10;
353.       segbuff[5]=temp/100;
354.      segbuff[6]=temp/10%10;
355. 
356.  }
357. 
358. 
359.  else if(mod1==1)
360.  { 
361. 
362. 
363.    segbuff[0]=12;
364.    segbuff[1]=2;
365. 
366.    segbuff[2]=10;
367. 
368.    segbuff[3]=Read_ds1302[0]>>4;
369.    segbuff[4]=Read_ds1302[0]%16;
370. 
371.    segbuff[5]=11;
372. 
373.    segbuff[6]=Read_ds1302[1]>>4;
374.    segbuff[7]=Read_ds1302[1]%16;
375. 
376.  }
377.  else if(mod1==2)
378.  {
379. 
380.    segbuff[0]=12;
381.    segbuff[1]=3;
382.    segbuff[2]=10;
383. 
384. 
385.    segbuff[3]=10;
386.    segbuff[4]=10;
387. 
388. 
389.    segbuff[5]=10;
390. 
391.    segbuff[6]=para/10;
392.    segbuff[7]=para%10;
393. 
394. 
395. 
396.  }
397. 
398. 
399. }

下面是各种.h文件了

1. #ifndef _DMX_H
2. #define _DMX_H
3. 
4. #define state_0 0
5. #define state_1 1
6. #define state_2 2
7. #define kbd_io  P3
8. #define kbd_maskrow 0x0f
9. extern unsigned int temp;
10. extern bit flag_t;
11. void time0();
12. void scan_kbd();
13. void key_real();
14. void Slect_fun(unsigned char n) ;
15. void segs();
16. void Init_ds1302();
17. void Read_time();
18. void SMG_show();
19. void Init_System();
20. void led_work();
21. #endif
目录
相关文章
|
传感器
蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)
蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)
536 0
蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)
|
11月前
单片机-蓝桥杯 用光敏电阻测量光照强度并显示在数码管上。
单片机-蓝桥杯 用光敏电阻测量光照强度并显示在数码管上。
185 1
|
11月前
蓝桥杯第11届国赛单片机组
蓝桥杯第11届国赛单片机组
103 0
|
11月前
蓝桥杯13届第2场(51单片机)
蓝桥杯13届第2场(51单片机)
69 0
|
11月前
蓝桥杯第12届第2场51单片机
蓝桥杯第12届第2场51单片机
105 0
|
11月前
蓝桥杯第六届省赛(单片机)--深度解析
蓝桥杯第六届省赛(单片机)--深度解析
117 0
蓝桥杯之单片机学习(二十九)——第十三届蓝桥杯单片机第二场(超声波未实现)
蓝桥杯之单片机学习(二十九)——第十三届蓝桥杯单片机第二场(超声波未实现)
267 0
蓝桥杯之单片机学习(二十九)——第十三届蓝桥杯单片机第二场(超声波未实现)
|
芯片
蓝桥杯STC15单片机流水灯
蓝桥杯STC15单片机流水灯
185 0
|
算法 程序员
蓝桥杯单片机快速得奖方法(分享一些实用技巧)
蓝桥杯单片机快速得奖方法(分享一些实用技巧)
315 0
蓝桥杯单片机技巧之数码管小数点显示及串口中断代码生成
蓝桥杯单片机技巧之数码管小数点显示及串口中断代码生成
238 0