欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
求大佬看下單片機(jī)程序的問(wèn)題,在實(shí)物中小車不動(dòng)
[打印本頁(yè)]
作者:
我是靴子
時(shí)間:
2020-5-23 22:50
標(biāo)題:
求大佬看下單片機(jī)程序的問(wèn)題,在實(shí)物中小車不動(dòng)
<避障小車的問(wèn)題,在實(shí)物中小車不動(dòng)
#include<reg52.h> //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include"lcd.h"
#include<intrins.h>
#define uchar unsigned char //無(wú)符號(hào)字符型 宏定義 變量范圍0~255
#define uint unsigned int //無(wú)符號(hào)整型 宏定義 變量范圍0~65535
/***************超聲波**I/O口******************/
sbit Trig = P2^3; //超聲波測(cè)距模塊Trig
sbit Echo = P2^4; //超聲波測(cè)距模塊Echo
/*****************蜂鳴器******************/
sbit beep = P2^7; //蜂鳴器
/*****************舵機(jī)******************/
sbit SG_PWM = P3^7; //舵機(jī)
/****************電機(jī)驅(qū)動(dòng)**IO口******************/
/*使能端*/
sbit ENA = P2^5; //左下電機(jī)pwm信號(hào)端
sbit ENB = P2^6; //右下電機(jī)pwm信號(hào)端
sbit ENC = P3^0; //左上電機(jī)pwm信號(hào)端
sbit END = P3^1; //右上電機(jī)pwm信號(hào)端
/*電機(jī)口*/
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit IN3 = P1^2;
sbit IN4 = P1^3;
sbit IN5 = P1^4;
sbit IN6 = P1^5;
sbit IN7 = P1^6;
sbit IN8 = P1^7;
/***************定義全局變量******************/
static unsigned char DisNum = 0; //顯示用指針
unsigned char table[]="Distance:";
unsigned char code ASCII[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','M',};
unsigned int time=0; //用于存放定時(shí)器時(shí)間的值
unsigned long S=0; //用于存放距離的值
unsigned long S1=0;
unsigned long S2=0;
unsigned long S3=0;
unsigned int timer=10000; //延時(shí)基準(zhǔn)變量
bit flag =0; //超聲波超出量程溢出標(biāo)志位
unsigned char disbuff[4] = { 0,0,0,0,}; //用于存放距離的值0.1mm、mm、cm和m的值
unsigned char pwm_val_left1 = 0; //左下電機(jī)變量定義
unsigned char pwm_val_right1 =0; //右下電機(jī)變量定義
unsigned char pwm_val_left2 = 0; //左上電機(jī)變量定義
unsigned char pwm_val_right2 = 0; //右下電機(jī)變量定義
unsigned char push_val_left1 = 0; //左下電機(jī)占空比N/20
unsigned char push_val_right1 =0; //右下電機(jī)占空比N/20
unsigned char push_val_left2 = 0; //左上電機(jī)占空比N/20
unsigned char push_val_right2 = 0; //右下電機(jī)占空比N/20
unsigned char count=0; //0.2ms次數(shù)標(biāo)識(shí)
unsigned char PWM_count=5; //舵機(jī)歸中
/******************************************************************************
* 函 數(shù) 名 : Delay1ms
* 函數(shù)功能 : 延時(shí)函數(shù),延時(shí)1ms
*******************************************************************************/
void Delay1ms(uint j)
{
uchar k;
while(j--)
{
for(k = 120; k > 0; k--);
}
}
/******************************************************************************
* 函 數(shù) 名 : feng
* 函數(shù)功能 : 報(bào)警函數(shù)
*******************************************************************************/
void feng()
{
if(S<=40)
{
beep=~beep;
Delay1ms(50);
}
else
beep=1;
}
void StartModule() //啟動(dòng)模塊
{
Trig=1; //啟動(dòng)一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
//計(jì)算距離
void Conut(void)
{
TH0=0;
TL0=0;
while(!Echo); //當(dāng)RX為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(Echo); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來(lái)是CM
if((S>=450)||flag==1) //超出測(cè)量范圍顯示“-”
{
flag=0;
DisplayOneChar(10, 0, ASCII[11]);
DisplayOneChar(11, 0, ASCII[10]); //顯示點(diǎn)
DisplayOneChar(12, 0, ASCII[11]);
DisplayOneChar(13, 0, ASCII[11]);
DisplayOneChar(14, 0, ASCII[12]); //顯示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
DisplayOneChar(10, 0, ASCII[disbuff[0]]);
DisplayOneChar(11, 0, ASCII[10]); //顯示點(diǎn)
DisplayOneChar(12, 0, ASCII[disbuff[1]]);
DisplayOneChar(13, 0, ASCII[disbuff[2]]);
DisplayOneChar(14, 0, ASCII[12]); //顯示M
}
}
void Timer0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
{
flag=1; //中斷溢出標(biāo)志
}
void run(void) //前進(jìn)
{
push_val_left1 = 10; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個(gè)值可以改變其速度
push_val_right1 = 10;
push_val_left2 = 10;
push_val_right2 = 10;
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
IN5 = 1;
IN6 = 0;
IN7 = 1;
IN8 = 0;
}
void backrun(void) //后退
{
push_val_left1 = 8; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個(gè)值可以改變其速度
push_val_right1 = 8;
push_val_left2 = 8;
push_val_right2 = 8;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
IN5 = 0;
IN6 = 1;
IN7 = 0;
IN8 = 1;
}
void leftrun(void) //左轉(zhuǎn)
{
push_val_left1 = 7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個(gè)值可以改變其速度
push_val_right1 = 7;
push_val_left2 = 7;
push_val_right2 = 7;
IN1 = 0;
IN2 = 0;
IN3 = 1;
IN4 = 0;
IN5 = 0;
IN6 = 0;
IN7 = 1;
IN8 = 0;
}
void rightrun(void) //右轉(zhuǎn)
{
push_val_left1 = 7; //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢,20是最快 改這個(gè)值可以改變其速度
push_val_right1 = 7;
push_val_left2 = 7;
push_val_right2 = 7;
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 0;
IN5 = 1;
IN6 = 0;
IN7 = 0;
IN8 = 0;
}
void stop(void) //停止
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
IN5 = 0;
IN6 = 0;
IN7 = 0;
IN8 = 0;
}
//pwm控制電機(jī)速度
void pwm_out_left1_moto(void) //左下電機(jī)
{
if(pwm_val_left1<=push_val_left1)
ENA=1;
else
ENA=0;
if(pwm_val_left1>=20)
pwm_val_left1=0;
else
ENA=0;
}
void pwm_out_right1_moto(void) //右下電機(jī)
{
if(pwm_val_right1<=push_val_right1)
ENB=1;
else
ENB=0;
if(pwm_val_right1>=20)
pwm_val_right1=0;
else
ENB=0;
}
void pwm_out_left2_moto(void) //左上電機(jī)
{
if(pwm_val_left2<=push_val_left2)
ENC=1;
else
ENC=0;
if(pwm_val_left2>=20)
pwm_val_left2=0;
else
ENC=0;
}
void pwm_out_right2_moto(void) //右上電機(jī)
{
if(pwm_val_right2<=push_val_right2)
END=1;
else
END=0;
if(pwm_val_right2>=20)
pwm_val_right2=0;
else
END=0;
}
void timer1 () interrupt 3 //中斷產(chǎn)生pwm信號(hào)
{
TH1=0xFC;
TL1=0x18; //1ms延時(shí)
pwm_val_left1++;
pwm_val_right1++;
pwm_val_left2++;
pwm_val_right2++;
pwm_out_left1_moto();
pwm_out_right1_moto();
pwm_out_left2_moto();
pwm_out_right2_moto();
}
//舵機(jī)控制方向函數(shù)
void COMM(void)
{
count=1; //舵機(jī)向左轉(zhuǎn)90度
Delay1ms(1000); //延時(shí)1000ms讓舵機(jī)轉(zhuǎn)到位置
StartModule(); //啟動(dòng)測(cè)距
Conut();
S2=S; //得到左邊距離
count=9; //舵機(jī)右轉(zhuǎn)
Delay1ms(1000); //延時(shí)1000ms讓舵機(jī)轉(zhuǎn)到位置
StartModule(); //啟動(dòng)測(cè)距
Conut();
S3=S; //得到右邊距離
count=5; //舵機(jī)歸中
Delay1ms(1000); //延時(shí)1000ms讓舵機(jī)轉(zhuǎn)到位置
StartModule(); //啟動(dòng)測(cè)距
Conut();
S1=S; //得到中間距離
if((S2<10)||(S3<10)) //只要左右各有距離小于10CM小車后退
{
backrun();
Delay1ms(1000);
}
if(S2>S3) //車的左邊比車的右邊距離小右轉(zhuǎn)
{
rightrun();
Delay1ms(1000);
}
else //車的左邊比車的右邊距離大 左轉(zhuǎn)
{
leftrun();
Delay1ms(1000);
}
}
void Timer2() interrupt 5
{
TF2=0;
TH2=(65536-200)>>8;
TL2=(65536-200);
count=count+1;
if(count >100)
{
count = 0;
}
if(count<=compare)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
} //次數(shù)始終保持為40即保持周期為20ms
}
/***************初始化定時(shí)器************/
void init_T0()
{
TMOD=0x01; //設(shè)T0為方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允許T0中斷
EA=1; //開啟總中斷
}
void init_T1()
{
TMOD=0x11; //設(shè)T1為方式1,GATE=1;
TH1=0xFC;
TL1=0x18; //1ms延時(shí)
ET1=1; //允許T1中斷
EA=1; //開啟總中斷
TR1=1; //t1開啟及時(shí)
}
void init_T2()
{
T2CON=0;
TH2=0xfe;
TL2=0x0c; //0.5ms
ET2=1; //允許T1中斷
EA=1; //開啟總中斷
TR2=1; //t2開啟及時(shí)
}
void main()
{
init_T0();
init_T1();
init_T2();
LcdInit();
LcdShowStr(0,0,table);
Delay1ms(5);
count=5;
while(1)
{
StartModule();
Conut();
feng();
if(S<=10)
{
stop();
COMM();
}
else
{
run();
}
}
}
復(fù)制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1