找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13944|回复: 16
收起左侧

蓝桥杯单片机第六届模拟预赛题参考答案 温度记录器

  [复制链接]
ID:115509 发表于 2016-4-20 18:48 | 显示全部楼层 |阅读模式

0.png
蓝桥杯单片机第六届模拟预赛题"温度记录器"答案如下:
第六届模拟.zip (58.13 KB, 下载次数: 272)


温度记录器试题如下:

_wk_0e38117b0b2ebc34a5a8ab4374693a8d_0.png _wk_0e38117b0b2ebc34a5a8ab4374693a8d_0(2).png _wk_0e38117b0b2ebc34a5a8ab4374693a8d_0(1).png

蓝桥杯单片机第六届模拟预赛题部分程序预览:

  1. #include "ds18b20.h"
  2. #include "K60S2.h"


  3. /****************************变量 & 宏定义************************/
  4. /*---------------系统全局-------------*/
  5. #define RESET 0
  6. #define SET 1
  7. #define Write_138(com , dat) {P2 = com; P0 = dat;}

  8. ulong time_base_2ms = 0;
  9. enum{
  10.         win_state_def,
  11.         win_state_edit
  12. }win_state ;//= win_state_edit;


  13. /*---------------LED-------------*/
  14. #define LED_ON 0
  15. #define LED_OFF 1

  16. bit L1_flash_flg = SET;
  17. enum{
  18.         L1_flash_interval_2,
  19.         L1_flash_interval_4,
  20.         L1_flash_interval_8
  21. }L1_flash_interval;

  22. /*---------------数码管-------------*/
  23. code uchar smg_code[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,0xff,0xbf};
  24. uchar smg_buf[8]={10,10,10,10,10,10,10,1};
  25. bit smg_changed_flg = RESET;

  26. /*---------------键盘-------------*/
  27. uchar key_value = 0;
  28. bit key_scan_flg = SET;
  29. uchar key_buf[4]={10,10,10,10};
  30. uchar key_buf_point = 0;
  31. bit put_set_key_flg = RESET;
  32. bit input_finished_flg = RESET;

  33. /*---------------DS18B20-------------*/
  34. bit temp_read_flg = SET;
  35. uchar temp_max = 30;
  36. uchar temp_min = 20;
  37. uchar current_temp = 0;
  38. bit temp_arg_err_flg = RESET;
  39. enum{
  40.         temp_interval_0,
  41.         temp_interval_1,
  42.         temp_interval_2
  43. }temp_interval;


  44. /*-----------蜂鸣器 & 继电器-----------*/
  45. #define RELAY_ON 0
  46. #define RELAY_OFF 1

  47. /**************************函数************************/
  48. /*=================LED================*/
  49. void Led_disp(uchar L_x , bit state){
  50.         if(state == LED_ON){
  51.                 switch(L_x){
  52.                         case 1:
  53.                                 Write_138(0x1f , 0xff);
  54.                                 Write_138(0x04<<5 , 0xfe);
  55.                                 Write_138(0x1f , 0x00);
  56.                                 break;
  57.                         case 2:
  58.                                 Write_138(0x1f , 0xff);
  59.                                 Write_138(0x04<<5 , 0xfd);
  60.                                 Write_138(0x1f , 0x00);
  61.                                 break;               
  62.                 }
  63.         }
  64.         else{
  65.                 switch(L_x){
  66.                         case 1:
  67.                                 Write_138(0x1f , 0xff);
  68.                                 Write_138(0x04<<5 , 0xff);
  69.                                 Write_138(0x1f , 0x00);
  70.                                 break;
  71.                         case 2:
  72.                                 Write_138(0x1f , 0xff);
  73.                                 Write_138(0x04<<5 , 0xff);
  74.                                 Write_138(0x1f , 0x00);
  75.                                 break;               
  76.                 }
  77.         }        
  78. }
  79. /*================数码管================*/
  80. void Smg_disp(){
  81.         static uchar smg_addr = 0;
  82.         Write_138(0x06<<5 , 0x00);

  83.         Write_138(0x1f , 0xff);
  84.         Write_138(0x07<<5 , smg_code[smg_buf[smg_addr]]);
  85.           Write_138(0x1f , 0x00);
  86.         Write_138(0x06<<5 , 0x01 << smg_addr);        

  87.         Write_138(0x1f , 0x00);

  88.         smg_addr++;
  89.         if(smg_addr >= 8) smg_addr = 0;               
  90. }

  91. /*================蜂鸣器 & 继电器================*/
  92. void Relay(bit state){
  93.         if(state == RELAY_ON){
  94.                 Write_138(0x05<<5 , 0x01<<4);                        
  95.         }
  96.         else{
  97.                 Write_138(0x05<<5 , 0x00);
  98.         }        
  99. }

  100. /*================矩阵键盘================*/
  101. void Key_scan(){
  102.         uchar row = 1;
  103.         uchar col = 0;
  104.         uchar tmp = 0;

  105.         P3 = 0x0f;
  106.         P42 = 0;
  107.         P44 = 0;
  108.         tmp = P3 & 0x0f;  
  109.         if(tmp != 0x0f){
  110.                 switch(tmp){
  111.                         case 0x0e:
  112.                                 row = 1;
  113.                                 break;
  114.                         case 0x0d:
  115.                                 row = 2;
  116.                                 break;
  117.                         case 0x0b:
  118.                                 row = 3;
  119.                                 break;
  120.                         case 0x07:
  121.                                 row = 4;
  122.                                 break;
  123.                         
  124.                 }
  125.                 P3 = 0xf0;
  126.                 P42 = 1;
  127.                 P44 = 1;
  128.                 if(P44 == 0) col = 1;                 
  129.                 else if(P42 == 0) col = 2;        
  130.                 else if(P35 == 0) col = 3;        
  131.                 else if(P34 == 0) col = 4;
  132.                 while(!P44 || !P42 || !P35 || !P34) ;        
  133.                 key_value = 4*(row-1) + col;
  134.         }
  135.         else key_value = 0;         
  136. }
  137. void Put_set_key(){
  138.         if(win_state == win_state_def){
  139.                 win_state = win_state_edit;
  140.                 key_buf[0] = 10;
  141.                 key_buf[1] = 10;
  142.                 key_buf[2] = 10;
  143.                 key_buf[3] = 10;
  144.                 key_buf_point = 0;
  145.                 input_finished_flg = RESET;
  146.                 smg_changed_flg = RESET;
  147.            }
  148.         else{
  149.                 if(input_finished_flg == SET && temp_arg_err_flg == RESET){
  150.                         win_state = win_state_def;
  151.                         smg_changed_flg = RESET;        
  152.                 }               
  153.         }               
  154. }
  155. void Put_reset_key(){
  156.         if(win_state == win_state_edit){
  157.                 key_buf[0] = 10;
  158.                 key_buf[1] = 10;
  159.                 key_buf[2] = 10;
  160.                 key_buf[3] = 10;
  161.                 input_finished_flg = RESET;               
  162.                 temp_arg_err_flg = RESET;
  163.                 key_buf_point = 0;
  164.         }
  165. }
  166. void Key_ack(){
  167.         if(key_value != 0){
  168.                 switch(key_value){
  169.                         case 1:
  170.                                 if(input_finished_flg == RESET){
  171.                                         key_buf[key_buf_point] = 0;
  172.                                         key_buf_point++;
  173.                                 }
  174.                                 break;        
  175.                         case 2:
  176.                                 if(input_finished_flg == RESET){
  177.                                         key_buf[key_buf_point] = 1;
  178.                                         key_buf_point++;
  179.                                 }
  180.                                 break;
  181.                         case 3:
  182.                                 if(input_finished_flg == RESET){
  183.                                         key_buf[key_buf_point] = 2;
  184.                                         key_buf_point++;
  185.                                 }
  186.                                 break;
  187.                         case 5:
  188.                                 if(input_finished_flg == RESET){
  189.                                         key_buf[key_buf_point] = 3;
  190.                                         key_buf_point++;
  191.                                 }
  192.                                 break;
  193.                         case 6:
  194.                                 if(input_finished_flg == RESET){
  195.                                         key_buf[key_buf_point] = 4;
  196.                                         key_buf_point++;
  197.                                 }
  198.                                 break;
  199.                         case 7:
  200.                                 if(input_finished_flg == RESET){
  201.                                         key_buf[key_buf_point] = 5;
  202.                                         key_buf_point++;
  203.                                 }
  204.                                 break;
  205.                         case 9:
  206.                                 if(input_finished_flg == RESET){
  207.                                         key_buf[key_buf_point] = 6;
  208.                                         key_buf_point++;
  209.                                 }
  210.                                 break;
  211.                         case 10:
  212.                                 if(input_finished_flg == RESET){
  213.                                         key_buf[key_buf_point] = 7;
  214.                                         key_buf_point++;
  215.                                 }
  216.                                 break;
  217.                         case 11:
  218.                                 if(input_finished_flg == RESET){
  219.                                         key_buf[key_buf_point] = 8;
  220.                                         key_buf_point++;
  221.                                 }
  222.                                 break;        
  223.                         case 13:
  224.                                 if(input_finished_flg == RESET){
  225.                                         key_buf[key_buf_point] = 9;
  226.                                         key_buf_point++;
  227.                                 }
  228.                                 break;
  229.                         case 14:
  230.                                 Put_set_key();                        
  231.                                 break;
  232.                         case 15:
  233.                                 Put_reset_key();
  234.                                 break;               
  235.                 }
  236.                 key_value = 0;
  237.                 if(key_buf_point >= 4) input_finished_flg = SET;               
  238.         }               
  239. }

  240. /*================界面状态================*/
  241. void Windows_def(){
  242.         if(current_temp < temp_min){
  243.                 temp_interval = temp_interval_0;
  244.                 L1_flash_interval = L1_flash_interval_2;
  245.                 Relay(RELAY_OFF);
  246.         }
  247.         else if(current_temp >= temp_min && current_temp <= temp_max){
  248.                 temp_interval = temp_interval_1;
  249.                 L1_flash_interval = L1_flash_interval_4;
  250.                 Relay(RELAY_OFF);        
  251.         }
  252.         else{
  253.                 temp_interval = temp_interval_2;
  254.                 L1_flash_interval = L1_flash_interval_8;
  255.                 Relay(RELAY_ON);        
  256.         }
  257.         smg_buf[1] = temp_interval;
  258.         smg_buf[6] = current_temp / 10;
  259.         smg_buf[7] = current_temp % 10;
  260.         if(smg_changed_flg == RESET){
  261.                 smg_buf[0] = 11;
  262.                 smg_buf[2] = 11;
  263.                 smg_buf[3] = 10;
  264.                 smg_buf[4] = 10;
  265.                 smg_buf[5] = 10;
  266.                 smg_changed_flg = SET;
  267.         }
  268.         if(L1_flash_flg == SET){
  269.                 Led_disp(1,LED_ON);               
  270.         }
  271.         else{
  272.                 Led_disp(1,LED_OFF);        
  273.         }
  274. }
  275. void Windows_edit(){
  276.         Led_disp(1,LED_OFF);
  277.         if(smg_changed_flg == RESET){
  278.                 smg_buf[0] = 11;
  279.                 smg_buf[5] = 11;
  280.                 smg_buf[3] = 10;
  281.                 smg_buf[4] = 10;
  282.                 smg_changed_flg = SET;        
  283.         }
  284.         smg_buf[1] = key_buf[0];
  285.         smg_buf[2] = key_buf[1];
  286.         smg_buf[6] = key_buf[2];
  287.         smg_buf[7] = key_buf[3];
  288.         if(input_finished_flg == SET){
  289.                 temp_max = key_buf[0] * 10 + key_buf[1];
  290.                 temp_min = key_buf[2] * 10 + key_buf[3];
  291.                 if(temp_max < temp_min){
  292.                         temp_arg_err_flg = SET;
  293.                         Led_disp(2,LED_ON);
  294.                 }
  295.                 else{
  296.                         temp_arg_err_flg = RESET;
  297.                         Led_disp(2,LED_OFF);
  298.                 }
  299.         }                        
  300. }
  301. void Windows_disp(){
  302.         switch(win_state){
  303.                 case win_state_def:
  304.                         Windows_def();
  305.                         break;
  306.                 case win_state_edit:
  307.                         Windows_edit();
  308.                         break;
  309.         }
  310. }
  311. /*==============系统初始化=============*/
  312. void Timer0Init(void)                //1毫秒@11.0592MHz
  313. {
  314.         AUXR |= 0x80;                //定时器时钟1T模式
  315.         TMOD &= 0xF0;                //设置定时器模式
  316. //        TL0 = 0xCD;                //设置定时初值               
  317. //        TH0 = 0xD4;                //设置定时初值
  318.         TL0 = 0x9A;                //设置定时初值
  319.         TH0 = 0xA9;                //设置定时初值
  320. //        TL0 = 0x00;                //设置定时初值
  321. //        TH0 = 0x28;                //设置定时初值
  322.         TF0 = 0;                //清除TF0标志
  323.         TR0 = 1;                //定时器0开始计时
  324.         ET0 = 1;
  325.         EA = 1;
  326. }

  327. void UartInit(void)                //9600bps@11.0592MHz
  328. {
  329.         SCON = 0x50;                //8位数据,可变波特率
  330.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  331.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  332.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  333.         TL1 = 0xE0;                //设定定时初值
  334.         TH1 = 0xFE;                //设定定时初值
  335.         ET1 = 0;                //禁止定时器1中断
  336.         TR1 = 1;                //启动定时器1
  337. }
  338. void System_init(){
  339.         Write_138(0x05<<5, 0x00); //关蜂鸣器
  340.         Write_138(0x04<<5, 0xff); //关LED                                 
  341.         UartInit();                                    
  342.         Timer0Init();
  343.         Read_temp();
  344.         Read_temp();
  345. }
  346. /*================主函数================*/
  347. void main(){
  348.         System_init();
  349.         while(1){
  350.                 Windows_disp();
  351.                 if(key_scan_flg == SET){
  352.                         key_scan_flg = RESET;        
  353.                         Key_scan();
  354.                         Key_ack();
  355.                 }           
  356.                 if(temp_read_flg == SET){
  357.                         temp_read_flg = RESET;
  358.                         current_temp = Read_temp();
  359.                 }         
  360.         }
  361. }
  362. /*================中断入口==============*/
  363. void Timer0() interrupt 1
  364. {
  365.         time_base_2ms++;
  366.         Smg_disp();
  367.            if(time_base_2ms % 10 == 0){
  368.                 key_scan_flg = SET;
  369.         }
  370.         if(time_base_2ms % 250 == 0){
  371.                 temp_read_flg = SET;
  372.         }
  373.         if(time_base_2ms % 100 == 0){
  374.                 switch(L1_flash_interval){
  375.                         case L1_flash_interval_2:
  376.                                         L1_flash_flg = ~L1_flash_flg;
  377.                                 break;
  378.                         case L1_flash_interval_4:
  379.                                 if(time_base_2ms % 200 == 0){
  380.                                         L1_flash_flg = ~L1_flash_flg;
  381.                                 }
  382.                                 break;
  383.                         case L1_flash_interval_8:
  384.                                 if(time_base_2ms % 400 == 0){
  385.                                         L1_flash_flg = ~L1_flash_flg;
  386.                                 }
  387.                                 break;         
  388.                 }
  389.         }
  390. }
  391. void Uart0() interrupt 4{
  392.         TI = 0;
  393. }
复制代码


评分

参与人数 4黑币 +65 收起 理由
Uhx_ + 5 很给力!
eeeewu + 5 很给力!
lls2012 + 5 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:144307 发表于 2016-10-24 22:43 | 显示全部楼层
楼主我爱你
回复

使用道具 举报

ID:159076 发表于 2016-12-31 15:12 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:166420 发表于 2017-2-24 15:32 | 显示全部楼层
非常感谢~~~~~~~~~~~
回复

使用道具 举报

ID:171031 发表于 2017-3-15 20:05 | 显示全部楼层
多谢!!!
回复

使用道具 举报

ID:176551 发表于 2017-3-21 12:49 | 显示全部楼层

非常感谢~~~~~~~~~~~
回复

使用道具 举报

ID:182762 发表于 2017-3-23 12:14 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:182762 发表于 2017-3-23 12:15 | 显示全部楼层
多谢。。。。
回复

使用道具 举报

ID:241057 发表于 2017-10-19 20:06 来自手机 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:171113 发表于 2018-1-15 21:52 | 显示全部楼层
十分感谢、、



回复

使用道具 举报

ID:283666 发表于 2018-2-13 11:29 | 显示全部楼层
十分感谢
回复

使用道具 举报

ID:272269 发表于 2018-2-14 19:18 | 显示全部楼层
赞一个
回复

使用道具 举报

ID:286471 发表于 2018-2-28 23:46 | 显示全部楼层
STM 32,你值得拥有
回复

使用道具 举报

ID:300196 发表于 2018-4-1 07:46 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:441716 发表于 2018-12-7 17:01 | 显示全部楼层
额,另一半在哪里?
回复

使用道具 举报

ID:561745 发表于 2019-6-13 16:18 | 显示全部楼层
非常感谢~~
回复

使用道具 举报

ID:859672 发表于 2020-12-13 20:04 | 显示全部楼层
非常好用,帮助很大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表