找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 841|回复: 11
收起左侧

求51单片机智能小车使用中断函数调速对延时影响的解决办法

[复制链接]
ID:1064841 发表于 2023-3-25 10:43 | 显示全部楼层 |阅读模式
本人在用中断函数调速时,发现在主函数中延时函数不准确,或者程序一直卡在延时函数里不出来,求大佬解决办法
具体代码如下:
#include <REG51.h>
#include "OLED.h"
#include "bmp.h"
#include "TIMER0.H"
#include "Delay.H"
//#include "Motor.H"
#include "Direction.h"
//#include "bi_zhang.h"
#include "xunji.h"
#include "chaoshengbo.h"

sbit EN1=P3^0;
sbit EN2=P3^1;
sbit EN3=P3^2;
sbit EN4=P3^3;

unsigned int pwml,pwmr,t;//左右占空比,比较值
unsigned char Distance__;
//unsigned int n=0,i,j,k;//这些变量不清楚,先留着
unsigned int m;

void delay__(unsigned int ms)
{
    TMOD &= 0xF0; // 设置定时器0为模式1,16位定时器/计数器
    TMOD |= 0x01;
    TH0 = (65536 - 1000) / 256; // 设置定时器初值
    TL0 = (65536 - 1000) % 256;
    TR0 = 1; // 启动定时器
    while (ms--)
    {
        while (!TF0); // 等待定时器溢出
        TF0 = 0; // 清除定时器溢出标志
        TH0 = (65536 - 1000) / 256; // 重新设置定时器初值
        TL0 = (65536 - 1000) % 256;
    }
    TR0 = 0; // 停止定时器
}

void main()
{      
        u8 t=' ';
        OLED_Init();//初始化OLED
        OLED_ColorTurn(0);//0正常显示,1 反色显示
        OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
        Timer0_Init();

        while(1)
        {
                xun_ji();
                Distance__=GetDistance();
                OLED_ShowString(1,1,"Distance: ",16);
                OLED_ShowNum(75,1,Distance__,2,16);
               
                if(Distance__<20.8)
                {
//                        all_stop();
                       
//                        m=1;
                        pwml=pwmr=10;
                        delay__(1000);
                        xun_ji();
                }
                else if(Distance__>21)
                {
//                        m=0;
                        xun_ji();
                }
                OLED_ShowNum(12,40,m,1,16);
        }
      
}




//定时器中断函数
void Timer0_Routine() interrupt 1
{
        TL0 = (65536-100)%256;                //设置定时初始值
        TH0 = (65536-100)/256;                //设置定时初始值
        t++;//周期计时加
        //左pwm
        if(t<pwml)
        {
                EN1 = 1;
                EN2 = 1;
        }
        else
        {
                EN1 = 0;
                EN2 = 0;
        }
        //右pwm
        if(t<pwmr)
        {
                EN3 = 1;
                EN4 = 1;
        }
        else
        {
                EN3 = 0;
                EN4 = 0;
        }

        if(t>=100){t = 0;}

}


回复

使用道具 举报

ID:857072 发表于 2023-3-25 11:17 来自手机 | 显示全部楼层
请抛弃include "Delay.H。延时函数只在教学演示程序里使用,以方便理解。正式工程里是不用的。
回复

使用道具 举报

ID:857072 发表于 2023-3-25 11:19 来自手机 | 显示全部楼层
不过比中断调用耗时差不多的比如延时个几微秒还是可以用的。
回复

使用道具 举报

ID:1064841 发表于 2023-3-25 11:22 | 显示全部楼层
a185980800 发表于 2023-3-25 11:17
请抛弃include "Delay.H。延时函数只在教学演示程序里使用,以方便理解。正式工程里是不用的。

那请问,我要实现小车在循迹的过程中停止5秒,再循迹,这个过程中停止5秒该怎么实现
回复

使用道具 举报

ID:1064841 发表于 2023-3-25 11:27 | 显示全部楼层
a185980800 发表于 2023-3-25 11:19
不过比中断调用耗时差不多的比如延时个几微秒还是可以用的。

可是我需要实现延时很长的功能,这颗咋办
回复

使用道具 举报

ID:844772 发表于 2023-3-25 15:29 来自手机 | 显示全部楼层
不要用同一个中断,另外中断里写的太多,时间太短
回复

使用道具 举报

ID:1064841 发表于 2023-3-25 16:26 | 显示全部楼层
glinfei 发表于 2023-3-25 15:29
不要用同一个中断,另外中断里写的太多,时间太短

可是我只用了一个中断函数,只不过延时函数是和中断用的同一个定时器
回复

使用道具 举报

ID:1034262 发表于 2023-3-25 22:50 | 显示全部楼层
项目程序,不要使用软件延时,不要使用查询的延时,切记!现在的MCU速度都会很快,延时1ms就浪费掉超过1万条指令的时间了。
回复

使用道具 举报

ID:1064841 发表于 2023-3-26 09:53 | 显示全部楼层
coody_sz 发表于 2023-3-25 22:50
项目程序,不要使用软件延时,不要使用查询的延时,切记!现在的MCU速度都会很快,延时1ms就浪费掉超过1万 ...

那请问大佬我该怎么样才能实现延时5秒的功能了
回复

使用道具 举报

ID:434018 发表于 2023-3-26 11:12 | 显示全部楼层
使用简单的状态机,就可以解决.
回复

使用道具 举报

ID:844772 发表于 2023-3-27 09:12 | 显示全部楼层
WangMC 发表于 2023-3-25 16:26
可是我只用了一个中断函数,只不过延时函数是和中断用的同一个定时器

1.你看一下,定时器里面设置是100,外部又设置成1000,定时器溢出是按100来的,所以延时就不准;
2.不知道你延时干啥用,但在小车控制里不宜用延时等待。
3.定时器按100配置,又要干那么多事,很容易卡死的。
建议就用定时器提供一个时间计数器,所有任务按这个计数器工作。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表