MarkOne 发表于 2023-12-13 23:11:32

请教开天斧开发板用中断模拟PWM的问题

开天斧开发板,用中断方式产生1000HZ的PWM控制LED0灯的亮度,想输出占空比为50%的PWM输出,为什么输出的波形不对,帮忙看哈程序哪里有问题


#include <stc8h.h>
sbit LED0=P2^0;
sbit LED1=P2^1;

unsigned char HighRH=0;             //高电平重载值的高字节
unsigned char HighRL=0;             //高电平重载值的低字节
unsigned char LowRH=0;            //低电平重载值的高字节
unsigned char LowRL=0;            //低电平重载值的低字节
/***********配置PWM占空比,周期为1000HZ******/
void ConfigPWM( unsigned char dc)
{
    unsigned int high,low;
    high = (11059*dc)/100; // 计算高电平所需的计数值
    low = 11059 - 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;
                AUXR |= 0x80;                        //定时器时钟1T模式
                TMOD &= 0xF0;                        //设置定时器模式
                TMOD |= 0x01;                        //设置定时器模式
                TL0 = HighRL;                                //设置定时初始值
                TH0 = HighRH;                                //设置定时初始值
                TF0 = 0;                                //清除TF0中断标志
          ET0=1;         //打开T0中断
                TR0 = 1;                                //定时器0开始计时
                LED0=1;          //输出高电平
               
}
/************定时器0中断,产生PWM**************/
void InterruptTimer0() interrupt 1
{               
                   if(LED0==1)//当前输出为高电平时,装载低电平值并输出低电平
    {
      TH0 = LowRH;
      TL0 = LowRL;
      LED0 = 0;                               
    }
    else            //当前输出为低电平时,装载高电平值并输出高电平
    {
      TH0 = HighRH;
      TL0 = HighRL;
      LED0 = 1;                       
    }             
}

void main()
{       
P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
        EA=1;
        LED1=0;       
        ConfigPWM(50);
        while(1);       
}
       

chen 发表于 2023-12-13 23:30:25

问题可能出现在high = (11059*dc)/100;这里,dc为char型,11059编译器会默认为int型,两个相乘的结果大于int型的65535,试试改成high = (11059L*dc)/100;

话说不是有硬件pwm么,那个更简单而且更稳定

MarkOne 发表于 2023-12-14 20:45:56

chen 发表于 2023-12-13 23:30
问题可能出现在high = (11059*dc)/100;这里,dc为char型,11059编译器会默认为int型,两个相乘的结果大于in ...

感谢大神的指点,解决了困扰我几日的难题,更改后波形已输出正常,关于这个芯片有PWM的问题,这段代码是我另一个(stc11f02e)硬件上的,那个单片机上没有pwm,我还以为那个芯片有问题才将代码移植到开天斧开发板上,再有就是好多坛友都有这个硬件,也方便提问,再次感谢!!!

神农鼎 发表于 2023-12-14 22:47:26

感谢 51 官方论坛 荣誉版主,路见不平拔刀相助

wangxiangtan 发表于 2023-12-25 15:29:51

收藏了,我也有几片STC11F02E,你这个程序很有用,我留着备用

MarkOne 发表于 2023-12-25 21:23:53

wangxiangtan 发表于 2023-12-25 15:29
收藏了,我也有几片STC11F02E,你这个程序很有用,我留着备用

{:4_165:}相互学习

LAOXU 发表于 2023-12-26 03:37:18

wangxiangtan 发表于 2023-12-25 15:29
收藏了,我也有几片STC11F02E,你这个程序很有用,我留着备用

都什么年代了 ?

还收藏 这个经典老古董 ~~~~~~ {:lol:}

wangxiangtan 发表于 2023-12-26 08:08:17

LAOXU 发表于 2023-12-26 03:37
都什么年代了 ?

还收藏 这个经典老古董 ~~~~~~

拆机件,被时间验证过了的经典{:4_197:}
页: [1]
查看完整版本: 请教开天斧开发板用中断模拟PWM的问题