|
|
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define P0_State P0
sbit leftmotor_in1=P2^7;
sbit leftmotor_in2=P2^6;
sbit rightmotor_in3=P2^5;
sbit rightmotor_in4=P2^4;
sbit Trig=P1^1;
sbit Echo=P1^2;
sbit en_1=P2^3;
sbit en_2=P2^2;
uint S,time,i,j,pwm1,pwm2;
void stop();
void straight();
void turn_left();
void turn_right();
void Sensor_5_Car_State_Adjustment();
void delay20us(unsigned char t)
{
while(--t);
}
/*******延時函數——延時50ms*******/
void delay(uint xms) //@11.0592MHz
{
unsigned char m, n;
for(m=xms;m>0;m--)
for(n=110;n>0;n--);
}
void csb()
{
Trig=1;
delay20us(20);
Trig=0;
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
time=TH0*256+TL0;
S=(time*1.7)/100;
TH0=0;
TL0=0;
}
void T0_time()interrupt 1
{
}
void T1_time()interrupt 3
{
TR1=0;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
i++;
j++;
if(i<pwm1)
{
en_1=1;
}
else
en_1=0;
if(j<pwm2)
{
en_2=1;
}
else
en_2=0;
if(i>=100)
{
i=0;
}
if(j>=100)
{
j=0;
}
TR1=1;
}
void main()
{
TMOD=0x10;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
TH0=0;
TL0=0;
ET1=1;
ET0=1;
TR1=1;
TR0=0;
EA=1;
while(1)
{
csb();
if(S>10)
{
straight();
}
else if(S<=10)
{
stop();
}
}
}
void straight() //直走函數
{
leftmotor_in1=0;
leftmotor_in2=1;
rightmotor_in3=0;
rightmotor_in4=1;
}
void turn_left() //左轉函數
{
leftmotor_in1=1;
leftmotor_in2=0;
rightmotor_in3=0;
rightmotor_in4=1;
}
void turn_right() //右轉函數
{
leftmotor_in1=0;
leftmotor_in2=1;
rightmotor_in3=1;
rightmotor_in4=0;
}
void stop() //停止函數
{
leftmotor_in1=0;
leftmotor_in2=0;
rightmotor_in3=0;
rightmotor_in4=0;
}
void Sensor_5_Car_State_Adjustment()
{
P0_State=P0_State&0x00;
switch(P0_State)
{
case 0x1b: pwm1=40;
pwm2=40;
straight(); //P0.0|P0.1|P0.2|P0.3|P0.4為11011說明小車正常尋跡下一步小車直行
break;
case 0x1d: //P0.0|P0.1|P0.2|P0.3|P0.4為11101說明小車左偏下一步小車右拐
pwm2=30;
pwm1=30;
turn_right();
break;
case 0x17: //10111
pwm2=35;
pwm1=35;
turn_left();
//P0.0|P0.1|P0.2|P0.3|P0.4為10111說明小車右偏下一步左拐
break;
case 0x03:
pwm1=50;
pwm2=50;
straight();
delay(1);
//P1.0|P1.1|P1.2|P1.3|P1.4為00011說明小車遇到左T標置物小車左拐
pwm1=30;
pwm2=40;
turn_left();
break;
case 0x18:
pwm1=50;
pwm2=50;
straight();
delay(1);
//P0.0|P0.1|P0.2|P0.3|P0.4為11000說明小車遇到右T標志物下一步小車右拐
pwm1=40;
pwm2=40;
turn_right();
break;
case 0x11: //P0.0|P0.1|P0.2|P0.3|P0.4為00001說明小車遇到十字標志物下一步直行
case 0x10: //P0.0|P0.1|P0.2|P0.3|P0.4為10001說明小車遇到十字標志物體下一步小車直行
case 0x01: //P0.0|P0.1|P0.2|P0.3|P0.4為10000說明小車遇到十字標志物下一步直行
case 0x00: //P0.0|P0.1|P0.2|P0.3|P0.4為00000說明小車遇到十字標志物下一步小車直行
pwm1=40;
pwm2=40;
turn_right();
delay(50);
break;
case 0x1c:
//11100
pwm1=40;
pwm2=40;
turn_right();
if(P0^2==0)
break;
break;
case 0x07:
//00111
pwm1=40;
pwm2=40;
turn_left();
delay(100);
break;
case 0x0b : //01011
pwm1=40;
pwm2=20;
turn_left();
break;
case 0x1a: //11010
pwm1=30;
pwm2=40;
turn_right();
break;
case 0x0f: //01111
pwm1=40;
pwm2=40;
turn_left();
delay(50);
break;
case 0x1e:
pwm1=40;
pwm2=40;
turn_right(); //11110
delay(50);
break;
default:
break; //P.0|P0.1|P0.2|P0.3|P0.4 其他情況不做任何改動
}
}
|
|
相關帖子
- • 第2章 點亮你的LED 2.1 2.2 2.3
- • 這是定義的問題嗎,用的c語言,怎么都改不對
- • adc_dma進行采集時打印數據為0,不開dma數據能夠正常顯示,想問一下是什么原因
- • 單片機不使用外部中斷,如何LED顯示程序?
- • 做了個替BF7612CM的測試
- • Keil程序求助,這些報錯怎么解決,小白一個,剛接觸單片機
- • 求用at89c51單片機測LM331 V/F轉化后的頻率 我的沒有顯示
- • MCU模擬SPI通信,能發送數據,接收不到數據
- • 菜鳥求助 這個問題怎么解決,已經在oledfont.h定義了 還是報錯
- • STM32單片機向ESP8266發送指令,設置延時1秒上傳一次數據,延時不準確
- • 單片機矩陣按鍵 原理圖+源代碼
- • 通過手機藍牙APP發出控制指令,控制3個以上LED燈亮滅和蜂鳴器報警和關閉,怎么做 求指導
- • 關于用51單片機驅動AD9851的原理及其編程思路?
- • 單片機用點陣LED實現靜態字符顯示實驗程序
- • 關于單片機矩陣鍵盤多位數的輸入程序問題
- • CCS10.2編譯器貌似不支持部分GNU的__attribute__
- • “+5.5019e+06”一類的數據轉換問題
- • 89C51聲光報警系統(轉載)
- • 51單片機自行車里程表設計C程序看不懂,求指教
- • 51單片機IIC協議 & EEPROM讀寫程序
|
|
|
|
|
|