首先这套题也比较常规,可能频率测量大家不熟悉,掌握这套代码就不用恐惧频率测量的题目了
工程文件在博主的资源中可自行下载(免费)
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