蓝桥杯省赛 第九届
 
有需要自己下载吧 今天星期 有点时间 把文件上传一下 其他的就不多说了
九届的题难点应该就在 LED延时方面吧
其次就是在24C02的读写。连续写数据记着至少延迟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; //默认为正常无闪烁状态
- bit Star_End=0; //S7的2种模式
- u8 ledtimes[4] = {40,40,40,40}; //默认LED的流转时间
- u8 PWM_RB2; //LED占空比值
- u8 Set_mode = 3; //默认为数码管熄灭,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();
- }
- }
- //*===============按键函数=============*//
- 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) //非设置状态读取RB2电压等级
- {
- temp = PCF8591_Levl();
- Display_SMG_LedLevl(11,temp);
- }
- Display_SMG();
- }
- }
- }
- //*===============数码管显示函数=============*//
- void Display_SMG(void)
- {
- if(Set_mode == 3) //数码管全部熄灭
- {
- 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;
- }
- //*===============中断响应函数=============*//
- //功能1:设置100HZ的PWM
- //功能2:设置的模式间隔0.8s闪烁
- //功能3:设置LED的流转
- //*========================================*//
- 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) //设置的模式闪烁
- {
- j ++;
- if(j > 400)
- {
- j = 0;
- Led_flag = ~Led_flag;
- }
- }
-
- if(Star_End) //上电LED熄灭,需要S7打开LED流转
- {
- 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调节亮度
- {
- 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模式是否改变,
- //若发生改变,则初始化LED闪烁状态
- }
- void Delay2ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 24;
- j = 85;
- do
- {
- while (--j);
- } while (--i);
- }
复制代码
所有程序51hei提供下载:
第九届.zip
(63.74 KB, 下载次数: 21)
|