|
#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 其他情况不做任何改动
}
}
|
|
相关帖子
- • 这是定义的问题吗,用的c语言,怎么都改不对
- • adc_dma进行采集时打印数据为0,不开dma数据能够正常显示,想问一下是什么原因
- • 单片机不使用外部中断,如何LED显示程序?
- • 做了个替BF7612CM的测试
- • Keil程序求助,这些报错怎么解决,小白一个,刚接触单片机
- • 求用at89c51单片机测LM331 V/F转化后的频率 我的没有显示
- • MCU模拟SPI通信,能发送数据,接收不到数据
- • 菜鸟求助
- • STM32单片机向ESP8266发送指令,设置延时1秒上传一次数据,延时不准确
- • 单片机矩阵按键 原理图+源代码
- • 通过手机蓝牙APP发出控制指令,控制3个以上LED灯亮灭和蜂鸣器报警和关闭,怎么做 求指导
- • 关于用51单片机驱动AD9851的原理及其编程思路?
- • 单片机用点阵LED实现静态字符显示实验程序
- • 关于单片机矩阵键盘多位数的输入程序问题
- • CCS10.2编译器貌似不支持部分GNU的__attribute__
- • “+5.5019e+06”一类的数据转换问题
- • 89C51声光报警系统(转载)
- • 51单片机自行车里程表设计C程序看不懂,求指教
- • 51单片机IIC协议 & EEPROM读写程序
- • 单片机入门到高级开挂学习路径
|
|
|
|
|