红外避障小车程序
嵌入式课程设计--红外遥控小车程序
#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit IRIN = P3^3;sbit P1_0=P1^0; //数码管动态扫描接口sbit P1_1=P1^1;sbit P1_5=P1^5; //蜂鸣器报警接口sbit P2_0=P2^0; //控制两个直流电机的控制端口sbit P2_1=P2^1;sbit P2_2=P2^2;sbit P2_3=P2^3;sbit P2_4=P2^4;sbit P2_5=P2^5;bit flag; //红外解码判断标志位,0有效uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区uchar disp_buf[4]={0x00,0x00,0x40,0x00}; //显示缓冲单元ucharseg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x 8e};//0~F符的显示码(字形码)void delay(uchar x); //延时函数void Delay_ms(uint xms); //延时void init();void car_forward(); //小车前进函数void car_back(); //小车后退函数void car_Leftturn(); //小车左转弯函数void car_Rightturn(); //小车右转弯函数void car_stop(); //小车停止函数void Display(uint m); //数码管显示函数void aralm();void car_jiaspeed();void car_jianspeed();/********以下是主函数********/void main(){init();while(1){Display(disp_buf[2]);switch(disp_buf[2]){case 0x46: car_forward();break;case 0x15: car_back();break;case 0x44: car_Leftturn();break;case 0x43: car_Rightturn();break;case 0x40: car_stop();break;case 0x47:car_jiaspeed();break;case 0x45:car_jianspeed();break;default: aralm();break;}}}void init(){EA=1;EX1=1; //允许总中断中断,使能INT1 外部中断IT1 = 1; //触发方式为脉冲负边沿触发IRIN=1; //遥控输入脚置1P2_0=0;P2_1=0;P2_2=0;P2_3=0;P2_4=1;P2_5=1;}void car_jiaspeed(){P2_4=1;P2_5=1;}void car_jianspeed(){while(1){P2_4=1;P2_5=0;Delay_ms(200);P2_4=0;P2_5=1;Delay_ms(200);if(disp_buf[2]!=0x45){break;}}}/********以下是0.14ms的x倍延时函数********/void delay(uchar x) //延时x*0.14ms{uchar i;while(x--)for (i = 0; i<13; i++);}/********以下是延时函数********/void Delay_ms(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);}/********以下是显示函数********/void Display(uint m){uint a,b;a=m;b=m;a=a>>4;b=b&0x0f;P1_0=0;P1_1=1;P0=seg_data[a];Delay_ms(5);P1_0=1;P1_1=0;P0=seg_data[b];Delay_ms(5);}void car_forward() {P2_4=1;P2_5=1;P2_0=1;P2_1=0;P2_2=1;P2_3=0;}void car_back() {P2_4=1;P2_5=1;P2_0=0;P2_1=1;P2_2=0;P2_3=1;}void car_Leftturn() {P2_0=1;P2_1=0;P2_2=0;P2_3=0;}void car_Rightturn(){P2_0=0;P2_1=0;P2_2=1;P2_3=0;}void car_stop(){P2_0=0;P2_1=0;P2_2=0;P2_3=0;}void aralm(){P1_5=0;Delay_ms(500);P1_5=1;Delay_ms(500);}/********以下是外中断1函数********/void IR_decode() interrupt 2{uchar i,j,k,count=0;EX1 = 0; //暂时关闭外中断1中断请求delay(20); //延时20*0.14=2.8msif (IRIN==1) //等待IRIN低电平出现{EX1 =1; //开外中断0return; //中断返回}while (!IRIN) delay(1); //等待IRIN变为高电平,跳过9ms的低电平引导码for (j=0;j<4;j++) //收集四组数据,即用户码低位、用户码高位、键值数据码和键值数码反码{for (k=0;k<8;k++) //每组数据有8位{while (IRIN) //等待IRIN变为低电平,跳过4.5ms的高电平引导码信号。
红外线小车避障实训报告
一、实训目的本次实训旨在让学生了解红外线避障技术的原理,掌握红外线避障小车的制作方法,培养学生的动手能力、实践能力和创新精神。
二、实训内容1. 红外线避障原理红外线避障技术是利用红外线发射器和接收器检测前方障碍物,并根据距离调整小车行驶速度和方向的技术。
当红外线发射器发出的红外线遇到障碍物时,部分红外线会被反射回来,被接收器接收,从而实现避障功能。
2. 红外线避障小车制作(1)材料与工具材料:红外线发射器、红外线接收器、STC89C52单片机、电机驱动模块、电源模块、车轮、支架等。
工具:万用表、焊接工具、电烙铁、线路板等。
(2)制作步骤① 设计电路图:根据红外线避障原理,设计电路图,确定各元器件的连接方式。
② 制作线路板:根据电路图,制作线路板,并进行元器件焊接。
③ 安装元器件:将红外线发射器、接收器、单片机、电机驱动模块等元器件安装在车体上。
④ 编写程序:编写单片机程序,实现红外线避障功能。
⑤ 调试与测试:调试程序,测试小车避障效果。
三、实训过程1. 学习红外线避障原理,了解红外线发射器和接收器的工作原理。
2. 根据红外线避障原理,设计电路图,确定元器件连接方式。
3. 制作线路板,进行元器件焊接。
4. 编写单片机程序,实现红外线避障功能。
5. 调试程序,测试小车避障效果。
四、实训结果与分析1. 实训结果通过本次实训,成功制作了一台红外线避障小车,小车能够根据前方障碍物的距离调整行驶速度和方向,实现避障功能。
2. 分析(1)红外线避障原理:红外线避障技术利用红外线发射器和接收器检测前方障碍物,当红外线遇到障碍物时,部分红外线会被反射回来,被接收器接收,从而实现避障功能。
(2)电路设计:电路设计合理,元器件连接正确,程序编写正确,实现了红外线避障功能。
(3)程序调试:程序调试过程中,发现问题并及时解决,提高了小车避障效果。
五、实训总结1. 通过本次实训,使学生掌握了红外线避障技术的原理和制作方法。
基于51单片机的红外避障+超声波避障程序
基于51单⽚机的红外避障+超声波避障程序最近在学习关于51单⽚机控制智能⼩车,学习了很多⼤佬优秀的代码和思路受到了⼀些启发,决定按⾃⼰的逻辑尝试⼀下关于红外避障+超声波避障的程序经过实际测试,当PWM在50%左右,效果还⾏,但当全速前进时效果不是很理想代码还有待改进,有些地⽅逻辑⽐较混乱,单纯只是为了能跑通,有待优化先记录⼀下,毕竟也花了不少时间来写和调试#include<reg52.H>#include "test2.h"#include <stdlib.h>sbit P22 = P2^2;sbit P23 = P2^3;sbit P24 = P2^4;sbit TRIG = P2^1;sbit ECHO = P2^0;sbit left_zhangai = P3^4;sbit right_zhangai = P3^5;unsigned char flag = 0;unsigned char i;unsigned int out_TH0, out_TL0, distance;void left_bizhang(){for (i = 0; i < 30; i++) //90 = 90{car_left_backward();}}void right_bizhang(){for (i = 0; i < 30; i++) //90 = 90{car_right_backward();}}void all_bizhang(){for (i = 0; i < 30; i++) //90 = 90{car_right_backward();}}void back_bizhang(){for (i = 0; i < 10; i++)car_straight_backward();for (i = 0; i < 10; i++)car_left_backward();}void init_time(){TMOD = 0x11; //启动0 1两个定时器TH0 = 0;TL0 = 0;TR0 = 0;TR1 = 0;TH1 = 238;TL1 = 0;TF0 = 0; //中断溢出标志位TF1 = 1;ET0 = 1;ET1 = 1;EA = 1;}void run(){P22 = 1;P24 = 1;left_zhangai = 1;right_zhangai = 1;TRIG = 0; // 先给控制端初始化为0car_straight_forward_per50();distance = 100;while(1){/////////////////////////////label:if (left_zhangai == 1&&right_zhangai == 1){car_straight_forward_per50();}else{if (left_zhangai == 0&&right_zhangai == 0) {all_bizhang();}if (right_zhangai == 0&&left_zhangai == 1) {right_bizhang();}if (left_zhangai == 0&&right_zhangai == 1) {left_bizhang();}}init_time(); //初始化定时器flag = 0; //置溢出标志位为0//控制⼝发⼀个10US 以上的⾼电平TRIG = 1;TR1 = 1; //启动定时器1delay_10um(2);TRIG = 0;//等待接收端出现⾼电平while(!ECHO){if (TH1 == 0){distance = 200;goto label;}};TR0 = 1; //启动计时器开始计时while(ECHO){if (TH1 == 0){distance = 200;goto label;}}; //等待⾼电平结束TR0 = 0; //关闭低电平out_TH0 = TH0; //取定时器的值out_TL0 = TL0;distance = (TH0*256 + TL0)*1.7/100;if (flag == 1){flag = 0;}else if (distance >= 200){car_straight_forward_per50();}else if (distance <= 10){back_bizhang();}else if (distance <= 20){all_bizhang();}///////////////////////////////////////// }}void timer0() interrupt 1//中断函数{flag=1; //溢出标志位置1}。
智能小车_走黑线_避障_物体跟随_红外遥控_C程序
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;//走黑线
红外遥控小车程序
附录一程序代码红外遥控编码程序#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define uintlong unsigned longsbit p3_0=P3^0;sbit p2_1=P2^1;sbit p1_0=P1^0;sbit p1_1=P1^1;sbit p1_2=P1^2;sbit p1_3=P1^3;bit out;uint keyvalue=0x00,flag_key=0,value1,value2,keycount=0,i,j,flag_set=0, flag_press=0;uchar code keycode[4]={0x7f,0xbf,0xdf,0xef};uchar codeportvalue[12]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x00, 0x0b};uchar code wy[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//**********红外发送部分**********//uchar user1=0x00,user2=0x00;uint count=0,endcount=0;uint irdata=0;void deltime(void);void key_scan(void);void sendirdata(void);main(void){EA = 1;TMOD = 0x11;ET0 = 1;p3_0=1;P1=0xff;TH0 = 0xFF;TL0 = 0xE4;TR0 = 0;while(1){key_scan();if(flag_press==1){flag_press=0;TR0=1;sendirdata();}}}//**********按键扫描***********// void key_scan(void){for(i=0;i<=3;i++){P1=keycode[i];if(p1_3==0){keycount=i*3+0;flag_key=1; break;}if(p1_2==0){keycount=i*3+1;flag_key=1;break;}if(p1_1==0){keycount=i*3+2;flag_key=1;break;}}if(flag_key==1){flag_key=0;value1=P1;deltime();value2=P1;if(value1==value2){keyvalue=portvalue[keycount];flag_set=1;flag_press=1;}while(flag_set){value2=P1;if(value1!=value2)flag_set=0;}}}//**********延时**********//void deltime(void){uint k;for(k=0;k<=20;k++){ }}//**********定时中断**********// void time0int(void) interrupt 1{TH0=0xFF;TL0=0xE4;count++;}//**********发送数据**********// void sendirdata(){uchar s=0,datapd=0;endcount=320;p3_0=0;count=0;do{}while(count<endcount); endcount=180;count=0;p3_0=1;do{}while(count<endcount);for(s=0;s<=11;s++){endcount=20;count=0;p3_0=0;do{}while(count<endcount);endcount=20;count=0;p3_0=1;do{}while(count<endcount);}irdata=keyvalue;for(s=0;s<=7;s++){datapd=irdata & wy[s];if (datapd==0){endcount=20;count=0;} else{endcount=60;count=0;} p3_0=0;do{}while(count<endcount);endcount=20;count=0;p3_0=1;do{}while(count<endcount);}irdata=keyvalue;for(s=0;s<=7;s++){datapd=irdata & wy[s];if (datapd==0){endcount=60;count=0;} else{endcount=20;count=0;}p3_0=0;do{}while(count<endcount);endcount=20;count=0;p3_0=1;do{}while(count<endcount);}TR0=0;}红外遥控解码及驱动程序COUNT EQU 30HFLAG_USER1 EQU 45HFLAG_USER2 EQU 46HSA VEDATA EQU 47HCS1 EQU P3.0CS2 EQU P3.1RS EQU P3.3RW EQU P3.4E EQU P3.5PAGES EQU 56HCOLUMN EQU 57HNUM EQU 58HORG 0000HLJMP MAINORG 0003HLJMP EXTER0INTORG 000BHLJMP TIMER0INTORG 1000HMAIN:MOV P1,#0C5HSETB P3.6SETB P3.7MOV TMOD,#01H ;中断初始化MOV TH0,#0FFHMOV TL0,#9CHSETB EASETB IT0SETB ET0SETB EX0MOV R0,52H ;数据接收初始化MOV 52H,#00HMOV 53H,#00HMOV 54H,#00HMOV 55H,#00HMOV 51H,#00HMOV COUNT,#00HMOV R1,#08HMOV R2,#02HCLR PSW.5 ;数据接收标志CLR PSW.1 ;数据处理标志MOV FLAG_USER1,#00HLCALL CLEARMOV DPTR,#TAB0 ;显示初始化MOV PAGES,#1MOV COLUMN,#0LCALL LCD_DISPMOV DPTR,#TAB2MOV PAGES,#1MOV COLUMN,#16LCALL LCD_DISPMOV DPTR,#TAB1MOV PAGES,#1MOV COLUMN,#32LCALL LCD_DISPMOV DPTR,#TAB3MOV PAGES,#1MOV COLUMN,#48LCALL LCD_DISPMOV DPTR,#TAB4MOV PAGES,#1MOV COLUMN,#64LCALL LCD_DISPMOV DPTR,#TAB5MOV PAGES,#1MOV COLUMN,#80 ;显示红外遥控模式LCALL LCD_DISPMOV DPTR,#TAB6MOV PAGES,#3MOV COLUMN,#0LCALL LCD_DISPMOV DPTR,#TAB7MOV PAGES,#3MOV COLUMN,#16LCALL LCD_DISPMOV DPTR,#TAB8MOV PAGES,#3MOV COLUMN,#32LCALL LCD_DISPMOV DPTR,#TAB10MOV PAGES,#3MOV COLUMN,#64LCALL LCD_DISPMOV DPTR,#TAB9MOV PAGES,#3MOV COLUMN,#48LCALL LCD_DISP ;显示状态:初始LOOP: ;是否进行数据处理JNB PSW.1,$LCALL DATACHULICLR PSW.1MOV A,SA VEDATALCALL DATASHOWENDLOOP:LJMP LOOPEXTER0INT: ;外部中断SETB TR0MOV 30H,#00HRETITIMER0INT: ;定时中断,数据的验证和接收.MOV TH0,#0FFHMOV TL0,#9CHINC 30HSETB P3.2MOV C,P3.2JB PSW.5,DATARECEIVEPDJNC ENDTIMER0INTMOV A,30HCLR CSUBB A,#90JC ENDTIMER0INTSETB PSW.5CLR TR0MOV R1,#08HMOV 51H,#00HMOV R0,#52HMOV R2,#04H ;共接受两组数据LJMP ENDTIMER0INTDATARECEIVEPD: ;数据接收判断JNC ENDTIMER0INTCLR TR0MOV A,30HCLR TR0SUBB A,#10JC ORECEIVESETB CMOV A,51HRRC AMOV 51H,ALJMP WENDPDORECEIVE:CLR CMOV A,51HRRC AMOV 51H,AWENDPD:DJNZ R1,ENDTIMER0INT ;重复两次接收,确保存储.MOV R1,#08HMOV @R0,51HMOV @R0,51HINC R0MOV 51H,#00HDJNZ R2,ENDTIMER0INTCLR PSW.5SETB PSW.1SETB P0.0ENDTIMER0INT: ;定时中断结束RETIDATACHULI: ;数据处理MOV A,52HCLR CSUBB A,FLAG_USER1JNZ ENDDATACHULIMOV A,54HANL A,55HJNZ ENDDATACHULIMOV A,54HMOV SA VEDATA,AMOV 52H,#00HMOV 53H,#00HMOV 54H,#00HMOV 55H,#00HENDDATACHULI: ;处理完成,返回主程序RETDATASHOW: ;判断接收信号,进行相应处理CJNE A,#00H,CON1LJMP AOTO ;状态判断CON1:CJNE A,#02H,CON2MOV P1,#0FAHMOV DPTR,#TAB11MOV PAGES,#3LJMP ENDDATASHOW ;后转并显示CON2:CJNE A,#04H,CON3MOV P1,#0E5HMOV DPTR,#TAB12MOV PAGES,#3LJMP ENDDATASHOW ;左转并显示CON3:CJNE A,#05H,CON4MOV P1,#0C5HMOV DPTR,#TAB13MOV PAGES,#3LJMP ENDDATASHOW ;停转并显示CON4:CJNE A,#06H,CON5MOV P1,#0D5HMOV DPTR,#TAB14MOV PAGES,#3LJMP ENDDATASHOW ;右转并显示CON5:CJNE A,#08H,CON6MOV P1,#0F5HMOV DPTR,#TAB15MOV PAGES,#3LJMP ENDDATASHOW ;前转并显示CON6:JMP ENDDATASHOW1ENDDATASHOW:MOV COLUMN,#48LCALL LCD_DISPMOV DPTR,#TAB16MOV PAGES,#3MOV COLUMN,#64LCALL LcD_DISPENDDATASHOW1:RETAOTO:MOV P1,#0C0H ;寻迹壁障程序MOV DPTR,#TAB17MOV PAGES,#1MOV COLUMN,#0LCALL LCD_DISPMOV DPTR,#TAB18MOV PAGES,#1MOV COLUMN,#16LCALL LCD_DISPMOV DPTR,#TAB19MOV PAGES,#1MOV COLUMN,#32LCALL LCD_DISPMOV DPTR,#TAB20MOV PAGES,#1MOV COLUMN,#48LCALL LCD_DISP ;显示寻迹避障MOV DPTR,#TAB10MOV PAGES,#3MOV COLUMN,#64LCALL LCD_DISPMOV DPTR,#TAB9MOV PAGES,#3MOV COLUMN,#48LCALL LCD_DISP ;显示初始LCALL DLY ;模式工作前等待3秒AOTO1: ;自动寻迹避障程序MOV DPTR,#TAB15MOV PAGES,#3MOV COLUMN,#48LCALL LCD_DISPMOV DPTR,#TAB16MOV PAGES,#3MOV COLUMN,#64LCALL LCD_DISP ;显示前转MOV P1,#0F5HJNB PSW.5,AOTO2 ;检测红外信号LCALL CLEARMOV P1,#0C5HLCALL DLY1LJMP MAINAOTO2:JNB P1.6,ZZ ;状态判断JNB P1.7,YZJNB P3.6,HTJNB P3.7,HTSJMP AOTO1ZZ:MOV P1,#0E5H ;右寻迹灯亮MOV DPTR,#TAB12MOV PAGES,#3MOV COLUMN,#48LCALL LCD_DISPLCALL DLYSJMP DDYZ:MOV P1, #0D5H ;左寻迹灯亮MOV DPTR,#TAB14MOV PAGES,#3MOV COLUMN,#48LCALL LCD_DISPLCALL DLYHT:MOV P1,#0FAH ;发现障碍物MOV DPTR,#TAB11MOV PAGES,#3MOV COLUMN,#48LCALL LCD_DISPLCALL DLYSJMP ZZDD:LJMP AOTO1DL Y:MOV R7,#0BDH ;3秒延时DL1:MOV R6,#0E6HDL0:MOV R5,#21HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1RETDLY1:MOV R7,#0A7H ;1秒延时DL3:MOV R6,#0ABHDL2:MOV R5,#10HDJNZ R5,$DJNZ R6,DL2DJNZ R7,DL3NOPRETCLEAR: MOV R4,#00H ;清屏程序CLEAR1:MOV A ,R4ORL A,#0B8HLCALL WCL0LCALL WCR0MOV B,#40HLCALL WCL0LCALL WCR0MOV R3,#40HCLEAR2:MOV B,#00HLCALL WCL1LCALL WCR1DJNZ R3,CLEAR2INC R4CJNE R4, #08H, CLEAR1RETLCD_DISP: ;汉字显示程序MOV R1,#02HMOV R0,#00HMOV NUM,#10HDISP: MOV R4,NUMDISPWORD:MOV A,COLUMNCLR CSUBB A,#63JNC YXPMOV A,COLUMNORL A,#40HMOV B,ALCALL WCL0ORL A,#0B8HMOV B,ALCALL WCL0 DISPDATA1:INC COLUMNMOV A,R0MOVC A,@A+DPTRMOV B,ALCALL WCL1LJMP NEXTDISPYXP:MOV A,COLUMNCLR CSUBB A,#64ORL A,#40HMOV B,ALCALL WCR0MOV A,PAGESORL A,#0B8HMOV B,ALCALL WCR0 DISPDATA2:INC COLUMNMOV A,R0MOVC A,@A+DPTRMOV B,ALCALL WCR1 NEXTDISP:INC R0DJNZ R4,DISPWORDCLR CSUBB A,#10HMOV COLUMN, AINC PAGESDJNZ R1,DISPRETWCL0: CLR CS1SETB CS2CLR RSSETB RWWCL00: MOV P2,#0FFHSETB EMOV A,P2CLR EJB ACC.7,WCL00CLR RWMOV P2, BSETB ENOPCLR ERETWCL1: CLR CS1SETB CS2CLR RSSETB RWWCL11: MOV P2,#0FFHSETB EMOV A,P2CLR EJB ACC.7,WCL11CLR RWSETB RSMOV P2, BSETB ECLR ERETWCR0: SETB CS1CLR CS2CLR RSSETB RWWCR00: MOV P2,#0FFHSETB EMOV A,P2CLR EJB ACC.7,WCR00CLR RWMOV P2, BSETB ECLR ERETWCR1: SETB CS1CLR CS2CLR RSSETB RWWCR11: MOV P2,#0FFHSETB EMOV A,P2CLR EJB ACC.7,WCR11CLR RWSETB RSMOV P2, BSETB ECLR ERETTAB0:DB20H,30H,0ACH,63H,20H,10H,04H,04H,04H,04H,0FCH,04H,06H,04H,00H,00H,22H,67H,22H,12H,12H,52H,40H,40H,40H,40H,7FH,40H,40H,60H,40H,00H ; 红TAB1:DB40H,42H,44H,0CCH,00H,42H,36H,2AH,22H,0FEH,21H,29H,25H,80H,00H,00H,00H,40H,20H,1FH,21H,41H,5DH,49H,49H,4FH,49H,49H,5DH,61H,21H,00H ; 外TAB2:DB00H,80H,0E0H,18H,17H,10H,90H,70H,00H,0FFH,20H,40H,80H,00H,00H,00H,01H,40H,20H,11H,0AH,04H,03H,00H,00H,0FFH,00H,00H,00H,01H,03H,00H ; 遥TAB3:DB10H,10H,10H,0FFH,90H,50H,0CH,44H,24H,15H,06H,14H,24H,54H,0CH,00H,02H,42H,81H,7FH,00H,40H,42H,42H,42H,42H,7EH,42H,43H,62H,40H,00H ; 控TAB4:DB10H,10H,0D0H,0FFH,94H,14H,0E4H,0BFH,0A4H,0A4H,0A4H,0BFH,0F4H,26H,04H,00H,04H,03H,00H,0FFH,08H,89H,8BH,4AH,2AH,1EH,2AH,2AH,4BH,0C8H,48H,00H ; 模TAB5:DB10H,10H,90H,90H,90H,90H,90H,10H,0FFH,10H,12H,14H,10H,18H,10H,00H,00H,20H,60H,20H,1FH,10H,10H,08H,01H,06H,18H,20H,40H,80H,70H,00H ; 式TAB6:DB00H,08H,30H,00H,0FFH,20H,20H,20H,20H,0FFH,20H,22H,24H,30H,20H,00H,08H,0CH,02H,01H,0FFH,40H,20H,1CH,03H,00H,03H,0CH,30H,60H,20H,00H; 状TAB7:DB04H,04H,84H,84H,44H,24H,54H,8FH,14H,24H,44H,44H,84H,86H,84H,00H,01H,21H,1CH,00H,3CH,40H,42H,4CH,40H,40H,70H,04H,08H,31H,00H,00H;态TAB8:DB000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,036H,036H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H ;:TAB9:DB10H,10H,91H,0D6H,30H,98H,00H,08H,08H,0F8H,08H,08H,08H,0FCH,08H,00H,02H,01H,00H,0FFH,01H,82H,40H,20H,18H,07H,40H,80H,40H,3FH,00H,00H ; 初TAB10:DB10H,10H,0F0H,1FH,10H,0F0H,40H,60H,58H,47H,40H,40H,50H,60H,0C0H,00H,40H,22H,15H,08H,16H,61H,00H,0FEH,42H,42H,42H,42H,42H,0FFH,02H,00H;始TAB11:DB00H,00H,0FCH,24H,24H,24H,24H,24H,24H,22H,22H,23H,0A2H,30H,20H,00H,40H,30H,0FH,00H,00H,0FFH,41H,41H,41H,41H,41H,41H,0FFH,01H,00H,00H;后TAB12:DB08H,08H,08H,08H,88H,78H,0FH,08H,08H,08H,08H,88H,0CH,08H,00H,00H,20H,50H,48H,46H,41H,41H,41H,41H,7FH,41H,41H,41H,41H,60H,40H,00H;左TAB13:DB40H,20H,0F8H,07H,00H,04H,74H,54H,55H,56H,54H,54H,76H,04H,00H,00H,00H,00H,0FFH,04H,03H,01H,05H,45H,85H,7DH,05H,05H,01H,05H,03H,00H ;停TAB14:DB08H,08H,08H,08H,0C8H,38H,0FH,08H,08H,08H,08H,08H,88H,0CH,08H,00H,08H,04H,02H,01H,0FFH,41H,41H,41H,41H,41H,41H,41H,0FFH,01H,00H,00H ;右TAB15:DB08H,08H,0E8H,29H,2AH,2EH,0E8H,08H,08H,0CCH,0AH,0BH,0E8H,0CH,08H,00H,00H,00H,0FFH,09H,49H,89H,7FH,00H,00H,0FH,40H,80H,7FH,00H,00H,00H;前TAB16:DB08H,0C8H,0B8H,8FH,0E8H,88H,40H,48H,0C8H,7FH,48H,48H,4CH,68H,40H,00H,08H,18H,08H,04H,0FFH,04H,00H,02H,13H,22H,62H,9AH,06H,02H,00H,00H;转TAB17:DB00H,00H,82H,92H,92H,92H,92H,92H,92H,92H,92H,0FFH,02H,00H,00H,00H,04H,04H,04H,04H,0CH,34H,04H,04H,44H,84H,7FH,04H,04H,06H,04H,00H ;寻TAB18:DB40H,42H,0CCH,00H,08H,0C8H,08H,0F9H,0AH,0EH,0F8H,08H,4CH,88H,00H,00H,40H,20H,1FH,20H,42H,41H,50H,4FH,40H,50H,5FH,40H,40H,63H,20H,00H ;迹TAB19:DB40H,42H,0C4H,00H,0FEH,22H,22H,3FH,8AH,0A8H,0C9H,8EH,0C8H,0ACH,88H,00H,40H,20H,1FH,22H,5FH,51H,51H,5FH,40H,44H,44H,7FH,44H,64H,20H,00H ;避TAB20:DB00H,0FEH,22H,5AH,86H,10H,0D2H,56H,5AH,53H,5AH,56H,0F2H,58H,10H,00H,00H,0FFH,04H,08H,17H,10H,17H,15H,15H,0FDH,15H,15H,17H,10H,10H,00H ;障END。
红外避障小车c语言程序
LeftStop ; RightStop ; }
} //******************************************************** // 跟随程序 //******************************************************** void Follow(void) { if(RightSenser && LeftSenser&&PWM) { LeftStop ; RightStop; } if((!RightSenser) && LeftSenser&&PWM) { TurnRight_1() ; } if(RightSenser && (!LeftSenser)&&PWM) { TurnLeft_1() ; } if(!(RightSenser || LeftSenser)) { FCar() ; } } //********************************************************
红外小车壁障程序
#include"reg51.h"#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define left_infrare 0#define right_infrare 1#define dj_state1 0X5F //前进#define dj_state2 0X4F //右转#define dj_state3 0X1F //左转#define dj_state4 0X0F //后退#define dj_state5 0XfF //停车#define light_off 0x0f //关转向灯#define left_light 0X5F //左转向灯两个是5f#define right_light 0XaF //右转向灯0xaf,两个是0xbf #define back_light 0XcF //刹车灯即后灯#define front_light 0x3f //前灯#define light_on 0xff //开所有灯#define true 1#define false 0#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"};uchar code talk4[]={"Turn right"};uchar flage =0x00;sbit ledcs=P1^2; //74H573的片选信号//sbit left_led=P0^2; //左红外发射管//sbit right_led=P0^3; //右红外发射管sbit LCD_RS = P1^5; //LCD定义引脚sbit LCD_RW = P1^6; //sbit LCD_E = P1^7 ;void Delay5Ms(void){uint TempCyc = 5552;while(TempCyc--);}//400ms延时void Delay400Ms(void){uchar TempCycA = 5;uint TempCycB;while(TempCycA--){ TempCycB=7269;while(TempCycB--);}}//LCD读状态unsigned char ReadStatusLCD(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;while (LCD_Data & Busy); //检测忙信号return(LCD_Data);}//LCD写数据void WriteDataLCD(unsigned char WDLCD ){ReadStatusLCD(); //检测忙LCD_Data = WDLCD;LCD_RS=1;LCD_RW =0;LCD_E = 0; //若晶振速度太高可以在这后加小的延时 LCD_E = 0; //延时 ,为了安全LCD_E = 0; //延时LCD_E = 1;}//LCD写指令void WriteCommandLCD(unsigned char WCLCD,BuysC){if (BuysC) ReadStatusLCD(); //根据需要检测忙,BuysC为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); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); // 显示光标移动设置WriteCommandLCD(0x0C,1); // 显示开及光标设置}//按指定位置显示一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y)X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出LCD的指令码WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}//按指定位置显示一串字符(只能写一行);void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar *DData,uchar n) { uchar i;Y &= 0x01;X &= 0x0F; //限制X不能大于15,Y不能大于1for(i=0;i<ListLength;i++){ if (X <= 0x0F) //X坐标应小于0xF{ DisplayOneChar(X, Y, DData[i]); //显示单个字符if(n==true)Delay400Ms();X++;}}}/****************************红外线接收子程序,利用了中断的下降沿触发方式****************************/void infrared_ray()interrupt 0 using 3{ uchar i=90;flage=0x01; //接受标志位while(i--); //减小灵敏度EX0=0; //关掉中断,等到发射方波后才开启,处于别动}// 延时子程序void delay(uint n){while(--n);}//中断初始化void Init0(void){ EA=1;IT0=1;}/***************************************/*原理是把中断打开并发射方波,当有中断时就转到中断产生中断位为下一步转向做准备,当没有是关闭中断****************************************/void seng_wave(uchar timer,bit n)//timer通过载波发射信号的时间,n->左右发射管的选择{ uchar i;P1 |= 0X04; //ledcs=1为74ls573为11脚为高电平时数据直接输出,为低时把数据锁存住,即保持IE |= 0X01;P0 |=0x0c; //04for(i=timer;i>0;i--){ if(n)P0^=0x08; // 右发射管通过载波发射信号//00else P0^=0x04; // 左发射管通过载波发射信号//0cdelay(100); //这里控制着灵敏度(控制38khz的方波的多少)和距离} //timer*delay(x)即为发射管得到的平均电流P1 &= 0Xfb;IE &= 0Xfe;}//led转向灯指示子程序void light_control(uchar deng){ ledcs=1;P0 =deng;ledcs=0; //11111011}//电机和灯光的控制部分void control(uchar n,uchar dj_state,uchar light){ uchar i;// P1|=0x04;light_control(light); //led转向指示灯delay(100);P2 =dj_state; //电机的方向控制WriteCommandLCD(0x01,1); //LCD显示清屏switch(dj_state){ case dj_state2 :{ DisplayListChar(3,1,10,talk4,false);}break;case dj_state3: { DisplayListChar(3,1,8,talk3,false);}break;case dj_state4: { DisplayListChar(3,1,7,talk1,false); }break;default :break;}for(i=n;i>0;i--){delay(2000);}P2=dj_state5; //停车light_control(light_off); //led关闭WriteCommandLCD(0x01,1); //LCD显示清屏P2=dj_state1; //前进if(dj_state1){ P1|=0X04; //ledcs=1;P0=0x0f;P1&=0XFB;delay(100);DisplayListChar(0,0,7,talk2,false);}}/****************************************避障主要控制部分*****************************************/void move_car(void){uchar temp =0x00;//左边红外管发射seng_wave(1,left_infrare); //向下为中断开启有关闭后,要执行的语句 if(flage==0x01){temp|=0x01;flage=0x00;}//右边红外管发射delay(30);seng_wave(1,right_infrare); //向下为中断开启有关闭后,要执行的语句 if(flage==0x01){temp|=0x02;flage=0x00;}//左边有障碍物,右转if(temp==0x01){control(2,dj_state2,left_light); temp =0x00;}//右边有障碍物,左转else if(temp==0x02) {control(2,dj_state3,right_light ); temp =0x00;} //两个方向都有障碍物,后退,右转else if(temp==0x03) {control(10,dj_state4,back_light );control(5,dj_state2,right_light ); temp =0x00;}}void main(void){ Init0(); //中断初始化P1 |= 0X04; //开锁存器的控制位P0 = 0xFf; //数据口的清零P1&=0XFB; //关锁存器的控制位LCDInit(); //LCD初始化WriteCommandLCD(0x01,1); //显示清屏delay(100);P2=dj_state1;DisplayListChar(0,0,8,talk2,false);while(1){ move_car(); //主要控制部分delay(200000);//延时}}。
单片机红外遥控小车源程序
单片机红外遥控小车源程序The document was finally revised on 202151单片机红外遥控小车源程序单片机源程序如下:1./*******************************************************************************2.--------------------------------------------------------------------------------3.* 实验名 : 红外线试验4.* 实验说明 : 数码管显示红外线发送过来的键值。
5.* 连接方式 : 见连接图6.* 注意 :7.*******************************************************************************/8.9.//#include<>10.#include<>11.//--定义使用的IO--//12.13.14.sbit IRIN = P3^2;15.sbit PWM1?= P0^1;16.sbit PWM2?= P0^2;17.18.//--定义一个全局变量--//19.unsigned char timer1;20.unsigned char IrValue[6]; //用来存放读取到的红外值21.unsigned char Time;22.23.//--声明全局函数--//24.void IrInit();25.void DelayMs(unsigned int );26.void Time1Config();27.void speedup();28.void Slowdown();29.void go();30.void left();31.void right();32.void pwm_left(int x);33.void pwm_right(int x);34./*******************************************************************************35.* 函数名 : main36.* 函数功能 : 主函数37.* 输入 : 无38.* 输出 : 无39.*******************************************************************************/40.41.void main()42.{43. PWM1=0;44. PWM2=0;45. IrInit();46. Time1Config();47. while(1)48. {49.50. IrValue[4]=IrValue[2]>>4; //高位51. IrValue[5]=IrValue[2]&0x0f; //低位52. if(IrValue[4]==0x0e&&IrValue[5]==0x08)53. {54.55. pwm_left(37);56. pwm_right(40);57.58. }59.60.61. if(IrValue[4]==0x0d&&IrValue[5]==0x04)62. {63.64. pwm_left(0);65. pwm_right(0);66.67. }68.69.//70. if(IrValue[4]==0x0e&&IrValue[5]==0x02)71. {72.73. pwm_left(35);74. pwm_right(22);75.76.77. }78.79. if(IrValue[4]==0x0e&&IrValue[5]==0x00)80. {81.82. pwm_left(22);83. pwm_right(35);84.85.86. }87.88. }89.90.}91.92.93.94.95.96.void pwm_left(int x)97.{98. if(timer1>100)//PWM周期为100*99. {100.101. timer1=0;102. }103.104. if(timer1 < x) //改变30这个值可以改变直流电机的速度105. {106.107. PWM1=1;108. }109.110. else111. {112.113. PWM1=0;114. }115.116.}117.118.void pwm_right(int y)119.{120. if(timer1>100)//PWM周期为100*121. {122.123. timer1=0;124. }125.126. if(timer1 < y) //改变30这个值可以改变直流电机的速度127. {128.129. PWM2=1;130. }131.132. else133. {134.135. PWM2=0;136. }137.138.}139./***************************************************************** **************140.* 函数名 : DelayMs()141.* 函数功能 : 延时142.* 输入 : x143.* 输出 : 无144.****************************************************************** *************/145.146.void DelayMs(unsigned int x) //误差 0us147.{148. unsigned char i;149. while(x--)150. {151.152. for (i = 0; i<13; i++)153. {}154. }155.156.}157./***************************************************************** **************158.* 函数名 : IrInit()159.* 函数功能 : 初始化红外线接收160.* 输入 : 无161.* 输出 : 无162.****************************************************************** *************/163.164.void IrInit()165.{166. IT0=1;//下降沿触发167. EX0=1;//打开中断0允许168. EA=1; //打开总中断169.170. IRIN=1;//初始化端口171. PWM1=0;172.173. PWM2=0;174.}175./***************************************************************** **************176.* 函数名 : ReadIr()177.* 函数功能 : 读取红外数值的中断函数178.* 输入 : 无179.* 输出 : 无180.****************************************************************** *************/181.182.void ReadIr() interrupt 0183.{184. unsigned char j,k;185. unsigned int err;186. Time=0;187. DelayMs(70);188.189. if(IRIN==0) //确认是否真的接收到正确的信号190. {191.192.193. err=1000; //1000*10us=10ms,超过说明接收到错误的信号194. /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时195.侯,程序死在这里*/196. while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去197. {198.199. DelayMs(1);200. err--;201. }202.203. if(IRIN==1) //如果正确等到9ms低电平204. {205.206. err=500;207. while((IRIN==1)&&(err>0)) //等待的起始高电平过去208. {209.210. DelayMs(1);211. err--;212. }213.214. for(k=0;k<4;k++) //共有4组数据215. {216.217. for(j=0;j<8;j++) //接收一组数据218. {219.220.221. err=60;222. while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去223. {224.225. DelayMs(1);226. err--;227. }228.229. err=500;230. while((IRIN==1)&&(err>0)) //计算高电平的时间长度。
kiluvision5避障小车左转右转程序
kiluvision5避障小车左转右转程序一、引言随着科技的不断发展,机器人避障技术在生活中的应用越来越广泛。
本文将以Kiluvision5避障小车为例,详细介绍其左转右转程序的编写过程,以实现小车在遇到障碍物时能够自动避开,提高行驶安全性。
二、避障小车左转右转原理2.1 硬件设备避障小车的主要硬件设备包括:电机、驱动器、红外传感器、微控制器等。
电机和驱动器负责小车的行驶和转向,红外传感器用于检测障碍物距离,微控制器则是整个系统的核心,负责处理传感器数据和控制小车行动。
2.2 软件算法避障小车的左转右转程序基于以下算法:(1)当红外传感器检测到障碍物在左侧时,小车执行左转动作;(2)当红外传感器检测到障碍物在右侧时,小车执行右转动作;(3)当红外传感器检测不到障碍物时,小车继续直行。
三、左转程序编写3.1 转向条件当红外传感器检测到障碍物在左侧,并且与小车的距离小于设定阈值时,触发左转条件。
3.2 转向逻辑当满足左转条件时,微控制器发送左转信号给驱动器,使小车执行左转动作。
同时,根据障碍物的距离调整左转速度,以保证小车能够在安全范围内避开障碍物。
四、右转程序编写4.1 转向条件当红外传感器检测到障碍物在右侧,并且与小车的距离小于设定阈值时,触发右转条件。
4.2 转向逻辑当满足右转条件时,微控制器发送右转信号给驱动器,使小车执行右转动作。
同时,根据障碍物的距离调整右转速度,以保证小车能够在安全范围内避开障碍物。
五、避障算法优化5.1 灵敏度调整根据实际行驶环境,调整红外传感器的灵敏度,提高避障效果。
5.2 转向速度调整根据障碍物的距离和速度,实时调整小车的转向速度,使避障过程更加平稳。
六、实车测试与总结通过对Kiluvision5避障小车的左转右转程序进行实车测试,观察其在遇到障碍物时的反应速度和避开效果。
测试结果显示,本文所编写的程序能够有效实现小车的避障功能,提高行驶安全性。
红外线避障小车的舵机调试过程
红外线避障小车的舵机调试过程红外线避障小车的舵机调试过程一、简介红外线避障小车是一种智能机器人,可以通过红外线传感器检测前方障碍物,并通过舵机控制转向,实现避障功能。
本文将详细介绍红外线避障小车的舵机调试过程。
二、准备工作1. 硬件准备:购买一台红外线避障小车套件,包括小车底盘、电池、电机、舵机和红外线传感器等。
2. 软件准备:下载并安装Arduino IDE(集成开发环境),用于编写和上传程序到小车控制板。
三、连接电路1. 将电池连接到小车底盘上的电源接口,确保电池正负极正确连接。
2. 将电机分别连接到小车底盘上的左右轮接口,并固定好。
3. 将舵机连接到小车底盘上的转向接口,并固定好。
4. 将红外线传感器连接到小车底盘上的传感器接口,并固定好。
四、编写程序1. 打开Arduino IDE软件,创建一个新的空白项目。
2. 导入相关库文件:在代码中添加#include <Servo.h>语句,引入舵机控制库。
3. 定义舵机对象:使用Servo servo;语句定义一个舵机对象。
4. 设置舵机引脚:使用servo.attach(舵机引脚号);语句将舵机连接到指定的引脚上。
5. 设置红外线传感器引脚:使用pinMode(传感器引脚号, INPUT);语句将红外线传感器设置为输入模式。
6. 编写主循环程序:在loop()函数中编写主要的避障逻辑。
首先使用digitalRead(传感器引脚号)读取红外线传感器的数值,判断是否检测到障碍物。
如果检测到障碍物,则使用servo.write(转向角度)调整舵机的转向角度,使小车避开障碍物。
如果没有检测到障碍物,则保持直行。
7. 上传程序:将编写好的程序通过USB数据线上传到小车控制板上。
五、调试过程1. 连接电源:将电池连接到小车底盘上,并打开电源开关,确保小车正常供电。
2. 启动程序:在Arduino IDE软件中点击“上传”按钮,将程序上传到小车控制板上。
红外遥控小车的c程序
#include<reg52.h>#include<math.h>#include<intrins.h>#define uchar unsigned char //数据类型#define uint unsigned intsbit hwx=P3^3;uchar key;uchar l_lhj[66];//定义66位数组变量来存储接收的时间参数uchar ledmap[10]={0x3f, 0x06 , 0x5b, 0x4f, 0x66, 0x6d,0x7d};//*********************************************sbit ENa=P2^4; //* L298的Enable Asbit ENb=P2^7; //* L298的Enable Bsbit IN1=P2^2; //* L298的Input 1sbit IN2=P2^3; //* L298的Input 2sbit IN3=P2^5; //* L298的Input 3sbit IN4=P2^6; //* L298的Input 4uchar t=0; //* 中断计数器uchar m1=0; //* 电机1速度值uchar m2=0; //* 电机2速度值uchar tmp1,tmp2; //* 电机当前速度值//*************************************************//函数定义void Init8952( ) ; //初始化AT89C52单片机void Move_Fo( ) ; // 小车向前运动void Move_Ba( ) ; // 小车向后运动void Move_Le( ) ; // 小车向左运动void Move_Ri( ) ; // 小车向右运动void Stop( );// 小车停止void Move_Qi(); //小车加速运动void Move_Sl();//小车减速运动void Delay(uchar n) ;// 延时n 毫秒void Delay1(void);//空5个指令void Motor(uchar index , char speed);//控制小车速度void Car_Action();//*****************************************************//延时//*****************************************************void Delay(uchar n){uchar i;while(n--){for (i=0;i<250;i++){}}}void Delay1(void)//空5个指令{unsigned char i=13;while(i)i--;}//******************************************************* //单片机初始化//******************************************************* void Init8952(){TMOD = 0x02; //定时器0工作与方式2EX1=1; //开启外部中断1IT1=1; // 设置成下降沿触发方式TH0=0x9B; // 装入定时器0的初值TL0=0x9B;ET0=1; // 定时器0允许中断TR0=1; // 启动定时器0EA = 1 ;// 开总中断}//******************************************************** //电机控制函数index-电机号(1,2); speed-电机速度(-100到+100) //******************************************************** void motor(uchar index, char speed){if(speed>=-100 && speed<=100){if(index==1) // 电机1的处理{m1=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN1=0;IN2=1;}else // 不为负数则正转{IN1=1;IN2=0;}}if(index==2) // 电机2的处理{m2 = abs(speed); // 电机2的速度控制if(speed<0) // 电机2的方向控制{IN3 = 0;IN4 = 1;}else{IN3 = 1;IN4 = 0;}}}}//***************************************void Move_Fo( ) // 小车向前运动{P1 = ledmap[1];Motor(1,40);Delay(250) ;}void Move_Ba( ) // 小车向后运动{P1 = ledmap[2];Motor(1,-40) ;Delay(250) ;}void Move_Le( ) // 小车向左运动{P1 = ledmap[3];//Motor(1,40);Motor(2,90);Delay(30) ;Motor(1,80);Delay(50) ;}void Move_Ri( ) // 小车向右运动{P1 = ledmap[4];Motor(2,-90);Delay(30) ;//Delay(250) ;Motor(1,80);Delay(50) ;}void Move_Qi( )//加速{uchar i;P1 = ledmap[5];for(i=40;i<100;i+=15){Motor(1,i);// Motor(2,i-3);Delay(250) ;Delay(250) ;}}void Move_Sl()//减速{uchar j;P1 = ledmap[6];for(j=80;j>0;j-=8){Motor(1,j);Delay(250) ;Delay(250) ;}}void Stop( ) //小车停止{P1 = ledmap[0];IN1 = IN2;IN3 = IN4;}void Car_Action() //判断红外线信号小车响应运动{switch( key ){case 0x03://暂停Stop( ) ; break ;case 0x01: //前进Move_Fo() ;break;case 0x02: // 后退Move_Ba() ;break;case 0x04: // 左转Move_Le() ;break;case 0x05: // 右转Move_Ri() ;break;case 0x06://快速运行Move_Qi( ) ; break ;case 0x07:Move_Sl( ) ;break ;//减速}}//************************************************* //主函数void main( ){//Delay(100) ;Init8952( );while(1){Car_Action();//Delay(10) ;}//*****************************************************//定时器0 中断函数void timer0( ) interrupt 1 // T0中断服务程序{if(t==0) // 1个PWM周期完成后才会接受新数值{tmp1 = m1 ;tmp2 = m2 ;}if(t<tmp1)ENa = 1 ;elseENa = 0 ; // 产生电机1的PWM信号if(t<tmp2)ENb = 1 ;elseENb = 0 ; // 产生电机2的PWM信号t++;if(t>=100) // 1个PWM信号由100次中断产生t = 0 ;}//********************************************************void hongwai(void) interrupt 2 //外部中断1 ,INT1(P3^3)连接红外线接收IC数据脚{uchar i,j,tmp;EX1=0;j=33;//传送一组数包括引导码1位,地址码8位加反码8位,指令码8位加反码8位,总共33位i=0;//从第一维数组开始tmp=100;//加八延时,while(tmp){tmp--;}if(hwx){//然后再检测红线接收脚是有数据招收,有继续,没有则退出EX1=1;return;}{//循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就//可以判断1或0了,在这里我们都接收,为串口调试软件接收计算波形//还有一点要知道,接收波形是反向,在没有接收时端口为高电平tmp=0;l_lhj[i]=1;//时间量从1开始while(!hwx){//检测高低电平的变化l_lhj[i]++;//没变继续加1Delay1();//加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满tmp++;//此变量为防止干扰带来的死循环if(tmp==250)break;}i++;tmp=0;l_lhj[i]=1;//时间量从1开始while(hwx){//检测高低电平的变化l_lhj[i]++;//没变继续加1Delay1();//同上tmp++;if(tmp==250)break;}i++;j--;}i=255;//加入循环延时,抗干扰while(i){tmp=255;while(tmp){tmp--;}i--;}tmp=0;for(i=3;i<19;i++,i++){//处理地址位,对低电平时间数据的数理,这里我们只处理地址码和指令码,引导码和反码我们就忽略tmp>>=1;//右移一位,接收低电平在前if(l_lhj[i]>30)//检测低电平时间超过30就确认为1tmp+=0x80;}for(i=35;i<51;i++,i++){//同上,这里处理指令位tmp>>=1;if(l_lhj[i]>30)tmp+=0x80;}key=tmp;EX1=1;}。
红外遥控小车程序
程序已调试,能实现前进、后退、左前转、右前转、左后转、右后转、左圆转、右圆转等,并且有LED灯显示。
//**********************************************//***************红外小车***********************//**********************************************#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit M11=P1^0; // 电机1接口sbit M12=P1^1;sbit M21=P1^2; // 电机2接口sbit M22=P1^3;sbit LED0=P0^0; // 紧急灯sbit LED1=P0^1; // 左前灯sbit LED2=P0^2; // 右前灯sbit LED3=P0^3; // 左后灯sbit LED4=P0^4; // 左后灯sbit F=P1^5; //蜂鸣器接口sbit Int0 = P3^3; // 红外接收采用外部中断1uchar TEMP1=0; //全局变量用于存放红外返回值-用于PWM占空比的控制uchar TEMP2=10; // 用于方向的控制uchar databus[7];//用于红外接收存放数据//************************************************************//延时函数void delay1(uint xms) //delay 0.1ms{uint i,j;for(i=xms;i>0;i--)for(j=13;j>0;j--);}//************************************************************//********************接受解码函数uchar Rec(){uchar temp=0; //函数内部临时变量用于返回函数值uint i=0; // 用于存放数据的临时变量uint j=0;uint m=0; // 局部计数临时变量uint n=0; // 局部计数临时变量uint k=0; // 局部计数临时变量EX1=0; // 关外部中断1 以防再次外部1中断的介入while(!Int0) //用于计时前9Ms低电平的引导码{delay1(1);m++; // 计数引导码的长度}if(m<=60)return 0; //while(Int0) //用于计时4.5ms高电平的引导码{delay1(1);n++; //计时高电平}if(n<=30)return 0;M11=M12=M21=M22=0; //进入中断停止电机防止电机颤抖for(i=0;i<4;i++)for(j=0;j<8;j++){while(!Int0) //过滤数据的低位0.56ms低电平{delay1(1);}while(Int0) // 进入高电平计时{delay1(1);k++; // k计时每次的高电平}databus[i]=databus[i]>>1; // 数据接收数组首先默认接收为0信号即databus 【i】//第7位移入0if(k>=10){databus[i]=databus[i]|0x80; // 若为1把第8位置1}k=0; //把k的值重新置零};if(databus[2]!=~databus[3])return 0;temp=databus[2]; // 返回赋值return temp; //}//****************************************************//**********红外接受中断服务函数+接受编码TEMP1TEMP2void int0() interrupt 2{uchar temp; // 临时存放红外接收函数返回值uint i=0; // 计数临时变量LED0=1; //因紧急灯是闪烁的每次中断时结果不一样为保证效果先灭紧急指示灯temp=Rec(); // 红外函数返回赋值switch (temp) // 对返回的数据进行编码方便后面的操作{case 0x40:{TEMP2=0;//紧急状态暂停break;}case 0x46:{TEMP2=1;//前进LED2=LED1=0; //指示灯设置LED4=LED3=1;break;}case 0x44:{TEMP2=2;//左前转LED1=0; //指示灯设置LED2=LED4=LED3=1;break;}case 0x43 :{TEMP2=3;//右前转LED2=0; //指示灯设置LED1=LED4=LED3=1;break;}case 0x15:{TEMP2=4; //倒车状态LED2=LED1=1; //指示灯设置LED4=LED3=0;break;}case 0x07:{TEMP2=5;//左后转LED3=0; //指示灯设置LED1=LED4=LED2=1;break;}case 0x09:{TEMP2=6;//右后转LED4=0; //指示灯设置LED1=LED2=LED3=1;break;}case 0x45:{TEMP2=7; //左园转break;}case 0x47:{TEMP2=8;//右园转break;}} //每次接受红外蜂鸣器蜂鸣一次F=1;delay1(300);F=0;EA=1; // 开总中断EX1=1; // 开外1中断IT1=1; // 下降沿触发}//*****************************************//**********电机驱动函数void PWM_RUN(){uchar n=0; //n=TEMP2;if(n==0) //紧急状态{M11=M12=M21=M22=0;LED0=~LED0; //设置紧急灯动作delay1(1000);}if(n==1) //m1和m2都前转前进{ M11=1; M12=0; M21=0; M22=1; }if(n==2) //m1停止m2前转实现左前转弯{ M11=0; M12=0; M21=0; M22=1; }if(n==3) // m1前转m2停止实现右前转{ M11=1; M12=0; M21=0; M22=0; }if(n==4)//m1m2倒转实现倒车{ M11=0; M12=1; M21=1; M22=0; }if(n==5) //m1停止m2倒转实现左后转{ M11=0; M12=0; M21=1; M22=0; }if(n==6)// m1倒转m2停止实现右后转{ M11=0; M12=1; M21=0; M22=0; }if(n==7)//m1倒传m2前转实现左方向原地打转{ M11=0; M12=1; M21=0; M22=1; }if(n==8)//m1前转m2倒转实现右方向原地打转{ M11=1; M12=0; M21=1; M22=0; }}//***************************THE main()void main(){EA=1; // 开总中断EX1=1; // 开外1中断IT1=1; // 下降沿触发P1=0; // P1口为电机控制口初始化为0即开机时电机是停止的while(1) {PWM_RUN();}}。
循迹、红外避障、遥控综合程序
循迹、红外避障、遥控综合程序/**********************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红外避障小车课程设计报告一、设计简介红外避障小车是一款利用红外传感器避开障碍物的智能小车。
通过在车身前方安装红外传感器,当小车遇到障碍物时,传感器能够检测到障碍物并发送信号给控制器,控制器根据接收到的信号调整小车的运动状态,实现自动避障。
二、系统构成1.控制器:采用Arduino控制器,通过编程实现小车的运动控制和红外避障功能。
2.红外传感器:选用光电传感器,能够检测到前方障碍物并发送信号给控制器。
3.电机驱动器:采用L293D或L298N电机驱动器,驱动小车前进、后退、左转和右转。
4.电池:为整个系统提供电源。
三、硬件搭建1.将控制器、红外传感器、电机驱动器和电池按照电路图正确连接。
2.将红外传感器固定在小车前方适当位置,确保能够检测到前方障碍物。
3.将电池固定在小车底部,保证电源供应稳定。
四、软件编程1.导入Arduino开发环境,编写程序实现小车的运动控制和红外避障功能。
2.编写程序控制电机驱动器,实现小车的运动控制。
3.编写程序读取红外传感器的信号,根据传感器信号调整小车的运动状态。
4.调试程序,确保小车能够正常运行并实现红外避障功能。
五、测试与验证1.在不同环境下测试小车的避障功能,包括直线、曲线、障碍物大小和距离等。
2.观察小车的运动状态,检查是否存在异常情况。
3.测试小车的响应速度和稳定性,确保其性能达到预期要求。
4.在实际应用中进行测试,验证小车的实用性和可靠性。
六、总结与展望本设计实现了一款基于Arduino控制器的红外避障小车,通过编程实现了小车的运动控制和避障功能。
测试结果表明,小车的性能稳定可靠,具有较好的实用性和市场前景。
未来可以进一步完善小车的功能,如增加无线遥控、自动导航等,提高其智能化程度和应用范围。
红外避障小车原理介绍及制作
红外避障小车原理介绍及制作引言:红外避障小车是一种能够通过红外线传感器检测前方障碍物并自动转向避免碰撞的智能小车。
本文将介绍红外避障小车的原理及其制作方法。
1. 红外避障小车的原理红外避障小车通过使用红外线传感器识别前方的障碍物。
红外线传感器是一种能够发送和接收红外线信号的装置。
当红外线传感器接收到反射回来的红外线信号时,就会触发避障小车的转向动作。
2. 制作所需材料2.1 电机和轮子:用于小车的驱动和移动;2.2 Arduino控制板:用于编程和控制小车;2.3 红外线传感器:用于检测前方障碍物,并控制小车的方向;2.4 电池盒和电池:用于为小车供电;2.5 连线和焊接工具:用于连接各个组件;2.6 其他辅助材料:如螺丝、螺母等。
3. 制作步骤3.1 连接电机和轮子:首先,将电机通过导线连接到Arduino控制板上。
然后将轮子固定在电机上,确保能够顺利驱动小车移动。
3.2 安装红外线传感器:将红外线传感器连接到Arduino控制板上,确保能够准确接收红外线信号。
3.3 编写程序:使用Arduino的开发环境,编写程序以控制红外避障小车的运动。
程序的逻辑可以设计为:当红外线传感器接收到反射信号时,小车停止前进并进行转向操作,以避免碰撞。
3.4 连接电池盒:将电池盒通过导线连接到Arduino控制板上,以提供小车所需的电力。
3.5 测试运行:将程序上传到Arduino控制板上,并将电池插入电池盒中。
然后测试红外避障小车的运行情况,观察是否能够准确识别障碍物并进行避免碰撞的动作。
4. 使用注意事项4.1 红外线传感器的安装位置需要保持稳定,并且不受外界其他光源的干扰,以确保能够准确接收反射信号。
4.2 程序设计中需要考虑到红外避障小车在遇到障碍物时的反应速度及动作的平稳性,以提高小车的避障性能。
4.3 定期检查电池的电量是否充足,并及时更换电池,以保证小车的正常运行。
5. 经济和实用性分析红外避障小车的制作成本相对较低,所需材料和设备均易获取,并且拥有广泛的应用场景。
红外避障小车
红外避障小车目的:本毕业设计是红外蔽障小车的设计,通过设计使学生系统的熟悉和掌握单片机控制系统设计方面的内容体系、开发流程和程序设计,培养学生具有综合运用所学的理论知识去开拓创新及解决实际问题的能力。
培养学生掌握设计题的思想和方法,树立严肃认真的工作作风、培养学生调查研究、查阅技术文献、资料、手册以及编写技术文献的能力。
同时是为了掌握电路设计的方法和技巧。
如何将学习到的理论知识运用到实际当中去,怎样能够活学活用,深入的了解电子元器件的使用方法,了解各种元器件的基本用途和方法,能够灵活敏捷的判断电路中出现的故障,学会独立设计电路,积累更多的设计经验,加强焊接能力和技巧,完成基本的要求。
并能完美的完成这次实训。
目录一、任务书...............................P1二、引言..............................P2二、要求与发挥...........................P4三、设计摘要.............................P6四、模块方案比较.......................P71.避障模块2.驱动模块3.控制模块五、程序设计.........................P91.程序流程图2.程序编写六、工作原理.........................P13七、结论............................P13八、参考文献........................P14九、毕业设计(论文)成绩评定表.....P15任务:利用单片机、红外实现避障,要求具有下述功能:1.小车前进可以避开(前、左、右)20cm的障碍物;2.实现下车前进时,不碰障碍物;3.具有声音播报功能。
引言随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
红外线遥控小车c程序
#include <reg52.h>sbit servo=P2^5; //PWM信号输出sbit zuo11=P1^0; //为0为左边正转sbit zuo12=P1^1; //为1为左边正转sbit you21=P1^2; //为1为右边正转sbit you22=P1^3; //为0为右边正转uchar redmessage[4]={0x00,0x00,0x00,0x00};uchar qianjin[]={0xf6,0xf0,0xf0}; // 左右行驶变量uchar houtui[]={0xf9,0xf0,0xf0}; ////uint qianX=0,houX=0; //uint haha; //uint mark; //uint mark1,mark2;uchar control=12; //角度标识uchar jishu; //0.125ms次数标识unsigned long m,Tc;void delay(uint a){uint b,c;for(b=a;b>0;b--)for(c=115;c>0;c--);}void T1_out() interrupt 2{Tc=TH0*256+TL0; //提取中断时间间隔时长TH0=0;TL0=0; //定时中断重新置零if((Tc>8000)&&(Tc<14000)){m=0;mark1=1;return;} //找到启始码if(mark1==1){if(Tc>1450&&Tc<3000){redmessage[m/8]=redmessage[m/8]>>1|0x80;m++;}if(Tc>700&&Tc<1450){redmessage[m/8]=redmessage[m/8]>>1;m++; //取码}if(m==32){m=0;mark1=0;if(redmessage[2]==~redmessage[3]){mark2=1 ;}else{mark2=0; //取码完成后判断读码是否正确}}}}void red_check(){if(mark2==1){switch(redmessage[2]){case 0x16: //遥控器+键按下角度加45control++; //角度标识加1jishu=0; //按键按下则20ms周期从新开始if(control==21){control=20; //已经是180度,则保持}break;case 0x0d: //遥控器-键按下角度减45control--; //角度标识减1jishu=0;if(control==0){control=1; //已经是0度,则保持}break;case 0x15:houX=0;qianX=1; //前进数据位break;case 0x18:qianX=0;houX=1; //后退数据位break;case 0x19:TR1=~TR1;P1=0xf0; //启动数据位break;default:break;}mark2 = 0;}}void initial_T01(){TMOD=0x21;TH1=0xfc;TL1=0x66;TH0=0xff;TL0=0x8c;EA=1;ET0=1;TR0=1;ET1=1;TR1=0;}void main(){m=0;mark1=0;EA=1;IT1=1;EX1=1;//// TMOD=0x11;// TH0=0;// TL0=0;// TR0=1;control=1;jishu=0;servo=0;initial_T01();servo=1;while(1){red_check(); //红外接收处理}}void T0_waytwo() interrupt 1{TH0=0xff;TL0=0x8c;if(jishu<control)servo=1;elseservo=0;jishu++;jishu=jishu%160;}void T1_waytwo() interrupt 3{TH1=0xfc; //1ms一中断TL1=0x66;mark++;if(mark==5){mark=0;if(qianX==1)P1=qianjin[haha];if(houX==1)P1=houtui[haha];//// haha++;// if(haha==2) haha=0;}}。
智能小车循迹避障红外遥控C语言代码
.//智能小车避障、循迹、红外遥控C语言代码//实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹,1602显示小车的工作状态,另有三个独立按键分别控制三种状态的转换//注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <reg52.h>#include <math.h>#includelcd.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 =2sbit 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;}}s3是否按下if(KEY2==0) //检测按键{消除抖动Delay10ms(); //if(KEY2==0){1 总状态定义// 0为自动循迹模块为自动避state_total=2;2 为红外遥控障模块检测按键是否松开while((i<30)&&(KEY2==0)) //{Delay10ms();i++;}i=0;'..}}}init_test();delay(50); //等待硬件操作50usTR1=0; //关闭定时器1if(state_total==1){//SPEED=90; //自动循迹速度控制高电平持续次数占空比为10的低电平bizhang_test();}if(state_total==0){// SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平xunji_test();}if(state_total==2){//SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平hongwai_test();}}void init0_suspend(void) interrupt 0 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{timeH=TH0; //记录高电平次数timeL=TL0; //state=1; //标志状态为1,表示已接收到返回信号EX0=0; //关闭外部中断0}void time0_suspend0(void) interrupt 1 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{if(state_total==1) // 自动避障初值装入{ TH0=0X00; //装入初值TL0=0x00;}if(state_total==0) //自动循迹初值装入{ TH0=0Xec; //装入初值定时一次0.005s 200hzTL0=0x78;time_1++; //控制转弯延时计数'..}}void IR_IN(void) interrupt 2{unsigned char j,k,N=0;EX1 = 0;IRdelay(5);if (TRIG==1){ EX1 =1;return;}//确认IR信号出现while (!TRIG) //等IR变为高电平,跳过9ms的前导低电平信号。
红外循迹、超声波避障小车编程
你的指尖可以改变世界
红外循迹小车 模块设置
红外模块
灵敏度调节器
开关指示灯
认识循迹模块
串口监视程序
上载程序到Arduino
上传成功
认识循迹模块
监视串口
串口监视页面
串口监视器按钮
临界数据
1
对比在黑线以及空白区域上反馈的数据
超声波测距仪
前
触发针脚——2 接收针脚——3
LOREM IPSUM DOLOR LOREM IPSUM DOLOR
LOREM IPSUM DOLOR LOREM IPSUM DOLOR LOREM IPSUM DOLOR LOREM IPSUM DOLOR
LOREM IPSUM DOLOR LORE
THANKS!
左
触发针脚——? 接收针脚——?
右
触发针脚——? 接收针脚——?
车体运动
1
转向判断
车身方向
前
左
?
右
?
注意:M1、M2针脚对应4,5,6,7
逻辑运算
1
数据对比
数据比对
VS
控制程序
1
控制程序运用
控制程序
A
B
C
兴趣拓展
1
子程序
拓展学习——子程序
LOREM IPSUM DOLOR LOREM IPSUM DOLOR LOREM IPSUM DOLOR LOREM IPSUM DOLOR
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 后退
//********************************************************
void BCar()
{
BLeftMotor ;
BRightMotor ;
}
//********************************************************
#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
//********************************************************
智能小车红外避障c语言程序
#include <AT89X52.H>
bit RandomFactor = 0 ;
bit RandomFactorBuf = 0 ;
#include <Timer.H>
#define FLeftMotor P0_2 = 1 ; P0_3 = 0
#define BLeftMotor P0_2 = 0 ; P0_3 = 1
if((!RightSenser) && LeftSenser&&PWM)
{
BTurnLeft_1() ;
}
if(RightSenser && (!LeftSenser)&&PWM)
{
BTurnRight_1() ;
}
if(!(RightSenser || LeftSenser))
// 用倒退的方式进行车头右转
//********************************************************
void BTurnRight_1()
{
LeftStop ;
BRightMotor ;
}
//********************************************************
Timer0Setup(500) ;
Timer1Setup(50) ;
Obstacle_Avoid() ;
// Follow() ;
}
{
RandomFactorBuf = RandomFactor ;
while (!(RightSenser || LeftSenser))
{
if(RandomFactorBuf)
{
BTurnLeft_1() ;
delay (300) ;
// 左转
//********************************************************
void TurnLeft_1()
{
LeftStop ;
FRightMotor ;
}
//********************************************************
}
if(!RandomFactorBuf)
{
BTurnRight_1() ;
delay (300) ;
}
}
}
if(!PWM)
{
LeftStop ;
RightStop ;
}
}
//********************************************************
{
FCar() ;
}
}
//********************************************************
//********************************************************
main()
{
// 用倒退的方式进行车头左转
//********************************************************
void BTurnLeft_1()
{ RightStop ;
BLeftMotor ;
}
//********************************************************
// 快速右转
//********************************************************
void TurnRight_Fast()
{
BRightMotor ;
FLeftMotor ;
}
//********************************************************
// 快速左转
//********************************************************
void TurnLeft_Fast()
{
BLeftMotor ;
FRightMotor ;
}
//********************************************************
// 跟随程序
//********************************************************
void Follow(void)
{
if(RightSenser && LeftSenser&&PWM)
{
LeftStop ;
RightStop;
}
if((!RightSenser) && LeftSenser&&PWM)
{
TurnRight_1() ;
}
if(RightSenser && (!LeftSenser)&&PWM)
{
TurnLeft_1() ;
}
if(!(RightSenser || LeftSenser))
// 前进
//********************************************************
void FCar()
{
FLeftMotor ;
FRightMotor ;
}
//********************************************************
// 右转
//********************************************************
void TurnRight_1()
{
RightStop ;
FLeftMotor ;
}
//********************************************************
// 壁障程序
//********************************************************
void Obstacle_Avoid(void)
{
if(RightSenser && LeftSenser&&PWM)
{
FCar() ;
}