標題:
第九屆藍橋杯單片機-彩燈控制器代碼
[打印本頁]
作者:
真得浪
時間:
2020-2-28 21:01
標題:
第九屆藍橋杯單片機-彩燈控制器代碼
51hei截圖_20200228210121.png
(140.57 KB, 下載次數(shù): 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 關(guān)閉PWM
bit twinkle=0;//0.8秒閃爍
bit start=0;//啟動LED標志位
bit Bright_flat=0;//亮度調(diào)節(jié)標志位
static u8 mode1_time=0,mode2_time=0,mode3_time=0,mode4_time=0;
//EEPROM AT24C02有256個字節(jié),所以最大值為255,故縮小10倍
void Smg(u8 wei,u8 duan);
void Delayms(u16 ms);
void Timer0Init();
void Key_Scan();//獨立按鍵
void LED_Disply();//運行模式
void Set_Disply();//設(shè)置狀態(tài)
void Bright_Display();//亮度調(diào)節(jié)
void Tiem_interval();//時間間隔,優(yōu)化所加
void Init()//初始化
{
P2 = (P2 & 0X1f) | 0x80;//打開LED鎖存
P0 = 0xff; //初始化
P2 = P2 & 0X1f; //恢復(fù)鎖存,避免影響其他位
P2 = (P2 & 0X1f) | 0xa0;//打開蜂鳴器、繼電器鎖存
P0 = 0x00;
P2 = P2 & 0X1f;////恢復(fù)鎖存,避免影響其他位
P2 = (P2 & 0X1f) | 0xc0;//打開位選鎖存
P0 = 0x00;
P2 = P2 & 0X1f;//恢復(fù)鎖存,避免影響其他位
P2 = (P2 & 0X1f) | 0xe0;//打開段選鎖存
P0 = 0xff;
P2 = P2 & 0X1f;//恢復(fù)鎖存,避免影響其他位
}
////////////////////////////////////////////////////////
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(); //設(shè)置狀態(tài)
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)//設(shè)置狀態(tài)
{
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)//減/亮度調(diào)節(jié)
{
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)//非“設(shè)置”狀態(tài)下
{
Bright_Display();//亮度調(diào)節(jié)
}
//////////////////////////////////////////////////
}
if(change==1|change==2)
while(!S4);
}
}
void Set_Disply()//設(shè)置狀態(tài)
{
if(change==0)//數(shù)碼管熄滅
{
}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()//亮度調(diào)節(jié)
{
Vaout=ADC_Read();
lamp=0.02*Vaout;//將0-255轉(zhuǎn)換成顯示0-5 5/255=0.02
// if(lamp==5)flat=0;//關(guān)閉定時
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里來運行并調(diào)節(jié)亮度,否則會與數(shù)碼管沖突
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調(diào)節(jié)亮度//////////////////////////////////
if(flat==1)//關(guān)閉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;
}
/////////////流轉(zhuǎn)間隔////////////////////////////
if(mode==1)
{
if(count==mode1_time*10) Tiem_interval();////EEPROM AT24C02有256個字節(jié),所以最大值為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--);
}
復(fù)制代碼
全部資料51hei下載地址:
第九屆藍橋杯單片機-彩燈控制器代碼.zip
(807.35 KB, 下載次數(shù): 28)
2020-2-28 20:59 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1