请教开天斧开发板用中断模拟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);
}
问题可能出现在high = (11059*dc)/100;这里,dc为char型,11059编译器会默认为int型,两个相乘的结果大于int型的65535,试试改成high = (11059L*dc)/100;
话说不是有硬件pwm么,那个更简单而且更稳定 chen 发表于 2023-12-13 23:30
问题可能出现在high = (11059*dc)/100;这里,dc为char型,11059编译器会默认为int型,两个相乘的结果大于in ...
感谢大神的指点,解决了困扰我几日的难题,更改后波形已输出正常,关于这个芯片有PWM的问题,这段代码是我另一个(stc11f02e)硬件上的,那个单片机上没有pwm,我还以为那个芯片有问题才将代码移植到开天斧开发板上,再有就是好多坛友都有这个硬件,也方便提问,再次感谢!!! 感谢 51 官方论坛 荣誉版主,路见不平拔刀相助 收藏了,我也有几片STC11F02E,你这个程序很有用,我留着备用 wangxiangtan 发表于 2023-12-25 15:29
收藏了,我也有几片STC11F02E,你这个程序很有用,我留着备用
{:4_165:}相互学习 wangxiangtan 发表于 2023-12-25 15:29
收藏了,我也有几片STC11F02E,你这个程序很有用,我留着备用
都什么年代了 ?
还收藏 这个经典老古董 ~~~~~~ {:lol:} LAOXU 发表于 2023-12-26 03:37
都什么年代了 ?
还收藏 这个经典老古董 ~~~~~~
拆机件,被时间验证过了的经典{:4_197:}
页:
[1]