智能小车循迹,避障,红外遥控C语言知识学习代码

合集下载

红外循迹小车c程序(舵机小车)

红外循迹小车c程序(舵机小车)

#include<reg52.h>sbit servo=P2^5;uint control=12;uint jishu;uint pianchu;sbit zuo11=P3^4; //为0为左边正转sbit zuo12=P3^5; //为1为左边正转sbit you21=P3^6; //为1为右边正转sbit you22=P3^7; //为0为右边正转uint sp,speed=3;uint ji=1,guang,bi; //判断循迹寻光变量uint stop1,stop2,stop3;void delay(uint a){uint b,c;for(b=a;b>0;b--)for(c=115;c>0;c--);}void qianjin() //可以当做延时函数来用{// P3=0x0f;// delay(speed);P3=0xf9;}void initial_T0(){TMOD=0x21;TH1=0x8c;TL1=0x8c;EA=1;ET1=1;TR1=1;}void xunji(){if(P1==0x00){qianjin();}// if(P1==0x20)// {// //加速// qianjin();// speed=2;// qianjin();// qianjin();// }if(P1==0x10){//左转qianjin();control+=1;qianjin();while(P1!=0x20){if(P1==0x08){//大角度左转qianjin();qianjin();control+=1;while(P1!=0x10){// if(P1==0x00) //偏出跑道,小车停止// {// speed=10000;// }pianchu++;if(pianchu>=20000){break;}}control-=1;qianjin();qianjin();}pianchu++;if(pianchu>=20000){break;}}pianchu=0;control-=1;qianjin();qianjin();}if(P1==0x40){//右转qianjin();control-=1;qianjin();while(P1!=0x20){if(P1==0x80){//大角度右转qianjin();control-=1;qianjin();while(P1!=0x40){// if(P1==0x00) //偏出跑道,小车停止// {// speed=10000;// }pianchu++;if(pianchu>=20000){break;}}qianjin();control+=1;qianjin();}pianchu++;if(pianchu>=20000){break;}}pianchu=0;qianjin();control+=1;qianjin();}}void main(){initial_T0();P1=0xf8;while(1){stop1=P1;if(stop1==stop2){stop3++;}else{stop3=0;}xunji();if(P1==0x80||P1==0x08||stop3>10000){P3=0x00;while(1);}stop2=P1;}}void T0_waytwo() interrupt 3 {if(jishu<control)servo=1;elseservo=0;jishu++;jishu=jishu%160;}。

循迹小车程序代码

循迹小车程序代码

//(在MAIN中接受铁片颜色判断传感器的信号来赋值) unsigned char Light_Flag=0;//进入光引导区的标志(1) unsigned int cntTime_5Min=0;//时间周期数,用于 T0 精确定时 unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数 /*============================全局变量定义区 ============================*/ /*------------------------------------------------*/ /*-----------------通用延迟程序-------------------*/ /*------------------------------------------------*/ void delay(unsigned int time) { unsigned int i,j; for(j=0;j<time;j++) { for(i=0;i<60;i++) {;} } } /*-----------------------------------------------*/ /*-------------------显示控制模块----------------*/ /*-----------------------------------------------*/ /*数码管显示,显示铁片的数目(设接在P0,共阴)*/ void Display(unsigned char n) { char Numb[12]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n]; } // time*0.5ms延时

智能循迹小车电磁组C语言源代码(stc12c5a芯片)

智能循迹小车电磁组C语言源代码(stc12c5a芯片)

智能循迹小车电磁组C语言源代码(stc12c5a芯片)#include#include#define FOSC 18432000L#define BAUD 9600#define ADC_POWER 0x80 //ADC power control bit 电源控制位#define ADC_FALG 0x10 //ADC complete flag 标志位#define ADC_START 0x08 //ADC start control bit 启动控制位#define ADC_SPEEDLL 0x00 //420 clocks#define ADC_SPEEDL 0x20 //280 clocks#define ADC_SPEEDH 0x40 //140 clocks#define ADC_SPEEDHH 0x60 //70 clockstypedef unsigned char BYTE;typedef unsigned int WORD;float bj1,bj2;int cg1,cg2,go;go=0x05; //电机驱动设为0101BYTE ch=0;void InitADC();void Delay(WORD n);void kongzhi();void PWM();void GetADCResult(BYTE ch);void main(){P0=0X00; //P0口的LED灯全亮InitADC(); //初始化ADIE=0xa0;PWM(); //调用PWM函数while(1){GetADCResult(ch); //读取AD值并赋值给变量kongzhi(); //调用控制函数}}void GetADCResult(BYTE ch) //读取AD的函数{ADC_CONTR &=!ADC_FALG;for(ch=0;ch<2;ch++){switch(ch){case 0: ADC_CONTR=0xe9; //定义P1.1为AD转换 1110 1001 _nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FALG));ADC_CONTR&=~ADC_FALG; //清除falg位cg1=ADC_RES; //把传到P1.1口的AD值(二进制)赋值给cg1 break;case 1: ADC_CONTR=0xea; //定义P1.2口为AD转换1110 1010_nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FALG));ADC_CONTR&=~ADC_FALG;cg2=ADC_RES; //把传到P1.2口的AD值(二进制)赋值给cg2 break;default: break;}}if(++ch>=2) ch=0;}void InitADC() //初始化AD函数{P1ASF=0XE7; // 1110 0111 //定义为AD转换的IO口P1M0=0xE7 ; // P1.7-P1.0:1110 0111P1M1=0xE7 ; // P1.7-P1.0:1110 0111ADC_RES=0;ADC_CONTR=0xe9;Delay(2);}void Delay(WORD n) //延时函数{WORD x;while(n--){x=5000;while(x--);}}void kongzhi(){bj1=((cg2*5/256)-(cg1*5/256)); //两个传感器所检测到的电压的差值bj2=((cg1*5/256)-(cg2*5/256));if((bj1<1)&&(bj2<1)) //全速{CCAP0H=0x08; //左轮CCAP1H=0x00; //右轮P3=go;}else if(bj1>4/3) //强左拐{CCAP0H=0x40; //左轮CCAP1H=0x00; //右轮P3=go;}else if(bj1>1&&bj1<4/3) //微左拐{CCAP0H=0x22; //左轮CCAP1H=0x00; //右轮P3=go;}else if(bj2>1&&bj2<4/3) //微右拐{CCAP0H=0x00; //左轮CCAP1H=0x18; //右轮P3=go;}else if(bj2>4/3) //强右拐{CCAP0H=0x00; //左轮CCAP1H=0x35; //右轮P3=go;}}void PWM(){CCON=0;CL=0;CH=0;CMOD=0X02;CCAP0H=CCAP0L=0X80;CCAPM0=0X42; //允许比较器功能、PWM脉宽输出CCAP1H=CCAP1L=0X80;PCA_PWM0=0x00; //组成9位P1.3PCA_PWM1=0x00; //组成9位P1.4CCAPM1=0X42;CR=1; //启动PCA计数器阵列}。

智能小车_走黑线_避障_物体跟随_红外遥控_C程序

智能小车_走黑线_避障_物体跟随_红外遥控_C程序
bit flag_bizhang=0;
bit flag_gensui=0;
bit flag_yaokong=0;
void delay(unsigned int n)
{
unsigned char i, j,k;
for(k=0;k<=n;k++)
{
_nop_();
_nop_();
i = 5;
j = 6 ;
do
{
while (--j);
} while (--i);
}
}
void beep(void)
{
unsigned char i;
for(i=0;i<3;i++)
{
BUZZ=~BUZZ;
delay(10);
}
BUZZ=1;
}
void gogogo(void)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
/*遥控器按键设置*/
if(k5==0)
{
while(!k5);
flag_heixian=0;
flag_bizhang=0;
flag_gensui=0;
flag_yaokong=1;
}
}
void main(void)
{
flag_heixian=0;
flag_bizhang=0;
flag_gensui=0;
sbit d=P0^6;//对应D1D
sbit a=P0^5;//对应D2A
sbit c=P0^4;//对应D3C
/*按键功能定义*/
sbit k2=P3^0;//走黑线

循迹小车程序代码(带解释说明)

循迹小车程序代码(带解释说明)

int Left_motor_go=6; //左电机前进(IN1)int Left_motor_back=7; //左电机后退(IN2)int Right_motor_go=9; // 右电机前进(IN3)int Right_motor_back=10; // 右电机后退(IN4)const int SensorRight = 3; //右循迹红外传感器(P3.2 OUT1)const int SensorLeft = 4; //左循迹红外传感器(P3.3 OUT2)int SL; //左循迹红外传感器状态int SR; //右循迹红外传感器状态void setup(){//初始化电机驱动IO为输出方式pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入}//=======================智能小车的基本动作========================= //void run(int time) // 前进void run(){digitalWrite(Right_motor_go,HIGH); // 右电机前进digitalWrite(Right_motor_back,LOW);analogWrite(Right_motor_go,20);//PWM比例0~255调速,左右轮差异略增减analogWrite(Right_motor_back,0);digitalWrite(Left_motor_go,LOW); // 左电机前进digitalWrite(Left_motor_back,HIGH);analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减analogWrite(Left_motor_back,127 );//delay(time * 100); //执行时间,可以调整}//void brake(int time) //刹车,停车void brake(){digitalWrite(Right_motor_go,LOW);digitalWrite(Right_motor_back,LOW);digitalWrite(Left_motor_go,LOW);digitalWrite(Left_motor_back,LOW);//delay(time * 100);//执行时间,可以调整}//void left(int time) //左转(左轮不动,右轮前进) void left(){digitalWrite(Right_motor_go,HIGH);// 右电机前进digitalWrite(Right_motor_back,LOW);analogWrite(Right_motor_go,1);analogWrite(Right_motor_back,0);//PWM比例0~255调速digitalWrite(Left_motor_go,LOW); //左轮后退digitalWrite(Left_motor_back,LOW);analogWrite(Left_motor_go,0);analogWrite(Left_motor_back,0);//PWM比例0~255调速//delay(time * 100);//执行时间,可以调整}void right(){digitalWrite(Right_motor_go,LOW); //右电机后退digitalWrite(Right_motor_back,LOW);analogWrite(Right_motor_back,0);//PWM比例0~255调速digitalWrite(Left_motor_go,LOW);//左电机前进digitalWrite(Left_motor_back,HIGH);analogWrite(Left_motor_go,0);analogWrite(Left_motor_back,127);//delay(time * 100);//执行时间,可以调整}void back(int time){digitalWrite(Right_motor_go,LOW); //右轮后退digitalWrite(Right_motor_back,HIGH);analogWrite(Right_motor_go,0);analogWrite(Right_motor_back,60);//PWM比例0~255调速digitalWrite(Left_motor_go,HIGH); //左轮后退digitalWrite(Left_motor_back,LOW);analogWrite(Left_motor_go,60);analogWrite(Left_motor_back,0);//PWM比例0~255调速delay(time * 100); //执行时间,可以调整}//==========================================================void loop(){//有信号为LOW 没有信号为HIGH 检测到黑线输出高检测到白色区域输出低SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L1亮;没信号表明压在黑线上,车子底板上L1灭SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭if (SL == LOW&&SR==LOW)run(); //调用前进函数else if (SL == HIGH & SR == LOW)// 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转left();else if (SR == HIGH & SL == LOW) // 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转right();else // 都是黑色, 停止brake();}。

无线遥控循迹避障小车代码

无线遥控循迹避障小车代码

#include< reg51.h >#define uchar unsigned char#define uint unsigned int#define MOTOR_C P1 //P1口作为电机的控制口。

//#define SIGNAL P3 //P3口的低两位为循迹传感器输入口。

#define SHELVES 10 //速度总档数。

#define BACK 0xfa //后退。

#define FORWARD 0xf5 //前进。

#define WXYK P2 //无线遥控sbit senserr = P3^2; //(右)循迹。

sbit senserl = P3^3; //(左)循迹。

sbit hwr = P3^0; //(前)红外壁障传感器入口。

sbit hwl = P3^1; //(后)红外壁障传感器入口。

sbit PWM_R = P1^0; //右电机PWM输入口。

sbit PWM_L = P1^2; //左电机PWM输入口。

sbit PWM_HR = P1^1; //(后退)右电机。

sbit PWM_HL = P1^3; //(后退)左电机。

sbit wxr_a = P2^4; //无线遥控接收端D0sbit wxb_b = P2^5; //无线遥控接收端D1sbit wxl_c = P2^6; //无线遥控接收端D2sbit wxs_d = P2^7; //无线遥控接收端D3void timer0_init( void ); //定时器0初始化函数。

void timer1_init( void ); //定时器1初始化函数。

void right( void ); //前进右转弯函数。

void left( void ); //前进左转弯函数。

void forward( void ); //前进函数。

void hright(void); //后退右转函数。

void hleft(void); //后退左转函数。

智能小车C语言程序

智能小车C语言程序

智能小车C语言程序智能小车黑线循迹C语言程序#include#include#define uchar unsigned char#define uint unsigned intsbit LeftIR=P1^6; //左边红外接收sbit RightIR=P1^7; //右边红外接收sbit ENA=P1^2; // L298的Enable Asbit IN1=P1^0; // L298的Input 1sbit IN2=P1^1; // L298的Input 2sbit ENB=P1^5; // L298的Enable Bsbit IN3=P1^3; // L298的Input 3sbit IN4=P1^4; // L298的Input 4uchar t=0; //中断计数器uchar motor_1=0,motor_2=0; //电机1,2速度值uchar tmp1,tmp2; // 电机当前速度值uchar aa; //定时器1中断计数bit flag=0; //标志位void motor(uchar index, char speed){if(speed>=-100 && speed<=100){if(index==1) // 电机1的处理{motor_1=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN1=0;IN2=1;}else // 不为负数则正转{IN1=1;IN2=0;}}if(index==2) // 电机1的处理{motor_2=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN3=0;IN4=1;}else // 不为负数则正转{IN3=1;IN4=0;}}}}void init(){TMOD=0x12; // 设定T0的工作模式为2TH0=0x9B; // 装入定时器的初值TL0=0x9B;TH1=(65536-50000)/256; //设置初值定时50msTL1=(65536-50000)%6;EA=1; // 开中断ET0=1; // 定时器0允许中断ET1=1; //定时器1允许中断TR0=0; // 关闭定时器0TR1=0; // 关闭定时器0ENA=0; //关闭电机1ENB=0; //关闭电机2}void main(){int irDetectLeft,irDetectRight;init();while(1)// 电机实际控制演示{irDetectRight = RightIR;//右边接收irDetectLeft = LeftIR;//左边接收if((irDetectLeft==0)&&(irDetectRight==0))//向前进{motor(1,100);motor(2,100);}if((irDetectLeft==0)&&(irDetectRight==1))//右转{motor(1,-100);motor(2,100);}if((irDetectLeft==1)&&(irDetectRight==0))//左转{motor(1,100);motor(2,-100);}if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==0)) //第一次探测定时器1开始计时{motor(1,100);motor(2,100);TR1=1;}if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==1))//第二次探测时小车停{TR0=0;ENA=0;ENB=0;}}}void timer0() interrupt 1 // T0中断服务程序{if(t==0) // 1个PWM周期完成后才会接受新数值{tmp1=motor_1;tmp2=motor_2;}if(t ENA=1;elseENA=0; // 产生电机1的PWM信号if(t ENB=1;elseENB=0; // 产生电机2的PWM信号t++;if(t>=100)t=0; // 1个PWM信号由100次中断产生}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%6;aa++;if(aa==40) //定时2s后小车开始运动TR0=1;if(aa==60) //定时3s后置标志位{aa=0;flag=1;}}。

自动追光自动避障智能小车的源代码

自动追光自动避障智能小车的源代码
return k1;
}
//*********从左向右检测,检测10cm之内的障碍物*************//
void barrier_detection(void)
{
uchar i;
barrier_flag=0;
detector=4;
time_0_count=0;//定时器0工作在15cm障碍物检测
_nop_();
clk=1;
D1=1; //设定通道初始化
_nop_();
_nop_();
_nop_();
clk=0;
_nop_();
_nop_();
_nop_();
clk=1;
D1=1; //设定通道初始化.第3个下降沿
_nop_();
_nop_();
_nop_();
clk=0; //AD转化的初始化完成。
while(detector)
{
EX0 = 0;//关外部中断
IE0 = 0; //清除外部中断0标志位
TR0 = 0;//关闭定时器0
TH0=0xfc;
TL0=0x18;
leftTX=1;
MiddleTX=1;
rightTX=1;
switch(detector)
{
case 4: leftControl=1;MiddleControl=0;rightControl=0;
uchar number1=0; //用于计数500ms,太阳能板对光一次
uchar detector_busy = 0; //超声波正在检测标志位
uchar barrier_flag = 0; //低三位用于表示是否有障碍物;第三位表示左侧探测器探测结果,第二位表示中间探测器探测结果,最低位表示右侧探测器探测结果;1-有,0-无
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//智能小车避障、循迹、红外遥控C语言代码//实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹,1602显示小车的工作状态,另有三个独立按键分别控制三种状态的转换//注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <reg52.h>#include <math.h>#include"lcd.h"#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar ENCHAR_PuZh1[8]=" run ";//1602显示数组uchar ENCHAR_PuZh2[8]=" back ";uchar ENCHAR_PuZh3[8]=" stop ";uchar ENCHAR_PuZh4[8]=" left ";uchar ENCHAR_PuZh5[8]=" right ";uchar ENCHAR_PuZh6[8]=" xunji ";uchar ENCHAR_PuZh7[8]=" bizhang";uchar ENCHAR_PuZh8[8]=" yaokong";#define HW P2 //红外传感器引脚配置P2k口#define PWM P1 /* L298N管脚定义*//******************************超声波引脚控制******************************/sbit ECHO=P3^2; //超声波接收引脚定义兼红外遥控按键state_total =2 sbit TRIG=P3^3; //超声波发送引脚定义/////红外控制引脚配置sbit KEY2=P3^7; //红外接收器数据线兼循迹按键state_total= 0 sbit KEY1=P3^4; //独立按键p3.4控制自动避障state_total=1 uchar state_total=3,state_2=0;//总状态控制全局变量0为自动循迹模块1为自动避障模块2为红外遥控uchar state_1,DAT; //红外扫描标志位uchar time_1=0,time_2=0;//定时器1中断全局变量time_ 2控制PWM脉冲计数time_1控制转弯延时计数也做延时一次0.005suchar time,timeH,timeL,state=0;//超声波测量缓冲变量state为超声波状态检测控制全局变量uint count=0; //1602显示计数/**************************/unsigned char IRCOM[7]; //红外接收头接收数据缓存IRCOM[2]存放的为数据unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; //红外接收缓存变量/***********/void IRdelay(char x); //x*0.14MS 红外头专用delayvoid run();void back();void stop();void left_90();void left_180();void right_90();void delay(uint dat); //void init_test();void delay_100ms(uint ms) ;void display(uchar temp); //超声波显示驱动void bizhang_test();void xunji_test();void hongwai_test();void Delay10ms(void);void init_test()//定时器0 1 外部中断0 1 延时初始化{TMOD=0x11; //设置定时器0 1 工作方式1 16位初值定时器TH1=0Xfe; //装入初值定时一次为0.0005s 2000hzTL1=0x0c;TF0=0; //定时器0方式1计数溢出标志TF1=0; //定时器1方式1计数溢出标志ET0=1; //允许定时器0中断溢出ET1=1; //允许定时器1中断溢出EA=1; //开总中断if(state_total==1)//为超声波模块时初始化{TRIG=0; //发射引脚低电平ECHO=0; // 接收引脚低电平EX0=0; //关闭外部中断IT0=1; //由高电平变低电平,触发外部中断0}if(state_total==2) //红外遥控初始化{ IT1=1; //外部中断1为负跳变触发EX1=1; //允许外部中断1TRIG=1; // 3.3为高电平I/O口初始化}delay(60); //等待硬件操作}void main(){ uint i;delay(50);init_test();TR1=1; //开启定时器1LCD1602_Init() ;delay(50);* * while(state_2==0){if(KEY1==0) //检测按键s1是否按下{Delay10ms(); //消除抖动if(KEY1==0){state_total=0; //总状态定义0为自动循迹模块1为自动避障模块2为红外遥控while((i<30)&&(KEY1==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}if(TRIG==0) //检测按键s2是否按下{Delay10ms(); //消除抖动if(TRIG==0){state_total=1; //总状态定义0为自动循迹模块1为自动避障模块2为红外遥控while((i<30)&&(TRIG==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}if(KEY2==0) //检测按键s3是否按下{Delay10ms(); //消除抖动if(KEY2==0){state_total=2; //总状态定义0为自动循迹模块1为自动避障模块2为红外遥控while((i<30)&&(KEY2==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}}init_test();delay(50); //等待硬件操作50usTR1=0; //关闭定时器1if(state_total==1){//SPEED=90; //自动循迹速度控制高电平持续次数占空比为10的低电平bizhang_test();}if(state_total==0){// SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平xunji_test();}if(state_total==2){//SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平hongwai_test();}}void init0_suspend(void) interrupt 0 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{timeH=TH0; //记录高电平次数timeL=TL0; //state=1; //标志状态为1,表示已接收到返回信号EX0=0; //关闭外部中断0}void time0_suspend0(void) interrupt 1 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{if(state_total==1) // 自动避障初值装入{ TH0=0X00; //装入初值TL0=0x00;}if(state_total==0) //自动循迹初值装入{ TH0=0Xec; //装入初值定时一次0.005s 200hzTL0=0x78;time_1++; //控制转弯延时计数}}void IR_IN(void) interrupt 2{unsigned char j,k,N=0;EX1 = 0;IRdelay(5);if (TRIG==1){ EX1 =1;return;}//确认IR信号出现while (!TRIG) //等IR变为高电平,跳过9ms的前导低电平信号。

{IRdelay(1);}for (j=0;j<4;j++) //收集四组数据{for (k=0;k<8;k++) //每组数据有8位{while (TRIG) //等IR 变为低电平,跳过4.5ms的前导高电平信号。

{IRdelay(1);}while (!TRIG) //等IR 变为高电平{IRdelay(1);}while (TRIG) //计算IR高电平时长{IRdelay(1);N++;if(N>=30){EX1=1;return;} //0.14ms计数过长自动离开。

} //高电平计数完毕IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”N=0;}//end for k}//end for jif(IRCOM[2]!=~IRCOM[3]) //判断数据码与数据反码是否正确真确返回{ EX1=1;return;}EX1 = 1;}void time1_suspend1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{TH1=0Xec; //装入初值定时一次为0.0005s 2000hzTL1=0x78;time_2++; //控制PWM 脉冲计数if(state_total!=3) //判断进入按键是否按下进入状态1 避障或者0 循迹{state_2=1; //退出按键判断}/* if(time_2>100){time_2=0;}else if(time_2<=SPEED){PWM_g; //频率为2000hz的占空比为高电平的方波}else{ PWM_l; //为低电平} */}void IRdelay(unsigned char x) //x*0.14MS用于红外遥控{unsigned char i;while(x--){for (i = 0; i<13; i++) {}}}void Delay10ms(void) //用于按键检测误差{unsigned char a,b,c;for(c=1;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}void delay(uint dat) //延时函数用于初始化{* * uint i;for(i=dat;i>0;i--){_nop_();}}void delay_100ms(uint ms) //延时函数用于超声波{uint i,j;for(i=ms;i>0;i--)for(j=200;j>0;j--){_nop_();_nop_();_nop_();_nop_();_nop_();}}//小车前进void run(void){}//小车后退void back(void){PWM=0XA9;TR1=1;time_2=0;while(time_2<=100); //延时0.2sTR1=0;}//小车停止void stop(void){PWM=0X00;}//小车左转180void left_180(){//PWM=0X59; //左两轮反转,右两轮正转PWM=0X50; //右两轮正转TR1=1;while(time_2<=150); //延时0.2stime_2=0;while(time_2<=150); //延时0.2s}//小车左转90void left_90(void){PWM=0X59; //左两轮反转,右两轮正转//PWM=0X50; //右两轮正转TR0=1;time_1=0;while(time_1<=20); //延时0.2sTR0=0;}//小车左转120void left_120(void){PWM=0X59; //左两轮反转,右两轮正转// PWM=0X50; //右两轮正转TR0=1;while(time_1<=60); //延时0.4sTR0=0;}//小车右转90void right_90(void){PWM=0XA6; //左两轮正转右两轮反转//PWM=0X06; //左两轮正转TR0=1;time_1=0;while(time_1<=20); //延时0.2sTR0=0;}//小车右转120void right_120(void){PWM=0XA6; //左两轮正转右两轮反转// PWM=0X06; //左两轮正转TR0=1;time_1=0;while(time_1<=60); //延时0.4s}/************************************自动避障模块************************************/void display(uchar temp) //判断障碍距离小车的距离,左转180,前进,峰呤器报警1602显示{ uint ge,shi,bai,i;if((temp<=20)&&(temp>2)) //小于15厘米小车后退再左转{back();left_180();}if(count>=20){bai=temp/100; //1602显示数据date_data[5]=bai;shi=(temp%100)/10;date_data [6]=shi;ge=temp%100%10;date_data[7]=ge;for(i=0;i<8;i++){LCD1602_WriteCom(0x80+i);LCD1602_WriteData(date_data[i]+48);}count=0;}}void bizhang_test(){ int i,j=0;uchar distance_dat;delay(50);for(i=0;i<8;i++){LCD1602_WriteCom(0x80+i);LCD1602_WriteData(ENCHAR_PuZh7[i]);}while(1){run();EA=0; //关总中断TRIG=1; // 发射20us脉冲信号delay(30);TRIG=0;while(ECHO==0); //等待接收信号state=0; //标志清零EA=1; //开总中断EX0=1; //打开外部中断0 P3.2外部中断0引脚此时为高电平TH0=0x00; //定时器0 初值TL0=0x00;TF0=0; // 定时器0方式1计数溢出标志TR0=1; // 定时器0方式1启动定时器1while(state!=1);EX0=0; // 关闭外部中断0TR0=0; // 关闭定时器0中断TF0=0; // 定时器1方式1计数溢出标志if(state==1) //检测到障碍物计算离障碍物的距离{time=(timeH*4.352+timeL*0.017); //设定超声波的速度为340m/s 定时计数一次1usdistance_dat=time;}else //未检测到障碍物无返回信号{distance_dat=0;}distance[j]=distance_dat;j++;if(j==3){ if(distance[0]>distance[1]) {}else{distance[0]=distance[1];}if(distance[0]>distance[2]){}else{distance[0]=distance[2];}if(distance[0]>distance[3]){}else{distance[0]=distance[3];}distance_dat=distance[0];j=0;display(distance_dat);}count++;}}void xunji_test(){ int i;delay(50);for(i=0;i<8;i++){LCD1602_WriteCom(0x80+i);LCD1602_WriteData(ENCHAR_PuZh6[i]);}while(1){// delay(10);state_1=HW;DAT=state_1&(0x0f); //判断低4位的状态每隔5ms检测一次switch(DAT){case 0x00:run();break;case 0x01:right_120();break;case 0x02:right_90();break;case 0x04:left_90();break;case 0x06:run();break;case 0x03:right_120();break;case 0x08:left_120();break;case 0x0c:left_120();break;default:run();break;}}}void hongwai_test(){ int i;delay(60);for(i=0;i<8;i++){LCD1602_WriteCom(0x80+i);LCD1602_WriteData(ENCHAR_PuZh8[i]);}// TR1=1;while(1){Number=IRCOM[2];switch(Number){case 0x18:PWM=0X56; //前进for(i=0;i<8;i++){LCD1602_WriteCom(0x80+i);LCD1602_WriteData(ENCHAR_PuZh1[i]);}break;case 0x08:PWM=0X50; //右两轮正转左转for(i=0;i<8;i++){LCD1602_WriteCom(0x80+i);LCD1602_WriteData(ENCHAR_PuZh4[i]);}break;case 0x1c:PWM=0X00;for(i=0;i<8;i++){LCD1602_WriteCom(0x80+i);LCD1602_WriteData(ENCHAR_PuZh3[i]);}break;case 0x5a:PWM=0X06; //左两轮正转右转for(i=0;i<8;i++){LCD1602_WriteCom(0x80+i);LCD1602_WriteData(ENCHAR_PuZh5[i]);}break;case 0x52:PWM=0XA9; //后退for(i=0;i<8;i++){LCD1602_WriteCom(0x80+i);LCD1602_WriteData(ENCHAR_PuZh2[i]);}break;default:break;}//display(IRCOM[2]);}}。

相关文档
最新文档