当前位置:   article > 正文

蓝桥杯单片机第十四届模拟题_蓝桥杯单片机第14届模拟赛

蓝桥杯单片机第14届模拟赛

一、基本要求


使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的hex文件。不符合以上文件提交要求的作品将被评为零分或者被酌情扣分。

 

硬件设置:

IAP15F2K61S2单片机内部振荡器频率设定为12MHz,串口通信波特率为9600bps

键盘工作模式跳线J5配置为KBD矩阵按键模式。

扩展方式跳线J13配置为IO模式。

请注意:选手需严格按照以上要求配置竞赛板,编写和调试程序,不符合以上配置要求的作品将被评为零分或者被酌情扣分。

 

二、硬件框图


1 系统硬件框图

 

三、功能描述 


3.1 基本功能描述

1)通过串口控制数码管显示界面:"温度显示界面""电压显示界面";也可以返回当前数码管显示的数据。

2)通过读取DS18B20温度传感器,获取环境温度。

3)通过 PCF8591 ADC 通道测量电位器 RB2 的输出电压。

4)通过数码管显示获取的温度数据和采集的电压数据,显示界面可以通过串口切换。

5)通过LED指示灯完成题目要求的指示功能。

6)根据题目要求完成继电器和蜂鸣器的控制功能。

3.2 性能要求

1)按键动作响应时间:≤0.2

2)指示灯动作响应时间:≤0.1

3.3 显示功能

温度显示界面

温度显示界面如图2所示,显示内容包括界面提示符(U1)和温度数据,单位为

2 温度显示界面(27.5°C

使用3位数码管显示温度数据,温度数据保留小数点后1位有效数字。

 

电压显示界面

电压显示界面如图3所示,显示内容包括界面提示符(U2)和电压数据,单位为V

3 电压显示界面(1.35V

使用3位数码管显示电压数据,电压数据保留小数点后2位有效数字。

3.4 按键功能

1)按键S4定义为"锁定"按键,按下S4按键,能够锁定当前界面"温度显示界面""电压显示界面",串口切换界面指令失效。

2)按键S5定义为"解锁"按键,在界面锁定时,按下S5按键,可取消界面锁定,串口指令恢复控制。

3)按键S12定义为"发送"按键,每次按下,串口将当前数码管显示的数据发送给PC端的串口调试工具。

注意:

1)按键S5仅在界面锁定时有效。

2)判断按键是否按下时,需进行消抖操作,避免单次按键操作,触发多次结果。

3.5 串口功能

1)串口接收到指令字符'A',进入温度显示界面。

2)串口接收到指令字符'B',进入电压显示界面。

3)串口返回数据格式:

“TEMP27.5°C”“Voltage1.35V”

注意: 注意区分字母大小写。

3.6 LED指示灯功能

当前界面处于温度显示界面时,L1指示灯点亮,否则熄灭。

当前界面处于电压显示界面时,L2指示灯点亮,否则熄灭。

当前界面处于锁定状态时,L3指示灯以0.1s的时间间隔亮、灭,否则熄灭。

其余指示灯均处于熄灭状态。

3.7 继电器控制功能

继电器状态受温度控制,将采集的温度数据记为T,若当前采集的温度满足下列条件时,继电器吸合,否则,继电器断开。

温度≥28°C

3.8 蜂鸣器控制功能

蜂鸣器状态受电压控制,将采集的电压数据记为V,若当前采集的电压满足下列条件时,蜂鸣器发声,否则蜂鸣器静音。

V>3.6V

3.9 初始化

上电数码管默认处于温度显示界面。

界面切换处于解锁状态。

指示灯全部熄灭。

 代码如下

  1. #include <STC15F2K60S2.H>
  2. #include "onewire.h"
  3. #include "iic.h"
  4. #include "intrins.h"
  5. #include "stdio.h"
  6. sbit h1 = P3^2;
  7. sbit h2 = P3^3;
  8. sbit s1 = P4^4;
  9. sbit s3 = P3^5;
  10. void DisplaySMG_Info();
  11. unsigned char code SMG_NoDot[18]={0xc0,0xf9,
  12. 0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  13. 0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
  14. unsigned char code SMG_Dot[10]={0x40,0x79,
  15. 0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  16. unsigned char stat_LM = 0;
  17. unsigned char stat_U9 = 0x00;
  18. unsigned char num_01s = 0;
  19. unsigned char stat_led = 0xff;
  20. unsigned char stat_shan = 0;
  21. unsigned char stat_UI0 = 0;
  22. unsigned char stat_UI1 = 0;
  23. unsigned char stat_send = 0;
  24. unsigned char receive_data = 0;
  25. unsigned char adc_value = 0;
  26. float adc_volt = 0;
  27. unsigned int adc_smg = 0;
  28. float temp_value = 0;
  29. unsigned int temp_smg = 0;
  30. unsigned char UI = 0; // 0-温度界面 1-电压界面
  31. unsigned char send_data[100];
  32. void Delay20ms() //@11.0592MHz
  33. {
  34. unsigned char i, j, k;
  35. _nop_();
  36. _nop_();
  37. i = 1;
  38. j = 216;
  39. k = 35;
  40. do
  41. {
  42. do
  43. {
  44. while (--k);
  45. } while (--j);
  46. } while (--i);
  47. }
  48. void Init_timer0()
  49. {
  50. TMOD = TMOD & 0xf0;
  51. TMOD = TMOD | 0x01;
  52. TH0 = (65535 - 10000) / 256;
  53. TL0 = (65535 - 10000) % 256;
  54. ET0 = 1;
  55. EA = 1;
  56. TR0 = 1;
  57. PT0 = 0;
  58. }
  59. void seveice_timer0() interrupt 1
  60. {
  61. TH0 = (65535 - 10000) / 256;
  62. TL0 = (65535 - 10000) % 256;
  63. if(stat_shan == 1)
  64. {
  65. num_01s++;
  66. if(num_01s == 10)
  67. {
  68. num_01s = 0;
  69. if(stat_LM == 0)
  70. {
  71. stat_LM = 1;
  72. }
  73. else
  74. {
  75. stat_LM = 0;
  76. }
  77. }
  78. }
  79. }
  80. void UartInit(void) //9600bps@12.000MHz
  81. {
  82. PCON &= 0x7F; //波特率不倍速
  83. SCON = 0x50; //8位数据,可变波特率
  84. AUXR |= 0x40; //定时器1时钟为Fosc,即1T
  85. AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
  86. TMOD &= 0x0F; //清除定时器1模式位
  87. TMOD |= 0x20; //设定定时器1为8位自动重装方式
  88. TL1 = 0xD9; //设定定时初值
  89. TH1 = 0xD9; //设定定时器重装值
  90. ET1 = 0; //禁止定时器1中断
  91. TR1 = 1; //启动定时器1
  92. EA = 1;
  93. ES = 1;
  94. PS = 1;
  95. }
  96. void Sevice_Uart() interrupt 4
  97. {
  98. if(RI == 1)
  99. {
  100. receive_data = SBUF;
  101. RI = 0;
  102. }
  103. if(receive_data == 'A')
  104. {
  105. if(stat_UI0 == 0)
  106. {
  107. UI = 0;
  108. }
  109. }
  110. if(receive_data == 'B')
  111. {
  112. if(stat_UI1 == 0)
  113. {
  114. UI = 1;
  115. }
  116. }
  117. }
  118. void sendByte_Uart(unsigned char senddata)
  119. {
  120. SBUF = senddata;
  121. while(TI == 0);
  122. TI = 0;
  123. }
  124. void sendstring_Uart(unsigned char *dat)
  125. {
  126. while(*dat != '\0')
  127. {
  128. sendByte_Uart(*dat++);
  129. }
  130. }
  131. void SelectHC573(unsigned char channel,unsigned char dat)
  132. {
  133. P2 = (P2 & 0x1f) | 0x00;
  134. P0 = dat;
  135. switch(channel)
  136. {
  137. case 4:
  138. P2 = (P2 & 0x1f) | 0x80;
  139. break;
  140. case 5:
  141. P2 = (P2 & 0x1f) | 0xa0;
  142. break;
  143. case 6:
  144. P2 = (P2 & 0x1f) | 0xc0;
  145. break;
  146. case 7:
  147. P2 = (P2 & 0x1f) | 0xe0;
  148. break;
  149. case 0:
  150. P2 = (P2 & 0x1f) | 0x00;
  151. break;
  152. }
  153. P2 = (P2 & 0x1f) | 0x00;
  154. }
  155. void DelaySMG(unsigned int t)
  156. {
  157. while(t--);
  158. }
  159. void DisplaySMG_Bit(unsigned char pos,unsigned char value)
  160. {
  161. SelectHC573(6,0x01 << pos);
  162. SelectHC573(7,value);
  163. DelaySMG(500);
  164. SelectHC573(6,0x01 << pos);
  165. SelectHC573(7,0xff);
  166. }
  167. void DisplaySMG_All(unsigned char value)
  168. {
  169. SelectHC573(6,0xff);
  170. SelectHC573(7,value);
  171. }
  172. void Init_DS18B20_temp()
  173. {
  174. unsigned char MSB,LSB;
  175. init_ds18b20();
  176. Write_DS18B20(0xcc);
  177. Write_DS18B20(0x44);
  178. do{
  179. init_ds18b20();
  180. Write_DS18B20(0xcc);
  181. Write_DS18B20(0xbe);
  182. LSB = Read_DS18B20();
  183. MSB = Read_DS18B20();
  184. MSB = (MSB << 4) | (LSB >> 4);
  185. }while(MSB == 85);
  186. }
  187. void read_DS18B20_temp()
  188. {
  189. unsigned char MSB,LSB;
  190. unsigned int temp;
  191. init_ds18b20();
  192. Write_DS18B20(0xcc);
  193. Write_DS18B20(0x44);
  194. DisplaySMG_Info();
  195. init_ds18b20();
  196. Write_DS18B20(0xcc);
  197. Write_DS18B20(0xbe);
  198. DisplaySMG_Info();
  199. LSB = Read_DS18B20();
  200. MSB = Read_DS18B20();
  201. temp = MSB << 8;
  202. temp = temp | LSB;
  203. if((temp & 0xf800) == 0x0000)
  204. {
  205. temp_value = temp * 0.0625;
  206. temp_smg = temp_value * 10;
  207. if(temp_value >= 23)
  208. {
  209. stat_U9 = stat_U9 | 0x10;
  210. SelectHC573(5,stat_U9);
  211. }
  212. else
  213. {
  214. stat_U9 = stat_U9 & 0xef;
  215. SelectHC573(5,stat_U9);
  216. }
  217. }
  218. }
  219. void read_adc_AIN3()
  220. {
  221. IIC_Start();
  222. IIC_SendByte(0x90);
  223. IIC_WaitAck();
  224. IIC_SendByte(0x03);
  225. IIC_WaitAck();
  226. IIC_Stop();
  227. IIC_Start();
  228. IIC_SendByte(0x91);
  229. IIC_WaitAck();
  230. adc_value = IIC_RecByte();
  231. IIC_SendAck(1);
  232. IIC_Stop();
  233. adc_volt = adc_value * (5.0 / 255);
  234. adc_smg = adc_volt * 100;
  235. if(adc_volt > 3.6)
  236. {
  237. stat_U9 = stat_U9 | 0x40;
  238. SelectHC573(5,stat_U9);
  239. }
  240. else
  241. {
  242. stat_U9 = stat_U9 & 0xbf;
  243. SelectHC573(5,stat_U9);
  244. }
  245. }
  246. void DisplaySMG_Info()
  247. {
  248. if(UI == 0)
  249. {
  250. DisplaySMG_Bit(0,0xc1);
  251. DisplaySMG_Bit(1,SMG_NoDot[1]);
  252. DisplaySMG_Bit(5,SMG_NoDot[temp_smg / 100]);
  253. DisplaySMG_Bit(6,SMG_Dot[temp_smg / 10 % 10]);
  254. DisplaySMG_Bit(7,SMG_NoDot[temp_smg % 10]);
  255. }
  256. else if(UI == 1)
  257. {
  258. DisplaySMG_Bit(0,0xc1);
  259. DisplaySMG_Bit(1,SMG_NoDot[2]);
  260. DisplaySMG_Bit(5,SMG_Dot[adc_smg / 100]);
  261. DisplaySMG_Bit(6,SMG_NoDot[adc_smg / 10 % 10]);
  262. DisplaySMG_Bit(7,SMG_NoDot[adc_smg % 10]);
  263. }
  264. }
  265. void scan_key()
  266. {
  267. s1 = 0;
  268. s3 = h1 = h2 = 1;
  269. if(h1 == 0) //S5
  270. {
  271. Delay20ms();
  272. if(h1 == 0)
  273. {
  274. stat_UI0 = 0;
  275. stat_UI1 = 0;
  276. while(h1 == 0)
  277. {
  278. DisplaySMG_Info();
  279. }
  280. }
  281. }
  282. else if(h2 == 0) // S4
  283. {
  284. Delay20ms();
  285. if(h2 == 0)
  286. {
  287. stat_UI0 = 1;
  288. stat_UI1 = 1;
  289. while(h2 == 0)
  290. {
  291. DisplaySMG_Info();
  292. }
  293. }
  294. }
  295. s3 = 0;
  296. s1 = h1 = h2 = 1;
  297. if(h2 == 0)
  298. {
  299. Delay20ms();
  300. if(h2 == 0)
  301. {
  302. if(UI == 0)
  303. {
  304. sprintf(send_data,"TEMP:%.1f'C\r\n",temp_value);
  305. sendstring_Uart(send_data);
  306. }
  307. else if(UI == 1)
  308. {
  309. sprintf(send_data,"Voltage:%.2fV\r\n",adc_volt);
  310. sendstring_Uart(send_data);
  311. }
  312. while(h2 == 0)
  313. {
  314. DisplaySMG_Info();
  315. }
  316. }
  317. }
  318. }
  319. void led_jdq_fmq_control()
  320. {
  321. if(UI == 0)
  322. {
  323. stat_led = 0xfe;
  324. SelectHC573(4,stat_led);
  325. }
  326. else if(UI == 1)
  327. {
  328. stat_led = 0xfd;
  329. SelectHC573(4,stat_led);
  330. }
  331. if(stat_UI0 == 1)
  332. {
  333. stat_shan = 1;
  334. if(stat_LM == 0)
  335. {
  336. stat_led = stat_led & 0xfb;
  337. SelectHC573(4,stat_led);
  338. }
  339. else
  340. {
  341. stat_led = stat_led | 0x04;
  342. SelectHC573(4,stat_led);
  343. }
  344. }
  345. }
  346. void main()
  347. {
  348. Init_timer0();
  349. UartInit();
  350. DisplaySMG_All(0xff);
  351. SelectHC573(4,0xff);
  352. SelectHC573(5,0x00);
  353. Init_DS18B20_temp();
  354. while(1)
  355. {
  356. led_jdq_fmq_control();
  357. read_adc_AIN3();
  358. read_DS18B20_temp();
  359. DisplaySMG_Info();
  360. scan_key();
  361. }
  362. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/705953
推荐阅读
相关标签
  

闽ICP备14008679号