hhwsljb 2021-10-18 11:13 采纳率: 100%
浏览 50
已结题

51单片机奇怪的延时问题

刚接触单片机没多久,弄了一个实验,用红外避障模块,控制一个舵机转指定的角度(代码是从网上找的)。正常情况下当检测到红外信号时,舵机转到90度,没有检测到就转到0度。问题出在延时那里,用了延时后,当检测到信号舵机转到90度,没有信号后却不能回归0度了。用 Keil uVision5调试程序是正常执行的,会经过延时函数到达servo = PWM(5)。百思不得其解,请各位帮忙看看,是代码有问题么?用的单片机是STC15F104W,stc-isp版本是v6.88i,代码编写用的 Keil uVision5。

#include <STC15F104E.H>
#define PWM_T 200                     //产生中断的时间,因为是24MHz,200即100微妙(0.1毫秒)
int PWM_count0 = 0;                    //进入中断的次数
int PWM_count1 = 0;                    //与上面的类似,用于计数
int PWM_F = 0;                        //一个用于计时的标志,作用类似定时器的TF0、TF1
int YS = 0; 
sbit servo = P3^3;                   //舵机信号线所连接的IO口
sbit ceju=P3^2;                      //    红外检测信号
int count;      //中断次数变量
bit flag = 0; //标志时间结束

void PWM_Start()                      //PWM初始化函数,打开了定时器0
{  EA = 1;  
   ET0 = 1;  
   TMOD |= 0x01;  
   TR0 = 1;  
   TH0 = (65536-PWM_T)/256;  
   TL0 = (65536-PWM_T)%256;
}
int PWM(int PWM_value)                //控制PWM输出的子函数
{  if(PWM_count0 <= PWM_value)  
{    return 1;  
}  
else  {    return 0;  
}
}
void Delay1000ms()        //@24.000MHz  STC官方的例子
{
    unsigned char i, j, k;

    i = 92;
    j = 50;
    k = 238;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void main()
{  PWM_Start();                        //PWM开始运行  
 
 
while(1) {        
if(ceju == 0)      
{       servo = PWM(15);               //旋转至90° 
      
     }
     else  
  
{      
          //Delay1000ms();              //这一句保留就会出问题
         servo = PWM(5);                //旋转至0°                             
          
        
}
  

} 
}
void Timer0() interrupt 1
{  TH0 = (65536-PWM_T)/256;  
TL0 = (65536-PWM_T)%256;  
PWM_count0++;  
if(PWM_count0 == 200)                //过了20ms,完成了一个PWM周期  
{    PWM_count0 = 0;                    //清零,重新开始计数    
PWM_count1++;    
if(PWM_count1 == 50)              //PWM_count0清零了50次,也就是说过了20ms*50=1000ms=1s    
{      PWM_count1 = 0;                  //清零,重新开始计数      
PWM_F = 1;                      //标志置1,说明已经过了2s    
}  
}
}
  • 写回答

2条回答 默认 最新

  • ferguson26 2021-10-18 14:17
    关注

    软延时导致 PWM()没有正常执行。
    你的软延时远高于PWN周期,不要用软延时。
    扫描周期的问题,不是程序没走到

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 修改了问题 10月18日
  • 修改了问题 10月18日
  • 展开全部

悬赏问题

  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan