本帖最后由 Amistad 于 2019-5-12 23:30 編輯
附件里面有該題的源程序(親測無誤)以及原題
IMG_20190505_225715.jpg (243.83 KB, 下載次數: 55)
下載附件
2019-5-6 04:54 上傳
IMG_20190505_225729.jpg (251.29 KB, 下載次數: 45)
下載附件
2019-5-6 04:54 上傳
IMG_20190505_225734.jpg (267.6 KB, 下載次數: 67)
下載附件
2019-5-6 04:54 上傳
IMG_20190505_225747.jpg (249.61 KB, 下載次數: 42)
下載附件
2019-5-6 04:54 上傳
IMG_20190505_225753.jpg (279.3 KB, 下載次數: 35)
下載附件
2019-5-6 04:54 上傳
題目是我在網上到的,以下是題目:
9:藍橋杯單片機第九屆初賽試題-彩燈控制器_Page1.png (406.22 KB, 下載次數: 35)
下載附件
2019-5-5 23:36 上傳
9:藍橋杯單片機第九屆初賽試題-彩燈控制器_Page2.png (488.18 KB, 下載次數: 42)
下載附件
2019-5-5 23:36 上傳
9:藍橋杯單片機第九屆初賽試題-彩燈控制器_Page3.png (269.77 KB, 下載次數: 49)
下載附件
2019-5-5 23:36 上傳
程序運行效果圖不知道怎么回事上傳不成功,我就不貼了,放在附件里面了,大家下載下來就可以看了。以下是單片機主函數有完整注釋- #include "main.h"
- #include "Display.H"
- #include "stdio.H"
- #include "KEY.h"
- #include "TIME.h"
- #include "DELAY.h"
- #include "i2c.h"
- //u8 Voltage_Pv;//實測電壓ADC值
- u8 Dis_Buf[10]={" "};//數碼管顯示緩存
- u8 Led_Set_Temp =0xff;//LED燈初值
- u8 Led_brightness=4;//LED亮度等級,0V則為0,0.01-1.25V則為1,1.26-2.50V則為2,2.51-3.75V則為3,3.75-5.00V則為4
- u8 Work_Mode =1;//LED流轉模式初值,1 2 3 4分別是從左到右、從右到左、由外而內、由內而外的流轉,0是全部熄滅
- u8 Work_Mode_set=1;//LED流轉模式設置值
- u8 Time_lag[5];//LED流轉模式對應的流轉時間間隔,保存在E2PROM中,4代表400ms,12代表1200ms
- u8 Dis_Mode =0;//數碼管顯示模式初值,0常規不顯示、1設置工作模式S6、2設置流轉間隔S6、3亮度等級顯示S4
- u8 LED_Mode1[8] ={~0x01, ~0x02, ~0x04, ~0x08,~0x10, ~0x20, ~0x40, ~0x80};//1是從左到右的流轉
- u8 LED_Mode2[8] ={~0x80, ~0x40, ~0x20, ~0x10,~0x08, ~0x04, ~0x02, ~0x01};//2是從右到左的流轉
- u8 LED_Mode3[8] ={~0x81, ~0x42, ~0x24, ~0x18,~0x81, ~0x42, ~0x24, ~0x18};//3是由外而內的流轉
- u8 LED_Mode4[8] ={~0x18, ~0x24, ~0x42, ~0x81,~0x18, ~0x24, ~0x42, ~0x81};//4是由內而外的流轉
- u8 LED_NUM=0;//流轉位計數,隔Time_lag[Work_Mode]當前間隔值時間,計數加1,到8時復位0值
- //u8 LED_temp =0;
- //bit Pwm_Io =0;//1亮燈或0熄滅,PWM方式調節亮度
- bit job1_flag=0;
- bit job2_flag=0;
- bit job3_flag=0;
- bit job4_flag=0;
- bit job5_flag=0;
- bit flash_flag=0;
- void job1(void);//數碼管動態顯示處理,每5ms一次
- void job2(void);//ADC轉換處理,每200ms一次
- void job3(void);//按鍵讀取與處理,每50ms一次
- void job4(void);//LED彩燈流轉處理,每10ms一次
- void job5(void);//顯示模式處理,每100ms一次
- void Sys_Init()
- {
- Buzzy_Off;
- Relay_Off;
- Led_Set=0xff;
- }
- void main()
- {
- Sys_Init();
- Timer1Init();
- Timer0Init(); //定時器0設置,每隔1000us一個周期PWM中斷@12MHz
- init_pcf8591();
- //讀取LED工作模式的流轉間隔
- Time_lag[1]=read_eeprom(1);i2c_delay(200);i2c_delay(200);
- Time_lag[2]=read_eeprom(2);i2c_delay(200);i2c_delay(200);
- Time_lag[3]=read_eeprom(3);i2c_delay(200);i2c_delay(200);
- Time_lag[4]=read_eeprom(4);i2c_delay(200);i2c_delay(200);
- if((Time_lag[1]<4)||(Time_lag[1]>12)) Time_lag[1]=10;
- if((Time_lag[2]<4)||(Time_lag[2]>12)) Time_lag[2]=10;
- if((Time_lag[3]<4)||(Time_lag[3]>12)) Time_lag[3]=10;
- if((Time_lag[4]<4)||(Time_lag[4]>12)) Time_lag[4]=10;
- while(1)
- {
- if(job1_flag)
- {
-
- job1(); //數碼管動態顯示處理,每5ms一次
- job1_flag=0;
- }
- if(job2_flag)
- {
- job2(); //ADC轉換處理,每200ms一次
- job2_flag=0;
- }
- if(job3_flag)
- {
- job3(); //按鍵讀取與處理,每50ms一次
- job3_flag=0;
- }
- if(job4_flag)
- {
- job4(); //LED彩燈流轉處理,每10ms一次
- job4_flag=0;
- }
- if(job5_flag)
- {
- job5(); //顯示模式處理,每100ms一次
- job5_flag=0;
- }
- }
- }
- void job1(void) //數碼管動態顯示處理,每5ms一次
- {
- Display(Dis_Buf);
- }
- void job2(void) //ADC轉換處理,每200ms一次
- {
- Led_brightness = (adc_pcf8591()/64)+1;
- }
- void job3(void) //按鍵讀取與處理,每50ms一次
- {
- u8 Key_Num=No_Key;
- Key_Num=read_keyboard();
- switch(Key_Num)
- {
- case 'T': //S7 切換 啟動和停止
- {
- ET0=~ET0;
- if(!ET0) Led_Set=0xff;//滅燈同時停止PWM工作
- }break;
- case '+': //S5 加
- {
- if(Dis_Mode==1)//數碼管顯示模式,0常規不顯示、1設置工作模式S6、2設置流轉間隔S6、3亮度等級顯示S4
- {
- Work_Mode_set++;//LED流轉模式,1 2 3 4分別是從左到右、從右到左、由外而內、由內而外的流
- if(Work_Mode_set>4) Work_Mode_set =1;
- }
- if(Dis_Mode==2)
- {
- Time_lag[Work_Mode_set]++;//當前流轉時間間隔*100ms
- if(Time_lag[Work_Mode_set]>12) Time_lag[Work_Mode_set] =4;
- write_eeprom(Work_Mode_set,Time_lag[Work_Mode_set]);
- }
- }break;
- case '-': //S4 減、亮度等級顯示
- {
- if(Dis_Mode==1)//數碼管顯示模式,0常規不顯示、1設置工作模式S6、2設置流轉間隔S6、3亮度等級顯示S4
- {
- Work_Mode_set--;//LED流轉模式,1 2 3 4分別是從左到右、從右到左、由外而內、由內而外的流轉,0是全部熄滅
- if(Work_Mode_set<1) Work_Mode_set =4;
-
- }
- if(Dis_Mode==2)
- {
- Time_lag[Work_Mode_set]--;//當前流轉時間間隔*100ms
- if(Time_lag[Work_Mode_set]<4) Time_lag[Work_Mode_set] =12;
- write_eeprom(Work_Mode_set,Time_lag[Work_Mode_set]);
- }
- if(Dis_Mode==0)
- {
- Dis_Mode=3;
- }
- }break;
- case 'A': //S6 切換 設置工作模式和流轉模式
- {
- Dis_Mode++;
- if(Dis_Mode>2) Dis_Mode =0;
- }break;
- }
- }
- void job4(void) //LED彩燈流轉處理,每10ms一次
- {
- switch(Work_Mode)
- {
- case 1: //LED彩燈流轉模式 1 是從左到右的流轉
- {
- Led_Set_Temp =LED_Mode1[LED_NUM];
- } break;
- case 2: //LED彩燈流轉模式 2 是從右到左的流轉
- {
- Led_Set_Temp =LED_Mode2[LED_NUM];
- }break;
- case 3: //LED彩燈流轉模式 3 是由外而內的流轉
- {
- Led_Set_Temp =LED_Mode3[LED_NUM];
- }break;
- case 4: //LED彩燈流轉模式 4 是由內而外的流轉
- {
- Led_Set_Temp =LED_Mode4[LED_NUM];
- }break;
- }
- }
- void job5(void) //顯示模式處理,每100ms一次
- {
- if(Dis_Mode==0) sprintf(Dis_Buf," ");//數碼管顯示模式,0常規不顯示、1設置工作模式S6、2設置流轉間隔S6、3亮度等級顯示S4
- else if(Dis_Mode==1)
- {
- if(flash_flag) sprintf(Dis_Buf,"-%01d- %04d",(s16)Work_Mode_set,(s16)Time_lag[Work_Mode_set]*100);//0.8s閃爍,1顯示、0不顯示
- else sprintf(Dis_Buf,"- - %04d",(s16)Time_lag[Work_Mode_set]*100);
- }
- else if(Dis_Mode==2)
- {
- if(flash_flag) sprintf(Dis_Buf,"-%01d- %04d",(u16)Work_Mode_set,(s16)Time_lag[Work_Mode_set]*100);//0.8s閃爍,1顯示、0不顯示
- else sprintf(Dis_Buf,"-%01d- ",(s16)Work_Mode_set);
- }
- else if(Dis_Mode==3)
- {
- sprintf(Dis_Buf," -%01d",(s16)Led_brightness);//亮度等級顯示
- }
- }
復制代碼 有什么不對的地方歡迎大家批評指正。
全部資料51hei下載地址:
第9屆藍橋杯省賽單片機工程文件(彩燈控制器).rar
(763.49 KB, 下載次數: 157)
2019-5-6 04:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|