自动追光自动避障智能小车的源代码
- 格式:doc
- 大小:84.50 KB
- 文档页数:22
智能小车循迹、避障、红外遥控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;}}。
智能小车原理图及源程序智能小车避障、圣光报警程序/*用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;}。
资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载智能小车源代码地点:__________________时间:__________________说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容#include<reg51.H>#include <intrins.h>//#include"lcd.h"sbit TX=P2^7;sbit RX=P2^6;sbit PWM=P1^4;sbit Beep=P3^7;sbit led1=P3^3;sbit led2=P3^4;sbit led3=P3^5;/***********蓝牙切换按键**********/sbit k1=P3^6;/***自定义一些数据,注意这些数据对应“51智能车蓝牙无线遥控.exe”软件上的数据设置**/#define leftdata 0x11#define rightdata 0x22#define forwarddata 0x33#define backdata 0x44#define stopdata 0x55#define uchar unsigned char#define uint unsigned intunsigned char receiveData,high_velosity,low_velosity;void UsartConfiguration();/***********电机端口定义************************/sbit IN1=P1^0; //为高电平时,左电机后转sbit IN2=P1^1; //为高电平时,左电机正转sbit IN3=P1^2; //为高电平时,右电机正转sbit IN4=P1^3; //为高电平时,右电机后转/**************无线遥控模块定义****************/sbit Key_A = P2^0; //B键信号端对应D0 sbit Key_B = P2^1; //D键信号端对应D1 sbit Key_C = P2^2; //C键信号端对应D2 sbit Key_D = P2^3; //C键信号端void delay0(int a);void delay15us(void);void delay1ms(int z);void di(); //蜂鸣器函数声明unsigned int time;//用于存放定时器时间值unsigned int S; //用于存放距离的值char flag =0; //量程溢出标志位char f1,f2,f3,f4,n0;int a;int n;//运行次数判断标志int s_left,s_right;void Delay10us(unsigned char i){unsigned char j;do{j = 10;do{_nop_();}while(--j);}while(--i);}/**************************************************************** *****************************//*****************电机程序********************//**************************************************************** ****************************/void loop(){IN1=1; //左电机IN2=0;IN3=1; //右电机IN4=0;}void runfront(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=1;}//小车后退函数void runback(){IN1=0; //左电机IN2=1;IN3=1; //右电机IN4=0;}//小车左转void runleft(){IN1=0; //左电机IN2=0;IN3=0; //右电机IN4=1;}//小车右转void runright(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=0;}////小车左后转//void runbackleft()//{// IN1=0; //左电机// IN2=0;// IN3=0; //右电机// IN4=1;//}////小车右后转//void runbackright()//{// IN1=1; //左电机// IN2=0;// IN3=0; //右电机// IN4=0;//}//小车停止函数void stop(){IN1=0; //左电机IN2=0;IN3=0; //右电机IN4=0;}/**************************************************************** *****************************//***********蓝牙程序************//**************************************************************** ****************************/void delay(unsigned int a){unsigned int b;for(;a>0;a--)for(b=3;b>0;b--);}//左电机转void left_motor_runfront(unsigned int a){IN1=1; //左电机IN2=0;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_runfront(unsigned int a){IN3=0; //右电机IN4=1;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_back(unsigned int a) {IN1=0; //左电机IN2=1;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_back(unsigned int a) {IN3=1; //右电机IN4=0;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_stop(){IN1=0; //左电机IN2=0;}void right_motor_stop(){IN3=0; //左电机IN4=0;}//PWM调速void PWM_RUNFRONT(unsigned int a,unsigned int b) //a 属于0~100{left_motor_runfront(a);right_motor_runfront(b);}void PWM_RUNBACK(unsigned int a,unsigned int b) //a 属于0~100{left_motor_back(a);right_motor_back(b);}void PWM_RUNLEFT(unsigned int a) //a属于0~100 {right_motor_runfront(a);left_motor_stop();}void PWM_RUNRIGHT(unsigned int a) //a属于0~100 {right_motor_stop();left_motor_runfront(a);}void bluestop(){left_motor_stop() ;right_motor_stop() ;}void UsartConfiguration(){SCON=0X50; //设置为工作方式1TMOD=TMOD|0x21; //设置计数器工作方式2PCON=0X80; //波特率加倍TH1=0XFA; //计数器初始值设置,注意波特率是4800的TL1=0XFA;ES=1; //打开接收中断EA=1; //打开总中断TR1=1;TH0=0;TL0=0;ET0=1; //打开计数器}/**************************************************************** **************** 函数名 :Delay(unsigned int i)* 函数功能 : 延时函数* 输入 : 无* 输出 : 无***************************************************************** **************/void Usart() interrupt 4{receiveData=SBUF;//出去接收到的数据RI = 0;//清除接收中断标志位if(receiveData==0x66){low_velosity=1;high_velosity=0;// write_com(0x80);}if(receiveData==0x77){low_velosity=0;high_velosity=1;}}/**************************************************************** *****************************//***********舵机程序************//**************************************************************** ****************************/void delayx(int t){char j;for(;t>0;t--)for(j=19;j>0;j--);}void degree0(){int i;for(i=0;i<10;i++){PWM=1;delayx(10);//1msPWM=0;delayx(390);//19ms}}void degree90(){int i;for(i=0;i<10;i++){PWM=1;delayx(24);//50PWM=0;delayx(376);//18.5ms}}void degree180(){int i;for(i=0;i<15;i++){PWM=1;delayx(40);//1.5msPWM=0;delayx(360);//18.5ms}}/**************************************************************** *****************************//**************超声波程序**************//**************************************************************** *****************************//****A键被按下后,前进*****/void Count1(void){time=TH1*256+TL1;TH1=0;TL1=0;S=(time*1.7)/100; n++;if(S<=30&&n==1) {led1=0;stop();degree0();di(); }if(S>30&&n==1) {led1=1;runfront();n=0;}if(n==2){s_left=S;degree180();di(); }if(n==3){s_right=S; degree90();di();n=0; //标志位清零if(s_left>s_right){led2=1;delay1ms(50);led2=0;delay1ms(50);runright();delayx(1250);}else{led3=1;delay(800);led3=0;delay(500);runleft();delayx(1250);}}}/********超声波高电平脉冲宽度计算程序***************/void Timer_Count(void){TR1=1; //开启计数while(RX); //当RX为1计数并等待TR1=0; //关闭计数//Count1(); //计算}/********************************************************/ void StartModule() //启动模块{TX=1; //启动一次模块Delay10us(2);TX=0;}/**************************************************************** *****************************//********************主程序*******************//**************************************************************** *****************************/void main(void){UsartConfiguration();while(1){if(k1==0&&n0==0){delay1ms(20);if(k1==0){n0++;}}else if(k1==0&&n0==1){delay1ms(20);if(k1==0){n0--;}}if(n0==0){if(Key_B==0&&Key_D==0&&Key_C==0&&Key_A==1) //A键被按下{f1=1;f2=0;f3=0;f4=0;di();}else if(Key_A==0&&Key_D==0&&Key_B==1&&Key_C==0) //B键被按下{f1=0;f2=1;f3=0;f4=0;di();}else if(Key_B==0&&Key_D==0&&Key_A==0&&Key_C==1) //C键被按下{f1=0;f2=0;f3=1;f4=0;di();}else if(Key_D==1&&Key_B==0&&Key_A==0&&Key_C==0) //D键被按下{f1=0;f2=0;f3=0;f4=1;di();}if(f1)StartModule();for(a=951;a>0;a--) {if(RX==1){Timer_Count(); Count1();}}}if(f2){runback();}if(f3){loop();}if(f4){stop();}}if(n0==1)if(low_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(30); break; case rightdata: PWM_RUNRIGHT(30); break; case forwarddata: PWM_RUNFRONT(64,70); break; case backdata: PWM_RUNBACK(64,70); break; case stopdata: bluestop(); break; }}if(high_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(50); break; case rightdata: PWM_RUNRIGHT(50); break; case forwarddata: PWM_RUNFRONT(94,100); break; case backdata: PWM_RUNBACK(94,100); break; case stopdata: stop(); break;}}}}/*****************蜂鸣器*********************/ void di(){int i;for(i=0;i<150;i++){Beep= 1;delay0(20);}Beep=0;}void delay0(int a){char j;int i;for(i=a; i > 0; i--)for(j = 200; j > 0; j--);}void delay1ms(int z) //延时1ms{int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。
#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); //后退左转函数。
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; // 只有。
/*****************循迹避障小车程序*************************************//**********************dragon*************************************/Qufu normal unversity#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar count0 = 0;//低电平的占空比uchar count1 = 0;//高电平的占空比uchar count = 0; //0.1ms 次数标识uchar jd,time; //角度标识uchar yz = 0; //遇障标志uint distance,t;sbit Trig=P3^0; //控制端超声波sbit Echo=P3^2; //接收端sbit pwm = P1^1; //舵机控制信号sbit rclf = P3^6; //循迹红外sbit rcrt = P3^7;sbit jz = P3^5;sbit PWM1=P1^4;//PWM 通道1,反转脉冲sbit PWM2=P1^3;//PWM 通道2,正转脉冲sbit PWM3=P1^6;//PWM 通道3,反转脉冲sbit PWM4=P1^5;//PWM 通道4,正转脉冲/***延时1ms***/void delay(uint x){uchar i,j;for(i=0;i<x;i++)for(j=0;j<110;j++);}/************电机运行**************/void Motor_run(void){PWM1 = 1;if(++count1 < count0){PWM2 = 0;}else{PWM2 = 1;}if(count1 >= 100){count1 = 0;}}/**********************红外探测部分*************************************/void ir_ch(void){if(jz == 1){jd = 14;count0 = 80 ;}if((rclf == 1 && rcrt == 0 && jd == 14) || (rclf == 1 && jz == 1) ){count0 = 70 ;jd = 13;}if((rcrt == 1 && rclf == 0 && jd == 13) || (rcrt == 1 && jz == 1) ){count0 = 90 ;jd = 15;}if((rcrt == 1 && rclf == 0 && jd == 14) || (rcrt == 1 && jz == 1) ){count0 = 90 ;jd = 15;}if((rclf == 1 && rcrt == 0 && jd == 15) || (rclf == 1 && jz == 1) ) {count0 = 90 ;jd= 13;}}/********************* 超声波************//***延时1us***/void delay_us(uchar m ){while(m--);}void ceju(void){Trig=1; //发射置高delay_us(15); //延时10usTrig=0; //发射置低//while(Echo==0); //等待接收端准备接收TR0=1; //启动定时器0//while(Echo==1); //等待接收端接收delay(3); // 等待处理数据}void panduan(void){uint n;if(distance<245){yz = 1;for(n=0;n<7000;n++){jd = 13;Motor_run();}}else{if(yz == 1)jd = 15;yz = 0;}else{ir_ch();}}}/***********定时器1舵机***********/void timer0init(void) // 1初始化{TMOD = 0X19; //定时器1工作1 定时器1工作1TH1 = 0Xff; //高第八位清零TL1 = 0Xa0;TH0=0;TL0=0;EA = 1; //打开全局中断允许位(中断允许寄存器IE)TR1 = 1; //寄存器TCON,置一启动定时器0ET1 = 1; //允许定时器1中断ET0 = 1; //允许定时器1中断IT0=1;//下降沿触发EX0=1;//外部中断0允许中断}/*********主函数********************/void main(void){timer0init(); //定时器1初始化Trig=0;jd = 14;count = 0;delay(10);while(1)ceju();panduan();Motor_run();}}/***外部中断超声波***/void int0() interrupt 0{TR0=0; //关定时器t=TH0*256+TL0;distance=t*0.173;//取346m/sTH0=0;TL0=0;}void Time_Int() interrupt 3{TH1 = 0xff;TL1 = 0xa0;if(count < jd)pwm = 1;elsepwm = 0;count += 1;count = count%200;}。
智能寻光小车源程序#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();}}。
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();//⽆障碍物,直⾏}}。