|
我用STC15W201S把網(wǎng)上資料用定時(shí)器1改成定時(shí)器2實(shí)現(xiàn)七彩燈漸變。主程序中的while(1),我注解后工作不正常的變化了,變成綠燈閃爍了。我自己的理解沒有while(1),就不循環(huán)了,漸變一次就會(huì)停止,燈滅。怎么不是我想的那樣?這種現(xiàn)象如何理解?單片機(jī)程序如下:
#include"stc15wxx.h"
#define uchar unsigned char
#define uchar unsigned char//字浮型宏定義
#define uint unsigned int//整型宏定義
#define shudu 30//LED漸變速度調(diào)整
#define dengji 1//LED變化等級調(diào)整
uchar Rout,Bout,Gout;//紅綠蘭3個(gè)變量
sbit R1=P3^1; // 輪流七彩變色呼吸 3.0 紅色
sbit G1=P5^5;// 3.1 綠色
sbit B1=P3^0; // 3.2 藍(lán)色
/***************************************************/
/**********************延時(shí)子程序*******************/
/***************************************************/
void delay(uint z)
{
uint x,y;//局部變量定義
for(x=0;x<5;x++)//延時(shí)外循環(huán)
for(y=0;y<z;y++);//延時(shí)內(nèi)循環(huán)
}
/**********************************************/
/**********PWM控制紅綠蘭3種燈亮滅時(shí)間**********/
/**********************************************/
void RGBpwm(uchar Rou,uchar Gou,uchar Bou)//3個(gè)局部變量,些部分為帶參數(shù)函數(shù)
{
if(Rou!=0)//如果紅燈變量不等于0就亮紅燈
{
R1=1;//紅燈亮
delay(Rou);//紅燈亮起時(shí)間
R1=0;//紅燈滅
}
if(Gou!=0)//如果紅燈變量不等于0就亮綠燈
{
G1=1;//綠燈亮
delay(Gou);//綠燈亮起的時(shí)間
G1=0;//綠燈滅
}
if(Bou!=0)//如果紅燈變量不等于0就亮藍(lán)燈
{
B1=1;//蘭燈亮
delay(Bou);//蘭燈亮起的時(shí)間
B1=0;//蘭燈滅
}
}
/***********************************************/
/********************主程序*********************/
/***********************************************/
void main()
{
// TMOD=0x01;//選擇定時(shí)器在方式1下工作
// EA=1;//打開總中斷
// ET0=1;//打開定時(shí)器中斷
// TR0=1;//打開定時(shí)器
// R1=0;//開機(jī)將紅燈關(guān)閉
// G1=0;//開機(jī)將綠燈關(guān)閉
// B1=0;//開機(jī)將蘭燈關(guān)閉
// TH0=(65536-256)/256;//給定時(shí)器高8位賦值
// TL0=(65536-256)%256;//給定時(shí)器低8位賦值
AUXR &= 0xFB; //定時(shí)器時(shí)鐘12T模式
T2L = 0xB4; //設(shè)置定時(shí)初始值 FEB4 30us
T2H = 0xFE; //設(shè)置定時(shí)初始值
AUXR |= 0x10; //定時(shí)器2開始計(jì)時(shí)
EA = 1;
IE2 |= 0X04;
R1=0;//開機(jī)將紅燈關(guān)閉
G1=0;//開機(jī)將綠燈關(guān)閉
B1=0;//開機(jī)將蘭燈關(guān)閉
while(1)//程序主循環(huán):次句注解后現(xiàn)象變成綠燈閃爍,沒有注解漸變正常!
{
RGBpwm(Rout,Gout,Bout);//調(diào)用RGBpwm子程序
}
}
/*************************************************/
/*中斷服務(wù)子程序(控制LED紅綠蘭亮滅時(shí)間占空比例)*/
/*************************************************/
//void zhong() interrupt 1//中斷向量位為1
void zhong() interrupt 12//中斷向量位為12
{
uint num;//定時(shí)器計(jì)數(shù)變量
uint ji;//亮度等級控制變量
// TH0=(65536-256)/256;//給定時(shí)器高8位賦值
// TL0=(65536-256)%256;//給定時(shí)器低8位賦值
T2L = 0xB4; //設(shè)置定時(shí)初始值 FEB4 30us
T2H = 0xFE; //設(shè)置定時(shí)初始值
num++;//將定時(shí)計(jì)數(shù)變自動(dòng)增加1
if(num==shudu)//如果速度變量等于定時(shí)計(jì)數(shù)器變量就執(zhí)行下面大括號語句
{
num=0;//將計(jì)數(shù)器清0
ji++;//將亮度等級控制變量加1
if((ji>0)&&(ji<100))//如果亮度等級控制變量ji小于100,紅燈亮起時(shí)間變量為240
{
Rout=240;//紅燈亮起變量為240
Gout=0;//綠燈亮起變量為0
Bout=0;//蘭燈亮起變量為0
}
if((ji>100)&&(ji<340))/*如果亮度等級控制變量ji大于100小于340(剛好240個(gè)等級),
紅燈亮起時(shí)間變量由原來的240,慢慢減小到0,同時(shí)綠燈由原來的0慢慢增到240,形成
紅燈到綠燈的漸變過程*/
{
Rout-=dengji;//將紅燈變量減1。因?yàn)閐engji為亮度變化等級(本程序變化等級為1),
Gout+=dengji;//將綠燈變量加1
Bout=0;//蘭燈不變
}
if((ji>340)&&(ji<440))/*亮度等級控制變量ji大于340小于440時(shí),讓綠燈變量停一段時(shí)間
這樣就形成了當(dāng)紅燈過度到綠燈時(shí),綠燈會(huì)停一會(huì)兒的效果。*/
{
Rout=0;//紅燈滅
Gout=240;//綠燈亮
Bout=0;//蘭燈滅
}
if((ji>440)&&(ji<680))//同理:亮度等級控制變量ji大于440小于680時(shí),由綠燈到蘭燈過度
{
Rout=0;//紅燈變量不變
Gout-=dengji;//將綠燈變量減1
Bout+=dengji;//將蘭燈變量加1
}
if((ji>680)&&(ji<780))//亮度等級控制變量ji大于680小于780時(shí),讓蘭燈變量停一段時(shí)間
{
Rout=0;//紅燈滅
Gout=0;//綠燈滅
Bout=240;//蘭燈亮一會(huì)兒
}
if((ji>780)&&(ji<1020))//亮度等級控制變量ji大于780小于1020時(shí),由蘭燈到白燈過度
{
Rout+=dengji;//將紅燈變量加1
Gout+=dengji;//綠燈變量加1
Bout=240;//蘭燈不變
}
if((ji>1020)&&(ji<1025))//亮度等級控制變量ji大于1020小于1025時(shí),由蘭燈到白燈過度
{
Rout=240;//將紅燈變量加1
Gout=240;//綠燈變量加1
Bout=240;//蘭燈不變
}
if((ji>1025)&&(ji<1265))//亮度等級控制變量ji大于1025小于1265時(shí),由白光到紅光過度
{
Rout=240;//紅燈變量不變
Gout-=dengji;//綠燈變量自動(dòng)減1
Bout-=dengji;//蘭燈變量自動(dòng)減1
}
if(ji>1265)//當(dāng)亮度等級控制變量ji大于1210時(shí),就將它清0
ji=0;//將亮度控制等級清0
}
}
|
|