|
51单片机控制PWM时的诡异问题 请帮忙看一下 谢谢
[复制链接]
这个程序是用51单片机控制L298,输出pwm波控制直流电机,调试没错误,又加了键盘控制。然后就碰见诡异问题了。用键盘控制高电平占用一个周期的时间。(高低和是10) 在高1低9的时候没问题,但高电平再加,如果不按住键盘输出的一直是最高电压。按住键盘的时候输出的电压才对。而软仿真的时候监控变量都是对的。。。请高手帮忙看看是怎么回事 谢谢
#include
#define _TH0_TL0_ (65536 - 10000)
#define HI (_TH0_TL0_ / 256) //给高8位赋值
#define LO (_TH0_TL0_ % 256) //给低8位赋值
#define M 20
#define uchar unsigned char
#define uint unsigned int
sbit pwm=P1^0;
sbit zheng=P1^1;
sbit k1=P1^2;
sbit k2=P1^3;
sbit k3=P1^4;
sbit LED1=P2^5;
uchar highT=0;
uchar lowT;
uchar highA;
uchar lowA;
////////////////////////////
////////////////////////////
///// 时间中断
void Timer0Init(void) //初始化定时器0程序
{
TMOD = 0x01; //设置模式1 定时器0 工作方式0
TH0 = HI; //给TH0,TL0赋初始值
TL0 = LO;
TR0 = 1; //启动定时器0
ET0 = 1; //定时器中断开
EA = 1; //总中断开
}
void IsrTimer0(void) interrupt 1 using 1 //定时器0中断服务程序
{
TR0 = 0; //以下调整出栈入栈的时间误差
TL0 += (_TH0_TL0_ + 9) % 256;
TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;
TR0 = 1;
if(highA>0)
{
highA--;
pwm=1;
}
if(highA==0)
{
if(lowA>0)
{
lowA--;
pwm=0;
}
if(lowA==0)
{
highA=highT;
lowA=lowT;
}
}
}
/////////////////////
////////////////////
///键盘
void delayKEY(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
void main(void)//主函数
{
k1=1;
k2=1;
k3=1;
zheng=1;
LED1=1;
Timer0Init();//初始化定时器0
while(1)
{
if(k1==0) //KEY1键实现数据增加
{
delayKEY(50);
if(k1==0)
highT--;
// if(highT<0)
// highT=0;
while(!k1);
}
if(k2==0) //key2键盘实现数据减
{
if(k2==0)
delayKEY(50);
if(k2==0)
highT++;
// if(highT>10)
// highT=10;
while(!k2);
}
if(highT>10)
highT=10;
if(highT<0)
highT=0;
lowT=10-highT;
highA=highT;
lowA=lowT;
}//while over
}
|
|