• 第十三届蓝桥杯国赛


    1. #include
    2. #include "mywave.h"
    3. #include "display.h"
    4. #include "pcf8591.h"
    5. #include "eeprom.h"
    6. #include "intrins.h"
    7. void DisplaySMG_info();
    8. void control_led_jdq();
    9. sbit s4 = P3^3;
    10. sbit s5 = P3^2;
    11. sbit s6 = P3^1;
    12. sbit s7 = P3^0;
    13. code unsigned char Seg_dot[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
    14. code unsigned char Seg_Table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
    15. unsigned char count_200ms = 0;
    16. unsigned char count_1s = 0;
    17. unsigned int distance = 0;//距离值
    18. unsigned int count_f = 0;//频率值
    19. unsigned int adc_smg = 0;
    20. float adc_volt = 0;
    21. unsigned char humidity = 0;//湿度
    22. unsigned char count_100ms = 0;
    23. unsigned char f_param = 90;//频率参数
    24. unsigned char h_param = 40;//湿度参数
    25. unsigned char dis_param = 6;//距离参数
    26. unsigned char UI = 0;// 0-频率界面 1-湿度界面 2-测距界面 3-参数界面
    27. unsigned char UI_param = 0;//0-频率参数 1-湿度参数 2-距离参数
    28. unsigned char f_mode = 0;//0-Hz显示 1-KHz显示
    29. unsigned char dis_mode = 0;//0-CM显示 1-M显示
    30. unsigned int f_int = 0;//数码管显示KHz单位的频率
    31. float f_temp = 0;//频率单位转KHz
    32. unsigned char stat_led = 0xff;
    33. unsigned char stat_jdq = 0x00;
    34. unsigned char count_01s = 0;
    35. unsigned char num_jdq = 0;//继电器开关次数
    36. unsigned char count_s7 = 0;//长按计数
    37. unsigned char stat_s7 = 0;//按键S7按下和松开的状态
    38. unsigned char stat_on_off = 0;//防止继电器开计数多次频繁计数
    39. unsigned char pwm = 0;//周期计数
    40. unsigned char duty_pwm = 0;//占空比
    41. unsigned char count_50ms = 0;
    42. unsigned char stat_on_off1 = 0;//防止继电器关计数多次频繁计数
    43. void Delay20ms() //@12.000MHz
    44. {
    45. unsigned char i, j, k;
    46. _nop_();
    47. _nop_();
    48. i = 1;
    49. j = 234;
    50. k = 113;
    51. do
    52. {
    53. do
    54. {
    55. while (--k);
    56. } while (--j);
    57. } while (--i);
    58. }
    59. void Timer1Init(void) //200微秒@12.000MHz
    60. {
    61. AUXR &= 0xBF; //定时器时钟12T模式
    62. TMOD &= 0x0F; //设置定时器模式
    63. TMOD |= 0x10; //设置定时器模式
    64. TL1 = 0x38; //设置定时初值
    65. TH1 = 0xFF; //设置定时初值
    66. TF1 = 0; //清除TF1标志
    67. TR1 = 1; //定时器1开始计时
    68. ET1 = 1;
    69. EA = 1;
    70. }
    71. void Sevice_timer1() interrupt 3
    72. {
    73. EA = 0;
    74. TL1 = 0x38; //设置定时初值
    75. TH1 = 0xFF; //设置定时初值
    76. pwm++;
    77. if(pwm == duty_pwm)
    78. {
    79. stat_jdq &= 0xdf;
    80. }
    81. else if(pwm == 5)
    82. {
    83. pwm = 0;
    84. stat_jdq |= 0x20;
    85. }
    86. SelectHC573(5,stat_jdq);
    87. EA = 1;
    88. }
    89. void Init_timer0()
    90. {
    91. AUXR &= 0x7f;
    92. TMOD &= 0xf0;
    93. TMOD |= 0x05;
    94. TH0 = TL0 = 0;
    95. TR0 = 1;
    96. ET0 = 0;
    97. }
    98. void Init_timer2()
    99. {
    100. AUXR &= 0xf3;
    101. T2L = 0xf0;
    102. T2H = 0xd8;
    103. AUXR |= 0x10;
    104. IE2 |= 0x04;
    105. EA = 1;
    106. }
    107. void Sevice_timer2() interrupt 12
    108. {
    109. DisplaySMG_info();
    110. count_200ms++;
    111. count_1s++;
    112. count_100ms++;
    113. count_50ms++;
    114. if(count_50ms == 5)
    115. {
    116. count_50ms = 0;
    117. control_led_jdq();
    118. }
    119. if(count_100ms == 5)
    120. {
    121. count_100ms = 0;
    122. adc_volt = read_myadc();
    123. }
    124. if(count_1s == 100)
    125. {
    126. TR0 = 0;
    127. count_1s = 0;
    128. count_f = (TH0 << 8) | TL0;
    129. TH0 = TL0 = 0;
    130. TR0 = 1;
    131. }
    132. if(count_200ms == 20)
    133. {
    134. count_200ms = 0;
    135. distance = measure_distan();
    136. }
    137. if(UI == 3)
    138. {
    139. count_01s++;
    140. if(count_01s == 10)
    141. {
    142. count_01s = 0;
    143. if(UI_param == 0)
    144. {
    145. stat_led |= 0x04;
    146. if((stat_led | 0xfe) == 0xfe)
    147. {
    148. stat_led |= 0x01;
    149. }
    150. else
    151. {
    152. stat_led &= 0xfe;
    153. }
    154. }
    155. else if(UI_param == 1)
    156. {
    157. stat_led |= 0x01;
    158. if((stat_led | 0xfd) == 0xfd)
    159. {
    160. stat_led |= 0x02;
    161. }
    162. else
    163. {
    164. stat_led &= 0xfd;
    165. }
    166. }
    167. else if(UI_param == 2)
    168. {
    169. stat_led |= 0x02;
    170. if((stat_led | 0xfb) == 0xfb)
    171. {
    172. stat_led |= 0x04;
    173. }
    174. else
    175. {
    176. stat_led &= 0xfb;
    177. }
    178. }
    179. }
    180. SelectHC573(4,stat_led);
    181. }
    182. if(stat_s7 == 1)
    183. {
    184. count_s7++;
    185. }
    186. else if(stat_s7 == 2)
    187. {
    188. if(count_s7 > 100)
    189. {
    190. num_jdq = 0;
    191. save_data(0x00,num_jdq);
    192. count_s7 = 0;
    193. stat_s7 = 0;
    194. }
    195. }
    196. }
    197. void DisplaySMG_info()
    198. {
    199. switch(UI)
    200. {
    201. case 0:
    202. DisplaySMG_Bit(0,0x8e);
    203. if(f_mode == 0)
    204. {
    205. if(count_f > 99999)
    206. DisplaySMG_Bit(2,Seg_Table[count_f / 100000]);
    207. if(count_f > 9999)
    208. DisplaySMG_Bit(3,Seg_Table[count_f / 10000 % 10]);
    209. if(count_f > 999)
    210. DisplaySMG_Bit(4,Seg_Table[count_f / 1000 % 10]);
    211. if(count_f > 99)
    212. DisplaySMG_Bit(5,Seg_Table[count_f / 100 % 10]);
    213. if(count_f > 9)
    214. DisplaySMG_Bit(6,Seg_Table[count_f / 10 % 10]);
    215. DisplaySMG_Bit(7,Seg_Table[count_f % 10]);
    216. }
    217. else if(f_mode == 1)
    218. {
    219. f_temp = (float)count_f / 1000;
    220. f_int = f_temp * 10;
    221. if(f_int > 99999)
    222. DisplaySMG_Bit(2,Seg_Table[f_int / 100000]);
    223. if(f_int > 9999)
    224. DisplaySMG_Bit(3,Seg_Table[f_int / 10000 % 10]);
    225. if(f_int > 999)
    226. DisplaySMG_Bit(4,Seg_Table[f_int / 1000 % 10]);
    227. if(f_int > 99)
    228. DisplaySMG_Bit(5,Seg_Table[f_int / 100 % 10]);
    229. DisplaySMG_Bit(6,Seg_dot[f_int / 10 % 10]);
    230. DisplaySMG_Bit(7,Seg_Table[f_int % 10]);
    231. }
    232. break;
    233. case 1:
    234. DisplaySMG_Bit(0,0x89);
    235. DisplaySMG_Bit(6,Seg_Table[humidity / 10]);
    236. DisplaySMG_Bit(7,Seg_Table[humidity % 10]);
    237. break;
    238. case 2:
    239. DisplaySMG_Bit(0,0x88);
    240. if(dis_mode == 0)
    241. {
    242. if(distance > 99)
    243. DisplaySMG_Bit(5,Seg_Table[distance / 100]);
    244. if(distance > 9)
    245. DisplaySMG_Bit(6,Seg_Table[distance / 10 % 10]);
    246. DisplaySMG_Bit(7,Seg_Table[distance % 10]);
    247. }
    248. else if(dis_mode == 1)
    249. {
    250. DisplaySMG_Bit(5,Seg_dot[distance / 100]);
    251. DisplaySMG_Bit(6,Seg_Table[distance / 10 % 10]);
    252. DisplaySMG_Bit(7,Seg_Table[distance % 10]);
    253. }
    254. break;
    255. case 3:
    256. if(UI_param == 0)
    257. {
    258. DisplaySMG_Bit(0,0x8c);
    259. DisplaySMG_Bit(1,Seg_Table[1]);
    260. if(f_param > 99)
    261. DisplaySMG_Bit(5,Seg_Table[f_param / 100 % 10]);
    262. DisplaySMG_Bit(6,Seg_dot[f_param / 10 % 10]);
    263. DisplaySMG_Bit(7,Seg_Table[f_param % 10]);
    264. }
    265. else if(UI_param == 1)
    266. {
    267. DisplaySMG_Bit(0,0x8c);
    268. DisplaySMG_Bit(1,Seg_Table[2]);
    269. DisplaySMG_Bit(6,Seg_Table[h_param / 10]);
    270. DisplaySMG_Bit(7,Seg_Table[h_param % 10]);
    271. }
    272. else if(UI_param == 2)
    273. {
    274. DisplaySMG_Bit(0,0x8c);
    275. DisplaySMG_Bit(1,Seg_Table[3]);
    276. DisplaySMG_Bit(6,Seg_dot[dis_param / 10]);
    277. DisplaySMG_Bit(7,Seg_Table[dis_param % 10]);
    278. }
    279. break;
    280. }
    281. }
    282. void scan_key()
    283. {
    284. if(s4 == 0)
    285. {
    286. Delay20ms();
    287. if(s4 == 0)
    288. {
    289. if(UI == 0)
    290. {
    291. UI = 1;
    292. }
    293. else if(UI == 1)
    294. {
    295. UI = 2;
    296. }
    297. else if(UI == 2)
    298. {
    299. UI_param = 0;
    300. UI = 3;
    301. }
    302. else if(UI == 3)
    303. {
    304. UI = 0;
    305. }
    306. while(s4 == 0);
    307. }
    308. }
    309. else if(s5 == 0)
    310. {
    311. Delay20ms();
    312. if(s5 == 0)
    313. {
    314. if(UI == 3)
    315. {
    316. if(UI_param == 0)
    317. {
    318. UI_param = 1;
    319. }
    320. else if(UI_param == 1)
    321. {
    322. UI_param = 2;
    323. }
    324. else if(UI_param == 2)
    325. {
    326. UI_param = 0;
    327. }
    328. }
    329. while(s5 == 0);
    330. }
    331. }
    332. else if(s6 == 0)
    333. {
    334. Delay20ms();
    335. if(s6 == 0)
    336. {
    337. if((UI == 3) && (UI_param == 0))
    338. {
    339. if(f_param == 120)
    340. {
    341. f_param = 10;
    342. }
    343. else
    344. {
    345. f_param += 5;
    346. }
    347. }
    348. else if((UI == 3) && (UI_param == 1))
    349. {
    350. if(h_param == 60)
    351. {
    352. h_param = 10;
    353. }
    354. else
    355. {
    356. h_param += 10;
    357. }
    358. }
    359. else if((UI == 3) && (UI_param == 2))
    360. {
    361. if(dis_param == 12)
    362. {
    363. dis_param = 1;
    364. }
    365. else
    366. {
    367. dis_param += 1;
    368. }
    369. }
    370. if(UI == 2)
    371. {
    372. if(dis_mode == 0)
    373. {
    374. dis_mode = 1;
    375. }
    376. else if(dis_mode == 1)
    377. {
    378. dis_mode = 0;
    379. }
    380. }
    381. while(s6 == 0);
    382. }
    383. }
    384. else if(s7 == 0)
    385. {
    386. Delay20ms();
    387. if(s7 == 0)
    388. {
    389. if((UI == 3) && (UI_param == 0))
    390. {
    391. if(f_param == 10)
    392. {
    393. f_param = 120;
    394. }
    395. else
    396. {
    397. f_param -= 5;
    398. }
    399. }
    400. else if((UI == 3) && (UI_param == 1))
    401. {
    402. if(h_param == 10)
    403. {
    404. h_param = 60;
    405. }
    406. else
    407. {
    408. h_param -= 10;
    409. }
    410. }
    411. else if((UI == 3) && (UI_param == 2))
    412. {
    413. if(dis_param == 1)
    414. {
    415. dis_param = 12;
    416. }
    417. else
    418. {
    419. dis_param -= 1;
    420. }
    421. }
    422. if(UI == 0)
    423. {
    424. if(f_mode == 0)
    425. {
    426. f_mode = 1;
    427. }
    428. else
    429. {
    430. f_mode = 0;
    431. }
    432. }
    433. if(UI == 1)
    434. {
    435. stat_s7 = 1;
    436. }
    437. while(s7 == 0);
    438. if(UI == 1)
    439. {
    440. stat_s7 = 2;
    441. }
    442. }
    443. }
    444. }
    445. void deal_data()
    446. {
    447. unsigned char dac_value = 0;
    448. if(adc_volt < 5.0)
    449. humidity = 20 * adc_volt;
    450. if(humidity < h_param)
    451. {
    452. Set_mydac(51);
    453. }
    454. else if(humidity <= 80)
    455. {
    456. dac_value = (((4.0/(80-h_param))*humidity + ((float)(80-(5*(char)h_param))/(80-h_param))) * 51);
    457. Set_mydac(dac_value);
    458. }
    459. else
    460. {
    461. Set_mydac(255);
    462. }
    463. }
    464. void control_led_jdq()
    465. {
    466. if(distance > (dis_param * 10))
    467. {
    468. stat_jdq |= 0x10;
    469. stat_led &= 0xdf;
    470. stat_on_off1 = 0;
    471. if(stat_on_off == 0)//继电器开计数
    472. {
    473. num_jdq++;
    474. stat_on_off = 1;
    475. save_data(0x00,num_jdq);
    476. }
    477. }
    478. else
    479. {
    480. stat_jdq &= 0xef;
    481. stat_led |= 0x20;
    482. stat_on_off = 0;
    483. if(stat_on_off1 == 0)//继电器关计数
    484. {
    485. num_jdq++;
    486. stat_on_off1 = 1;
    487. save_data(0x00,num_jdq);
    488. }
    489. }
    490. if(UI == 0)
    491. {
    492. stat_led |= 0x04;
    493. stat_led &= 0xfe;
    494. }
    495. else if(UI == 1)
    496. {
    497. stat_led |= 0x01;
    498. stat_led &= 0xfd;
    499. }
    500. else if(UI == 2)
    501. {
    502. stat_led |= 0x02;
    503. stat_led &= 0xfb;
    504. }
    505. if(count_f > (f_param * 100))
    506. {
    507. stat_led &= 0xf7;
    508. duty_pwm = 4;
    509. }
    510. else
    511. {
    512. stat_led |= 0x08;
    513. duty_pwm = 1;
    514. }
    515. if(humidity > h_param)
    516. {
    517. stat_led &= 0xef;
    518. }
    519. else
    520. {
    521. stat_led |= 0x10;
    522. }
    523. SelectHC573(5,stat_jdq);
    524. SelectHC573(4,stat_led);
    525. }
    526. void main()
    527. {
    528. Init_timer2();
    529. Init_timer0();
    530. SelectHC573(5,0x00);
    531. SelectHC573(4,0xff);
    532. DisplaySMG_All(0xff);
    533. Timer1Init();
    534. while(1)
    535. {
    536. deal_data();
    537. scan_key();
    538. }
    539. }

    需要完整工程可私信

  • 相关阅读:
    车载GNSS/INS/LiDAR坐标系定义与理解
    1024 科学计数法
    Security RBAC 表结构+权限查询sql
    zabbix如何配置告警短信?(预警短信通知设置流程)
    laravel carbon时间处理组件开发文档-中文版
    机器学习基础05DAY
    ES & Kibana windows 安装
    Vue前端页面打印
    秒懂生成式AI—大语言模型是如何生成内容的?
    初识 C语言文件操作
  • 原文地址:https://blog.csdn.net/2301_80600743/article/details/138759987