智能小车循迹、避障、红外遥控C语言代码(特制材料)

合集下载

智能小车循迹、避障、红外遥控C语言代码

智能小车循迹、避障、红外遥控C语言代码

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

智能循迹小车电磁组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;//走黑线

基于51单片机的红外遥控智能小车源程序(C语言)

基于51单片机的红外遥控智能小车源程序(C语言)

/*预处理命令*/#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};sbit IRIN=P3^2; //红外接收器数据线sbit LCD_RS = P0^7;sbit LCD_RW = P0^6;sbit LCD_EN = P0^5;uchar begin[]={"My car!"};uchar cdis1[]={"jiansu!"};uchar cdis2[]={"qianjin!"};uchar cdis3[]={"jiasu!"};uchar cdis4[]={"zuozhuang!"};uchar cdis5[]={"STOP!"};uchar cdis6[]={"youzhuan!"};uchar cdis8[]={"daoche!"};sbit M1 = P1^0;sbit M2 = P1^1;sbit M3 = P1^2;sbit M4 = P1^3;sbit EN12 = P1^4;sbit EN34 = P1^5;uchar IRCOM[7];uchar m,n;uchar t=2;uchar g;uchar code digit[]={"0123456789"};uint v;uchar count;bit flag;void delayxms(uchar t);void delay(unsigned char x) ;void delay1(int ms);void motor();void lcd_display();/*检查LCD忙状态lcd_busy为1时,忙,等待。

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

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

#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); //后退左转函数。

智能红外循迹小车程序

智能红外循迹小车程序

#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit you_2=P2^0;//红外探测端口定义sbit you_1=P2^1;sbit zhong=P2^2;sbit zuo_1=P2^3;sbit zuo_2=P2^4;sbit CG=P0^1;sbit DC=P0^0;uchar code L_F[8]= {0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//左电机正转uchar code L_B[8]= {0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};//左电机反转uchar code R_F[8]= {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//右电机正转uchar code R_B[8]= {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//右电机反转uchar code B_F[8]= {0x91,0x83,0xc2,0x46,0x64,0x2c,0x38,0x19};//左反右正uchar code F_B[8]= {0x19,0x38,0x2c,0x64,0x46,0xc2,0x83,0x91}; //左正右反uchar code duandian[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//断电unsigned char code qianjin[]={0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99};//前进unsigned char h[]={0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99};//uchar i;void delay(uint z){uint k ;uint j;for(k=0; k<z; k++)for(j=0; j<110; j++);}void QJ(unsigned int i){for(i=0;i<8;i++){P1=h[i]=qianjin[i];delay(13);}}void DD(){P1=0x00;delay(300);}void wtj(){while(1){if(P2==0xff){DD();delay(1000);break;}else{QJ(8);}}}void YG_1(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=F_B[i];delay(10);}}void ZG_1(){ unsigned char i;for(i=0;i<8;i++){P1=h[i]=B_F[i];delay(10);}}void byg(){while(1){if(P2==0xfb)break;else if(P2==0xf9)break;else if(P2==0xfd)break;/*if(P2^0==0)break;else if(P2^1==0)break;/*else if(P2^2==0)break;else if(P2^3==0)break;else if(P2^4==0)break;*/elseYG_1();}}void bzg(){while(1){if(P2==0xfb)break;else if(P2==0xf3)break;else if(P2==0xf7)break;/*if(P2^0==0)break;else if(P2^1==0)break;else if(P2^2==0)break;if(P2^3==0)break;else if(P2^4==0)break;*/elseZG_1();}}void YG_2(){//unsigned char i; //unsigned char g;if(P2==0xfa){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}} */}else if(P2==0xf2){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else if(P2==0xf6){//delay(4000);byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else if(P2==0xf4){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else ;}void ZG_2(){//unsigned char i; //unsigned char g;if(P2==0xeb){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/else if(P2==0xe9){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else if(P2==0xed){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else if(P2==0xe5){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else ;}void ZG(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=R_F[i];delay(11);}}void YG(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=L_F[i];delay(11);}}/*void HT(){unsigned char i;for(i=0;i<8;i++){P1=houtui[i];delay(55);}}*/void zd(){while(1){if(P2==0xe0)QJ(8);else if(P2==0xff){while(1){DD();}}else{QJ(80);if(P2==0xff){while(1){DD();}}else{DC=0;break;break;}}}}void zd1(){while(1){if(P2==0xe0)QJ(8);else if(P2==0xff){while(1){DD();}}else{QJ(80);if(P2==0xff)while(1){DD();}}else{DC=0;break;}}}}void hy(){unsigned char i;for(i=0;i<8;i++){P1=h[i];delay(10);}}void main(){DC=1;while(1){QJ(8);if(P2!=0xff){delay(9000);break;}}while(1){DC=1;if(CG==1){delay(9000);DC=1;while(1){switch(P2){case 0xfb:QJ(8);break;//11011case 0xf1:QJ(8);break;//10001case 0xf3:QJ(8);break;//10011case 0xf7:ZG();break;//10111case 0xe7:ZG_1();break;//00111case 0xef:ZG_1();break;//01111case 0xe3:ZG_1();break; //00011case 0xe1:ZG_1();break; //00001case 0xf9:QJ(8);break;//11001case 0xfd:YG();break;//11101case 0xfc:YG_1();break;//11100case 0xfe:YG_1();break;//11110case 0xf8:YG_1();break; //11000case 0xf0:YG_1();break;//10000case 0xfa://11010QJ(16);// delay(4000);YG_2();//f7 break;case 0xf2://10010QJ(16);// delay(4000);YG_2();break;case 0xf6://10110QJ(16);// delay(4000);YG_2();break;case 0xf4://10100QJ(16);// delay(4000);YG_2();break;case 0xeb://01011QJ(16);//delay(4000);ZG_2();//fd break;case 0xe9://01001QJ(16);//delay(4000);ZG_2();break;case 0xed://01101QJ(16);//delay(4000);ZG_2();break;case 0xe5://00101QJ(16);//delay(4000);ZG_2();break;case 0xe0:zd1();break;//00000case 0xff:hy();break;//11111default:QJ(8); break;}}}else{switch(P2){case 0xfb:QJ(8);break;//11011 case 0xf1:QJ(8);break;//10001case 0xf3:QJ(8);break;//10011 case 0xf7:ZG();break;//10111 case 0xe7:ZG_1();break;//00111 case 0xef:ZG_1();break;//01111 case 0xe3:ZG_1();break; //00011 case 0xe1:ZG_1();break; //00001case 0xf9:QJ(8);break;//11001 case 0xfd:YG();break;//11101 case 0xfc:YG_1();break;//11100 case 0xfe:YG_1();break;//11110 case 0xf8:YG_1();break; //11000 case 0xf0:YG_1();break;//10000case 0xfa://11010QJ(16);// delay(4000);YG_2();//f7 break;case 0xf2://10010QJ(16);// delay(4000);YG_2();break;case 0xf6://10110QJ(16);// delay(4000);YG_2();break;case 0xf4://10100QJ(16);// delay(4000);YG_2();break;case 0xeb://01011QJ(16);//delay(4000);ZG_2();//fd break;case 0xe9://01001QJ(16);//delay(4000);ZG_2();break;case 0xed://01101QJ(16);//delay(4000);ZG_2();break;case 0xe5://00101QJ(16);//delay(4000);ZG_2();break;case 0xe0:zd();break;//00000case 0xff:hy();break;//11111default:QJ(8); break;}}}}。

智能小车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-无

智能循迹避障小车C语言代码

智能循迹避障小车C语言代码
{
array[0]=(sec%10);
array[1]=(sec/10);
array[2]=(min%10);
array[3]=(min/10);
}
void display()
{
P0=tab[array[0]];
P2=0X01;
delay();
sbit P37=P3^7;
sfr WDT_CONTR=0Xe1;
uint line,flag_stop=1,flag_signal; //小车停止标志位 ,障碍物检测标志位
uint flag_zuo=0,flag_you=0; //偏离黑线标志位
uint number=0;
uint sec=0,min=0,count=0;//时间初始化
delay();
P2=0X00;
}
void delay()
{
uint i;
for(i=500;i>0;i--);
}
void check()
{
P10=1;
_nop_();
_nop_();
flag_signal=P10;
if(flag_signal==0) //检测到障碍物
P2=0X00;
P0=tab[array[1]];
P2=0X02;
delay();
P2=0X00;
P0=tab[array[2]];
P2=0X04;
delay();
P2=0X00;
P0=tab[array[3]];
P2=0X08;
{
P14=0,P15=1,P16=1,P17=1;

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

智能循迹小车电磁组C语言源代码(stc12c5a芯片)
}
void InitADC() //初始化AD函数
{
P1ASF=0XE7; // 1110 0111 //定义为AD转换的IO口
P1M0=0xE7 ; // P1.7-P1.0:1110 0111
case 1: ADC_CONTR=0xea; //定义P1.2口为AD转换 1110 1010
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR&ADC_FALG));
while(1){
GetADCResult(ch); //读取AD值并赋值给变量
kongzhi(); //调用控制函数
}
}
void GetADCResult(BYTE ch) //读取AD的函数
{
ADC_CONTR &=!ADC_FALG;
while(!(ADC_CONTR&ADC_FALG));
ADC_CONTR&=~ADC_FALG; //清除falg位
cg1=ADC_RES; //把传到P1.1口的AD值(二进制)赋值给cg1
break;
CCAP1H=0x00; //右轮
P3=go;
}
else if(bj2>1&&bj2<4/3) //微右拐
{
CCAP0H=0x00; //左轮
CCAP1H=0x18; //右轮
}
void PWM()
{
CCON=0;
CL=0;
CH=0;
CMOD=0X02;
CCAP0H=CCAP0L=0X80;

循迹、红外避障、遥控综合程序

循迹、红外避障、遥控综合程序

循迹、红外避障、遥控综合程序/**********************ZYWIFI0939C-WIFI机器人实验板例程************************ * 平台:ZYWIFI0939C-WIFI机器人+ Keil U4 + STC89C52* 名称:ZY-1智能小车参考程序* 公司:湖南智宇科教设备有限公司* 淘宝:https:///* 网站:* 编写:智宇公司研发一部* 日期:2015-1-15* 交流:智能车QQ:261339276* 晶振:11.0592MHZ* 说明:免费开源,不提供源代码分析* 硬件设置:要有自己动手能力,才能完成实验* 使用说明:根据下面IO口自己用杜邦线连接各种模块,可以自己修改各种模块IO口* 视频教程:本小车配套学习C语言详细视频教程,资料统一网盘下载重点提示:本程序只做参考,不提供技术支持,请自己研究吸收。

******************************************************************/ #include<AT89x51.H>#include <intrins.h>#include<HJ-4WD_PWM.H>//包含HL-1蓝牙智能小车驱动IO口定义等函数#define Left_1_led P3_7//左循迹传感器#define Right_1_led P3_6//右循迹传感器#define LeftIRBZ P3_5//左避障传感器#define RightIRBZ P3_4//右避障传感器sbit SB1=P2^3; //定义蜂鸣器端口sbit IRIN=P3^3; //定义红外接收端口unsigned char code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定义数码管显示数据0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9 unsigned char code RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F}; unsigned char IRCOM[7];#define ShowPort P0 //定义数码管显示端口unsigned char temp = 1;void Delay1ms(unsigned int i){unsigned char j,k;do{do{k = 50;do{_nop_();}while(--k);}while(--j);}while(--i);}void delay_nus(unsigned int i) //延时:i>=12 ,i的最小延时单12 us{i=i/10;while(--i);}void delay_nms(unsigned int n) //延时n ms{n=n+1;while(--n)delay_nus(900); //延时1ms,同时进行补偿}void delayms(unsigned char x) //0.14mS延时程序{unsigned char i; //定义临时变量while(x--) //延时时间循环{for (i = 0; i<13; i++) {} //14mS延时}}void Delay() //定义延时子程序{unsigned int DelayTime=30000; //定义延时时间变量while(DelayTime--); //开始进行延时循环return; //子程序返回}void ControlCar_yaokong(unsigned char ConType) //定义电机控制子程序(红外遥控单独设置一个switch case 语句){switch(ConType) //判断用户设定电机形式{case 1: //前进//判断用户是否选择形式1{stop();//进入前进之前先停止一段时间防止电机反向电压冲击主板导致系统复位Delay1ms(150);//LeftLed = 0 ;run();break;}case 2: //后退//判断用户是否选择形式2{stop();//进入后退之前先停止一段时间防止电机反向电压冲击主板导致系统复位Delay1ms(150);// LeftLed = 1 ;back(); //M2电机反转break;}case 3: //右转//判断用户是否选择形式3{stop();//进入左转之前先停止一段时间防止电机反向电压冲击主板导致系统复位Delay1ms(150);rightrun(); //M2电机正转break;}case 4: //左转//判断用户是否选择形式4{stop();//进入右转之前先停止一段时间防止电机反向电压冲击主板导致系统复位Delay1ms(150);leftrun(); //M1电机正转//M2电机反转break;}case 8: //停止//判断用户是否选择形式8{stop();break; //退出当前选择}}}void Robot_Avoidance() //机器人避障子程序{if(LeftIRBZ==1&&RightIRBZ ==1)//LeftIRBZ RightIRBZ{run();delay_nms (10);SB1=1;}else{if(LeftIRBZ==1&&RightIRBZ ==0)//右边检测到红外信号{rightrun(); //右转delay_nms (300);//停止300MS 防止电机反相电压冲击导致系统复位}if(RightIRBZ ==1&&LeftIRBZ==0)//左边检测到红外信号{leftrun(); //左转delay_nms (300);//停止300MS 防止电机反相电压冲击导致系统复位}if(RightIRBZ==0&&LeftIRBZ==0)//两边传感器同时检测到红外{SB1=0;stop(); //停止delay_nms (300);//停止300MS 防止电机反相电压冲击导致系统复位back(); //调用电机后退函数delay_nms (300);//后退50毫秒rightrun(); //调用电机右转函数delay_nms (400);}}run();}//机器人循迹子程序void Robot_Traction() //机器人循迹子程序{//SB1=1;if(Left_1_led == 0 && Right_1_led == 0) //三个红外检测到黑线,就前进Left_1_led Right_1_led{run(); //左侧没有信号时,开始向右转一定的角度delay_nms (10);SB1=0;}else if(Left_1_led == 0 && Right_1_led == 1){rightrun(); //右侧检测到黑线,开始向右转一定的角度delay_nms (10);}else if(Left_1_led == 1 && Right_1_led == 0){leftrun(); //左侧检测到黑线,开始向左转一定的角度delay_nms (10);}else if(Left_1_led == 1 && Right_1_led == 1){SB1=1;stop(); //左侧检测到黑线,开始向左转一定的角度delay_nms (10);}}//----------红外遥控-------------------------------------------------------------void IR_IN() interrupt 2 using 0 //定义INT2外部中断函数{unsigned char j,k,N=0; //定义临时接收变量EX1 = 0; //关闭外部中断,防止再有信号到达delayms(15); //延时时间,进行红外消抖if (IRIN==1) //判断红外信号是否消失EX1 =1; //外部中断开return; //返回}while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。

智能小车代码

智能小车代码

智能小车代码一、主程序#include<reg51.h>#include <INTRINS.H>#include "pwm.h"#include "delay.h"#include "tracking.h"#define uchar unsigned char#define uint unsigned intsbit front=P3^3; /*前边红外避障*/sbit right1=P3^4; /*右前红外避障*/sbit right2=P3^5; /*右后红外避障*/sbit left1=P3^6; /*左前红外避障*/sbit left2=P3^7; /*左后红外避障*/sbit shine0=P1^0; /*前趋光*/sbit shine1=P1^1; /*左趋光*/sbit shine2=P1^2; /*右趋光*/sbit beef=P1^3;sbit led=P2^4; /*声光报警led灯*/uchar flag=0;void main(void){ uchar k;int i;beef=1;pwm_init();/*******从A到B******************************/ while(right1==0 || right2==0 ){if(left1==0 && left2==0)go(15,1);else if(left1==1 && left2==0)go(3,15);else if(left1==0 && left2==1)go(15,3);elsego(14,15);}/******转弯进入Ⅰ区***************/go(20,-20); //左转delay(4);TR0=0;stop();delay(1000);TR0=1;go(20,15);delay(180);while(front==1) //检测到白板前直走{go(17,15);}TR0=0;stop();delay(200);TR0=1;go(20,-20); //检测到白板就左转delay(4);TR0=0;stop();delay(1000);TR0=1;while(left1==0 || left2==0) //靠左边白板直走{if(left1==0 && left2==0)go(15,1);else if(left1==1 && left2==0)go(3,15);else if(left1==0 && left2==1)go(15,3);elsego(14,15);}while(right1==0 || right2==0){if(left1==0 && left2==0)go(15,1);else if(left1==1 && left2==0)go(3,15);else if(left1==0 && left2==1)go(15,3);elsego(14,15);}while(front==1){go(15,12);}TR0=0;stop();delay(1000);/*****左转进入Ⅱ区**************/TR0=1;go(-20,20);delay(4);TR0=0;stop();delay(1000);TR0=1;tracking_stop(); //打开循迹,当3个红外同检测到黑线时TR0=0;stop();k=100; //停留5 秒,并发出断续声光报警。

红外循迹小车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;}。

避障跟随测距c语言程序,红外避障小车c语言程序.pdf

避障跟随测距c语言程序,红外避障小车c语言程序.pdf
避障跟随测距c语言程序,红外避障小车c语言程序.pdf
智能小车红外避障智能小车红外避障 c 语言程序语言程序 #include bit RandomFactor = 0 ; bit RandomFactorBuf = 0 ; #include #define FLeftMotor P0_2 = 1 ; P0_3 = 0 #define BLeftMotor P0_2 = 0 ; P0_3 = 1 #define FRightMotor P0_5 = 1 ; P0_4 = 0 #define BRightMotor P0_5 = 0 ; P0_4 = 1 #define LeftStop P0_2 = 0 ; P0_3 = 0 #define RightStop P0_4 = 0 ; P0_5 = 0 #define CarStop P0_2 = 0 ; P0_3 = 0 ; P0_4 = 0 ; P0_5 = 0 #define RightSenser P0_0 #define LeftSenser P0_1 //******************************************************** // 左转 //******************************************************** void TurnLeft_1() { LeftStop ; FRightMotor ; } //******************************************************** // 快速左转 //******************************************************** void TurnLeft_Fast() { BLeftMotor ; FRightMotor ; } //******************************************************** // 右转 //******************************************************** void TurnRight_1() { RightStop ; FLeftMotor ; } //******************************************************** // 快速右转 //******************************************************** void TurnRight_Fast() { BRightMotor ; FLeftMotor ; } //******************************************************** // 用倒退的方式进行车头右转 //******************************************************** void BTurnRight_1() { LeftStop ; BRightMotor ; } //******************************************************** // 用倒退的方式进行车头左转 //******************************************************** void BTurnLeft_1() { RightStop ; BLeftMotor ; } //******************************************************** // 前进 //******************************************************** void FCar() { FLeftMotor ; FRightMotor ; } //************************// 后退 //******************************************************** void BCar() { BLeftMotor ; BRightMotor ; } //******************************************************** // 壁障程序 //******************************************************** void Obstacle_Avoid(void) { if(RightSenser } if((!RightSenser) } if(RightSenser } if(!(RightSenser || LeftSenser)) { RandomFactorBuf = RandomFactor ; while (!(RightSenser || LeftSenser)) { if(RandomFactorBuf) { BTurnLeft_1() ; delay (300) ; } if(!RandomFactorBuf) { BTurnRight_1() ; delay (300) ; } } } if(!PWM) { LeftStop ; RightStop ; } } //******************************************************** // 跟随程序 //******************************************************** void Follow(void) { if(RightSenser RightStop; } if((!RightSenser) } if(RightSenser } if(!(RightSenser || LeftSenser)) { FCar() ; } } //******************************************************** //******************************************************** main() { Timer0Setup(500) ; Timer1Setup(50) ; Obstacle_Avoid() ; // Follow() ; }

智能小车避障C程序

智能小车避障C程序

智能小车的四路避障C程序前,左,后避障传感器现在对应中,右,左三路寻线传感器.#include <stdio.h>#include <intrins.h>#include "STC12C5410AD.H"#include "sio.h"#define MIN9MS 0x0120 //9ms中心是0x0159#define MAX9MS 0x01a0#define MIN45MS 0x0090 //4.5ms中心是0x00ac #define MAX45MS 0x00d0#define MIN225MS 0x0040 //2.25ms中心是0x0056#define MAX225MS 0x0080#define MIN056MS 0x000e //0.56ms中心是0x0015#define MAX056MS 0x001b#define MIN168MS 0x0020 //1.68ms中心是0x0040#define MAX168MS 0x0060sfr ISP_CUNTR = 0xE7;sbit LED1 = P1^1;sbit LED2 = P1^2;sbit IR_FRONT = P3^3;sbit IR_LEFT = P3^4;sbit IR_RIGHT = P3^5;sbit IR_BACK = P1^3;sbit IR_OUT = P1^0;sbit PWM0 = P3^7;sbit MOTO_IN_A1 = P1^7;sbit MOTO_IN_A2 = P1^6;sbit MOTO_IN_B1 = P1^5;sbit MOTO_IN_B2 = P1^4;bit power_stat;static unsigned char car_stat; //小车状态:0,停止;1,前进;2,后退;3,左转;4,右转;ff,自控寻线模式static unsigned char code led_mod_table[3][20] = {{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},{1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0} };unsigned char idata led_mod = 0;static unsigned char idata led_tick = 0; static unsigned char idata led_ptr = 0;#define IR_SIGNAL_TOTAL 21#define IR_SIGNAL_VALID 18static unsigned char codeir_table[IR_SIGNAL_TOTAL] = {1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0 };static unsigned char codeir_check_table[IR_SIGNAL_TOTAL] = { 0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0 };static unsigned char idata ir_ptr = 0;static unsigned char idata front_signal = 0; static unsigned char idata back_signal = 0;static unsigned char idata left_signal = 0;static unsigned char idata right_signal = 0;static bit front_obj = 0, back_obj = 0, left_obj = 0, right_obj = 0;static void delay(unsigned long v) {while (v--) {}}/** PCA中断计数,根据位置判断信号区域和定义,位置0表示初始,1代表引导码信号,2表示引导码间隔,* 3表示第一个bit的信号,4表示第一个bit的间隔,以次类推...* 更具体见对应的红外线协议.*/static unsigned char idata pca_tick;static unsigned char idata pca_int_count;static unsigned char data pca_int_total; /* 根据引导头确定总长度*/static unsigned int idata period; /* 红外信号占或空周期计数*/static unsigned char idata data_buf[6]; /* 红外线协议数据缓冲区*/static unsigned int idata ccap1; //PCA0上一次的的计数static unsigned char idata frame_dog; //红外帧看门狗,限定时间未接收完成清除工作void time0_isr() interrupt 1{unsigned char tmp;if (ir_table[ir_ptr++]) {IR_OUT = 0;} else {IR_OUT = 1;}ir_ptr %= IR_SIGNAL_TOTAL;tmp = ir_check_table[ir_ptr];if ((!IR_FRONT && tmp) || (IR_FRONT && !tmp)) front_signal++;if ((!IR_LEFT && tmp) || (IR_LEFT && !tmp))left_signal++;if ((!IR_RIGHT && tmp) || (IR_RIGHT && !tmp)) right_signal++;if ((!IR_BACK && tmp) || (IR_BACK && !tmp)) back_signal++;if (ir_ptr == 0) {// com_putchar(front_signal);if (front_signal >= IR_SIGNAL_VALID) front_obj = 1;elsefront_obj = 0;if (back_signal >= IR_SIGNAL_VALID) back_obj = 1;elseback_obj = 0;if (left_signal >= IR_SIGNAL_VALID)left_obj = 1;elseleft_obj = 0;if (right_signal >= IR_SIGNAL_VALID) right_obj = 1;elseright_obj = 0;front_signal = 0;back_signal = 0;left_signal = 0;right_signal = 0;}}void time0_initialize(void){TMOD &= ~0x0F; /* clear timer 0 mode bits */ TMOD |= 0x02; /* put timer 0 into MODE 2 */ TH0 = 0x5C; /* 256 -XTAL*dur/T1_12/1000000, dur=定时器的周期,以us为单位*/TL0 = 0x5C; /* 100us */PT0 = 0; /* 时钟0中断低优先级*/TR0 = 1;ET0 = 1;}static void wakeup (void) interrupt 2{}static void pca_isr (void) interrupt 6{unsigned char i, j;if (CCF1) {CCF1 = 0; //清PCA1中断标志LED1 = IR_RIGHT;LED2 = IR_RIGHT;if (!pca_int_count) { //第一次收到信号if (!IR_RIGHT) {ccap1 = pca_tick * 256 + CCAP1H;pca_int_count++;}} else { //已经收到一些信号period = pca_tick * 256 + CCAP1H - ccap1;ccap1 = pca_tick * 256 + CCAP1H;//com_putchar(period / 256);//com_putchar(period % 256);if (pca_int_count == 1) {if (period < MIN9MS || period > MAX9MS) { //9mspca_int_count = 0;frame_dog = 0;} elsepca_int_count++;} else if (pca_int_count == 2) {if (period > MIN225MS && period <MAX225MS) { //2.25mspca_int_total = 3;pca_int_count++;} else if (period > MIN45MS && period < MAX45MS) { //4.5mspca_int_total = 67;pca_int_count++;} else {pca_int_count = 0;frame_dog = 0;}} else {if (IR_RIGHT) {if (period > MIN056MS && period < MAX056MS) { //0.56msif (pca_int_count >= pca_int_total) { //帧接收完毕,下面进行有效分析.if (pca_int_total == 67) { //完整信号,含有引导信号,设备码8bit,设备反码8bit,命令字8bit,命令字反码8bitif ((data_buf[0] ^ data_buf[1] == 0xff) && (data_buf[2] ^ data_buf[3] == 0xff)) {com_putchar(data_buf[0]);com_putchar(data_buf[2]);if (data_buf[0] == 0x40) {switch (data_buf[2]) {case 0x5F: //左car_stat = 3;break;case 0x5B: //右car_stat = 4;break;case 0x5A: //上car_stat = 1;break;case 0x5E: //下car_stat = 2;break;case 0x56: //菜单car_stat = 0;break;case 0x0: //数字0car_stat = 0xff;break;case 0x12: //POWER// power_stat =~power_stat;break;default:break;}}}} else { //重复信号,仅含有引导信号}pca_int_count = 0;frame_dog = 0;} else {pca_int_count++;}} else {pca_int_count = 0;frame_dog = 0;}} else {j = (pca_int_count - 3) / 2;i = j / 8;j = j % 8;if (period > MIN168MS && period < MAX168MS) { //1.68ms// com_putchar(0x01);data_buf |= (0x01 << j);pca_int_count++;} else if (period > MIN056MS && period < MAX056MS) { //0.56ms// com_putchar(0x00);data_buf &= ~(0x01 << j);pca_int_count++;} else {pca_int_count = 0;frame_dog = 0;}}}}}if (CF) { //PCA计数溢出中断,19.6608MHZ晶体大约6.7ms溢出CF = 0;pca_tick++;if (led_tick++ >= 10) {led_tick = 0;if (led_mod_table[led_mod][led_ptr++]) {LED1 = 0;LED2 = 0;} else {LED1 = 1;LED2 = 1;}led_ptr %= 20;}if (pca_int_count) {frame_dog++;if (frame_dog >= 15) { //100ms后重新开始分析新的红外线数据包pca_int_count = 0;frame_dog = 0;}}}}void auto_power_down() {delay(30000);ISP_CUNTR = 0x20; //从AP复位并从AP执行}void main (void){unsigned char i;unsigned long j;MOTO_IN_A1 = 0;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 0;P1M1 = 0xf0; //P1.7~P1.4 强推挽输出EA = 0;power_stat = 0;time0_initialize();com_initialize (); /* initialize interrupt driven serial I/O */com_baudrate (4800); /* setup for 1200 baud */ /*CMOD = 0x01; // #00000000B,PCA空闲计数,PCA计数源=Fosc/12,PCA溢出中断(做一个定时器使用)CCON = 0x00; //PCA中断标志清0,PCA停止计数CL = 0x0;CH = 0x0;CCAPM1 = 0x31; //PCA1上升下降沿捕获*/CMOD = 0x03; /* #00000010B,PCA空闲计数,PCA计数源=fosc/2,PCA溢出中断*/CCON = 0x00; //PCA中断标志清0,PCA停止计数CL = 0x0;CH = 0x0;CCAPM1 = 0x31; //PCA1上升下降沿捕获CCAPM0 = 0x42; //PCA0工作模式:8位pwm PCA_PWM0 = 0x00;CCAP0L = 0x20;CCAP0H = 0x20;EPCA_LVD = 1; //允许PCA和低压检测中断car_stat = 0;pca_tick = 0;pca_int_count = 0;frame_dog = 0;EA = 1; /* Enable Interrupts */CR = 1; //启动PCA计数while (1){if (power_stat) {// auto_power_down();}if (left_obj || right_obj || front_obj || back_obj) { LED1 = 0;LED2 = 0;}switch (car_stat) {case 0:MOTO_IN_A1 = 0;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 0;break;case 0xff:if (!front_obj) { //中线传感器检测到黑线MOTO_IN_A1 = 1;MOTO_IN_A2 = 0;MOTO_IN_B1 = 1;MOTO_IN_B2 = 0;j = 50000;while (j) {j--;if (front_obj)break;}} else {TURNLEFT:MOTO_IN_A1 = 0;MOTO_IN_A2 = 1;MOTO_IN_B1 = 1;MOTO_IN_B2 = 0;j = 1000000;while (1) {j--;if (!front_obj) {goto EXIT;}if (!left_obj)goto TURNLEFT;if (!back_obj)goto TURNRIGHT;if (j == 0)goto EXIT;}TURNRIGHT:MOTO_IN_A1 = 1;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 1;j = 1000000;while (j) {j--;if (!front_obj)goto EXIT;if (!back_obj)goto TURNRIGHT;if (!left_obj)goto TURNLEFT;}}EXIT:/*MOTO_IN_A1 = 0;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 0;delay(5000);*/break;default:break;}PCON |= 0x01;}。

  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= 0sbit KEY1=P3^4; //独立按键p3.4控制自动避障state_total=1uchar 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 200hz TL0=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]) //判断数据码与数据反码是否正确真确返回。

相关文档
最新文档