蓝桥杯第12届第2场51单片机

简介: 蓝桥杯第12届第2场51单片机

首先这套题也比较常规,可能频率测量大家不熟悉,掌握这套代码就不用恐惧频率测量的题目了

工程文件在博主的资源中可自行下载(免费)

1.首先配置文件(关键

1. #include "key.h"
2. #include <STC15F2K60S2.H>
3. #include "iic.h"
4. uint segtab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff
5. ,0x4e,0x3e, 0xc0&0x7f, 0xF9&0x7f,0xA4&0x7f,0xB0&0x7f, 0x99&0x7f, 
6. 0x92&0x7f,0x82&0x7f,0xF8&0x7f, 0x80&0x7f,0x90&0x7f}; //储存显示界面
7. uint segbuff[8]={0};
8. uint count_f=0;  //频率次数每个时钟周期加1
9. uint sum=2035;   //1s的总频率
10. uint count=0;    //计时1s
11. uint count_v=0;    //数据采集计数
12. bit flag_v=0;       //可以采集标志位
13. uint v;      //    采集数据
14. uchar mod1=0;         //界面切换
15. uchar mod2=0;             //模式切换
16. uint count_s=0;   //长按时间
17. uint flag_s=0;   //1s标志位
18. uchar aaa=0;      //是否启动led
19. uint temp1;      //存储电压
20. uint temp2;       //存储频率
21. void delay(uint t)
22. {
23. while(t--);
24. 
25. 
26. }
27. void time0()
28. {
29.   TMOD=0x06;
30.   TH0=0xff;
31.   TL0=0xff;
32.   TR0=1;
33.   ET0=1;
34.   EA=1;
35. }
36. void time2(void)
37. {
38.   T2H=(65535-10000)/256;  //10ms
39.   T2L=(65535-10000)%256;
40.   EA=1;
41.   IE2|=0x04;  //定时器2中断允许
42.   AUXR|=0x10;  //开启定时器2
43. 
44. }
45. void time1()
46. {                  //1ms
47.   TMOD|=0x10;
48.   TH1=(0-5000)/256;
49.   TL1=(0-5000)%256;
50.   TR1=1;
51.   ET1=1;
52. }
53. void init()  //关闭蜂鸣器和led
54. {
55. select(4);
56.   P0=0xff;
57.   select(5);
58.   P0=0xaf;
59. 
60. 
61. }
62. void Timer0() interrupt 1
63. {
64.    count_f++;    //频率次数
65. 
66. }
67. void Timer1() interrupt 3  //5ms
68. { 
69. 
70.   TH1=(0-5000)/256;
71.   TL1=(0-5000)%256;
72.    count++;
73.    if(count==200)  //1s采集频率
74.    { 
75.      sum=count_f;
76.      count_f=0;
77.      count=0;
78. 
79.    }
80.    count_v++;
81.    if(count_v==100) // 0.5s采集电压
82.    {
83.      flag_v=1;
84.      count_v=0;
85.    }
86. 
87. 
88. }
89. void Timer2() interrupt 12
90. {
91.    count_s++;   //判断S7是否长按
92.   if(count_s==100)
93.   {
94.       count_s=0;
95.       flag_s++;
96. 
97.   }
98. }
99. 
100. void scan_kbd()
101. {
102. 
103. if(S4==0)
104.  { 
105.    delay(100);
106.    if(S4==0)
107.    { 
108.      mod1++;  //切换界面
109.      if(mod1==3)mod1=0;
110.      while(!S4){   //判断弹起的时候刷新数码管
111.        show_seg(0);delay(500);
112.    show_seg(4);delay(500);
113.    show_seg(5);delay(500);
114.    show_seg(6);delay(500);
115.    show_seg(7);delay(500);led_work();}
116. 
117. 
118.    }
119. 
120. 
121.  }
122.  if(S5==0&&mod1==2)
123.  {
124.    delay(100);
125.    if(S5==0)
126.    {
127.      mod2++; if(mod1==1)mod2=0;  //模式切换      
128.        while(!S5){   //判断弹起的时候刷新数码管
129.        show_seg(0);delay(500);
130.    show_seg(4);delay(500);
131.    show_seg(5);delay(500);
132.    show_seg(6);delay(500);
133.    show_seg(7);delay(500);}
134. 
135. 
136.    }
137. 
138.  }
139.  if(S7==0)
140.  {
141.    delay(100);
142.    if(S7==0)
143.    {     count_s=0;  
144.          flag_s=0;
145.       while(!S7)
146.       {
147.      //判断弹起的时候刷新数码管
148.    show_seg(0);delay(500);
149.    show_seg(4);delay(500);
150.    show_seg(5);delay(500);
151.    show_seg(6);delay(500);
152.    show_seg(7);delay(500);
153. 
154.       }
155. 
156. 
157.          if(flag_s>=1)  //大于1s
158.          {
159.            if(aaa<1)aaa++;
160.            else aaa=0;
161. 
162.          }  //¶Ì°´±£´æƵÂÊ
163.          else temp2=sum;
164. 
165. 
166. 
167.    }
168. 
169.  }
170.  if(S6==0)
171.  {
172.    delay(100);
173.    if(S6==0)
174.    { //保存电压
175.  temp1= adc_read(0x41)*100/51;
176.       while(!S6)
177.       {
178.      show_seg(0);delay(500);
179.    show_seg(4);delay(500);
180.    show_seg(5);delay(500);
181.    show_seg(6);delay(500);
182.    show_seg(7);delay(500);
183. 
184.         // led_work();
185. 
186.       }
187. 
188.    }
189. 
190. 
191.  }
192. 
193. }
194. 
195. void select(uchar n)
196. {
197. switch(n)
198.  { 
199.    case 0:P2=P2&0x1f;break;
200.    case 4:P2=P2&0x1f|0x80;break;
201.    case 5:P2=P2&0x1f|0xa0;break;
202.    case 6:P2=P2&0x1f|0xc0;break;
203.    case 7:P2=P2&0x1f|0xe0;break;
204.  }
205. 
206. }
207. void show_seg(uchar wei)
208. {
209. select(6);
210.    P0=1<<wei;
211. select(7);
212.    P0=segtab[segbuff[wei]];
213. select(0); 
214. }
215. //²É¼¯ÆµÂÊ
216. void SMG1()
217. {
218.    segbuff[0]=11;
219.   segbuff[1]=10;
220.   segbuff[2]=10;
221.    segbuff[3]=10;
222.  if(sum>=1000)
223.    segbuff[4]=sum/1000;
224.  else   segbuff[4]=10;
225.  if(sum<100)
226.     segbuff[5]=10;
227.  else segbuff[5]=sum/100%10;
228.   if(sum<10)  segbuff[6]=10;
229.   else segbuff[6]=sum/10%10;
230.   if(sum>0)
231.           segbuff[7]=sum%10;
232.   else segbuff[7]=10;
233. }
234. void led_work()
235. {
236. 
237. if(aaa==0)
238. {
239. 
240. if(temp1>v)
241.  {
242.     P2=P2&0x1f|0x80;
243.    P0=0xfe;
244.  }
245. if(temp2<v)
246.  {
247.    P2=P2&0x1f|0x80;
248.   P0=0xef;
249.  }
250. 
251. 
252. }
253. if(aaa>0)
254. {
255.   P2=P2&0x1f|0x80;
256.   P0=0xff;
257. 
258. }
259. 
260. 
261. 
262. 
263. 
264. }
265. //ÖÜÆÚÏÔʾ
266. void SMG2()
267. {  
268.  uint dat_t=1000000/sum;
269.    segbuff[0]=11;
270.   segbuff[1]=10;
271.   segbuff[2]=10;
272.    segbuff[3]=10;
273.  if(sum>=1000)
274.    segbuff[4]=dat_t/1000;
275.  else   segbuff[4]=10;
276.  if(sum<100)
277.     segbuff[5]=10;
278.  else segbuff[5]=dat_t/100%10;
279.   if(sum<10)  segbuff[6]=10;
280.   else segbuff[6]=dat_t/10%10;
281.   if(sum>0)
282.           segbuff[7]=dat_t%10;
283.   else segbuff[7]=10;
284. 
285. 
286. }
287. //²É¼¯µçѹ
288. void SMG3()
289. {
290.   segbuff[0]=12;
291.  segbuff[1]=11;
292.  segbuff[2]=mod2+1; //²É¼¯Í¨µÀ
293.  segbuff[3]=10;
294.  segbuff[4]=10;
295.  segbuff[5]=v/100+13;
296.  segbuff[6]=v/10%10;
297.  segbuff[7]=v%10;
298. 
299. }
300. void SMG()
301. {
302. if(mod1==0)SMG1();
303.  else if(mod1==1)SMG2();
304.  else SMG3();
305. }

2.main函数(主要调用函数)

1. #include "key.h"
2. #include "iic.h"
3. uchar mod_v=0x40;
4. void main()
5. { 
6. init();
7.  time0(); //初始化定时器0
8. time1(); //初始化定时器1
9.  time2(); //初始化定时器2
10.   while(1)
11.   {  
12.     if(flag_v) //采集数据标志位
13.     { 
14.       if(mod2==0)mod_v=0x41; //光敏
15.       else  mod_v=0x43;  //电压
16.       v=adc_read(mod_v)*1.96;
17.       flag_v=0;   
18.     }
19.      scan_kbd();//扫描按键
20.      SMG();  //数组赋值,显示什么数据
21.     led_work();//led控制
22.     //刷新数码管
23.     show_seg(0);delay(500);
24.     show_seg(4);delay(500);
25.     show_seg(5);delay(500);
26.     show_seg(6);delay(500);
27.     show_seg(7);delay(500);
28. 
29.   }
30. 
31. }
32.

3.然后就是iic.c文件

1. #include "iic.h"
2. 
3. #define DELAY_TIME 5
4. 
5. //I2C????????
6. void IIC_Delay(unsigned char i)
7. {
8. do{_nop_();}
9. while(i--);        
10. }
11. 
12. //I2C??????
13. void IIC_Start(void)
14. {
15.     SDA = 1;
16.     SCL = 1;
17. IIC_Delay(DELAY_TIME);
18.     SDA = 0;
19. IIC_Delay(DELAY_TIME);
20.     SCL = 0;  
21. }
22. 
23. //I2C??????
24. void IIC_Stop(void)
25. {
26.     SDA = 0;
27.     SCL = 1;
28. IIC_Delay(DELAY_TIME);
29.     SDA = 1;
30. IIC_Delay(DELAY_TIME);
31. }
32. 
33. //??????????
34. void IIC_SendAck(bit ackbit)
35. {
36.     SCL = 0;
37.     SDA = ackbit;           
38. IIC_Delay(DELAY_TIME);
39.     SCL = 1;
40. IIC_Delay(DELAY_TIME);
41.     SCL = 0; 
42.     SDA = 1;
43. IIC_Delay(DELAY_TIME);
44. }
45. 
46. //????
47. bit IIC_WaitAck(void)
48. {
49.     bit ackbit;
50. 
51.     SCL  = 1;
52. IIC_Delay(DELAY_TIME);
53.     ackbit = SDA;
54.     SCL = 0;
55. IIC_Delay(DELAY_TIME);
56. return ackbit;
57. }
58. 
59. //I2C??????????
60. void IIC_SendByte(unsigned char byt)
61. {
62. unsigned char i;
63. 
64. for(i=0; i<8; i++)
65.     {
66.         SCL  = 0;
67. IIC_Delay(DELAY_TIME);
68. if(byt & 0x80) SDA  = 1;
69. else SDA  = 0;
70. IIC_Delay(DELAY_TIME);
71.         SCL = 1;
72.         byt <<= 1;
73. IIC_Delay(DELAY_TIME);
74.     }
75.     SCL  = 0;  
76. }
77. 
78. //I2C??????????
79. unsigned char IIC_RecByte(void)
80. {
81. unsigned char i, da;
82. for(i=0; i<8; i++)
83.     {   
84.       SCL = 1;
85.   IIC_Delay(DELAY_TIME);
86.   da <<= 1;
87.   if(SDA) da |= 1;
88.   SCL = 0;
89.   IIC_Delay(DELAY_TIME);
90.     }
91. return da;    
92. }
93. unsigned char adc_read(unsigned char addr)
94. {
95. unsigned char date;
96.   IIC_Start();
97.   IIC_SendByte(0x90);//ͨÐÅ·¢ËÍдÈëÇëÇó
98.   IIC_WaitAck();
99.   IIC_SendByte(addr);
100.  IIC_WaitAck();
101.  IIC_Stop();//¹Ø±ÕIIC
102. 
103.  IIC_Start();
104.  IIC_SendByte(0x91);
105.  IIC_WaitAck();
106.  date=IIC_RecByte();
107.  IIC_SendAck(1);
108.  return date;
109. 
110. }
111. /*
112. void dac_out(unsigned char date)
113. {
114.   IIC_Start();
115.   IIC_SendByte(0x90);
116.   IIC_WaitAck();
117.  IIC_SendByte(0x40); //0x43
118.   IIC_WaitAck();
119.  IIC_SendByte(date);
120.  IIC_WaitAck();
121.  IIC_Stop();
122. 
123. }
124. */

4.H文件

1. #ifndef _IIC_H
2. #define _IIC_H
3. #include <STC15F2K60S2.H>
4. #include "intrins.h"
5. 
6. sbit SDA = P2^1;
7. sbit SCL = P2^0;
8. 
9. void IIC_Start(void); 
10. void IIC_Stop(void);  
11. bit IIC_WaitAck(void);  
12. void IIC_SendAck(bit ackbit); 
13. void IIC_SendByte(unsigned char byt); 
14. unsigned char IIC_RecByte(void); 
15. unsigned char adc_read(unsigned char addr);
16. void dac_out(unsigned char date);
17. 
18. #endif

key.h

1. #ifndef _KEY_H
2. #define _KEY_H
3. #define uchar unsigned char
4. #define uint unsigned int 
5. #define  S4     P33
6. #define  S5     P32
7. #define  S6     P31
8. #define  S7     P30
9. extern bit flag_v;
10. extern uchar mod2;
11. extern uint v;
12. void delay(uint t);
13. void time0();
14. void time1();
15. void init();
16. void scan_kbd();
17. void select(uchar n);
18. void show_seg(uchar wei);
19. void SMG1();
20. void SMG2();
21. void SMG3();
22. void SMG();
23. void time2(void);
24. void led_work();
25. 
26. void delay(uint t);
27. #endif
目录
相关文章
|
11月前
单片机-蓝桥杯 用光敏电阻测量光照强度并显示在数码管上。
单片机-蓝桥杯 用光敏电阻测量光照强度并显示在数码管上。
184 1
|
11月前
蓝桥杯第11届国赛单片机组
蓝桥杯第11届国赛单片机组
103 0
|
11月前
13届蓝桥杯(单片机)
13届蓝桥杯(单片机)
84 0
|
11月前
蓝桥杯13届第2场(51单片机)
蓝桥杯13届第2场(51单片机)
66 0
|
11月前
蓝桥杯第六届省赛(单片机)--深度解析
蓝桥杯第六届省赛(单片机)--深度解析
117 0
蓝桥杯之单片机学习(二十九)——第十三届蓝桥杯单片机第二场(超声波未实现)
蓝桥杯之单片机学习(二十九)——第十三届蓝桥杯单片机第二场(超声波未实现)
266 0
蓝桥杯之单片机学习(二十九)——第十三届蓝桥杯单片机第二场(超声波未实现)
|
芯片
蓝桥杯STC15单片机流水灯
蓝桥杯STC15单片机流水灯
181 0
|
算法 程序员
蓝桥杯单片机快速得奖方法(分享一些实用技巧)
蓝桥杯单片机快速得奖方法(分享一些实用技巧)
312 0
蓝桥杯单片机技巧之数码管小数点显示及串口中断代码生成
蓝桥杯单片机技巧之数码管小数点显示及串口中断代码生成
234 0
蓝桥杯单片机国二经验分享
蓝桥杯单片机国二经验分享
187 0