智能小车源代码 避障 寻迹 寻光 遥控

合集下载

智能小车循迹、避障、红外遥控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 的前导低电平信号。

智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)/*******************************************//利用51定时器产生PWM波来调节电机速度//速度变化范围从0-100可调//使用三路做寻迹使用,哪一路检测在黑线哪一路为//高电平//没检测到黑线表示有反射对应输出低电平信号*********************************************/#include<>#define uint unsigned int#define uchar unsigned char/*电机四个接口定义*/sbit in1=P0^0;sbit in2=P0^1;sbit in3=P0^2;sbit in4=P0^3;/*计时器*/uchar j,k,i,a,A1,A2,second,minge,minshi;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};void delay(uchar i){for(j=i;j>0;j--)for(k=110;k>0;k--);}void display(uchar sh_c,uchar g_c,uchar min_ge,uchar min_shi) {dula=1;P0=table[sh_c];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(5);dula=1;P0=table[g_c];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(5);dula=1;P0=table[min_shi];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table2[min_ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(5);}/*左、中、右三路循迹传感器接口定义*/ sbit zuo=P1^0; sbit zhong=P1^1;sbit you=P1^2;/*避障接口定义*/sbit bz_zuo=P1^3;sbit bz_zhong=P1^4;sbit bz_you=P1^5;uchar count = 0;/*利用定时器0定时中断,产生PWM波*/ void Init_timer() {TH0 = (65535-10)/256;TL0 = (65535-10)%256;TMOD = 0x01;TR0 = 1;ET0 = 1;EA = 1;}/*左轮速度调节程序*/void zuolun(uchar speed){if(count <= speed) //count计数变量{in1 = 1;in2 = 0;}else{in1 = 0;in2 = 1;}}void youlun(uchar speed) //同上{if(count<= speed){in3 = 1;in4 = 0;}else{in3 = 0;in4 = 1;}}void Inline() //检测黑线信号{uchar temp;temp =P1;switch(temp){case 0x01:zuolun(0); youlun(90);break; //左侧循迹传感器压线,小车向左前修正case 0x02:zuolun(100);youlun(100);break; //中间循迹传感器压线,保持直走此处两值使电机速度保持相同case 0x04:zuolun(90); youlun(0);break; //右侧循迹传感器压线,小车向右前修正case 0x08:zuolun(90); youlun(0);break; //左侧避障传感器有信号小车右转case 0x10:zuolun(90); youlun(0);break; //中间避障传感器有信号小车左转case 0x20:zuolun(90); youlun(0);break; //右侧避障传感器有信号小车左转}/*if(zuo==1){zuolun(10);youlun(50);}else if(zhong==1){zuolun(99);youlun(99);}else if(you==1){zuolun(50);youlun(10);} */}void main() //主函数{Init_timer(); //调用函数while(1){Inline();minge=0;minshi=0;second++;if(second==60)second=0,minge++;A1=second/10;A2=second%10;if(minge==10)minge=0,minshi++;for(a=200;a>0;a--){display(A1,A2,minge,minshi);};}}void Timer0_int()interrupt 1 //定时器中断计数{TH0 = (65535-10)/256;TL0 = (65535-10)%256;count ++;if(count >= 100){count = 0;}}。

51的智能循迹小车代码

51的智能循迹小车代码

#include<reg52.h>#define sense P1 /*宏定义光电传感器端口*/#define input1 P0 /*左电机的IN1,IN2定义在P0口*/#define input2 P2 /*右电机的IN3,IN4及ENA,ENB定义在P2口*/ //宏定义电机的具体端口sbit MOTO1_INT1=P0^0;sbit MOTO1_INT2=P0^1;sbit MOTO1_ENA=P2^0;sbit MOTO2_INT3=P2^5;sbit MOTO2_INT4=P2^4;sbit MOTO2_ENB=P2^2;//宏定义传感器的具体端口sbit sense_L=P1^3;sbit sense_R=P1^6;//宏定义金属传感器端口sbit METAL=P1^1;//宏定义DELAY函数中的一些变量int Dtime1=20000;int Dtime2=2000;int i=0;unsigned char SIGNAL(void); //传感器信号分析函数void DELAY(void); //延时函数void main(){int a;MOTO1_INT1=1; //使车开始时运动MOTO1_INT2=0;MOTO1_ENA=1;MOTO2_INT3=1;MOTO2_INT4=0;MOTO2_ENB=1;while(1){if(METAL==1) //有金属时车停止DELAY();else{a=SIGNAL();switch(a){case 1:input2=0x25;break; //前进case 2:input2=0x24;break; //左转case 3:input2=0x21;break; //右转default:break;}}}}void DELAY() //延时函数{input2=0x20; //使驱动芯片的两个使能端为0,使两个电机停转for(i=0;i<Dtime1;i++); //实现延时,用DTIME控制input2=0x25; //使驱动芯片的两个使能端为1,使两个电机重新转for(i=0;i<Dtime2;i++);}unsigned char SIGNAL(){unsigned char Re;Re=sense&0x28;if(Re==40)return 1;//前进else if(Re==8)return 2;//左转else if(Re==32)return 3;//右转else return 1;//有错时前进}。

循迹小车程序代码

循迹小车程序代码

//(在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延时

智能避障小车原理图及源程序,诺基亚显示屏显示信息

智能避障小车原理图及源程序,诺基亚显示屏显示信息

智能小车原理图及源程序智能小车避障、圣光报警程序/*用T0计时器中断进行对小车方向的调节用INT0外部中断进行声光报警用INT1外部中断进行超声避障用T1计时器进行对时间的测量*/#include<reg52.h>#include<stdio.h>sbit P00=P1^0; //循迹口sbit P01=P1^1;sbit P02=P1^2;sbit P03=P0^3; //声光信号P03接蜂鸣器,P04接LED sbit P04=P0^4;sbit P20=P2^0; //电机1 左轮sbit P21=P2^1;sbit P22=P2^2; //电机2sbit P23=P2^3;void zhuanxiang(char,char,char);void delay1ms(void);void delaynms(int);unsigned int i=0,j=0; //特殊情况旗标void kongzhi(void) interrupt 1 //PWM信号进行电机控制{if(P00==0&&P01==1&&P02==0) //小车直线快走定时0.02ms{TH0=0X1F;TL0=0XEC;P20=0; //电机1 左轮P21=1;P22=1; //电机2 右转P23=0;}if(P00==0&&P01==0&&P02==1) //小车右转定时0.05ms {TH0=0X1F;TL0=0XCE;P20=1; //电机1 左轮P21=1;P22=1; //电机2P23=0;i=1;}if(P00==0&&P01==0&&P02==0&&i==1) // 特别{TH0=0X1F;TL0=0XCE;P20=1;P21=1;P22=1;P23=0;j=0;}if(P00==1&&P01==0&&P02==0) //小车左转定时0.05ms {TH0=0X1F;TL0=0XCE;P20=0; //电机1P21=1;P22=1; //电机2P23=1;j=1;}if(P00==0&&P01==0&&P02==0&&j==1) // 特别{TH0=0X1F;TL0=0XCE;P20=0;P21=1;P22=1;P23=1;i=0;}if(P00==1&&P01==1&&P02==1){ //全部检测到黑线时车停TH0=0X1F;TL0=0XCE;P20=1;P21=1;P22=1;P23=1;}}void shengguang(void) interrupt 0 //停车并产生声光2s{unsigned int i,j;P20=1;P21=1;P22=1;P23=1;delaynms(500);for(i=0;i<20;i++){P04=0;for(j=0;j<100;j++){P03=0;delay1ms();P03=~P03;}}P03=1; //关闭声光P04=1;delaynms(500);P20=0;//继续行车P21=1;P22=1;P23=0;}void chaoshengbo(void) interrupt 2 //超声波测距避障程序{}void main(){while(1){P20=1;P21=1;P22=1;P23=1;//小车停P03=1;P04=1;PX0=1;TMOD=0X10;//T0用方式0,T1用方式1EA=1; //开启中断总开关EX0=1;//T0中断EX1=1; //T1中断ET0=1;//INT0中断ET1=1; //INT1中断TR1=1; //开启T1计时器zhuanxiang(P00,P01,P02);}}void zhuanxiang(char P00,char P01,char P02){if(P00==0&&P01==1&&P02==0) // 小车直走{ //0.01msTH0=0X1F;TL0=0XF6;;TR0=1;}if(P00==0&&P01==0&&P02==1) //小车右转定时0.05ms{TH0=0X1F;TL0=0XCE;TR0=1;}if(P00==1&&P01==0&&P02==0) //小车左转定时0.05ms {TH0=0X1F;TL0=0XCE;TR0=1;}if(P00==1&&P01==1&&P02==1) //全部检测到黑线时车停{TH0=0X1F;TL0=0XCE;TR0=1;}}void delay1ms(void){int i;for(i=0;i<120;i++);}void delaynms(int n){int i,j;for(i=0;i<n;i++)for(j=0;j<120;j++);}诺基亚显示程序:#include <reg51.h>#include <stdio.h>#include<string.h>sbit SCLK = P1^5; // pin 2 header 5sbit SDIN = P1^4; // pin 3 header 4sbit LCD_DC = P1^3; // pin 4 header 3sbit LCD_CE = P1^2; // pin 5 header 2sbit LCD_RST = P1^1; // pin 9 header 1void LCD_init(void);void LCD_clear(void);void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);void LCD_write_char(unsigned char c);void LCD_write_byte(unsigned char dat, unsigned char dc);void LCD_set_XY(unsigned char X, unsigned char Y);void delay_1us(void);unsigned char font6x8[5][4]={{'a','s','d','f'},{'j','k','f','e'},{'j','y','i','o'},{'t','f','j','g'},{'d','s',' ','g'}}; unsigned char write_chinese[3][1]={{'1'},{'g'},{'h'}};void main(void){LCD_init(); //初始化液晶LCD_clear();while(1){LCD_init();//设置基本功能LCD_clear();//清屏LCD_set_XY(0,0);//设置坐标X:0-83,Y:0-5LCD_write_chinese_string(12,4,12,4,0,5);//写入汉字}}void LCD_init(void){// 产生一个让LCD复位的低电平脉冲LCD_RST = 0;delay_1us();LCD_RST = 1;// 关闭LCDLCD_CE = 0;delay_1us();// 使能LCDLCD_CE = 1;delay_1us();LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式LCD_write_byte(0xc8, 0); // 设置偏置电压LCD_write_byte(0x06, 0); // 温度校正LCD_write_byte(0x13, 0); // 1:48LCD_write_byte(0x20, 0); // 使用基本命令LCD_clear(); // 清屏LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示// 关闭LCDLCD_CE = 0;}void LCD_clear(void) //LCD_clear : LCD清屏函数{unsigned int i;LCD_write_byte(0x0c, 0);LCD_write_byte(0x80, 0);for (i=0; i<504; i++)LCD_write_byte(0, 1);}/* LCD_set_XY : 设置LCD坐标函数输入参数:X :0-83Y :0-5*/void LCD_set_XY(unsigned char X, unsigned char Y){LCD_write_byte(0x40 | Y, 0); // columnLCD_write_byte(0x80 | X, 0); // row}/*-----------------------------------------------------------------------LCD_write_char : 显示英文字符输入参数:c :显示的字符;*/void LCD_write_char(unsigned char c){unsigned char line;c -= 32;for (line=0; line<6; line++)LCD_write_byte(font6x8[c][line], 1);}/*----------------------------------------LCD_write_chinese_string: 在LCD上显示汉字输入参数:X、Y :显示汉字的起始X、Y坐标;ch_with :汉字点阵的宽度num :显示汉字的个数;line :汉字点阵数组中的起始行数row :汉字显示的行间距例如:LCD_write_chi(0,0,12,7,0,0);-------------------------------------------*/void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row){unsigned char i,n;LCD_set_XY(X,Y); //设置初始位置for (i=0;i<num;){for (n=0; n<ch_with*2; n++) //写一个汉字{if (n==ch_with) //写汉字的下半部分{if (i==0) LCD_set_XY(X,Y+1);elseLCD_set_XY((X+(ch_with+row)*i),Y+1);}LCD_write_byte(write_chinese[line+i][n],1);}i++;LCD_set_XY((X+(ch_with+row)*i),Y);}}/*-----------------------------------------------------------------------LCD_write_byte : 使用SPI接口写数据到LCD输入参数:data :写入的数据;command :写数据/命令选择;-----------------------------------------------------------------------*/void LCD_write_byte(unsigned char dat, unsigned char command) {unsigned char i;//PORTB &= ~LCD_CE ; // 使能LCDLCD_CE = 0;if (command == 0)// PORTB &= ~LCD_DC ; // 传送命令LCD_DC = 0;else// PORTB |= LCD_DC ; // 传送数据LCD_DC = 1;for(i=0;i<8;i++){if(dat&0x80)SDIN = 1;elseSDIN = 0;SCLK = 0;dat = dat << 1;SCLK = 1;}// SPDR = data; // 传送数据到SPI寄存器//while ((SPSR & 0x80) == 0); // 等待数据传送完毕//PORTB |= LCD_CE ; // 关闭LCDLCD_CE = 1;}。

自动避障红外电动小车C51程序

自动避障红外电动小车C51程序
#define LCD_Data P0
#define Busy 0x80 //用于检测LCD状态字中的Busy标识
sbit c=P1^2; //转向灯使能端
uchar code talk1[]={"backward"};
uchar code talk2[]={"forward"};
uchar code talk3[]={"Turnleft"};
****************************/
void infrared_ray()interrupt 0 using 3
{ uchar i=90;
flage=0x01; //接受标志位
while(i--); //减小灵敏度
EX0=0; //关掉中断,等到发射方波后才开启,处于别动
}
//延时子程序
LCD_Data = WCLCD;
LCD_RS= 0;
LCD_RW= 0;
LCD_E = 0; //延时,为了安全
LCD_E = 0;
LCD_E = 0; //延时
LCD_E = 1;
}
void LCDInit(void) //LCD初始化
{
Delay400Ms();
LCD_Data = 0;
WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
//右边有障碍物,左转
else if(temp==0x02) {control(2,dj_state3,right_light ); temp =0x00;}
//两个方向都有障碍物,后退,右转
else if(temp==0x03) {control(10,dj_state4,back_light );

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

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

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

寻迹避障小车51程序(绝版模块化程序)

寻迹避障小车51程序(绝版模块化程序)

M a i n.c #include "common.h"#include "motor.h"#include "timer.h"uchar speed_l;uchar speed_r;sbit out = P3^7;void main(){P1 = 0xff;flag_l = 0;flag_r = 0;sensor_ldata = 0;sensor_rdata = 0;avoid_keyfunc = 0;findline_keyfunc = 0;motor_stop();timerinit();while(1){/*********************************************************循迹功能*********************************************************/while(findline_keyfunc){/**************************************************************** 正常情况下前进****************************************************************/ if(sensor == 0x27){motor_go();speed_l = 50;speed_r = 47;}/****************************************************************如果小车偏左****************************************************************/if((sensor == 0x37) || (sensor == 0x17) || (sensor == 0x0f) || (sensor == 0x1f) || (sensor == 0x3f)){motor_r();speed_l = 45;speed_r--;if(speed_r == 30){speed_r = 31;}}/**************************************************************** 如果小车偏右****************************************************************/if((sensor == 0x67) || (sensor == 0x47) || (sensor == 0x87) || (sensor == 0xc7) ||(sensor == 0xe7)){motor_l();speed_r = 45;speed_l--;if(speed_l == 30){speed_l = 31;}}}/////////////////////////////////////////////////////////////////// /////****************************************************************** * 避障功能******************************************************************* / while(avoid_keyfunc){/*********************************************************** 如果没有检测到有障碍物***********************************************************/ if((sensor_ldata == 1) && (sensor_rdata == 1)){motor_go();speed_l = 48;speed_r = 50;}/*********************************************************** 如果检测到右边有障碍物***********************************************************/ if((sensor_ldata == 1) && (sensor_rdata == 0)){motor_go();speed_l--;speed_r = 100;if(speed_l == 10){speed_l = 11;}}/****************************************************** 如果左边检测到有障碍物******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 1)){motor_go();speed_r--;speed_l = 100;if(speed_r == 10){speed_r = 11;}}/****************************************************** 如果都检测到有障碍物******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 0)){motor_go();speed_r = 100;speed_l = 10;}//////////////////////////////////////}/////////////////////////////////////motor_stop();}}MAIN.H#ifndef MAIN_H#define MAIN_Hextern uchar speed_l;extern uchar speed_r;#endifMotor.c#include "common.h"#include "timer.h"sbit in1 = P2^0;sbit in2 = P2^1; //左电机sbit in3 = P2^2;sbit in4 = P2^3;//右电机sbit ENA = P2^4; //只有当ENA=1时左电机才能转sbit ENB = P2^5; // 只有。

智能寻光小车源程序

智能寻光小车源程序

智能寻光小车源程序#include#define uchar unsigned char//宏定义#define uint unsigned int//宏定义sbit zuo1=P0^0;//定义控制左边电机的单片机引脚sbit zuo2=P0^1;//定义控制左边电机的单片机引脚sbit you1=P0^2;//定义控制右边电机的单片机引脚sbit you2=P0^3;//定义控制右边电机的单片机引脚sbit qh=P1^0;//前后控制位sbit zy=P1^1;//左右控制位sbit ting=P1^2;//停止控制位void delay(uint z)//一个带参数的延时程序{int i,j;//定义两个变量for(i=10;i>0;i--)for(j=z;j>0;j--);//将参数z赋值给j}void goright()//前进右转子程序{zuo1=0;zuo2=1;//左边轮子正转delay(24);//pwm有用值,越大左边方向的轮子越快zuo1=1;//关闭左边轮子you1=0;you2=1; //右边轮子正转delay(10);//pwm有用值,越大右边的轮子越快you1=1;//关闭右边轮子delay(80);//pwm无用值,越大,小车跑的越慢}void goleft()//前进左转子程序{zuo1=0;zuo2=1;//左边轮子正转delay(10);//pwm有用值,越大左边方向的轮子越快zuo1=1;//关闭左边轮子you1=0;you2=1; //右边轮子正转delay(24);//pwm有用值,越大右边的轮子越快you1=1;//关闭右边轮子delay(80);//pwm无用值,越大,小车跑的越慢}void down()//停止子程序{zuo1=1;zuo2=1;you1=1;you2=1; //左右轮全部停止}void main(){while(1){zy=1;qh=1;ting=1;//初始化各个引脚while(ting==1)//如果中间传感器检测到光亮则认为是遇到光源,就停止{down();}if(qh==0&&zy==1)//当前后传感器为0且左边传感器触发时,前进左转goleft();if(qh==0&&zy==0)//当前后传感器为0且右边传感器触发时,前进右转goright();}}。

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

自动追光自动避障智能小车的源代码
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-无

智能循迹小车详细源代码程序MSPID

智能循迹小车详细源代码程序MSPID

巡线车程序(完整版)1 #ifndef _Macro.h_2 #define _Macro.h_3 #include <msp430x14x.h>4 #include <intrinsics.h>5 #define uchar unsigned char6 #define uint unsigned int7 #define one 11.118 #define LMAX 19999 #define RMAX 399910 #define CPU_F ((double)8000000)11 #define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))1213 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))14 #define PC 20 // 比例放大系数15 #define IC 0 //积分放大系数16 #define DC 85 //大系数17 #define LEFTOUT TACCR118 #define RIGHTOUT TACCR219 #define SensorIn P5IN20 #define F 5000//5000hz21 #define Period (8000000/F)22 #define EnableLeftPos P3OUT|=BIT123 #define UnenableLeftPos P3OUT&=~BIT12425 #define EnableLeftNeg P3OUT|=BIT026 #define UnenableLeftNeg P3OUT&=~BIT02728 #define EnableRightPos P3OUT|=BIT229 #define UnenableRightPos P3OUT&=~BIT23031 #define EnableRightNeg P3OUT|=BIT332 #define UnenableRightNeg P3OUT&=~BIT33334 #define Basic_Left 100//百分之八十35 #define Basic_Right 100//Basic_Left36 #define MAX (100)37 #define MIN (-100)38 #define foreward 139 #define backward 040 #define max_speed 10041 #define min_speed -10042 #define key 0434445 #define left_1 146 #define left_2 247 #define left_3 348 #define left_4 449 #define left_5 550 #define left_6 651 #define left_7 7//右直角5253 #define right_1 -154 #define right_2 -255 #define right_3 -356 #define right_4 -457 #define right_5 -558 #define right_6 -659 #define right_7 -7//左直角60 #endif[cpp]view plaincopy61 #include "Macro.h"62 #include "sensor.h"63 void Motorstop()64 {65 LEFTOUT=0;66 RIGHTOUT=0;67 }68 void MotorLeft(int speed,int direction)69 {70 if(speed>max_speed)speed=max_speed;71 if(direction==backward)//反转72 {73 EnableLeftNeg;74 UnenableLeftPos;75 }76 else if(direction==foreward)//正转77 {78 EnableLeftPos;79 UnenableLeftNeg;80 }81 LEFTOUT=Period/100*speed;82 }83 void MotorRight(int speed,int direction)84 {85 if(speed>max_speed)speed=max_speed;8687 if(direction==backward)//反转88 {89 EnableRightNeg;90 UnenableRightPos;91 }92 else if(direction==foreward)//正转93 {94 EnableRightPos;95 UnenableRightNeg;96 }97 RIGHTOUT=Period/100*speed;98 }99 void MotorDrive(int PIDout)100 {101 int speedleft,speedright;102 speedleft=Basic_Left PIDout;103 speedright=Basic_Right-PIDout;104105 if(speedleft<0)106 MotorLeft(speedleft,backward);//反转107 else MotorLeft(speedleft,foreward);//正转108109 if(speedright<0)110 MotorRight(speedright,backward);//反转111 else MotorRight(speedright,foreward);//正转112 }113 void Rangle(float angle)114 {115 // TBCTL|=TBCLR;116 TBCCR1=LMAX (unsigned int)(angle*one);117 }[cpp]view plaincopy118 //下面是小车的程序。

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

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

循迹、红外避障、遥控综合程序/**********************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的前导低电平信号。

Arduino超声波智能避障小车完整代码

Arduino超声波智能避障小车完整代码

Arduino超声波智能避障⼩车完整代码// Arduino超声波 智能避障⼩车(不含舵机)#include <LiquidCrystal.h> //申明1602液晶的函数库LiquidCrystal lcd(11,2,3,4,7,8); //4数据⼝模式连线声明,//===============================================================//LCD的接⼝:各个引脚连接的I/O⼝编号,格式为// LiquidCrystal(rs, enable, d4, d5, d6, d7)// LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)// LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)// LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)//===============================================================int Echo = A0; // Echo回声脚(P2.0)int Trig =A1; // Trig 触发脚(P2.1)int Distance = 0;int L_motor_back=5; //左电机后退(IN1)int L_motor_go=6; //左电机前进(IN2)int R_motor_go=9; // 右电机前进(IN3)int R_motor_back=10; // 右电机后退(IN4)void setup(){Serial.begin(9600); // 初始化串⼝//初始化电机驱动IO为输出⽅式pinMode(L_motor_go,OUTPUT); // PIN 5 (PWM)pinMode(L_motor_back,OUTPUT); // PIN 6 (PWM)pinMode(R_motor_go,OUTPUT);// PIN 9 (PWM)pinMode(R_motor_back,OUTPUT);// PIN 10 (PWM)//初始化超声波引脚pinMode(Echo, INPUT); // 定义超声波输⼊脚pinMode(Trig, OUTPUT); // 定义超声波输出脚lcd.begin(16,2); //初始化1602液晶⼯作 模式//定义1602液晶显⽰范围为2⾏16列字符}//=======================智能⼩车的基本动作=========================void run() // 前进{analogWrite(R_motor_go,200);//右电机前进,PWM⽐例0~255调速,左右轮差异略增减analogWrite(R_motor_back,0);analogWrite(L_motor_go,200);// 左电机前进,PWM⽐例0~255调速,左右轮差异略增减analogWrite(L_motor_back,0);}void brake() //刹车,停车{digitalWrite(R_motor_go,LOW);digitalWrite(R_motor_back,LOW);digitalWrite(L_motor_go,LOW);digitalWrite(L_motor_back,LOW);}void left() //左转(左轮不动,右轮前进){analogWrite(R_motor_go,200); //右电机前进,PWM⽐例0~255调速analogWrite(R_motor_back,0);digitalWrite(L_motor_go,LOW); //左轮不动digitalWrite(L_motor_back,LOW);}void spin_left() //左转(左轮后退,右轮前进){analogWrite(R_motor_go,200); //右电机前进,PWM⽐例0~255调速analogWrite(R_motor_back,0);analogWrite(L_motor_go,0);analogWrite(L_motor_back,200);//左轮后退PWM⽐例0~255调速}void right() //右转(右轮不动,左轮前进){digitalWrite(R_motor_go,LOW); //右电机不动digitalWrite(R_motor_back,LOW);analogWrite(L_motor_go,200);analogWrite(L_motor_back,0);//左电机前进,PWM⽐例0~255调速}void spin_right() //右转(右轮后退,左轮前进){analogWrite(R_motor_go,0);analogWrite(R_motor_back,200);//右电机后退,PWM⽐例0~255调速analogWrite(L_motor_go,200); //左电机前进,PWM⽐例0~255调速analogWrite(L_motor_back,0);}void back() //后退{analogWrite(R_motor_go,0);analogWrite(R_motor_back,150);//右轮后退,PWM⽐例0~255调速analogWrite(L_motor_go,0);analogWrite(L_motor_back,150);//左轮后退,PWM⽐例0~255调速}//==========================================================void Distance_test() // 量出前⽅距离{digitalWrite(Trig, LOW); // 给触发脚低电平2μsdelayMicroseconds(2);digitalWrite(Trig, HIGH); // 给触发脚⾼电平10μs,这⾥⾄少是10μsdelayMicroseconds(10);digitalWrite(Trig, LOW); // 持续给触发脚低电float Fdistance = pulseIn(Echo, HIGH); // 读取⾼电平时间(单位:微秒)Fdistance= Fdistance/58; //为什么除以58等于厘⽶, Y⽶=(X秒*344)/2 // X秒=( 2*Y⽶)/344 ==》X秒=0.0058*Y⽶ ==》厘⽶=微秒/58Serial.print("Distance:"); //输出距离(单位:厘⽶)Serial.println(Fdistance); //显⽰距离Distance = Fdistance;}void Distance_display()//显⽰距离{if((2<Distance)&(Distance<400)){lcd.home(); //把光标移回左上⾓,即从头开始输出lcd.print(" Distance: "); //显⽰lcd.setCursor(6,2); //把光标定位在第2⾏,第6列lcd.print(Distance); //显⽰距离lcd.print("cm"); //显⽰}else{lcd.home(); //把光标移回左上⾓,即从头开始输出lcd.print(" Out of range"); //显⽰超出距离}delay(250);lcd.clear();}void loop(){while(1){Distance_test();//测量前⽅距离Distance_display();//液晶屏显⽰距离if(Distance < 40)//数值为碰到障碍物的距离,可以按实际情况设置{if(Distance < 5){back();delay(100);brake();}while(Distance < 60)//再次判断是否有障碍物,若有则转动⽅向后,继续判断 {spin_right();//右转delay(100);brake();//停车Distance_test();//测量前⽅距离Distance_display();//液晶屏显⽰距离if(Distance < 60){spin_left();delay(200);brake();//停车Distance_test();//测量前⽅距离Distance_display();//液晶屏显⽰距离}}}elserun();//⽆障碍物,直⾏}}。

智能小车代码

智能小车代码

智能小车代码一、主程序#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 秒,并发出断续声光报警。

智能循迹小车详细源代码程序(MSP430,PID)

智能循迹小车详细源代码程序(MSP430,PID)
80 }
81 LEFTOUT=Period/100*speed;
82 }
83 void MotorRight(int speed,int direction)
84 {
85 if(speed>max_speed)speed=max_speed;
86
72 {
73 EnableLeftNeg;
74 UnenableLeftPos;
75 }
76 else if(direction==foreward)//正转
77 {
78 EnableLeftPos;
79 UnenableLeftNeg;
17 #define LEFTOUT TACCR1
18 #define RIGHTOUT TACCR2
19 #define SensorIn P5IN
20 #define F 5000//5000hz
21 #define Period (8000000/F)
64 {
65 LEFTOUT=0;
66 RIGHTOUT=0;
67 }
68 void MotorLeft(int speed,int direction)
69 {
70 if(speed>max_speed)speed=max_speed;
71 if(direction==backward)//反转
183 TACCTL2|=OUTMOD_7;//
184 LEFTOUT=0;
185 RIGHTOUT=0;
186 }
187
188 float abs(float a)
189 {

智能循迹小车程序代码

智能循迹小车程序代码

/****************************************************************************硬件连接P1_4接驱动模块ENA使能端,输入PWM信号调节速度P1_5接驱动模块ENB使能端,输入PWM信号调节速度P1_0 P1_1接IN1 IN2 当P1_0=1,P1_1=0; 时左电机正转驱动蓝色输出端OUT1 OUT2接左电机P1_0 P1_1接IN1 IN2 当P1_0=0,P1_1=1; 时左电机反转P1_2 P1_3接IN3 IN4 当P1_2=1,P1_3=0; 时右电机正转驱动蓝色输出端OUT3 OUT4接右电机P1_2 P1_3接IN3 IN4 当P1_2=0,P1_3=1; 时右电机反转P1_0接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1P1_1接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2P1_2接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3P1_3接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4八路寻迹传感器有信号(白线)为0 没有信号(黑线)为1****************************************************************************/#include<AT89x51.H>#define Right_moto_pwm P1_4 //接驱动模块ENA使能端,输入PWM信号调节速度#define Left_moto_pwm P1_5 //接驱动模块ENB使能端,输入PWM 信号调节速度#define Left_1_led P2_0 //四路寻迹模块接口第一路#define Left_2_led P2_1 //四路寻迹模块接口第二路#define Right_1_led P2_2 //四路寻迹模块接口第三路#define Right_2_led P2_3 //四路寻迹模块接口第四路#define Left_moto_go {P1_0=0,P1_1=1;} //左电机前进#define Left_moto_back {P1_0=1,P1_1=0;} //左电机后退#define Left_moto_stop {P1_0=1,P1_1=1;} //左电机停转#define Right_moto_go {P1_2=0,P1_3=1;} //右电机前转#define Right_moto_back {P1_2=1,P1_3=0;} //右电机后退#define Right_moto_stop {P1_2=1,P1_3=1;} //右电机停转#define uchar unsigned char#define uint unsigned intuchar pwm_val_left =0;uchar push_val_left =0; //左电机占空比N/10uchar pwm_val_right =0;uchar push_val_right=0; //右电机占空比N/10bit Right_moto_stp=1;bit Left_moto_stp =1;/**************************************************************** ********/void run(void)//前进函数{push_val_left =13; //PWM 调节参数1-20 1为最慢,20是最快改这个值可以改变其速度push_val_right =15; //PWM 调节参数1-20 1为最慢,20是最快改这个值可以改变其速度Left_moto_go ;//左电机前进Right_moto_go ; //右电机前进}/**************************************************************** ********/void left(void) //左转函数{push_val_left =8;push_val_right =9;Right_moto_go;//右电机继续Left_moto_stop;//左电机停走}/************************************************************************/void right(void)//右转函数{push_val_left =8;push_val_right =9;Right_moto_stop;//右电机停走Left_moto_go;//左电机继续}void Delayms(uint x){uchar i;while(x--)for(i=0;i<120;i++);}void stop(void){Right_moto_stop;//右电机停走Left_moto_stop;//左电机停走Delayms(3000);run();Delayms(100);}/*************************PWM调制电机转速********************************/void pwm_out_left_moto(void) //左电机调速,调节push_val_left的值改变电机转速,占空比{if(Left_moto_stp){if(pwm_val_left<=push_val_left)Left_moto_pwm=1;elseLeft_moto_pwm=0;if(pwm_val_left>=20)pwm_val_left=0;}elseLeft_moto_pwm=0;}void pwm_out_right_moto(void) //右电机调速,调节push_val_left的值改变电机转速,占空比{if(Right_moto_stp){if(pwm_val_right<=push_val_right)Right_moto_pwm=1;elseRight_moto_pwm=0;if(pwm_val_right>=20)pwm_val_right=0;}elseRight_moto_pwm=0;}/***************************************************/void xunji(){switch(P2&0x0f){case 0x00: // 全部没有压线,直走run(); break;case 0x01:// 右压线,左转left(); break;case 0x02: // 右压线,左转left(); break;case 0x04: // 左压线,转右right(); break;case 0x08: // 左压线,右转right();break;case 0x0f:stop();break;default:run(); break;}}/***********TIMER0中断服务子函数产生PWM信号**********/ void timer0()interrupt 1 using 2{TH0=0XF8; //2Ms定时TL0=0X30;pwm_val_left++;pwm_val_right++;pwm_out_left_moto();pwm_out_right_moto();}/***************************************************/ void main(void){TMOD=0X01;TH0= 0XF8; //2ms定时TL0= 0X30;TR0= 1;ET0= 1;EA = 1;while(1)/*无限循环*/{xunji();} }。

智能小车避障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)。
{
forward ();
}
if (red1==0&&red2==1)//路在左边向左走
{
left ();
}
if (red3==0&&red2==1)//路在右边向右走
{
right ();
}
if (red1==1&&red2==1&&red3==1)//没路就停
{
stop ();
}
Delay_1ms(100);
uchar Buffer[3] = {0};
unsigned long s=0;
void Delay15us()//@11.0592MHz延时15us
{
unsigned char i;
i = 39;
while (--i);
}
void Delay_140us(uchar t) //延时140 X t us
TL0 = 0;//计时器低8位
s = (time * 17) / 1000; //算出来是CM340/2=170,170/10000=17/1000,得厘

if(s>=20) //判断是否超出测量范围,前进
{
forward ();
}
else if (s<20)//遇障碍后退
{
Delay_1ms(100);//多次判断改良误触发
TX=0; //关闭超声波发射
}
void Main(void)//主函数
{
uchar i;
for(i=0; i<20; i++)//延时2秒,让超声波传感器稳定
{
Delay_1ms(100);
}
gpio();//单片机端口初始化
IRIN = 1; //接收端口初始化
OutsideInit(); //初始化外部中断
sbit int32=P3^5;
sbit int41=P3^6;
sbit int42=P3^7;
uchar IRTemp;//红外线按键数据存放变量
uchar IRCOM[7]={0};//存放红外解码后的32位数据
uchar time=0;//定义超声波发射时间
uchar Flag =0;//定时器中断的时间变量
小车的实物图,很多东西藏在小车夹层了。
下面就是源代码了!
#include <stc15.h>
#include <gpio.h>//端口初始化,里面有个gpio();函数不用也可以
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
if (s<20)
{
Delay_1ms(100);
if (s<20)
{
backward ();
Delay_1ms(2000);
right();
Delay_1ms(500);
}
}
}
}
void Send(void)//启动模块启动后延时15us
{
TX=1;//开启超声波发射
Delay15us();//延时15us
{
uchar i,j;
for(j=0; j<t; j++)
{
for (i=0; i<27; i++)
{
_nop_();
}
}
}
void Delay_1ms(uint t)//延时1ms
{
uint i,j;
for(i=0;i<t;i++)
{
for(j=0;j<=100;j++)
{
_nop_();
}
}
}
void forward (void)//前进
else yaokong();
}
}
void IRReceive(void) interrupt 0 using 2//设置外部中断0接收红外编码
{
uchar i, j, count = 0;
EX0 = 0;//关闭外部中断1
Delay_140us(20);
if(IRIN == 1)//确认红外线信号出现
文章最后还有我的原理图。
元件的清单可看我另一篇:智能小车的元件清单(Excel)。
单片机我用的是STC89C52RC(便宜实惠哈,只是保密性不行),L298N的电机驱动,直流减速电机,普通的红外遥控器,红外寻迹模块。光敏传感器模块(技术好的朋友可以用光敏电阻加AD转换器,不过麻烦很多)。电源用12V,单片机的电源由电机驱动输出。
{
TMOD = 0x01;//定时器工作于方式1
TH0 = 0;
TL0 = 0;
ET0 = 1; //允许T0中断
EA = 1;//开启总中断
}
void Conut(void)//超声波模块的计算距离,
{
time = TH0 * 256 + TL0;//计算计时器的时间
TH0 = 0;//计时器高8位
}
void xunguang (void)//寻光
{
if(light1==0&&light2==0) //光强往前走
{
forward ();
}
if(light1==1&&light2==0) //左亮往左走
{
left ();
}
if(light1==0&&light2==1) //右亮往右走
{
right ();
{
EX0=1;
return;
}
EX0 = 1;
}
原理图的接口有所改动,以代码的为主。
{
//int11=1;int12=0;
//int21=1;int22=0;
int31=1;int32=0; led3=0;led1=0;
int41=1;int42=0; led4=0;led2=0;
}
void backward (void)//后退
{
//int11=0;int12=1;
//int21=0;int22=1;
sbit IRIN =P3^2;//红外线一体化接收头接收端
sbit light1=P2^4;//寻光传感器1
sbit TX=P2^5;//超声波接口
sbit RX=P2^6;//超声波接口
sbit light2=P2^7;//寻光传感器2
sbit red1=P2^0;//3路红外寻迹
sbit red2=P2^2;
}
if(light1==1&&light2==1) //太暗停下
{
stop ();
}
Delay_1ms(100);
}
void yaokong (void)//遥控
{
if (IRCOM[2]==0x1c)//按5前进
{
P0=0xa4;//共阳数码管显示模式5;下同
forward ();
}
else if (IRCOM[2]==0x5a)//按6停止
int31=0;int32=1; led3=1;led1=1;
int41=0;int42=1; led4=1;led2=1;
}
void right (void)//右转
{
//int11=1;int12=0;
//int21=0;int22=0;
int31=1;int32=0; led3=0;led1=0;
{
P0=0x91;//数码管显示模式2;
Conut ();
}
else if (IRCOM[2]==0x5e)//按3寻迹
{
P0=0x85;数码管显示模式3;
xunji ();
}
else if (IRCOM[2]==0x08)//按4寻光
{
P0=0xcc;//数码管显示模式4;
xunguang();
}
智能小车源代码
相信看到文档的朋友都想做一个智能小车,我最近也在做这个项目,并成功完成了。喜悦之余,特把源代码与各位爱好者分享!
想学习的朋友可以看我另外一篇:智能小车各独立模块代码,里面有注释。有基础的朋友都看得懂的,在那代码的基础上,成功地合成了一个程序。
里面功能有,超声波避障,红外寻迹,自动寻光,红外遥控四个主要功能,还有数码管显示工作模式,LED灯显示电机工作状态等。
}
}
IRCOM[i] = IRCOM[i] >> 1; //数据右移一位,最高位补"0"
if(count >=6 )
{
IRCOM[i] = IRCOM[i] | 0x80;//数据最高位或上"1"
}
count = 0;
}
}
if(IRCOM[2]!=~IRCOM[3]) //不相等,则红外遥控解码错误
right ();
}
else P0=0xcf;//没选择模式显示1;
Delay_1ms(100);
}
void OutsideInit(void)//设置外部中断初始化,红外遥控用到
{
EX0 = 1; //开外部中断0
IT0 = 1; //负边沿触发
EA = 1;//开总中断
}
void time0_init(void)//定时器0中断初始化,超声波用到
time0_init();
while (1)
{
Send(); //超声波发射
相关文档
最新文档