本人在用中断函数调速时,发现在主函数中延时函数不准确,或者程序一直卡在延时函数里不出来,求大佬解决办法
具体代码如下:
#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;}
}
|