100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 51单片机彩灯控制器c语言代码 【原创】第九届蓝桥杯单片机:彩灯控制器源程序和题目...

51单片机彩灯控制器c语言代码 【原创】第九届蓝桥杯单片机:彩灯控制器源程序和题目...

时间:2024-06-17 13:20:42

相关推荐

51单片机彩灯控制器c语言代码 【原创】第九届蓝桥杯单片机:彩灯控制器源程序和题目...

#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);//亮度等级显示

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。