新人發帖 如有不足 請各位批評指正~
本人想實現用PWM做一個呼吸燈 讓燈暗-亮-暗地循環 但是實際效果是燈的亮度變化不明顯 而且閃爍得很厲害 請各位幫忙看看我的程序哪里出了問題 謝謝各位!- #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;
- //這兩個是溝通主程序和T1中斷的
- u8 T1RL,T1RH;
- u8 freq;
- u16 Period;//一個信號周期所需要的機器周期數
- 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);//一個信號的周期也就是中斷周期
-
- 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;//記錄一個間隔=多少機器周期
- temp=interval*1000;//這個間隔以毫秒為單位 而一個機器周期又為1us 正好是一千倍的關系
- 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;//打開定時器1的中斷
- }
- void AdjustBrightness(u8 dr)//dr=占空比
- {
- static u16 hightime,lowtime;//傳送一個信號需要多少個機器周期
-
- //下面計算高電平和低電平所需要的時間
- //并算出對應的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)//如果此時輸出的是高電平
- {
- LED=output;
-
- TH0=TRH_L;
- TL0=TRL_L;
-
- output=0;
- }
- else if(output==0)//如果此時輸出的是高電平
- {
- LED=output;
-
- TH0=TRH_H;
- TL0=TRL_H;
-
- output=1;
- }
- }
- void InterruptTimer1() interrupt 3
- {
- static bit dir=0;//表示燈現在是往變大的方向變化還是往小的方向變化
- 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;}
- }
- }
復制代碼
|