|
藍(lán)橋杯省賽 第九屆
 
有需要自己下載吧 今天星期 有點時間 把文件上傳一下 其他的就不多說了
九屆的題難點應(yīng)該就在 LED延時方面吧
其次就是在24C02的讀寫。連續(xù)寫數(shù)據(jù)記著至少延遲1.8幾ms好像,取2ms多次寫就行。其他的沒啥了
單片機源程序如下:
- #include "smg.h"
- #include "iic.h"
- #include "type.h"
- #define SYSCLOCK 11059200
- sbit S7 = P3^0;
- sbit S6 = P3^1;
- sbit S5 = P3^2;
- sbit S4 = P3^3;
- bit Led_flag = 1; //默認(rèn)為正常無閃爍狀態(tài)
- bit Star_End=0; //S7的2種模式
- u8 ledtimes[4] = {40,40,40,40}; //默認(rèn)LED的流轉(zhuǎn)時間
- u8 PWM_RB2; //LED占空比值
- u8 Set_mode = 3; //默認(rèn)為數(shù)碼管熄滅,S6的三種模式:1,2,3
- u8 Led_mode=1; //LED的四種模式:1,2,3,4
- u8 eepromaddder[4] = {0x01,0x02,0x03,0x04}; //24C02的寫入和讀取地址
- code u8 Led_Mode12[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //LED模式1,2
- code u8 Led_Mode34[4] = {0x7E,0xBD,0xDB,0xE7}; //LED模式3,4
- void Delay2ms(); //@12.000MHz
- void Init_MCU(void);
- u8 PCF8591_Levl(void);
- void Init_Time0(u8 ms);
- void KeyScan(void);
- void Display_SMG(void);
- void main(void)
- {
- u8 i;
- u8 rb_levl;
- Init_MCU();
- Init_Time0(1); //1ms
- ledtimes[0] = Read_24C02(0x01);
- Delay2ms();
- for(i=0;i>4;i++)
- {
- ledtimes[i] = Read_24C02(eepromaddder[i]);
- Delay2ms();
- }
- while(1)
- {
- rb_levl = PCF8591_Levl();
- KeyScan();
- Display_SMG();
- }
- }
- //*===============按鍵函數(shù)=============*//
- void KeyScan(void)
- {
- u8 temp;
- if(S7 == 0)//S7
- {
- delay(200);
- if(S7 == 0)
- {
- Star_End = ~Star_End;
- }while(!S7)
- {
- Display_SMG();
- }
- }
-
- if(S6 == 0)//S6
- {
- delay(200);
- if(S6 == 0)
- {
- Set_mode ++;
- if(Set_mode > 3) Set_mode = 1;
- }while(!S6)
- {
- if(Set_mode == 3)
- {
- switch(Led_mode)
- {
- case 1: Write_24C02(eepromaddder[0],ledtimes[0]); break;
- case 2: Write_24C02(eepromaddder[1],ledtimes[1]); break;
- case 3: Write_24C02(eepromaddder[2],ledtimes[2]); break;
- case 4: Write_24C02(eepromaddder[3],ledtimes[3]); break;
- default : break;
- }
- }
- Display_SMG();
- }
- }
-
- if(S5 == 0)//S5
- {
- delay(200);
- if(S5 == 0)
- {
- if(Set_mode == 1)
- {
- Led_mode ++;
- if(Led_mode > 4)
- Led_mode = 4;
- }
- else if(Set_mode == 2)
- {
- ledtimes[Led_mode-1] += 10;
- if(ledtimes[Led_mode-1] > 120)
- ledtimes[Led_mode-1] = 120;
- }
- }while(!S5)
- {
- if(Set_mode == 1)
- ledtimes[Led_mode-1] = Read_24C02(eepromaddder[Led_mode-1]);
- Display_SMG();
- }
- }
-
- if(S4 == 0) //S4
- {
- delay(200);
- if(S4 == 0)
- {
- if(Set_mode == 1)
- {
- Led_mode --;
- if(Led_mode == 0)
- Led_mode = 1;
- }
- else if(Set_mode == 2)
- {
- ledtimes[Led_mode-1] -= 10;
- if(ledtimes[Led_mode-1] < 40)
- ledtimes[Led_mode-1] = 40;
- }
- }while(!S4)
- {
- if(Set_mode == 1)
- ledtimes[Led_mode-1] = Read_24C02(eepromaddder[Led_mode-1]);
- if(Set_mode == 3) //非設(shè)置狀態(tài)讀取RB2電壓等級
- {
- temp = PCF8591_Levl();
- Display_SMG_LedLevl(11,temp);
- }
- Display_SMG();
- }
- }
- }
- //*===============數(shù)碼管顯示函數(shù)=============*//
- void Display_SMG(void)
- {
- if(Set_mode == 3) //數(shù)碼管全部熄滅
- {
- Display_SMG_LedLevl(10,10);
- }
- else
- {
- switch(Led_mode)
- {
- case 1: Display_SMG_Setmode(1,ledtimes[Led_mode-1]*10); break;
- case 2: Display_SMG_Setmode(2,ledtimes[Led_mode-1]*10); break;
- case 3: Display_SMG_Setmode(3,ledtimes[Led_mode-1]*10); break;
- case 4: Display_SMG_Setmode(4,ledtimes[Led_mode-1]*10); break;
- default : break;
- }
- }
- }
- //*===============初始化MCU=============*//
- void Init_MCU(void)
- {
- Select_573(4);
- P0 = 0xFF;
- Select_573(5);
- P0 = 0x00;
- Select_573(6);
- P0 = 0x00;
- Select_573(0);
- }
- //*===============RB2的電壓等級==============*//
- u8 PCF8591_Levl(void)
- {
- u8 levl;
- u8 temp;
- temp = Read_PCF8591(0x03);
- switch(temp/64)
- {
- case 0: levl = 1;PWM_RB2 = 2;break;
- case 1: levl = 2;PWM_RB2 = 4;break;
- case 2: levl = 3;PWM_RB2 = 6;break;
- case 3: levl = 4;PWM_RB2 = 8;break;
- default :break;
- }
-
- return levl;
-
- }
- //*===============初始化定時器0=============*//
- void Init_Time0(u8 ms)
- {
- TMOD = TMOD & 0xF0;
-
- TH0 = (65536 - ms*SYSCLOCK/12/1000) / 256;
- TL0 = (65536 - ms*SYSCLOCK/12/1000) % 256;
-
- TR0 = 1;
- TF0 = 0;
- ET0 = 1;
- EA = 1;
- }
- //*===============中斷響應(yīng)函數(shù)=============*//
- //功能1:設(shè)置100HZ的PWM
- //功能2:設(shè)置的模式間隔0.8s閃爍
- //功能3:設(shè)置LED的流轉(zhuǎn)
- //*========================================*//
- void InterruptTime0(void) interrupt 1 //中斷:1ms
- {
- static u8 i=0;
- static u16 j=0;
- static char cnt=0;
- static u16 num=0;
- static u8 buff; //定義一個緩沖變量,用來保存上次的Set_mode值
-
-
-
- if(Set_mode == 1 || Set_mode == 2) //設(shè)置的模式閃爍
- {
- j ++;
- if(j > 400)
- {
- j = 0;
- Led_flag = ~Led_flag;
- }
- }
-
- if(Star_End) //上電LED熄滅,需要S7打開LED流轉(zhuǎn)
- {
- i++;num++;
- if(i>10) i=1; //100HZ無閃爍
- switch(Led_mode)
- {
- case 1: if(buff != 1) cnt = 0;
- if(num > ledtimes[0]*10) { num = 0; cnt ++;}
- if(cnt > 7) cnt = 0;
- break;
- case 2: if(buff != 2) cnt = 7;
- if(num > ledtimes[1]*10) { num = 0; cnt --;}
- if(cnt < 0) cnt = 7;
- break;
- case 3: if(buff != 3) cnt = 0;
- if(num > ledtimes[2]*10) { num = 0; cnt ++;}
- if(cnt > 3) cnt = 0;
- break;
- case 4: if(buff != 4) cnt = 0;
- if(num > ledtimes[3]*10) { num = 0; cnt --;}
- if(cnt < 0) cnt = 3;
- break;
- default :
- break;
- }
-
- Select_573(0);
- if(i>=PWM_RB2) //PWM調(diào)節(jié)亮度
- {
- Select_573(4);
- P0 = 0xFF;
- Select_573(0);
- }
- else
- {
- P0 = 0xFF;
- Select_573(4);
- if(Led_mode == 1 || Led_mode == 2)
- P0 = Led_Mode12[cnt];
- else if(Led_mode == 3 || Led_mode == 4)
- P0 = Led_Mode34[cnt];
- Select_573(0);
- }
- }
- buff = Led_mode; //用做比較的緩沖變量,比較按鍵LED模式是否改變,
- //若發(fā)生改變,則初始化LED閃爍狀態(tài)
- }
- void Delay2ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 24;
- j = 85;
- do
- {
- while (--j);
- } while (--i);
- }
復(fù)制代碼
所有程序51hei提供下載:
第九屆.zip
(63.74 KB, 下載次數(shù): 21)
2020-10-31 19:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|