标题:
第九届蓝桥杯单片机-彩灯控制器代码
[打印本页]
作者:
真得浪
时间:
2020-2-28 21:01
标题:
第九届蓝桥杯单片机-彩灯控制器代码
51hei截图_20200228210121.png
(140.57 KB, 下载次数: 48)
下载附件
2020-2-28 21:01 上传
单片机源程序如下:
#include<STC15F2K60S2.H>
#include<iic.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
u8 code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc6,0xff};//- C ff
u8 mode=1;//mode运行模式切换
u8 change=0;//change切换选择对象
u16 count=0,time_g=700;//count用于定时,time_g时间间隔
u8 Vaout=0;//电压
u16 time=0,time2=0;//0.8秒闪烁计时
u16 shan_time=0,shan_time2=0;
u16 bright_count=0;//bright_count用于PWM计时
u8 bright=10,lamp=0;//bright亮度 ,lamp亮度选择
bit flat=0;//1 开启PWM , 0 关闭PWM
bit twinkle=0;//0.8秒闪烁
bit start=0;//启动LED标志位
bit Bright_flat=0;//亮度调节标志位
static u8 mode1_time=0,mode2_time=0,mode3_time=0,mode4_time=0;
//EEPROM AT24C02有256个字节,所以最大值为255,故缩小10倍
void Smg(u8 wei,u8 duan);
void Delayms(u16 ms);
void Timer0Init();
void Key_Scan();//独立按键
void LED_Disply();//运行模式
void Set_Disply();//设置状态
void Bright_Display();//亮度调节
void Tiem_interval();//时间间隔,优化所加
void Init()//初始化
{
P2 = (P2 & 0X1f) | 0x80;//打开LED锁存
P0 = 0xff; //初始化
P2 = P2 & 0X1f; //恢复锁存,避免影响其他位
P2 = (P2 & 0X1f) | 0xa0;//打开蜂鸣器、继电器锁存
P0 = 0x00;
P2 = P2 & 0X1f;////恢复锁存,避免影响其他位
P2 = (P2 & 0X1f) | 0xc0;//打开位选锁存
P0 = 0x00;
P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
P2 = (P2 & 0X1f) | 0xe0;//打开段选锁存
P0 = 0xff;
P2 = P2 & 0X1f;//恢复锁存,避免影响其他位
}
////////////////////////////////////////////////////////
void main()
{
// IIC_Write(0x00,00);
// IIC_Write(0x01,00);
// IIC_Write(0x02,00);
// IIC_Write(0x03,00);
Init();
Timer0Init();
mode1_time=IIC_Read(0x00);
mode2_time=IIC_Read(0x01);
mode3_time=IIC_Read(0x02);
mode4_time=IIC_Read(0x03);
ADC_Init(0x03);//滑动变阻器
while(1)
{
Key_Scan(); //独立按键
Set_Disply(); //设置状态
if(start==1)LED_Disply();//打开LED
}
}
void Key_Scan()//独立按键
{
if(S7==0)//LED启动/停止
{
Delayms(5);
if(S7==0)
{
start=~start;
}while(!S7);
}
//////////////////////////
if(S6==0)//设置状态
{
Delayms(5);
if(S6==0)
{
change++;
if(change==3) change=0;
}while(!S6);
}
////////////////////////////
if(S5==0)//加
{
Delayms(5);
if(S5==0)
{
if(change==1)//LED运行模式
{
mode++;
if(mode>=4)mode=4;
}
if(change==2)//时间间隔
{
time_g=time_g+10;
if(time_g>=120)time_g=120;
if(mode==1)
{
mode1_time=time_g;
IIC_Write(0x00,mode1_time);//写入EEPROM
}else if(mode==2)
{
mode2_time=time_g;
IIC_Write(0x01,mode2_time);//写入EEPROM
}else if(mode==3)
{
mode3_time=time_g;
IIC_Write(0x02,mode3_time); //写入EEPROM
}else if(mode==4)
{
mode4_time=time_g;
IIC_Write(0x03,mode4_time);//写入EEPROM
}
}
}while(!S5);
}
/////////////////////////////////////////////
if(S4==0)//减/亮度调节
{
Delayms(5);
if(S4==0)
{
if(change==1)//运行模式
{
mode--;
if(mode==1)mode=1;
}
if(change==2)//时间间隔
{
time_g=time_g-10;
if(time_g<=40)time_g=40;
if(mode==1)
{
mode1_time=time_g;
IIC_Write(0x00,mode1_time);
}else if(mode==2)
{
mode2_time=time_g;
IIC_Write(0x01,mode2_time);
}else if(mode==3)
{
mode3_time=time_g;
IIC_Write(0x02,mode3_time);
}else if(mode==4)
{
mode4_time=time_g;
IIC_Write(0x03,mode4_time);
}
}
//**************************************************
if(change==0)//非“设置”状态下
{
Bright_Display();//亮度调节
}
//////////////////////////////////////////////////
}
if(change==1|change==2)
while(!S4);
}
}
void Set_Disply()//设置状态
{
if(change==0)//数码管熄灭
{
}else if(change==1)
{
if(mode==1)
{
time_g=mode1_time;
}else if(mode==2)
{
time_g=mode2_time;
}else if(mode==3)
{
time_g=mode3_time;
}else if(mode==4)
{
time_g=mode4_time;
}
Smg(0,10);
Smg(2,10);
Smg(4,time_g/100);
Smg(5,time_g%100/10);
Smg(6,time_g%100%10);
Smg(7,0);
if(twinkle==1)//0.8s闪烁
Smg(1,mode);
if(twinkle==0)//0.8s闪烁
Smg(1,12);
//*************************************************************
}else if(change==2)
{
Smg(0,10);
Smg(1,mode);//运行模式
Smg(2,10);
if(twinkle==1)//0.8s闪烁
{
Smg(4,time_g/100);
Smg(5,time_g%100/10);
Smg(6,time_g%100%10);
Smg(7,0);
}
if(twinkle==0)//0.8s闪烁
{
Smg(4,12);//
Smg(5,12);//
Smg(6,12);//
Smg(7,12);//
}
}
}
void Timer0Init()
{
TMOD=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。0000 0001
TL0=(65535-1000)%256;//给定时器赋初值,定时1ms
TH0=(65535-1000)/256;
TR0=1;///打开定时器0中断允许
ET0=1;//打开定时器中断
EA=1;//打开总中断
}
void Bright_Display()//亮度调节
{
Vaout=ADC_Read();
lamp=0.02*Vaout;//将0-255转换成显示0-5 5/255=0.02
// if(lamp==5)flat=0;//关闭定时
if(lamp==0)lamp=1;
if(lamp==5)lamp=4;
Smg(6,10);
Smg(7,lamp);
switch(lamp)
{
case 1:
flat=1;//打开定时
bright=2;
break;
case 2:
flat=1;//打开定时
bright=4;
break;
case 3:
flat=1;//打开定时
bright=6;
break;
case 4:
flat=1;//打开定时
bright=9;
break;
}
}
void LED_Disply()//运行模式
{
//一定要将模式放到定时器中断中的PWM里来运行并调节亮度,否则会与数码管冲突
if(mode==1)//模式1
{
P2=(P2&0X1F)|0X80;
P0=0XFE<<shan_time;
P2=P2&0X1F;
}else if(mode==2)//模式2
{
P2=(P2&0X1F)|0X80;
P0=~(0XFE<<shan_time);
P2=P2&0X1F;
}else if(mode==3)//模式3
{
P2=(P2&0X1F)|0X80;
P0=~((0X80>>shan_time2)|(0X01<<shan_time2));
P2=P2&0X1F;
}else if(mode==4)//模式4
{
P2=(P2&0X1F)|0X80;
P0=~((0X08>>shan_time2)|(0X10<<shan_time2));
P2=P2&0X1F;
}
}
void Timer() interrupt 1
{
TL0=(65535-1000)%256;///1ms
TH0=(65535-1000)/256;
count++;
time++;
time2++;
////////////PWM调节亮度//////////////////////////////////
if(flat==1)//关闭PWM定时
{
bright_count++;
}else{
bright_count=0;
}
if(bright_count==bright)//PWM
{
P2 = (P2 & 0X1f) | 0x80;
P0 = 0xff;
P2 = P2 & 0X1f;
}else if(bright_count==10)//1ms*10=10
{
LED_Disply(); //运行模式
bright_count=0;
}
/////////////流转间隔////////////////////////////
if(mode==1)
{
if(count==mode1_time*10) Tiem_interval();////EEPROM AT24C02有256个字节,所以最大值为255,扩大10倍 10*120=1200
}else if(mode==2)
{
if(count==mode2_time*10) Tiem_interval();
}else if(mode==3)
{
if(count==mode3_time*10) Tiem_interval();
}else if(mode==4)
{
if(count==mode4_time*10) Tiem_interval();
}
//************** 闪烁时间**********************************
if(time==800)twinkle=1;
if(time2==1600)
{
twinkle=0;
time=0;
time2=0;
}
}
void Tiem_interval()//时间间隔
{
shan_time++;
shan_time2++;
if(shan_time==8)
{
shan_time=0;
}
if(shan_time2==4)
{
shan_time2=0;
}
count=0;
}
void Smg(u8 wei,u8 duan)
{
P2 = (P2 & 0X1f) | 0xe0;//消隐
P0=0XFF;
P2 = P2 & 0X1f;
P2 = (P2 & 0X1f) | 0xc0;//位选
P0 = 0x01<<wei;
P2 = P2 & 0X1f;
P2 = (P2 & 0X1f) | 0xe0;//段选
P0=smgduan[duan];
Delayms(3);//***********延时够
P0=0XFF;
P2 = P2 & 0X1f;
P2 = (P2 & 0X1f) | 0xe0;//消隐
P0=0XFF;
P2 = P2 & 0X1f;
}
void Delayms(u16 ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
复制代码
全部资料51hei下载地址:
第九届蓝桥杯单片机-彩灯控制器代码.zip
(807.35 KB, 下载次数: 28)
2020-2-28 20:59 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1