|
|
新人發(fā)帖 如有不足 請(qǐng)各位批評(píng)指正~
本人想實(shí)現(xiàn)用PWM做一個(gè)呼吸燈 讓燈暗-亮-暗地循環(huán) 但是實(shí)際效果是燈的亮度變化不明顯 而且閃爍得很厲害 請(qǐng)各位幫忙看看我的程序哪里出了問題 謝謝各位!- #include<reg52.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit LED=P0^0;
- bit output=1;
- u8 TRH_H,TRH_L,TRL_H,TRL_L;
- //這兩個(gè)是溝通主程序和T1中斷的
- u8 T1RL,T1RH;
- u8 freq;
- u16 Period;//一個(gè)信號(hào)周期所需要的機(jī)器周期數(shù)
- u8 index=0;
- u8 code Brightness[]={51, 54, 58, 62, 65, 69, 73, 77, 81, 86, 90, 93, 95};
- void SetTimer0();
- void SetTimer1(u16);
- void AdjustBrightness(u8);
- void main()
- {
-
- EA=1;
- freq=100;
- Period=12000000/(12*freq);//一個(gè)信號(hào)的周期也就是中斷周期
-
- AdjustBrightness(Brightness[index]);
- SetTimer0();
- SetTimer1(50);
-
- while(1);
- }
- void SetTimer0()
- {
- ET0=1;
- TMOD=(TMOD&0xF0)|0x01;
- TR0=1;
- TH0=TRH_H;
- TL0=TRL_H;
- }
- void SetTimer1(u16 interval)
- {
- u16 temp=0;//記錄一個(gè)間隔=多少機(jī)器周期
- temp=interval*1000;//這個(gè)間隔以毫秒為單位 而一個(gè)機(jī)器周期又為1us 正好是一千倍的關(guān)系
- T1RH=(unsigned char)((65536-temp)>>8);
- T1RL=(unsigned char)(65536-temp);
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x10; //配置T1為模式1
- TL1=T1RL;
- TH1=T1RH;
- ET1=1;
- TR1=1;//打開定時(shí)器1的中斷
- }
- void AdjustBrightness(u8 dr)//dr=占空比
- {
- static u16 hightime,lowtime;//傳送一個(gè)信號(hào)需要多少個(gè)機(jī)器周期
-
- //下面計(jì)算高電平和低電平所需要的時(shí)間
- //并算出對(duì)應(yīng)的TRL和TRH
- hightime=Period*dr/100;
- lowtime=Period-hightime;
- TRH_H=(unsigned char)((65536-hightime)>>8);
- TRL_H= (unsigned char)(65536-hightime);//注意這里只取了低八位 高八位溢出了
- TRH_L=(unsigned char)((65536-lowtime)>>8);
- TRL_L=(unsigned char)(65536-lowtime);
- }
- void InterruptTimer0()interrupt 1
- {
- if(output==1)//如果此時(shí)輸出的是高電平
- {
- LED=output;
-
- TH0=TRH_L;
- TL0=TRL_L;
-
- output=0;
- }
- else if(output==0)//如果此時(shí)輸出的是高電平
- {
- LED=output;
-
- TH0=TRH_H;
- TL0=TRL_H;
-
- output=1;
- }
- }
- void InterruptTimer1() interrupt 3
- {
- static bit dir=0;//表示燈現(xiàn)在是往變大的方向變化還是往小的方向變化
- TH1=T1RH; //重裝
- TL1=T1RL;
- AdjustBrightness(Brightness[index]);
- if(dir==0)
- {
- index++;
- if(index>=12)
- {dir=1;}
-
- }
- else if(dir==1)
- {
- index--;
- if(index==0)
- {dir=0;}
- }
- }
復(fù)制代碼
|
|