/*基于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; } } } }
|