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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10592|回復: 7
打印 上一主題 下一主題
收起左側

[原創]第十屆藍橋杯單片機省賽:電壓頻率采集裝置源程序&題目&源代碼

  [復制鏈接]
跳轉到指定樓層
樓主
附件里面有省賽程序題及客觀題(客觀題無答案)及我自己寫的源代碼以下是程序設計題題目



以下是單片機主函數,有完整的注釋。
  1. #include "STC15F2K60S2.H"
  2. #include "MAIN.H"
  3. #include "HAREWARE.H"
  4. #include "DIG.H"
  5. #include "I2C.H"
  6. #include "DELAY.H"
  7. #include "LED.H"

  8. sbit s4 = P3^3;//按鍵S4
  9. sbit s5 = P3^2;//按鍵S5
  10. sbit s6 = P3^1;//按鍵S6
  11. sbit s7 = P3^0;//按鍵S7


  12. unsigned int PCF_NUM = 0;//電壓值
  13. unsigned char led_mode = 0xff;         //LED燈點亮模式
  14. unsigned int f_num = 0;//頻率數值
  15. unsigned char j = 0;//頻率測量里面的等待中斷標志
  16. unsigned char diya_num = 0;//儲存模數轉換返回的電壓值
  17. unsigned char timer = 0;

  18. bit s4_mode = 1;//1為電壓測量模式,0為頻率測量模式
  19. bit s5_mode = 0;//1為輸出2.0v電壓,為0跟隨PCF8591三通道電壓輸出
  20. bit s6_mode = 1;//1為開啟LED燈顯示,0為關顯示
  21. bit s7_mode = 1;//1為開啟數碼管顯示,0為關顯示
  22. bit gensui = 0;//0為不跟隨電壓輸出,1為跟隨電壓輸出

  23. unsigned char useg_num[]={0x3e,0,0,0,0,0,0,0};//電壓數值數組
  24. unsigned char fseg_num[]={0x71,0,0,0,0,0,0,0};//頻率數值數組


  25. void key_scan();//按鍵掃描函數原型
  26. unsigned char dian_ya_ce_liang(); //電壓測量函數原型
  27. void TimerInit();//定時計數初始化函數原型

  28. /************************************************************************************************/
  29. /******************************************函數**************************************************/
  30. /************************************************************************************************/

  31. void main()//主函數
  32. {        
  33.         HAREWARE_init();//關閉外部設備
  34.         DIG_init();//數碼管初始化
  35.         LED_init();//LED燈初始化
  36.         TimerInit();//定時器1初始化
  37.         P20 = 1;
  38.         while(1)//等待中斷
  39.         {
  40.                 key_scan();//按鍵掃描

  41.                 if(~s5_mode)//判斷是否是電壓跟隨模式
  42.                 {
  43.                         PCF_DA(103); //沒有跟隨
  44.                         gensui = 0;  //沒有跟隨
  45.                 }
  46.                 else
  47.                 {
  48.                         gensui = 1;                  //跟隨電壓
  49.                 }

  50.                 if(s4_mode)//判斷是否為電壓測量模式
  51.                 {
  52.                         diya_num = dian_ya_ce_liang();
  53.                         led_mode = 0xfe;//電壓測量模式指示燈亮
  54.                         if(((diya_num * 0.01953125 >= 1.5) && (diya_num * 0.01953125 < 2.5)) || (diya_num * 0.01953125 >= 3.5))
  55.                         {
  56.                                 led_mode &= 0xfb;//滿足條件第三個指示燈亮
  57.                         }
  58.                         if(gensui)
  59.                         {
  60.                                 led_mode &= 0xef;//電壓跟隨第五個指示燈亮
  61.                         }
  62.                         PCF_NUM = diya_num * 1.953125;//變成十進制的數字,把小數乘一百
  63.                         useg_num[5]=DIG_CODE[PCF_NUM/100];//百位數字
  64.                         PCF_NUM = PCF_NUM % 100;
  65.                         useg_num[6]=DIG_CODE[PCF_NUM/10];//十位數字
  66.                         PCF_NUM %=10;
  67.                         useg_num[7]=DIG_CODE[PCF_NUM];//個位數字
  68.                         LED_show(led_mode);//LED等顯示
  69.                         DIG_show(useg_num);//數碼管顯示
  70.                         if(gensui)//判斷是否是電壓跟隨模式
  71.                         {
  72.                                 PCF_DA(diya_num); //沒有跟隨
  73.                         }
  74.                 }
  75.                 else//頻率測量模式
  76.                 {
  77.                         TR1 = 1;//開始計時                        
  78.                         TR0 = 1;//開始計數
  79.                         j = 1;//等待中斷標志置1
  80.                         while(j);//等待中斷
  81.                 }
  82.         }        
  83. }

  84. ////////////////////////////////////////////////////
  85. ////////////////////////////////////////////////////

  86. void TimerInit()//定時計數器初始化函數
  87. {
  88.         AUXR &= 0x3F;//12分頻
  89.         TMOD &= 0x00;//TMOD(定時/計數器模式寄存器)清零
  90.         TMOD |= 0x15;//T0設置為模式1,計數;T1設置為模式1,定時
  91.         TH0 = TL0 = 0;//計數器清零
  92.         TL1 = 0xF0;                //設置定時初值
  93.         TH1 = 0xD8;                //設置定時初值
  94.         EA = 1;//開總中斷
  95.         ET1 = 1;//開定時器1中斷
  96. }

  97. ///////////////////////////////////////////////////////
  98. ///////////////////////////////////////////////////////

  99. unsigned char dian_ya_ce_liang()
  100. {
  101.         return PCF_AD(3);//返回模數轉換值         
  102. }

  103. //////////////////////////////////////////////////////
  104. //////////////////////////////////////////////////////

  105. void key_scan()//鍵盤掃描函數
  106. {
  107.         P3 |= 0x0f;//P3低4位設為全1
  108.         if(~s4)//判斷S4按鍵
  109.         {
  110.                 delay1ms(5);//按鍵消抖
  111.                 if(~s4)//判斷S4按鍵
  112.                 {
  113.                         s4_mode = ~s4_mode;
  114.                 }
  115.         }

  116.         if(~s5)//判斷S5按鍵
  117.         {
  118.                 delay1ms(5);//按鍵消抖
  119.                 if(~s5)//判斷S5按鍵
  120.                 {
  121.                         if(s4_mode)//如果在電壓測量模式則改變電壓跟隨標志
  122.                         {
  123.                                  s5_mode = ~s5_mode;//s5_mode取反
  124.                         }
  125.                         
  126.                 }
  127.         }

  128.         if(~s6)//判斷S6按鍵
  129.         {
  130.                 delay1ms(5);//按鍵消抖
  131.                 if(~s6)//判斷S6按鍵
  132.                 {
  133.                         s6_mode = ~s6_mode;
  134.                         if(~s6_mode)
  135.                         {
  136.                                 LED_init();//關LED燈
  137.                         }
  138.                         
  139.                 }
  140.         }

  141.         if(~s7)//判斷S7按鍵
  142.         {
  143.                 delay1ms(5);//按鍵消抖
  144.                 if(~s7)//判斷S7按鍵
  145.                 {
  146.                         s7_mode = ~s7_mode;//取反
  147.                         if(~s7_mode)//如果數碼管開關標志為0,關數碼管顯示
  148.                         {
  149.                                 DIG_init();//關數碼管
  150.                         }
  151.                         
  152.                 }
  153.         }
  154.         while(~s4||~s5||~s6||~s7)//松手檢測
  155.         {
  156.                 if(s4_mode)//如果為電壓測量模式,數碼管顯示電壓值,防止出現數碼管黑屏現象
  157.                 {
  158.                         DIG_show(useg_num);//數碼管顯示電壓測量值
  159.                         LED_show(led_mode);//LED顯示電壓測量模式
  160.                 }
  161.                 else//如果為頻率測量模式,數碼管顯示頻率值,防止出現數碼管黑屏現象
  162.                 {
  163.                         DIG_show(fseg_num);//數碼管顯示頻率測量值
  164.                         LED_show(led_mode);//LED顯示頻率測量模式
  165.                 }
  166.         }
  167. }
  168. /*//////////////////////////////////////////
  169. ///////////定時器1中斷函數/////////////////
  170. //////////////////////////////////////////*/
  171. void T1()interrupt 3//定時器1中斷函數
  172. {
  173.         unsigned char i = 0;
  174.         unsigned int f_num2 = 0;
  175.         P20 = ~P20;
  176.         TR0 = 0;//停止計數
  177.         TR1        = 0;//停止定時
  178.         TL1 = 0xF0;//設置定時初值
  179.         TH1 = 0xD8;//設置定時初值
  180.         timer++;//計數器加1
  181.         j = 0;//等待中斷標志清零
  182.         if(timer == 20)
  183.         {
  184.                 f_num = (TH0 * 256 + TL0) * 5; //計算頻率
  185.                 timer = 0;
  186.                 TL0 = TH0 = 0;//計數器清零
  187.                 for(i=7;i>2;i--)//重新初始化頻率數值數組
  188.                 {
  189.                         fseg_num[i] = 0;//除數組的第一位和第二位其他的初始化為0         
  190.                 }
  191.                 if((f_num >= 1000 && f_num < 5000)||(f_num >= 10000))
  192.                 {
  193.                         led_mode = 0XF5;//滿足條件led4亮
  194.                 }
  195.                 else
  196.                 {
  197.                         led_mode = 0XFD;
  198.                 }
  199.                 for(i = 7;i>2 && f_num != 0;i--)
  200.                 {
  201.                         fseg_num[i] = DIG_CODE[f_num % 10];
  202.                         f_num /= 10;
  203.                 }
  204.         }
  205.         LED_show(led_mode);
  206.         DIG_show(fseg_num);               
  207. }
復制代碼
全部的程序請到附件里面下載


全部資料51hei下載地址:
2019年第10屆.rar (760.55 KB, 下載次數: 214)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:425226 發表于 2019-10-26 18:43 | 只看該作者
國賽的單片機的題目有嗎
回復

使用道具 舉報

板凳
ID:411550 發表于 2020-2-8 15:50 | 只看該作者
很好,幫助很大 這一年考的不是很尋常
回復

使用道具 舉報

地板
ID:699675 發表于 2020-2-28 15:45 | 只看該作者
厲害啊
回復

使用道具 舉報

5#
ID:411236 發表于 2020-4-21 16:25 | 只看該作者
燒錄進去LED全是亮的,數碼管沒有顯示,獨立按鍵按下也沒有任何反應。。。
回復

使用道具 舉報

6#
ID:830957 發表于 2020-10-17 11:22 | 只看該作者
DAC輸出電壓是測量板子上哪里的電壓啊  比如 Rb2上?
回復

使用道具 舉報

7#
ID:331814 發表于 2020-11-12 20:35 | 只看該作者
本帖最后由 Amistad 于 2020-11-12 20:36 編輯
oiwgceowicqoeu 發表于 2020-4-21 16:25
燒錄進去LED全是亮的,數碼管沒有顯示,獨立按鍵按下也沒有任何反應。。。

看沒看程序是IO模式還是MM模式,就說不行,還有可能是你板子壞了
回復

使用道具 舉報

8#
ID:942202 發表于 2021-6-30 22:15 來自手機 | 只看該作者
所有程序都要寫上去嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩另类| 国产精品久久一区二区三区 | 久久久久国产 | www.av在线 | 久久99蜜桃综合影院免费观看 | 国产精品毛片 | 在线第一页 | 久久精品天堂 | 国产丝袜一区二区三区免费视频 | 国产精品视频一区二区三区不卡 | 国产精品免费看 | 日韩免费中文字幕 | 日韩欧美一区在线 | 中文字幕 在线观看 | 亚洲性人人天天夜夜摸 | 毛片a区| 午夜av成人 | 亚洲欧美中文日韩在线v日本 | 色婷婷在线视频 | 国产精品久久久久久久久久久久 | 日韩久久久久久 | 男女视频免费 | 日韩视频一区在线观看 | 国产欧美日韩一区二区三区在线 | 91精品国产91久久久久久吃药 | 99re国产视频 | 国产精品一区一区三区 | 国产精品一区二区不卡 | 欧美精品一区二区三 | 精品一二三区视频 | 欧美精品久久久久 | 欧洲免费视频 | 老外黄色一级片 | 日韩精品1区2区 | 亚洲 欧美 另类 综合 偷拍 | 日韩福利片 | 啪视频在线 | 午夜一级做a爰片久久毛片 精品综合 | 四虎成人免费电影 | 激情欧美日韩一区二区 | 草久久|