找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 10600|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

[原創(chuàng)]第十屆藍(lán)橋杯單片機(jī)省賽:電壓頻率采集裝置源程序&題目&源代碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
附件里面有省賽程序題及客觀題(客觀題無(wú)答案)及我自己寫(xiě)的源代碼以下是程序設(shè)計(jì)題題目



以下是單片機(jī)主函數(shù),有完整的注釋。
  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燈點(diǎn)亮模式
  14. unsigned int f_num = 0;//頻率數(shù)值
  15. unsigned char j = 0;//頻率測(cè)量里面的等待中斷標(biāo)志
  16. unsigned char diya_num = 0;//儲(chǔ)存模數(shù)轉(zhuǎn)換返回的電壓值
  17. unsigned char timer = 0;

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

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


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

  28. /************************************************************************************************/
  29. /******************************************函數(shù)**************************************************/
  30. /************************************************************************************************/

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

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

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

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

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

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

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

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

  105. void key_scan()//鍵盤(pán)掃描函數(shù)
  106. {
  107.         P3 |= 0x0f;//P3低4位設(shè)為全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)//如果在電壓測(cè)量模式則改變電壓跟隨標(biāo)志
  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();//關(guān)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)//如果數(shù)碼管開(kāi)關(guān)標(biāo)志為0,關(guān)數(shù)碼管顯示
  148.                         {
  149.                                 DIG_init();//關(guān)數(shù)碼管
  150.                         }
  151.                         
  152.                 }
  153.         }
  154.         while(~s4||~s5||~s6||~s7)//松手檢測(cè)
  155.         {
  156.                 if(s4_mode)//如果為電壓測(cè)量模式,數(shù)碼管顯示電壓值,防止出現(xiàn)數(shù)碼管黑屏現(xiàn)象
  157.                 {
  158.                         DIG_show(useg_num);//數(shù)碼管顯示電壓測(cè)量值
  159.                         LED_show(led_mode);//LED顯示電壓測(cè)量模式
  160.                 }
  161.                 else//如果為頻率測(cè)量模式,數(shù)碼管顯示頻率值,防止出現(xiàn)數(shù)碼管黑屏現(xiàn)象
  162.                 {
  163.                         DIG_show(fseg_num);//數(shù)碼管顯示頻率測(cè)量值
  164.                         LED_show(led_mode);//LED顯示頻率測(cè)量模式
  165.                 }
  166.         }
  167. }
  168. /*//////////////////////////////////////////
  169. ///////////定時(shí)器1中斷函數(shù)/////////////////
  170. //////////////////////////////////////////*/
  171. void T1()interrupt 3//定時(shí)器1中斷函數(shù)
  172. {
  173.         unsigned char i = 0;
  174.         unsigned int f_num2 = 0;
  175.         P20 = ~P20;
  176.         TR0 = 0;//停止計(jì)數(shù)
  177.         TR1        = 0;//停止定時(shí)
  178.         TL1 = 0xF0;//設(shè)置定時(shí)初值
  179.         TH1 = 0xD8;//設(shè)置定時(shí)初值
  180.         timer++;//計(jì)數(shù)器加1
  181.         j = 0;//等待中斷標(biāo)志清零
  182.         if(timer == 20)
  183.         {
  184.                 f_num = (TH0 * 256 + TL0) * 5; //計(jì)算頻率
  185.                 timer = 0;
  186.                 TL0 = TH0 = 0;//計(jì)數(shù)器清零
  187.                 for(i=7;i>2;i--)//重新初始化頻率數(shù)值數(shù)組
  188.                 {
  189.                         fseg_num[i] = 0;//除數(shù)組的第一位和第二位其他的初始化為0         
  190.                 }
  191.                 if((f_num >= 1000 && f_num < 5000)||(f_num >= 10000))
  192.                 {
  193.                         led_mode = 0XF5;//滿(mǎn)足條件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. }
復(fù)制代碼
全部的程序請(qǐng)到附件里面下載


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

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:425226 發(fā)表于 2019-10-26 18:43 | 只看該作者
國(guó)賽的單片機(jī)的題目有嗎
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

5#
ID:411236 發(fā)表于 2020-4-21 16:25 | 只看該作者
燒錄進(jìn)去LED全是亮的,數(shù)碼管沒(méi)有顯示,獨(dú)立按鍵按下也沒(méi)有任何反應(yīng)。。。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

7#
ID:331814 發(fā)表于 2020-11-12 20:35 | 只看該作者
本帖最后由 Amistad 于 2020-11-12 20:36 編輯
oiwgceowicqoeu 發(fā)表于 2020-4-21 16:25
燒錄進(jìn)去LED全是亮的,數(shù)碼管沒(méi)有顯示,獨(dú)立按鍵按下也沒(méi)有任何反應(yīng)。。。

看沒(méi)看程序是IO模式還是MM模式,就說(shuō)不行,還有可能是你板子壞了
回復(fù)

使用道具 舉報(bào)

8#
ID:942202 發(fā)表于 2021-6-30 22:15 來(lái)自手機(jī) | 只看該作者
所有程序都要寫(xiě)上去嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表