3517|3

8

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助如何优化程序 [复制链接]

我用定时器定时0.01ms来输出PWM信号(周期1ms)来控制电机转速,并把占空比显示在数码管上,但是数码管怎么总是闪烁呢?是不是定时器中断函数拖了时间呢?
求程序优化
代码如下:

#include
#include"main.h"
#include"delay.h"
void gostraight();
void turnleft();
void turnright();
void goback();
void inittimer0();
void PWM1speed();
void PWM2speed();
void display(uchar tmp1,uchar tmp2);
sbit PWM1=P3^0;
sbit PWM2=P3^1;
sbit RIN4=P3^2;
sbit RIN3=P3^3;
sbit LIN2=P3^4;
sbit LIN1=P3^5;
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit s1=P2^4;
sbit s2=P2^5;
sbit s3=P2^6;
sbit s4=P2^7;
uchar code a[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极0~9显示码
static int time=0;
uchar high1=50;
uchar high2=50;
uchar total=100;
void gostraight()
{
  RIN3=0;
  RIN4=1;
  LIN1=0;
  LIN2=1;
}
void turnleft()
{
   RIN3=0;
   RIN4=1;
   LIN1=1;
   LIN2=0;
}
void turnright()
{
   RIN3=1;
   RIN4=0;
   LIN1=0;
   LIN2=1;
}
void goback()
{
   RIN3=1;
   RIN4=0;
   LIN1=1;
   LIN2=0;
}
void inittimer0()        //初始化T0
{
   TMOD=0x01;
   TH0=(65536-10)/256;
   TL0=(65536-10)%256;
   EA=1;
   ET0=1;
   TR0=1;
}
void PWM1speed()     // 电机1占空比调节
{
   if(s1==0)
   {
      delay_ms(5);
   if(s1==0)
   {
      high1++;
   if(high1==99)
   {high1=1;}
    }
}
if(s2==0)
{
    delay_ms(5);
    if(s2==0)
    {
       high1--;
    if(high1==1)
    {high1=total-1;}
  }
}
// return (high1);
}
void PWM2speed()      //电机2占空比调节
{
if(s3==0)
{
    delay_ms(5);
    if(s3==0)
    {
       high2++;
    if(high2==99)
    {high2=1;}
  }
}
if(s4==0)
{
    delay_ms(5);
    if(s4==0)
    {
       high2--;
    if(high2==1)
    {high2=total-1;}
  }
}
// return (high2);      
}
void timer0() interrupt 1      //定时器中断
{
   TH0=(65536-10)/256;
   TL0=(65536-10)%256;
   time++;
   if(time<=high1)  
   {
      PWM1=1;
}
else
{
    PWM1=0;        
}
if(time<=high2)
{
    PWM2=1;
}
else
{
    PWM2=0;
}
if(time>=total)
{time=0;}
}
   
void display(uchar tmp1,uchar tmp2)      //显示占空比
{
   uchar dat;
   dat=tmp1/10;
   P0=a[dat];
   P2_0=1;  
   delay_ms(1);
   P2_0=0;
   dat=tmp1%10;
   P0=a[dat];
   P2_1=1;
   delay_ms(1);
   P2_1=0;
   
   dat=tmp2/10;
   P0=a[dat];
   P2_2=1;
   delay_ms(1);
   P2_2=0;
   
   dat=tmp2%10;
   P0=a[dat];
   P2_3=1;
   delay_ms(1);
   P2_3=0;
   
}  
     
void main()
{
  // uchar i;
  // uchar j;
   P0=0xff;
   P2=0xFF;
   inittimer0();
   while(1)
   {     
   PWM1speed();
      PWM2speed();
      display(high1,high2);
   gostraight();
  // turnleft();
//  turnright();
//  goback();
}
}

[ 本帖最后由 chenjin59324 于 2013-3-5 21:22 编辑 ]
此帖出自51单片机论坛

最新回复

建议你还是先把程序模块化以提高可读性!  详情 回复 发表于 2013-3-10 15:35
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
你的定时器时间太短了,%99的时间都在timer0() 里执行
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
没有pwm模块你只能每个pwm控制点中断,开销太大了.而且频率高了pwm周期不稳定.
控制点的周期=pwm周期/调控点数量,你算算...

[ 本帖最后由 huo_hu 于 2013-3-6 09:23 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

182

帖子

0

TA的资源

一粒金砂(高级)

4
 
建议你还是先把程序模块化以提高可读性!
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表