新人发帖 如有不足 请各位批评指正~
本人想实现用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;}
- }
- }
复制代码
|