本帖最后由 TzMVP 于 2020-10-21 00:00 编辑
PWMPWM(脉冲宽度调制)对模拟信号电平进行数字编码的方法,计算机只能输出0或5V的数字电压值而不能输出模拟电压,而我们如果想获得一个模拟电压值,则需通过使用高分辨率计数器,改变方波的占空比来对一个模拟信号的电平进行编码。
51单片机的Timer控制PWM需要用到定时器来生成不同占空比的波形,采用定时器中断的方式。 1.IE寄存器 2. TCON寄存器 3. TMOD寄存器
4. Timer0/1计数寄存器 TL1 TH1 而当TL0(TL1)和TH0(TH1)都满了以后,此时如果定时中断和总中断都已经打开,那么就会发生溢出中断,同时这两个寄存器清零。 运用PWM完成呼吸灯硬件电路
程序设计:
- unsigned char PWM_COUNT; //计数
- unsigned int HUXI_COUNT; //占空比更新时间
- unsigned char PWM_VLAUE; //占空比比对值
- bit direc_flag; //占空比更新方向
- void timer0_init()
- {
- TMOD = 0x02; //模式设置,00010000,定时器0,工作于模式2(M1=1,M0=0)
- TH0 = 0x47; //定时器溢出值设置,每隔200us发起一次中断。
- TL0 = 0X47;
- TR0 =1; //定时器0开始计时
- ET0 =1; //开定时器0中断
- EA = 1; //开总中断
- PWM_COUNT =0;
- }
- void time0() interrupt 1
- {
- PWM_COUNT++;
- HUXI_COUNT++;
- if(PWM_COUNT == PWM_VLAUE) //判断是否到了点亮LED的时候
- LED = 1; //点亮LED
- if(PWM_COUNT == 10) //当前周期结束
- {
- LED = 0; //熄灭LED
- PWM_COUNT = 0; //重新计时
- }
- if((HUXI_COUNT == 600) && (direc_flag == 0))
- {
- //占空比增加10%
- HUXI_COUNT = 0;
- PWM_VLAUE++;
- if(PWM_VLAUE == 9) //占空比更改方向
- direc_flag = 1;
- }
- if((HUXI_COUNT == 600) && (direc_flag == 1))
- {
- //占空比减少10%
- HUXI_COUNT = 0;
- PWM_VLAUE--;
- IF(PWM_VLAUE == 1) //占空比更改方向
- DIREC_FLAG = 0;
- }
- }
- void main()
- {
- HUXI_COUNT = 0;
- PWM_COUNT = 0;
- PWM_VLAUE = 5;
- direc_flag = 0;
- LED = 1; //默认LED熄灭
- timer0_init(); //定时器0初始化
- while(1);
- }
复制代码 |