注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
云南白药的个人空间 https://home.eeworld.com.cn/space-uid-481790.html [收藏] [复制] [分享] [RSS]
日志

基于A60S2单片机的超声波避障c程序

已有 630 次阅读2013-8-22 19:15

/*基于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;    
    }
 
}
}
}
 
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章