|
51hei截圖_20200228210121.png (140.57 KB, 下載次數(shù): 48)
下載附件
2020-2-28 21:01 上傳
單片機(jī)源程序如下:
- #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運(yùn)行模式切換
- u8 change=0;//change切換選擇對(duì)象
- u16 count=0,time_g=700;//count用于定時(shí),time_g時(shí)間間隔
- u8 Vaout=0;//電壓
- u16 time=0,time2=0;//0.8秒閃爍計(jì)時(shí)
- u16 shan_time=0,shan_time2=0;
- u16 bright_count=0;//bright_count用于PWM計(jì)時(shí)
- u8 bright=10,lamp=0;//bright亮度 ,lamp亮度選擇
- bit flat=0;//1 開啟PWM , 0 關(guān)閉PWM
- bit twinkle=0;//0.8秒閃爍
- bit start=0;//啟動(dòng)LED標(biāo)志位
- bit Bright_flat=0;//亮度調(diào)節(jié)標(biāo)志位
- static u8 mode1_time=0,mode2_time=0,mode3_time=0,mode4_time=0;
- //EEPROM AT24C02有256個(gè)字節(jié),所以最大值為255,故縮小10倍
- void Smg(u8 wei,u8 duan);
- void Delayms(u16 ms);
- void Timer0Init();
- void Key_Scan();//獨(dú)立按鍵
- void LED_Disply();//運(yùn)行模式
- void Set_Disply();//設(shè)置狀態(tài)
- void Bright_Display();//亮度調(diào)節(jié)
- void Tiem_interval();//時(shí)間間隔,優(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);//滑動(dòng)變阻器
- while(1)
- {
- Key_Scan(); //獨(dú)立按鍵
- Set_Disply(); //設(shè)置狀態(tài)
- if(start==1)LED_Disply();//打開LED
- }
- }
- void Key_Scan()//獨(dú)立按鍵
- {
- if(S7==0)//LED啟動(dòng)/停止
- {
- 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運(yùn)行模式
- {
- mode++;
- if(mode>=4)mode=4;
- }
- if(change==2)//時(shí)間間隔
- {
- 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)//運(yùn)行模式
- {
- mode--;
- if(mode==1)mode=1;
- }
- if(change==2)//時(shí)間間隔
- {
- 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);//運(yùn)行模式
- 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;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。0000 0001
- TL0=(65535-1000)%256;//給定時(shí)器賦初值,定時(shí)1ms
- TH0=(65535-1000)/256;
- TR0=1;///打開定時(shí)器0中斷允許
- ET0=1;//打開定時(shí)器中斷
- 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)閉定時(shí)
-
- if(lamp==0)lamp=1;
- if(lamp==5)lamp=4;
- Smg(6,10);
- Smg(7,lamp);
- switch(lamp)
- {
- case 1:
- flat=1;//打開定時(shí)
- bright=2;
- break;
- case 2:
- flat=1;//打開定時(shí)
- bright=4;
- break;
- case 3:
- flat=1;//打開定時(shí)
- bright=6;
- break;
- case 4:
- flat=1;//打開定時(shí)
- bright=9;
- break;
- }
- }
- void LED_Disply()//運(yùn)行模式
- {
- //一定要將模式放到定時(shí)器中斷中的PWM里來運(yùn)行并調(diào)節(jié)亮度,否則會(huì)與數(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定時(shí)
- {
- 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(); //運(yùn)行模式
- bright_count=0;
- }
- /////////////流轉(zhuǎn)間隔////////////////////////////
- if(mode==1)
- {
- if(count==mode1_time*10) Tiem_interval();////EEPROM AT24C02有256個(gè)字節(jié),所以最大值為255,擴(kuò)大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();
- }
- //************** 閃爍時(shí)間**********************************
- if(time==800)twinkle=1;
- if(time2==1600)
- {
- twinkle=0;
- time=0;
- time2=0;
- }
- }
- void Tiem_interval()//時(shí)間間隔
- {
- 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);//***********延時(shí)夠
- 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下載地址:
第九屆藍(lán)橋杯單片機(jī)-彩燈控制器代碼.zip
(807.35 KB, 下載次數(shù): 28)
2020-2-28 20:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|