51单片机中控制PWM波

    #include <reg52.h>
    sbit PWMOUT = P0^0;
    sbit ADDR0 = P1^0;
    sbit ADDR1 = P1^1;
    sbit ADDR2 = P1^2;
    sbit ADDR3 = P1^3;
    sbit ENLED = P1^4;
    unsigned char HighRH = 0; //高电平重载值的高字节
    unsigned char HighRL = 0; //高电平重载值的低字节
    unsigned char LowRH = 0; //低电平重载值的高字节
    unsigned char LowRL = 0; //低电平重载值的低字节
    void ConfigPWM(unsigned int fr, unsigned char dc);
    void ClosePWM();
    void main(){
        unsigned int i;
        EA = 1; //开总中断
        ENLED = 0; //使能独立 LED
        ADDR3 = 1;
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 0;

        while (1){
            ConfigPWM(100, 10); //频率 100Hz,占空比 10%
            for (i=0; i<40000; i++);
            ClosePWM();
            ConfigPWM(100, 40); //频率 100Hz,占空比 40%
            for (i=0; i<40000; i++);
            ClosePWM();
            ConfigPWM(100, 90); //频率 100Hz,占空比 90%
            for (i=0; i<40000; i++);
            ClosePWM(); //关闭 PWM,相当于占空比 100%
            for (i=0; i<40000; i++);
        }
    }
    /* 配置并启动 PWM,fr-频率,dc-占空比 */
    void ConfigPWM(unsigned int fr, unsigned char dc){
        unsigned int high, low;
        unsigned long tmp;

        tmp = (11059200/12) / fr; //计算一个周期所需的计数值
        high = (tmp*dc) / 100; //计算高电平所需的计数值
        low = tmp - high; //计算低电平所需的计数值
        high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时
        low = 65536 - low + 12;//计算低电平的重载值并补偿中断延时

        HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
        HighRL = (unsigned char)high;
        LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
        LowRL = (unsigned char)low;

        TMOD &= 0xF0; //清零 T0 的控制位
        TMOD |= 0x01; //配置 T0 为模式 1
        TH0 = HighRH; //加载 T0 重载值
        TL0 = HighRL;
        ET0 = 1; //使能 T0 中断
        TR0 = 1; //启动 T0
        PWMOUT = 1; //输出高电平
    }
    /* 关闭 PWM */
    void ClosePWM(){
        TR0 = 0; //停止定时器
        ET0 = 0; //禁止中断
        PWMOUT = 1; //输出高电平
    }
    /* T0 中断服务函数,产生 PWM 输出 */
    void InterruptTimer0() interrupt 1{
        if (PWMOUT == 1){ //当前输出为高电平时,装载低电平值并输出低电平
            TH0 = LowRH;
            TL0 = LowRL;
            PWMOUT = 0;
        }else{ //当前输出为低电平时,装载高电平值并输出高电平
            TH0 = HighRH;
            TL0 = HighRL;
            PWMOUT = 1;
        }
    }
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值