標(biāo)題:
單片機定時器初始化后整個程序不能運行了,求大神解答!
[打印本頁]
作者:
三五行天
時間:
2021-3-30 20:47
標(biāo)題:
單片機定時器初始化后整個程序不能運行了,求大神解答!
我是單片機小白,剛接觸幾天。我做的是一個智能小車,三個功能,避障、遙控、追光,分別用遙控的ABC鍵切換程序。用了定時器0來輸出pwm波調(diào)速。但是我在主函數(shù)下寫了定時器初始化函數(shù)后就怎么按鍵都不動了,去掉后三個功能正常切換運作(但是不能調(diào)速),是怎么回事呢?下附完整代碼,小白一個代碼寫得很爛,注釋有些地方還沒改,跪求大佬解答。
單片機源程序如下:
//包含所需要的頭文件
#include<AT89X52.h>
#include< BoeBot.h>
#include<uart.h>
#define uint unsigned int
#define uchar unsigned char
int PWMON;
uchar time;
double countA=30; //定義占空比A(右),并初始占空比為27%
double countB=36; //定義占空比B(左),并初始占空比為30%
sbit IN1=P1^0; //輸出IN1
sbit IN2=P1^1; //輸出IN2
sbit IN3=P1^2; //輸出IN3
sbit IN4=P1^3; //輸出IN4
sbit PWMA=P1^4; //輸出PWMA
sbit PWMB=P1^5; //輸出PWMB
sbit comparatorA=P3^5; //右邊電壓比較器A
sbit comparatorB=P3^3; //左邊電壓比較器B
//采用宏定義紅外發(fā)射、接收端口,便于更改端口進(jìn)行調(diào)試
sbit LeftIR=P3^2; //左邊紅外接收連接到P2_4
sbit RightIR=P3^4; //右邊紅外接收連接到P2_5
int irDetectLeft; //定義整型左紅外接收變量
int irDetectRight; //定義整型右紅外接收變量
/***********定時器0初始化***********/
void timer0_init()
{
TMOD=0x01; // 定時器0設(shè)置工作模式1
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
ET0=1;
EA=1;
}
/**************定時0中斷處理******************/
void timer0_int() interrupt 1
{
TR0=0; //設(shè)置定時器初值期間,關(guān)閉定時器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
time++;
if(time<countA) //countA為占空比
{
PWMA=1; //輸出高電平
}
else
PWMA=0;
if(time<countB) //countB為占空比
{
PWMB=1; //輸出高電平
}
else
PWMB=0;
if(time>=100)
{
time=0;
}
}
int P3_2state(void) //子函數(shù):調(diào)用后返回P2_4位的值
{
return (P3&0x04)?1:0; //將P2口八個位與0x08(00000100)進(jìn)行"與"運算,若為非零就返回1,若為零就返回零
}
int P3_4state(void) //子函數(shù):調(diào)用后返回P2_5位的值
{
return (P3&0x10)?1:0; //將P2口八個位與0x10(00010000)進(jìn)行"與"運算,若為非零就返回1,若為零就返回零
}
void bizhang()
{
irDetectLeft=P3_2state(); //調(diào)用子函數(shù),獲得左紅外接收變量值
irDetectRight=P3_4state(); //調(diào)用子函數(shù),獲得右紅外接收變量值
printf("irDetectLeft=%d ",irDetectLeft); //利用串口輸出左紅外接收變量值
printf("irDetectRight=%d\n",irDetectRight); //利用串口輸出右紅外接收變量值
delay_nms(20); //隔20毫秒后再次重復(fù)此紅外探測過程
if (irDetectLeft==1&&irDetectRight==1) //無障礙
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
if (irDetectLeft==1&&irDetectRight==0) //右邊有障礙,左轉(zhuǎn)
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
delay_nms(200);
}
if (irDetectLeft==0&&irDetectRight==1) //左邊有障礙,右轉(zhuǎn)
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
delay_nms(200);
}
if (irDetectLeft==0&&irDetectRight==0) //兩邊有障礙,先后退再右轉(zhuǎn)
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
delay_nms(300);
IN3=1;
IN4=0;
IN1=0;
IN2=1;
delay_nms(200);
}
}
void zhuiguang()
{
if(comparatorA==0&&comparatorB==1) //左邊有光,右電機加速
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
if(comparatorA==1&&comparatorB==0) //右邊有光,左電機加速
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
if(comparatorA==1&&comparatorB==1) //兩邊有光,直行
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
if(comparatorA==0&&comparatorB==0) //兩邊無光,停止
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
}
void main() //無操作數(shù)主函數(shù)
{
timer0_init();
while(1)
{
if(P0_1==1) //如果A被按下
{
delay_nms(10); //延時10ms,防止干擾抖動
if(P0_1==1)//確認(rèn)A按鈕按下無誤后
{
while(1)
{
bizhang(); //避障功能
if(P0_2==1)break;
}
}
}
if(P0_3==1) //如果B被按下
{
delay_nms(10); //延時10ms,防止干擾抖動
if(P0_3==1)//確認(rèn)B按鈕按下無誤后
{
while(1)
{
if((P0_0==0)&&(P0_1==0)&&(P0_2==0)&&(P0_3==0))//不操作遙控器
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
if((P0_1==1)&&(P0_0==0)&&(P0_2==0)&&(P0_3==0))//按A鍵,左轉(zhuǎn)
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
delay_nms(200);
}
if((P0_0==0)&&(P0_3==1)&&(P0_1==0)&&(P0_2==0))//按B鍵,右轉(zhuǎn)
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
delay_nms(200);
}
if((P0_0==1)&&(P0_3==0)&&(P0_1==0)&&(P0_2==0))//按C鍵,前進(jìn)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
delay_nms(1000);
}
if(P0_2==1)break;
}
}
}
if(P0_0==1) //如果C被按下
{
delay_nms(10); //延時10ms,防止干擾抖動
if(P0_0==1)//確認(rèn)C按鈕按下無誤后
{
while(1)
{
zhuiguang(); //追光功能
if(P0_2==1)break;
}
}
}
if(P0_2==1) //如果D被按下
{
delay_nms(10); //延時10ms,防止干擾抖動
if(P0_2==1)//確認(rèn)D按鈕按下無誤后
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
}
}
}
復(fù)制代碼
作者:
三五行天
時間:
2021-3-31 16:06
在第178行
作者:
jianuli
時間:
2021-3-31 20:18
我遇到定時器定200微秒時程序像卡住一樣,運行超慢,你會不會也是這樣?
作者:
tyrl800
時間:
2021-3-31 20:50
時間都用在定時器中斷了
作者:
yhang18
時間:
2021-3-31 21:05
49 void timer0_int ()
178 timer0_init()
馬虎了你,呵呵。找出不一樣的地方
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1