單片機源程序- /*原理:先亮紅燈(保持一會兒)----紅綠過度(綠加1、紅減1循環240次)------
- 綠燈亮起(保持一會兒)----綠蘭過度(蘭加1、綠減1循環240次)-----蘭燈亮起
- (保持)-----蘭白過度(綠加1、紅加1循環240次、蘭不變?---白紅過度*/
- #include<reg52.h>//MCU頭文件
- #define uchar unsigned char//字浮型宏定義
- #define uint unsigned int//整型宏定義
- #define shudu 30//LED漸變速度調整
- #define dengji 1//LED變化等級調整
- sbit B1=P1^0;//紅色燈控制IO口
- sbit G1=P1^1;//綠色燈控制IO口
- sbit R1=P1^2;//蘭色燈控制IO口
- uchar Rout,Bout,Gout;//紅綠蘭3個變量
- /***************************************************/
- /**********************延時子程序*******************/
- /***************************************************/
- void delay(uint z)
- {
- uint x,y;//局部變量定義
- for(x=0;x<5;x++)//延時外循環
- for(y=0;y<z;y++);//延時內循環
- }
- /**********************************************/
- /**********PWM控制紅綠蘭3種燈亮滅時間**********/
- /**********************************************/
- void RGBpwm(uchar Rou,uchar Gou,uchar Bou)//3個局部變量,些部分為帶參數函數
- {
- if(Rou!=0)//如果紅燈變量不等于0就亮紅燈
- {
- R1=1;//紅燈亮
- delay(Rou);//紅燈亮起時間
- R1=0;//紅燈滅
- }
- if(Gou!=0)//如果紅燈變量不等于0就亮紅燈
- {
- G1=1;//綠燈亮
- delay(Gou);//綠燈亮起的時間
- G1=0;//綠燈滅
- }
- if(Bou!=0)//如果紅燈變量不等于0就亮紅燈
- {
- B1=1;//蘭燈亮
- delay(Bou);//蘭燈亮起的時間
- B1=0;//蘭燈滅
- }
- }
-
- /***********************************************/
- /********************主程序*********************/
- /***********************************************/
- void main()
- {
- TMOD=0x01;//選擇定時器在方式1下工作
- EA=1;//打開總中斷
- ET0=1;//打開定時器中斷
- TR0=1;//打開定時器
- R1=0;//開機將紅燈關閉
- G1=0;//開機將綠燈關閉
- B1=0;//開機將蘭燈關閉
- TH0=(65536-256)/256;//給定時器高8位賦值
- TL0=(65536-256)%256;//給定時器低8位賦值
- while(1)//程序主循環
- {
- RGBpwm(Rout,Gout,Bout);//調用RGBpwm子程序
- }
- }
- /*************************************************/
- /*中斷服務子程序(控制LED紅綠蘭亮滅時間占空比例)*/
- /*************************************************/
- void zhong() interrupt 1//中斷向量位為1
- {
- uint num;//定時器計數變量
- uint ji;//亮度等級控制變量
- TH0=(65536-256)/256;//給定時器高8位賦值
- TL0=(65536-256)%256;//給定時器低8位賦值
- num++;//將定時計數變自動增加1
- if(num==shudu)//如果速度變量等于定時計數器變量就執行下面大括號語句
- {
- num=0;//將計數器清0
- ji++;//將亮度等級控制變量加1
- if((ji>0)&&(ji<100))//如果亮度等級控制變量ji小于100,紅燈亮起時間變量為240
- {
- Rout=240;//紅燈亮起變量為240
- Gout=0;//綠燈亮起變量為0
- Bout=0;//蘭燈亮起變量為0
- }
- if((ji>100)&&(ji<340))/*如果亮度等級控制變量ji大于100小于340(剛好240個等級),
- 紅燈亮起時間變量由原來的240,慢慢減小到0,同時綠燈由原來的0慢慢增到240,形成
- 紅燈到綠燈的漸變過程*/
- {
- Rout-=dengji;//將紅燈變量減1。因為dengji為亮度變化等級(本程序變化等級為1),
- Gout+=dengji;//將綠燈變量加1
- Bout=0;//蘭燈不變
- }
- if((ji>340)&&(ji<440))/*亮度等級控制變量ji大于340小于440時,讓綠燈變量停一段時間
- 這樣就形成了當紅燈過度到綠燈時,綠燈會停一會兒的效果。*/
- {
- Rout=0;//紅燈滅
- Gout=240;//綠燈亮
- Bout=0;//蘭燈滅
- }
- if((ji>440)&&(ji<680))//同理:亮度等級控制變量ji大于440小于680時,由綠燈到蘭燈過度
- {
- Rout=0;//紅燈變量不變
- Gout-=dengji;//將綠燈變量減1
- Bout+=dengji;//將蘭燈變量加1
- }
- if((ji>680)&&(ji<780))//亮度等級控制變量ji大于680小于780時,讓蘭燈變量停一段時間
- {
- Rout=0;//紅燈滅
- Gout=0;//綠燈滅
- Bout=240;//蘭燈亮一會兒
- }
- if((ji>780)&&(ji<1020))//亮度等級控制變量ji大于780小于1020時,由蘭燈到白燈過度
- {
- Rout+=dengji;//將紅燈變量加1
- Gout+=dengji;//綠燈變量加1
- Bout=240;//蘭燈不變
- }
- if((ji>1020)&&(ji<1025))//亮度等級控制變量ji大于1020小于1025時,由蘭燈到白燈過度
- {
- Rout=240;//將紅燈變量加1
- Gout=240;//綠燈變量加1
- Bout=240;//蘭燈不變
- }
- if((ji>1025)&&(ji<1265))//亮度等級控制變量ji大于1025小于1265時,由白光到紅光過度
- {
- Rout=240;//紅燈變量不變
- Gout-=dengji;//綠燈變量自動減1
- Bout-=dengji;//蘭燈變量自動減1
- }
- if(ji>1265)//當亮度等級控制變量ji大于1210時,就將它清0
- ji=0;//將亮度控制等級清0
- }
- }
復制代碼
全部資料51hei下載地址:
rgb彩燈 stc11fxx.rar
(20.13 KB, 下載次數: 127)
2020-2-27 16:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|