/*基于A60S2的超声波避障C程序
通过PWM调速来实现避障功能
由于只用到 一个超声波,所以避障灵活性不高
主要是试验用直流电机完成避障功能
*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit fa=P3^1; // 定义发射端IO口
sbit jie=P3^2; //接收端IO口
uchar timeh,timel;
uint juli;
bit flag,flag1; //标志位
sbit ch=P2^1;
sbit lcdrs=P2^0;
sbit lcden=P2^2;
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_20us()
{
uchar a ;
for(a=0;a<100;a++);
}
sbit a0=P1^0; //zuo
sbit a1=P1^1;
sbit ENA=P1^3; //you
sbit ENB=P1^4; //zuo
sbit b0=P1^2; //you
sbit b1=P1^5;
sfr CMOD = 0XD9; //PCA工作模式寄存器
sfr CCON = 0XD8; //PCA控制寄存器
sfr CL = 0XE9; //16位计数器低8位
sfr CH = 0XF9; // 高八位
/*PCA模块工作模式设定寄存器*/
sfr CCAPM0 = 0XDA;
sfr CCAPM1 = 0XDB;
/*PCA捕获寄存器四个模块*/
sfr CCAP0L = 0XEA;
sfr CCAP0H = 0XFA;
sfr CCAP1L = 0XEB;
sfr CCAP1H = 0XFB;
sfr P1M0=0X92;
sfr P1M1=0X91;
sbit CR=CCON^6; //计数器阵列运行控制位
void qianjin() //前进函数
{
CCAP0L=22; //z
CCAP0H=22;
CCAP1L=23; // y
CCAP1H=22;
a0=1;
a1=0;
b0=1;
b1=0;
}
void turn_right() //右拐
{
CCAP0L=0X00;
CCAP0H=0X00;
a0=1;
a1=0;
CCAP1L=150; //zuo
CCAP1H=150;
b0=0;
b1=1;
}
void turn_left() //左拐
{
CCAP1L=0X00; //zuo
CCAP1H=0X00;
a0=0;
a1=1;
CCAP1L=0X150; //zuo
CCAP1H=0X150;
b0=1;
b1=0;
}
void write_data(uchar date) //液晶显示数据函数
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/***************************************************************
写命令函数
/**************************************************************/
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void ledinit()
{
write_com(0x38);//初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
//显示数据转换程序
void display(uint temp)
{
uchar ge,shi,bai;
bai=temp/100;
shi=(temp%100)/10;
ge=temp%10;
write_com(0x80);
write_data(bai+'0');
write_data(shi+'0');
write_data(ge+'0');
}
void init() interrupt 0
{
timeh=TH0;
timel=TL0;
flag=1;
}
void pwminit() //PWM初始化
{
P1M0=0X00;
P1M1=0X00; //设置P1口弱上拉,准双向模式(标准8051 i/o模式)
CMOD=0X00; //脉冲源SYClk/12
CCON=0X00;
CCAPM0=0X42; //PWM输出模式
CCAPM1=0X42; //PWM输出模式
CH=0X00;
CL=0X00;
CCAP0L=0X00;
CCAP0H=0X00;
CCAP1L=0X00;
CCAP1H=0X00;
CR=1; //开始计数
}
//**************主函数***************//
void main()
{ pwminit();
flag=0;
fa=0;
TMOD=0x01;
EA=1;
IT0=1;
EX0=0;
ledinit();
delay(10);
qianjin();
ch=1;
flag1=0;
while(1)
{
EA=0;
fa=1;
delay_20us();
fa=0;
while(jie==0);
EX0=1;
TH0=0;
TL0=0;
TR0=1;
EA=1;
flag=0;
while(TH0<60);
EX0=0;
TR0=0;
if(flag)
{
juli=timeh;
juli<<=8;
juli|=timel;
juli=juli*0.0173;
display(juli);
if(juli<15 && juli>0)
{
flag1=1;
}
else
{
flag1=0;
qianjin();
}
while(flag1)
{
turn_left();
ch=0;
delay(3500);
qianjin();
ch=1;
delay(6000);
turn_right();
ch=0;
delay(3800);
qianjin();
ch=1;
delay(12000);
turn_right();
ch=0;
delay(3800);
qianjin();
ch=1;
delay(6000);
turn_left();
ch=0;
delay(3500);
qianjin();
ch=1;
break;
}
}
}
}