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

QQ登錄

只需一步,快速開始

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

【原創(chuàng)】第九屆藍(lán)橋杯單片機(jī):彩燈控制器源程序和題目

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 Amistad 于 2019-5-12 23:30 編輯

附件里面有該題的源程序(親測無誤)以及原題

題目是我在網(wǎng)上到的,以下是題目: 程序運(yùn)行效果圖不知道怎么回事上傳不成功,我就不貼了,放在附件里面了,大家下載下來就可以看了。以下是單片機(jī)主函數(shù)有完整注釋
  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. //u8 Voltage_Pv;//實(shí)測電壓ADC值
  9. u8 Dis_Buf[10]={"        "};//數(shù)碼管顯示緩存
  10. u8 Led_Set_Temp =0xff;//LED燈初值
  11. u8 Led_brightness=4;//LED亮度等級(jí),0V則為0,0.01-1.25V則為1,1.26-2.50V則為2,2.51-3.75V則為3,3.75-5.00V則為4
  12. u8 Work_Mode =1;//LED流轉(zhuǎn)模式初值,1 2 3 4分別是從左到右、從右到左、由外而內(nèi)、由內(nèi)而外的流轉(zhuǎn),0是全部熄滅
  13. u8 Work_Mode_set=1;//LED流轉(zhuǎn)模式設(shè)置值
  14. u8 Time_lag[5];//LED流轉(zhuǎn)模式對(duì)應(yīng)的流轉(zhuǎn)時(shí)間間隔,保存在E2PROM中,4代表400ms,12代表1200ms
  15. u8 Dis_Mode =0;//數(shù)碼管顯示模式初值,0常規(guī)不顯示、1設(shè)置工作模式S6、2設(shè)置流轉(zhuǎn)間隔S6、3亮度等級(jí)顯示S4
  16. u8 LED_Mode1[8] ={~0x01, ~0x02, ~0x04, ~0x08,~0x10, ~0x20, ~0x40, ~0x80};//1是從左到右的流轉(zhuǎn)
  17. u8 LED_Mode2[8] ={~0x80, ~0x40, ~0x20, ~0x10,~0x08, ~0x04, ~0x02, ~0x01};//2是從右到左的流轉(zhuǎn)
  18. u8 LED_Mode3[8] ={~0x81, ~0x42, ~0x24, ~0x18,~0x81, ~0x42, ~0x24, ~0x18};//3是由外而內(nèi)的流轉(zhuǎn)
  19. u8 LED_Mode4[8] ={~0x18, ~0x24, ~0x42, ~0x81,~0x18, ~0x24, ~0x42, ~0x81};//4是由內(nèi)而外的流轉(zhuǎn)
  20. u8 LED_NUM=0;//流轉(zhuǎn)位計(jì)數(shù),隔Time_lag[Work_Mode]當(dāng)前間隔值時(shí)間,計(jì)數(shù)加1,到8時(shí)復(fù)位0值
  21. //u8 LED_temp =0;

  22. //bit Pwm_Io =0;//1亮燈或0熄滅,PWM方式調(diào)節(jié)亮度
  23. bit job1_flag=0;
  24. bit job2_flag=0;
  25. bit job3_flag=0;
  26. bit job4_flag=0;
  27. bit job5_flag=0;
  28. bit flash_flag=0;
  29. void job1(void);//數(shù)碼管動(dòng)態(tài)顯示處理,每5ms一次
  30. void job2(void);//ADC轉(zhuǎn)換處理,每200ms一次
  31. void job3(void);//按鍵讀取與處理,每50ms一次
  32. void job4(void);//LED彩燈流轉(zhuǎn)處理,每10ms一次
  33. void job5(void);//顯示模式處理,每100ms一次
  34. void Sys_Init()
  35. {
  36.         Buzzy_Off;
  37.         Relay_Off;
  38.         Led_Set=0xff;
  39. }

  40. void main()
  41. {        

  42.         Sys_Init();
  43.          Timer1Init();
  44.         Timer0Init();                //定時(shí)器0設(shè)置,每隔1000us一個(gè)周期PWM中斷@12MHz
  45.         init_pcf8591();
  46.         //讀取LED工作模式的流轉(zhuǎn)間隔
  47.         Time_lag[1]=read_eeprom(1);i2c_delay(200);i2c_delay(200);
  48.         Time_lag[2]=read_eeprom(2);i2c_delay(200);i2c_delay(200);
  49.         Time_lag[3]=read_eeprom(3);i2c_delay(200);i2c_delay(200);
  50.         Time_lag[4]=read_eeprom(4);i2c_delay(200);i2c_delay(200);
  51.         if((Time_lag[1]<4)||(Time_lag[1]>12)) Time_lag[1]=10;
  52.         if((Time_lag[2]<4)||(Time_lag[2]>12)) Time_lag[2]=10;
  53.         if((Time_lag[3]<4)||(Time_lag[3]>12)) Time_lag[3]=10;
  54.         if((Time_lag[4]<4)||(Time_lag[4]>12)) Time_lag[4]=10;

  55.         while(1)
  56.         {
  57.                 if(job1_flag)
  58.                 {
  59.                
  60.                         job1();                 //數(shù)碼管動(dòng)態(tài)顯示處理,每5ms一次
  61.                         job1_flag=0;
  62.                 }
  63.                 if(job2_flag)
  64.                 {
  65.                         job2();                 //ADC轉(zhuǎn)換處理,每200ms一次
  66.                         job2_flag=0;
  67.                 }
  68.                 if(job3_flag)
  69.                 {
  70.                         job3();                //按鍵讀取與處理,每50ms一次
  71.                         job3_flag=0;
  72.                 }
  73.                 if(job4_flag)
  74.                 {
  75.                         job4();                 //LED彩燈流轉(zhuǎn)處理,每10ms一次
  76.                         job4_flag=0;               
  77.                 }
  78.                 if(job5_flag)
  79.                 {
  80.                         job5();                 //顯示模式處理,每100ms一次
  81.                         job5_flag=0;               
  82.                 }
  83.         }
  84. }



  85. void job1(void) //數(shù)碼管動(dòng)態(tài)顯示處理,每5ms一次
  86. {         
  87.                 Display(Dis_Buf);
  88. }   

  89. void job2(void) //ADC轉(zhuǎn)換處理,每200ms一次
  90. {  
  91.         Led_brightness = (adc_pcf8591()/64)+1;
  92. }



  93. void job3(void) //按鍵讀取與處理,每50ms一次
  94. {
  95.         u8 Key_Num=No_Key;
  96.         Key_Num=read_keyboard();
  97.         switch(Key_Num)
  98.         {
  99.                 case 'T': //S7 切換 啟動(dòng)和停止
  100.                 {
  101.                         ET0=~ET0;
  102.                         if(!ET0) Led_Set=0xff;//滅燈同時(shí)停止PWM工作
  103.                 }break;
  104.                 case '+': //S5 加
  105.                 {
  106.                         if(Dis_Mode==1)//數(shù)碼管顯示模式,0常規(guī)不顯示、1設(shè)置工作模式S6、2設(shè)置流轉(zhuǎn)間隔S6、3亮度等級(jí)顯示S4
  107.                         {
  108.                                 Work_Mode_set++;//LED流轉(zhuǎn)模式,1 2 3 4分別是從左到右、從右到左、由外而內(nèi)、由內(nèi)而外的流
  109.                                 if(Work_Mode_set>4) Work_Mode_set =1;
  110.                         }
  111.                         if(Dis_Mode==2)
  112.                         {
  113.                                 Time_lag[Work_Mode_set]++;//當(dāng)前流轉(zhuǎn)時(shí)間間隔*100ms
  114.                                 if(Time_lag[Work_Mode_set]>12) Time_lag[Work_Mode_set] =4;
  115.                                 write_eeprom(Work_Mode_set,Time_lag[Work_Mode_set]);
  116.                         }        
  117.                 }break;
  118.                 case '-': //S4 減、亮度等級(jí)顯示
  119.                 {
  120.                         if(Dis_Mode==1)//數(shù)碼管顯示模式,0常規(guī)不顯示、1設(shè)置工作模式S6、2設(shè)置流轉(zhuǎn)間隔S6、3亮度等級(jí)顯示S4
  121.                         {
  122.                                 Work_Mode_set--;//LED流轉(zhuǎn)模式,1 2 3 4分別是從左到右、從右到左、由外而內(nèi)、由內(nèi)而外的流轉(zhuǎn),0是全部熄滅
  123.                                 if(Work_Mode_set<1) Work_Mode_set =4;
  124.                                 
  125.                         }
  126.                         if(Dis_Mode==2)
  127.                         {
  128.                                 Time_lag[Work_Mode_set]--;//當(dāng)前流轉(zhuǎn)時(shí)間間隔*100ms
  129.                                 if(Time_lag[Work_Mode_set]<4) Time_lag[Work_Mode_set] =12;
  130.                                 write_eeprom(Work_Mode_set,Time_lag[Work_Mode_set]);
  131.                         }
  132.                         if(Dis_Mode==0)
  133.                         {
  134.                                 Dis_Mode=3;                                       
  135.                         }
  136.                 }break;
  137.                 case 'A': //S6 切換 設(shè)置工作模式和流轉(zhuǎn)模式
  138.                 {
  139.                         Dis_Mode++;
  140.                         if(Dis_Mode>2) Dis_Mode =0;                        
  141.                 }break;
  142.         }
  143. }        

  144. void job4(void)         //LED彩燈流轉(zhuǎn)處理,每10ms一次
  145. {
  146.         switch(Work_Mode)
  147.         {
  148.                 case 1: //LED彩燈流轉(zhuǎn)模式 1 是從左到右的流轉(zhuǎn)
  149.                 {
  150.                         Led_Set_Temp =LED_Mode1[LED_NUM];               
  151.                 }        break;
  152.                 case 2: //LED彩燈流轉(zhuǎn)模式 2 是從右到左的流轉(zhuǎn)
  153.                 {
  154.                         Led_Set_Temp =LED_Mode2[LED_NUM];               
  155.                 }break;
  156.                 case 3: //LED彩燈流轉(zhuǎn)模式 3 是由外而內(nèi)的流轉(zhuǎn)
  157.                 {
  158.                         Led_Set_Temp =LED_Mode3[LED_NUM];               
  159.                 }break;
  160.                 case 4: //LED彩燈流轉(zhuǎn)模式 4 是由內(nèi)而外的流轉(zhuǎn)
  161.                 {
  162.                         Led_Set_Temp =LED_Mode4[LED_NUM];                        
  163.                 }break;               
  164.         }
  165. }




  166. void job5(void) //顯示模式處理,每100ms一次
  167. {  
  168.         if(Dis_Mode==0) sprintf(Dis_Buf,"        ");//數(shù)碼管顯示模式,0常規(guī)不顯示、1設(shè)置工作模式S6、2設(shè)置流轉(zhuǎn)間隔S6、3亮度等級(jí)顯示S4
  169.         else if(Dis_Mode==1)
  170.         {
  171.                 if(flash_flag) sprintf(Dis_Buf,"-%01d- %04d",(s16)Work_Mode_set,(s16)Time_lag[Work_Mode_set]*100);//0.8s閃爍,1顯示、0不顯示
  172.                 else sprintf(Dis_Buf,"- - %04d",(s16)Time_lag[Work_Mode_set]*100);
  173.         }
  174.         else if(Dis_Mode==2)
  175.         {
  176.                 if(flash_flag) sprintf(Dis_Buf,"-%01d- %04d",(u16)Work_Mode_set,(s16)Time_lag[Work_Mode_set]*100);//0.8s閃爍,1顯示、0不顯示
  177.                 else sprintf(Dis_Buf,"-%01d-      ",(s16)Work_Mode_set);
  178.         }
  179.         else if(Dis_Mode==3)
  180.         {
  181.                  sprintf(Dis_Buf,"      -%01d",(s16)Led_brightness);//亮度等級(jí)顯示
  182.         }        
  183. }

復(fù)制代碼
有什么不對(duì)的地方歡迎大家批評(píng)指正。
全部資料51hei下載地址:
第9屆藍(lán)橋杯省賽單片機(jī)工程文件(彩燈控制器).rar (763.49 KB, 下載次數(shù): 157)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:608876 發(fā)表于 2020-2-24 00:53 | 只看該作者
老哥你pwm控制光強(qiáng)的部分在哪里啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:988618 發(fā)表于 2021-12-6 14:37 | 只看該作者
支持�。。�
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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