2583|2

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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
   
}

最新回复

谢谢。。果然是赋值的时候出问题了。。  详情 回复 发表于 2009-7-8 10:32
点赞 关注

回复
举报

90

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你的中断和你的MAIN偶合太严重了。。。

想法把这两块涉及到的变量分隔开,问题可能会更清晰些
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢。。果然是赋值的时候出问题了。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表