本人在用中斷函數調速時,發現在主函數中延時函數不準確,或者程序一直卡在延時函數里不出來,求大佬解決辦法
具體代碼如下:
#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;}
}
|