久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4504|回復: 6
收起左側

【原創】第九屆藍橋杯單片機決賽:多功能測量儀表源程序

[復制鏈接]
ID:331814 發表于 2019-5-10 21:09 | 顯示全部樓層 |閱讀模式
本帖最后由 Amistad 于 2019-5-12 23:29 編輯

這次分享的是藍橋杯第九屆的題目,國賽得題目比省賽的要難很多,主要是考的器件非常的多,怎么去設計代碼的結構至關重要,數碼管,e2prom,繼電器,蜂鳴器,led,這幾個器件在國賽是必考項目,DS1302,超聲波,和PCF8591考的次數也非常多。大家一定要每個模塊都練到位,一定分析一下從第三屆到現在每屆題目,下面我們給出第九屆的題目以上是第九屆的題目。 第九屆決賽試題:多功能測量儀表_Page1.jpg 第九屆決賽試題:多功能測量儀表_Page2.jpg 1.jpg 大家看過之后會發現考的器件非常的多,怎么去設計程序的結構非常重要。在我的程序運用了定時器產生輪詢標志來調用每個子函數,來符合程序的設計要求。這個方法大家可以借鑒一下(當然高手除外),如果大家有更好的方法歡迎分享,大家一起進步,共同提高。下面給出我單片機程序的main.c文件的內容
  1. #include "main.h"
  2. #include "Display.H"
  3. #include "stdio.H"
  4. #include "KEY.h"
  5. #include "TIME.h"
  6. #include "DELAY.h"
  7. #include "i2c.h"
  8. #include "onewire.h"
  9. union flo_to_ch
  10. {
  11.         f32 f_num;
  12.         u8 u_num[4];//共用內存單元,u_num[4]分別為f32數據f_num的4個字節
  13. };

  14. union flo_to_ch temperature_H,Voltage_H,frequency_H,thresh_H;//溫度、電壓、閾值數據結構
  15. f32 temperature_P,Voltage_P,thresh_P=1.0;//當前溫度、當前電壓、當前閾值

  16. u8 Dis_Buf[10] = {"        "}; //數碼管顯示緩存

  17. u8 Work_Mode = 0; //’U’回顯,其他常規顯示。初值0數碼管不顯示,任意按鍵后只有回顯和其他常規顯示。
  18. u8 Dis_Mode = 0;  //數碼管顯示模式,0常規不顯示、‘U’電壓顯示 ‘F’頻率顯示 ‘C’溫度顯示 ‘P’電壓閾值設置顯示

  19. bit job1_flag = 0;
  20. bit job2_flag = 0;
  21. bit job3_flag = 0;
  22. bit job4_flag = 0;
  23. bit job5_flag = 0;

  24. void job1(void); //數碼管動態顯示處理,每5ms一次
  25. void job2(void); //顯示模式處理,每100ms一次
  26. void job3(void); //按鍵讀取與處理,每50ms一次
  27. void job4(void); //電壓與溫度測量(頻率測量在time.c文件解決),每400ms一次
  28. void job5(void); //LED亮燈處理,每200ms一次
  29. void ufv_set(void);//溫度、電壓、頻率存儲
  30. void ufv_read(void);//溫度、電壓、頻率讀取
  31. void thresh_read(void);//閾值讀取
  32. void thresh_set(void);//閾值存儲

  33. void Sys_Init()
  34. {
  35.         Buzzy_Off;
  36.         Relay_Off;
  37.         Led_Set = 0xff;
  38. }

  39. void main()
  40. {
  41.         Sys_Init();
  42.         Timer0Init();
  43.         Timer1Init();
  44.         Timer2Init();
  45.         init_pcf8591();//初始化
  46.           ufv_read();//讀取eeprom數據,溫度、電壓、頻率
  47.         thresh_read();//閾值讀取
  48.         while (1)
  49.         {
  50.                 if (job1_flag)
  51.                 {
  52.                         job1(); //數碼管動態顯示處理,每5ms一次
  53.                         job1_flag = 0;
  54.                 }
  55.                 if (job2_flag)
  56.                 {
  57.                         job2(); //顯示模式處理,每100ms一次
  58.                         job2_flag = 0;
  59.                 }
  60.                 if (job3_flag)
  61.                 {
  62.                         job3(); //按鍵讀取與處理,每50ms一次
  63.                         job3_flag = 0;
  64.                 }
  65.                 if (job4_flag)
  66.                 {
  67.                         job4(); //電壓與溫度測量(頻率測量在time.c文件解決),每400ms一次
  68.                         job4_flag = 0;
  69.                 }
  70.                 if (job5_flag)
  71.                 {
  72.                         job5(); //LED亮燈處理,每200ms一次
  73.                         job5_flag = 0;
  74.                 }               
  75.         }
  76. }

  77. void job1(void) //數碼管動態顯示處理,每5ms一次
  78. {
  79.         Display(Dis_Buf);
  80. }

  81. void job2(void) //顯示模式處理,每100ms一次,Work_Mode=’U’回顯,其他常規顯示
  82. {
  83.         switch (Dis_Mode) //Dis_Mode=0常規不顯示、’U’電壓顯示 ‘F’頻率顯示 ‘C’溫度顯示 ‘P’電壓閾值設置顯示
  84.         {
  85.                 case 0:
  86.                 {
  87.                         sprintf(Dis_Buf, "        ");
  88.                 }break;
  89.                 case 'P':
  90.                 {
  91.                         sprintf(Dis_Buf, "P     %3.1f", thresh_P);
  92.                 }break;
  93.                 case 'C':
  94.                 {
  95.                         if (Work_Mode == 'H')
  96.                         {
  97.                                 sprintf(Dis_Buf, "HC  %5.2f", temperature_H.f_num);
  98.                         }        
  99.                         else
  100.                         {
  101.                                 sprintf(Dis_Buf, "C   %5.2f", temperature_P);
  102.                         }
  103.                 }break;
  104.                 case 'F':
  105.                 {
  106.                         if (Work_Mode == 'H')
  107.                         {
  108.                                 sprintf(Dis_Buf, "HF%6.0f", frequency_H.f_num);                        
  109.                         }
  110.                         else
  111.                         {
  112.                                 sprintf(Dis_Buf, "F %6.0f", frequency_P);
  113.                         }
  114.                 }break;
  115.                 case 'U':
  116.                 {
  117.                         if (Work_Mode == 'H')
  118.                         {
  119.                                 sprintf(Dis_Buf, "HU    %3.1f", Voltage_H.f_num);
  120.                         }        
  121.                         else
  122.                         {
  123.                                 sprintf(Dis_Buf, "U     %3.1f", Voltage_P);
  124.                         }
  125.                 }
  126.                 break;
  127.         }
  128. }
  129. void ufv_set(void)//溫度、電壓、頻率存儲
  130. {

  131.         temperature_H.f_num = temperature_P;
  132.         Voltage_H.f_num = Voltage_P;
  133.         frequency_H.f_num = frequency_P;
  134.         
  135.         write_eeprom(0,temperature_H.u_num[0]);i2c_delay(200);i2c_delay(200);
  136.         write_eeprom(1,temperature_H.u_num[1]);i2c_delay(200);i2c_delay(200);
  137.         write_eeprom(2,temperature_H.u_num[2]);i2c_delay(200);i2c_delay(200);
  138.         write_eeprom(3,temperature_H.u_num[3]);i2c_delay(200);i2c_delay(200);

  139.         write_eeprom(4,Voltage_H.u_num[0]);i2c_delay(200);i2c_delay(200);
  140.         write_eeprom(5,Voltage_H.u_num[1]);i2c_delay(200);i2c_delay(200);
  141.         write_eeprom(6,Voltage_H.u_num[2]);i2c_delay(200);i2c_delay(200);
  142.         write_eeprom(7,Voltage_H.u_num[3]);i2c_delay(200);i2c_delay(200);
  143.         
  144.         write_eeprom(8,frequency_H.u_num[0]);i2c_delay(200);i2c_delay(200);
  145.         write_eeprom(9,frequency_H.u_num[1]);i2c_delay(200);i2c_delay(200);
  146.         write_eeprom(10,frequency_H.u_num[2]);i2c_delay(200);i2c_delay(200);        
  147.         write_eeprom(11,frequency_H.u_num[3]);i2c_delay(200);i2c_delay(200);

  148. }
  149. void ufv_read(void)//溫度、電壓、頻率讀取
  150. {
  151.         
  152.         temperature_H.u_num[0]=read_eeprom(0);i2c_delay(200);i2c_delay(200);
  153.         temperature_H.u_num[1]=read_eeprom(1);i2c_delay(200);i2c_delay(200);
  154.         temperature_H.u_num[2]=read_eeprom(2);i2c_delay(200);i2c_delay(200);
  155.         temperature_H.u_num[3]=read_eeprom(3);i2c_delay(200);i2c_delay(200);
  156.         
  157.         Voltage_H.u_num[0]=read_eeprom(4);i2c_delay(200);i2c_delay(200);
  158.         Voltage_H.u_num[1]=read_eeprom(5);i2c_delay(200);i2c_delay(200);
  159.         Voltage_H.u_num[2]=read_eeprom(6);i2c_delay(200);i2c_delay(200);
  160.         Voltage_H.u_num[3]=read_eeprom(7);i2c_delay(200);i2c_delay(200);
  161.         
  162.         frequency_H.u_num[0]=read_eeprom(8);i2c_delay(200);i2c_delay(200);
  163.         frequency_H.u_num[1]=read_eeprom(9);i2c_delay(200);i2c_delay(200);        
  164.         frequency_H.u_num[2]=read_eeprom(10);i2c_delay(200);i2c_delay(200);        
  165.         frequency_H.u_num[3]=read_eeprom(11);i2c_delay(200);i2c_delay(200);

  166. }
  167. void thresh_read(void)//閾值讀取
  168. {
  169.         thresh_H.u_num[0]=read_eeprom(12);i2c_delay(200);i2c_delay(200);
  170.         thresh_H.u_num[1]=read_eeprom(13);i2c_delay(200);i2c_delay(200);        
  171.         thresh_H.u_num[2]=read_eeprom(14);i2c_delay(200);i2c_delay(200);        
  172.         thresh_H.u_num[3]=read_eeprom(15);i2c_delay(200);i2c_delay(200);
  173.         thresh_P=thresh_H.f_num;
  174. }
  175. void thresh_set(void)//閾值存儲
  176. {
  177.         thresh_H.f_num=thresh_P;
  178.         write_eeprom(12,thresh_H.u_num[0]);i2c_delay(200);i2c_delay(200);
  179.         write_eeprom(13,thresh_H.u_num[1]);i2c_delay(200);i2c_delay(200);
  180.         write_eeprom(14,thresh_H.u_num[2]);i2c_delay(200);i2c_delay(200);        
  181.         write_eeprom(15,thresh_H.u_num[3]);i2c_delay(200);i2c_delay(200);
  182. }
  183. void job3(void) //按鍵讀取與處理,每50ms一次
  184. {
  185.         u8 Key_Num = No_Key;
  186.         Key_Num = read_keyboard();
  187.         switch (Key_Num)
  188.         {
  189.                 //Work_Mode=’U’回顯,其他常規顯示;Dis_Mode=0常規不顯示、‘U’電壓顯示 ‘F’頻率顯示 ‘C’溫度顯示 ‘P’電壓閾值設置顯示
  190.         case 'T': //S7 設置 電壓閾值用S6加0.1V
  191.         {
  192.                 if (Dis_Mode == 'P')
  193.                 {
  194.                         Work_Mode = 0;
  195.                         Dis_Mode = 'U';
  196.                 }
  197.                 else
  198.                 {
  199.                         Dis_Mode = 'P';
  200.                 //        Voltage_threshold.f_num = read_eeprom(8);
  201.                 }
  202.         }
  203.         break;
  204.         case '+': //S5 存儲 (溫度/電壓/頻率 存儲到E2PROM)
  205.         {
  206.                 ufv_set();
  207.         }
  208.         break;
  209.         case '-': //S4 切換 數碼管顯示狀態(溫度/電壓/頻率,包括回顯)
  210.         {
  211.                 if (Dis_Mode == 'C')
  212.                         Dis_Mode = 'U';
  213.                 else if (Dis_Mode == 'U')
  214.                         Dis_Mode = 'F';
  215.                 else
  216.                         Dis_Mode = 'C';
  217.         }
  218.         break;

  219.         case 'A': //S6 回顯 E2PROM中的數據(溫度/電壓/頻率);設置電壓閾值用S6加0.1V
  220.         {
  221.                 if (Dis_Mode == 'P') //閾值設置thresh_P
  222.                 {
  223.                         thresh_P = thresh_P + 0.1;
  224.                         if (thresh_P > 5.0)
  225.                                 thresh_P = 0.1;
  226.                         thresh_set();        
  227.                 }
  228.                 else //回顯
  229.                 {
  230.                         Work_Mode = 'H';
  231.                         ufv_read();
  232.                 }
  233.         }
  234.         break;
  235.         }
  236. }

  237. void job4(void) //電壓與溫度測量(頻率測量在time.c文件解決),每400ms一次
  238. {
  239.         Voltage_P = adc_pcf8591();
  240.         Voltage_P = Voltage_P* 5.0 / 255;
  241.         temperature_P = rd_temperature();
  242.         temperature_P = temperature_P * 0.0625;
  243. }

  244. void job5(void) //LED亮燈處理,每200ms一次
  245. {
  246.         static bit led_flash =0;
  247.         static u8 Led_Set_Temp = 0xff;
  248.         led_flash =~led_flash;
  249.         (Dis_Mode == 'C')&&(Work_Mode!='H')?(Led_Set_Temp &= ~0x01):(Led_Set_Temp |= 0x01);
  250.         (Dis_Mode == 'U')&&(Work_Mode!='H')?(Led_Set_Temp &= ~0x02):(Led_Set_Temp |= 0x02);
  251.         (Dis_Mode == 'F')&&(Work_Mode!='H')?(Led_Set_Temp &= ~0x04):(Led_Set_Temp |= 0x04);
  252.         (Voltage_P>thresh_P)&&(!led_flash) ? (Led_Set_Temp &= 0x7f):(Led_Set_Temp|=0x80);
  253.         Led_Set=Led_Set_Temp;
  254. }

復制代碼

全部資料51hei下載地址:
第9屆:多功能測量儀表.rar (808.38 KB, 下載次數: 61)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:538905 發表于 2019-5-15 15:08 | 顯示全部樓層
做得非常好,幫助很大
回復

使用道具 舉報

ID:538905 發表于 2019-5-15 15:10 | 顯示全部樓層
非常棒,為樓主點贊!
回復

使用道具 舉報

ID:538578 發表于 2019-5-15 16:04 | 顯示全部樓層
我舍友去參加了藍橋杯,回來跟我們說收獲很大
回復

使用道具 舉報

ID:540218 發表于 2019-5-16 21:07 | 顯示全部樓層
nice 很不錯
回復

使用道具 舉報

ID:185815 發表于 2020-3-28 23:30 | 顯示全部樓層
感謝分享,學習一下
回復

使用道具 舉報

ID:102702 發表于 2020-3-31 22:26 | 顯示全部樓層
樓主做出實物圖了嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 能看的av| 亚洲高清视频在线 | 午夜在线小视频 | 伊人久久综合 | 嫩呦国产一区二区三区av | 麻豆精品一区二区三区在线观看 | 亚洲国产免费 | 视频在线观看一区二区 | 久久激情视频 | 亚洲一区二区在线 | 超碰免费在线观看 | h小视频| 精品国产区 | 天天摸天天干 | 亚洲日本一区二区 | 在线看黄免费 | 日韩av中文 | 天天澡天天狠天天天做 | 精品乱码久久久久 | 黄视频免费在线 | 波多野结衣在线观看一区二区三区 | 精品亚洲一区二区 | 欧美精品日韩 | 日韩中文字幕2019 | 久久一二| 国产一区二区三区高清 | 玩丰满女领导对白露脸hd | 成人在线视频网 | 日韩欧美一级 | 国产成人99久久亚洲综合精品 | 玖玖综合在线 | 亚洲国产小视频 | 男女羞羞视频在线看 | 国产精品视频二区三区 | 99pao成人国产永久免费视频 | 国产精品v| 欧美一二区 | 紧缚调教一区二区三区视频 | 国产激情综合五月久久 | 亚洲精品视频在线播放 | 国产激情在线观看 |