欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
這個單片機電機控制程序運行不了,沒找到原因
[打印本頁]
作者:
Fengziwen
時間:
2019-2-9 22:49
標題:
這個單片機電機控制程序運行不了,沒找到原因
我是直接接在單片機開發板上的,L298N的IN1~4分別接的是P1_0~P1_4,程序燒錄后,發現并不能成功運行。然后我就猜想可能沒有進入motor()這個函數,我就直接在讀取紅外線數據的那個中斷函數的switch里面,將程序改成我注釋里面的內容發現可以成功遙控輪子動。但是我將關于定時器的函數全部刪掉,再將main里面的flag也刪掉,發現依舊進不去motor()這個函數。
單片機程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
sbit IRIN=P3^2; //紅外接收器數據線
sbit M1 = P1^0;
sbit M2 = P1^1;
sbit M3 = P1^2;
sbit M4 = P1^3;
sbit EN12 = P1^4;
sbit EN34 = P1^5;
uchar IRCOM[7];
uchar m,n;
uchar t=2;
uchar count;
bit flag;
void delayxms(uchar t);
void delay(unsigned char x) ;
void delay1(int ms);
void motor();
void main()
{
uint a;
IRIN=1; //I/O口初始化
IE=0x83; //允許總中斷中斷,使能 INT0 外部中斷
TCON=TCON|0x01; //觸發方式為脈沖負邊沿觸發
lcd_init();
TMOD=0x51;
TH0=(65536-50000)/256;
TL0=(65536-50000)/256;
TR0=1;
count=0;
while(1)
{
TR1=1;
TH1=0;
TL1=0;
flag=0;
while(flag==0);
motor();
}
}
/**********************************************************/
void IR_IN() interrupt 0 using 0
{
unsigned char j,k,N=0;
unsigned char q=0;
EX0 = 0;
delay(15);
if (IRIN==1)
{
EX0 =1;
return;
}
//確認IR信號出現
while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。
delay(1);
for (j=0;j<4;j++) //收集四組數據
{
for (k=0;k<8;k++) //每組數據有8位
{
while (IRIN)
{delay(1);} //等 IR 變為低電平,跳過4.5ms的前導高電平信號。 {delay(1);}
while (!IRIN) //等 IR 變為高電平
delay(1);
while(IRIN)
{
delay(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms計數過長自動離開。
} //高電平計數完畢
IRCOM[j]=IRCOM[j] >> 1; //數據最高位補“0”
if(N>=8)
{
IRCOM[j] = IRCOM[j] | 0x80; //數據最高位補“1”
}
N=0;
}
}
if(IRCOM[2]!=~IRCOM[3])
{
EX0=1;
return;
}
IRCOM[5]=IRCOM[2] & 0x0F; //取鍵碼的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位變為低四位
if(IRCOM[5]>9)
{
IRCOM[5]=IRCOM[5]+0x37;
}
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{
IRCOM[6]=IRCOM[6]+0x37;
}
else
IRCOM[6]=IRCOM[6]+0x30;
q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));
switch(q) //判斷按鍵鍵碼值
{
case 0x03:t++;if(t>=5)t=4;break; //串口發送01
case 0x18:n=2;break; //串口發送02 M1=0;M2=1;M3=1;M4=0;break;
case 0x55:t--;if(t<=0)t=0;break; //串口發送03
case 0x08:n=4;break; //串口發送04 M1=0;M2=0;M3=1;M4=0;break;
case 0x13:n=5;break; //串口發送05 M1=0;M2=1;M3=0;M4=0;break;
case 0x51:n=6;break; //串口發送06
case 0x52:n=8;break; //串口發送08 M1=0;M2=0;M3=0;M4=0;break;
}
EX0 = 1;
}
/***************延時函數*****************************/
void delay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void motor()
{
EN12=1;
EN34=1;
switch( n)
{
case 2: //前進
M1=1;
M2=0;
M3=1;
M4=0;
break;
case 4: //左轉
M1=0;
M2=0;
M3=1;
M4=0;
break;
case 6: //右轉
M1=1;
M2=0;
M3=0;
M4=0;
break;
case 8: //后退
M1=0;
M2=1;
M3=0;
M4=1;
break;
case 5:
EN12=0;
EN34=0;
break;
default :break;
}
}
/*******************************************************
函數功能:定時器T0的中斷服務函數
********************************************************/
void Time0(void ) interrupt 1 using 1 //定時器T0的中斷編號為1,使用第1組工作寄存器 {
{
count++; //T0每中斷1次,count加1
if(count==20) //若累計滿20次,即計滿1秒鐘
{
flag=1; //計滿1秒鐘標志位置1
count=0; //清0,重新統計中斷次數
}
TH0=(65536-46083)/256; //定時器T0高8位重新賦初值
TL0=(65536-46083)%256; //定時器T0低8位重新賦初值
}
void delay1(int ms)
{
unsigned char y;
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
//************************************************************
void delayxms(uchar t)
{
uint i;
uchar j;
for(j=t;j>0;j--)
for(i=80;i>0;i--); //延時124*8+10=1002us
}
復制代碼
作者:
yaoji123
時間:
2019-2-10 09:14
將flag為1時進入motor(),while(flag){motor()},希望有用。
作者:
wulin
時間:
2019-2-11 16:47
void main()
{
uint a;
IRIN=1; //I/O口初始化
IE=0x83; //允許總中斷中斷,使能 INT0 外部中斷
TCON=TCON|0x01; //觸發方式為脈沖負邊沿觸發
lcd_init();
TMOD=0x51;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
TR0=1;
TR1=1;
TH1=0;
TL1=0;
count=0;
while(1)
{
if(flag==1)
{
flag=0;
TH1=0;
TL1=0;
motor();
}
}
}
作者:
iofree
時間:
2019-2-12 12:57
樓主,問題出在主函數的這兩句:
flag=0;
while(flag==0);
你把flag賦值為0,又執行一個while為真的空循環,可不一直就死耗在這里,無法走到下一步的Motor函數,不明白你的用意,或者你是手誤多打了一個分號?
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1