红外遥控小车程序
- 格式:doc
- 大小:112.00 KB
- 文档页数:23
#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的高电平引导码信号。
基于msp430g2553的红外遥控小车解码控制程序//遥控小车最终程序#include#define CPU_F ((double)12000000)//数字控制震荡器1MHZ#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/12000000.0))//延时X微秒#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/12000.0))//延时X毫秒char const redled[8]={0x07,0x00,0x01,0x02,0x03,0x04,0x05,0x06};//led测试版对应的八个灯unsigned char receive[2]={0x00,0x00};//数据码,数据反码unsigned char j=0,k=0,f=0,led=0;//中断次数,receive的元素,,找到按键地址数组的第f个元素int flag=1;//***************************主程序********************//void main(void){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗BCSCTL1=CALBC1_1MHZ; //这两句的作用,基本时钟系统控制,数控震荡控制,将时钟校准1MHZDCOCTL=CALDCO_1MHZ;P1DIR|=BIT0+BIT6+BIT2+BIT3+BIT4;//P1端口的P1.0、P1.6设置为输出方向P2DIR|=0x0f; //P2的0,1,2,3设置为输出口P1OUT|=BIT0+BIT6; //P1.0、P1.6输出高电平,次单片机的VCC为3.56VP1IE|=0X02; //P1.1中断使能P1IES|=BIT1; //P1.1中断边沿选择,下降沿触发P1IFG=0; //清P1.1中断标志_BIS_SR(GIE); //开总中断while(1) //{if(receive[0]==0xa2){flag=1;}if(receive[0]==0xe2){flag=-1;}if(flag==1) //正转P1.0{P1OUT&=~BIT3;P1OUT&=~BIT4;switch(receive[0]){case 0x68:{P1OUT&=~BIT0;P1OUT&=~BIT2;break;} //0键case0x30:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(1);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(9);}break;}//1键case0x18:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(2);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(8);}break;}//2键case0x7a:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(3);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(7);}break;}//3键case0x10:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(4);P1OUT&=~BIT0;P1OUT&=~BIT2;delay_m s(6);}break;}//4键case0x38:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(5);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(5);}break;}//5键case0x5a:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(6);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(4);}break;}//6键case0x42:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(7);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(3);}break;}//7键case0x4a:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(8);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(2);}break;}//8键case 0x52:{P1OUT|=BIT0;P1OUT|=BIT2;break;} //9键}}else if(flag==-1) //反转P1.2{P1OUT&=~BIT0;P1OUT&=~BIT2;switch(receive[0]){case 0x68:{P1OUT&=~BIT3;P1OUT&=~BIT4;break;} //0键case0x30:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(1);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(9);}break;}//1键case0x18:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(2);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(8);}break;}//2键case0x7a:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(3);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(7);}break;}//3键case0x10:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(4);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(6);}break;}//4键case0x38:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(5);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(5);}break;}//5键case0x5a:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(6);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(4);}break;}//6键case0x42:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(7);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(3);}break;}//7键case0x4a:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(8);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(2);}break;}//8键case 0x52:{P1OUT|=BIT3;P1OUT|=BIT4;break;} //9键}}}}//*********************红外遥控器中断程序*******************//#pragma vector=PORT1_VECTOR //中断程序的格式:#pragma vector=中断矢量__interrupt void port1(void)//格式:__interrupt void 函数名(void){P1IFG=0X00; //清P1中断标志int count=0; //高电平持续时间计数值while(!(P1IN&BIT1)); //等电平变为高电平while(P1IN&BIT1) //计算高电平持续时间{count++;if(count>8000)return;//如果高电平持续时间过长则推出中断程序}if(j>16) //一体化红外接收头一接收遥控器信号,就会输出32位的脉冲序列波,其中后16位{ //决定遥控器的按键地址,16位由8位数据码和数据反码组成,我们需要将其解码//time[j-17]=count; //将记得的高电平持续时间放入时间数组中if(j==25)k++; //到数据反码的起始位的时候,我让receive数组元素下标+1receive[k]<<=1; //接收数据码左移一位,比如:xxxx xxxx 左移一位后xxxx xxx0if(count>80)receive[k]|=0x01;//高电平持续时间超过80,则将左移一位后的最低位变1,} //结果变为,xxxx xxx1,如果没超过80则保持不变,xxxx xxx0 j++;if(j>32){j=0;k=0; //解码结束,j,k值清零delay_ms(150);}}。
/*预处理命令*/#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};sbit IRIN=P3^2; //红外接收器数据线sbit LCD_RS = P0^7;sbit LCD_RW = P0^6;sbit LCD_EN = P0^5;uchar begin[]={"My car!"};uchar cdis1[]={"jiansu!"};uchar cdis2[]={"qianjin!"};uchar cdis3[]={"jiasu!"};uchar cdis4[]={"zuozhuang!"};uchar cdis5[]={"STOP!"};uchar cdis6[]={"youzhuan!"};uchar cdis8[]={"daoche!"};sbit M1 = P1^0;sbit M2 = P1^1;sbit M3 = P1^2;sbit M4 = P1^3;sbit EN12 = P1^4;sbit EN34 = P1^5;uchar IRCOM[7];uchar m,n;uchar t=2;uchar g;uchar code digit[]={"0123456789"};uint v;uchar count;bit flag;void delayxms(uchar t);void delay(unsigned char x) ;void delay1(int ms);void motor();void lcd_display();/*检查LCD忙状态lcd_busy为1时,忙,等待。
附录一程序代码红外遥控编码程序#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define 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。
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit you_2=P2^0;//红外探测端口定义sbit you_1=P2^1;sbit zhong=P2^2;sbit zuo_1=P2^3;sbit zuo_2=P2^4;sbit CG=P0^1;sbit DC=P0^0;uchar code L_F[8]= {0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//左电机正转uchar code L_B[8]= {0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};//左电机反转uchar code R_F[8]= {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//右电机正转uchar code R_B[8]= {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//右电机反转uchar code B_F[8]= {0x91,0x83,0xc2,0x46,0x64,0x2c,0x38,0x19};//左反右正uchar code F_B[8]= {0x19,0x38,0x2c,0x64,0x46,0xc2,0x83,0x91}; //左正右反uchar code duandian[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//断电unsigned char code qianjin[]={0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99};//前进unsigned char h[]={0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99};//uchar i;void delay(uint z){uint k ;uint j;for(k=0; k<z; k++)for(j=0; j<110; j++);}void QJ(unsigned int i){for(i=0;i<8;i++){P1=h[i]=qianjin[i];delay(13);}}void DD(){P1=0x00;delay(300);}void wtj(){while(1){if(P2==0xff){DD();delay(1000);break;}else{QJ(8);}}}void YG_1(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=F_B[i];delay(10);}}void ZG_1(){ unsigned char i;for(i=0;i<8;i++){P1=h[i]=B_F[i];delay(10);}}void byg(){while(1){if(P2==0xfb)break;else if(P2==0xf9)break;else if(P2==0xfd)break;/*if(P2^0==0)break;else if(P2^1==0)break;/*else if(P2^2==0)break;else if(P2^3==0)break;else if(P2^4==0)break;*/elseYG_1();}}void bzg(){while(1){if(P2==0xfb)break;else if(P2==0xf3)break;else if(P2==0xf7)break;/*if(P2^0==0)break;else if(P2^1==0)break;else if(P2^2==0)break;if(P2^3==0)break;else if(P2^4==0)break;*/elseZG_1();}}void YG_2(){//unsigned char i; //unsigned char g;if(P2==0xfa){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}} */}else if(P2==0xf2){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else if(P2==0xf6){//delay(4000);byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else if(P2==0xf4){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else ;}void ZG_2(){//unsigned char i; //unsigned char g;if(P2==0xeb){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/else if(P2==0xe9){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else if(P2==0xed){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else if(P2==0xe5){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else ;}void ZG(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=R_F[i];delay(11);}}void YG(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=L_F[i];delay(11);}}/*void HT(){unsigned char i;for(i=0;i<8;i++){P1=houtui[i];delay(55);}}*/void zd(){while(1){if(P2==0xe0)QJ(8);else if(P2==0xff){while(1){DD();}}else{QJ(80);if(P2==0xff){while(1){DD();}}else{DC=0;break;break;}}}}void zd1(){while(1){if(P2==0xe0)QJ(8);else if(P2==0xff){while(1){DD();}}else{QJ(80);if(P2==0xff)while(1){DD();}}else{DC=0;break;}}}}void hy(){unsigned char i;for(i=0;i<8;i++){P1=h[i];delay(10);}}void main(){DC=1;while(1){QJ(8);if(P2!=0xff){delay(9000);break;}}while(1){DC=1;if(CG==1){delay(9000);DC=1;while(1){switch(P2){case 0xfb:QJ(8);break;//11011case 0xf1:QJ(8);break;//10001case 0xf3:QJ(8);break;//10011case 0xf7:ZG();break;//10111case 0xe7:ZG_1();break;//00111case 0xef:ZG_1();break;//01111case 0xe3:ZG_1();break; //00011case 0xe1:ZG_1();break; //00001case 0xf9:QJ(8);break;//11001case 0xfd:YG();break;//11101case 0xfc:YG_1();break;//11100case 0xfe:YG_1();break;//11110case 0xf8:YG_1();break; //11000case 0xf0:YG_1();break;//10000case 0xfa://11010QJ(16);// delay(4000);YG_2();//f7 break;case 0xf2://10010QJ(16);// delay(4000);YG_2();break;case 0xf6://10110QJ(16);// delay(4000);YG_2();break;case 0xf4://10100QJ(16);// delay(4000);YG_2();break;case 0xeb://01011QJ(16);//delay(4000);ZG_2();//fd break;case 0xe9://01001QJ(16);//delay(4000);ZG_2();break;case 0xed://01101QJ(16);//delay(4000);ZG_2();break;case 0xe5://00101QJ(16);//delay(4000);ZG_2();break;case 0xe0:zd1();break;//00000case 0xff:hy();break;//11111default:QJ(8); break;}}}else{switch(P2){case 0xfb:QJ(8);break;//11011 case 0xf1:QJ(8);break;//10001case 0xf3:QJ(8);break;//10011 case 0xf7:ZG();break;//10111 case 0xe7:ZG_1();break;//00111 case 0xef:ZG_1();break;//01111 case 0xe3:ZG_1();break; //00011 case 0xe1:ZG_1();break; //00001case 0xf9:QJ(8);break;//11001 case 0xfd:YG();break;//11101 case 0xfc:YG_1();break;//11100 case 0xfe:YG_1();break;//11110 case 0xf8:YG_1();break; //11000 case 0xf0:YG_1();break;//10000case 0xfa://11010QJ(16);// delay(4000);YG_2();//f7 break;case 0xf2://10010QJ(16);// delay(4000);YG_2();break;case 0xf6://10110QJ(16);// delay(4000);YG_2();break;case 0xf4://10100QJ(16);// delay(4000);YG_2();break;case 0xeb://01011QJ(16);//delay(4000);ZG_2();//fd break;case 0xe9://01001QJ(16);//delay(4000);ZG_2();break;case 0xed://01101QJ(16);//delay(4000);ZG_2();break;case 0xe5://00101QJ(16);//delay(4000);ZG_2();break;case 0xe0:zd();break;//00000case 0xff:hy();break;//11111default:QJ(8); break;}}}}。
单片机红外遥控小车源程序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)) //计算高电平的时间长度。
#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();}}。
/************************************************************************** **简单寻迹程序:接法EN1 EN2 PWM输入端,本程序不输入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_0 P1_1 接IN1 IN2 当P1_0=0,P1_1=0; 时左上电机停转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_2 P1_3 接IN3 IN4 当P1_2=0,P1_3=0; 时左下电机停转P1_4 P1_5 接IN5 IN6 当P1_4=1,P1_5=0; 时右上电机正转右上电机接驱动板子输出端(蓝色端子OUT5 OUT6)P1_4 P1_5 接IN5 IN6 当P1_4=0,P1_5=1; 时右上电机反转P1_4 P1_5 接IN5 IN6 当P1_4=0,P1_5=0; 时右上电机停转P1_6 P1_7 接IN7 IN8 当P1_6=1,P1_7=0; 时右下电机正转右下电机接驱动板子输出端(蓝色端子OUT7 OUT8)P1_6 P1_7 接IN7 IN8 当P1_6=0,P1_7=1; 时右下电机反转P1_6 P1_7 接IN7 IN8 当P1_6=0,P1_7=0; 时右下电机停转P3_4接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1P3_5接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2P3_6接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3P3_7接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4四路寻迹传感器有信号(白线)为0 没有信号(黑线)为1四路寻迹传感器电源+5V GND 取自于单片机板靠近液晶调节对比度的电源输出接口关于单片机电源:本店驱动模块内带LDO稳压芯片,当电池输入6V时时候可以输出稳定的5V分别在针脚标+5 与GND 。
/*************************************************************************原理:根据高电平持续时间判断信号传输的是0还是1进行解码方法:采用定时器这里用width=end-start,width的长度来判断解码信号为1还是0 功能:按一个键,单片机数码管上显示按键的用户码、数据码和数据反码**************************************************************************/#include <msp430f5438a.h>#include "PIN_DEF.H"#define uchar unsigned char#define uint unsigned intuint start = 0,end = 0; //计数开始和结束标志uint width = 0; //用于存放脉宽uint en = 0,n = 0; // en用于保存是否有引导码进入,n表示保存信号的数组IR[]下标uchar IR[32]; //先用数组将接收到的数据保存起来uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区uchar disp_buf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //显示缓冲单元,初值为0x00,指向显示码的8个"0"uchar seg_data[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//0~F和"-"符的显示码(字形码)/* 50us的延迟函数*/void delay_50us(unsigned int t){unsigned int j;for(;t>0;t--)for(j=10;j>0;j--);}/********以下是显示函数********/void Display(){P8DIR = 0XFF; //段选方向打开P8OUT = seg_data[disp_buf[0]]; //用户码低P9DIR = 0x01; //选位P9OUT = ~0x01; //数码管第一位输出delay_50us(1); //延迟50usP8OUT = seg_data[disp_buf[1]]; //用户码低P9DIR = 0x02;P9OUT = ~0x02;delay_50us(1);P8OUT = seg_data[disp_buf[2]]; //用户码高P9DIR = 0x04;P9OUT = ~0x04;delay_50us(1);P8OUT = seg_data[disp_buf[3]]; //用户码高P9DIR = 0x08;P9OUT = ~0x08;delay_50us(1);P9DIR = 0x00;P8OUT = seg_data[disp_buf[4]]; //数据码P1DIR = 0x10;P1OUT = ~0x10;delay_50us(1);P8OUT = seg_data[disp_buf[5]]; //数据码P1DIR = 0x20;P1OUT = ~0x20;delay_50us(1);P8OUT = seg_data[disp_buf[6]]; //数据反码P1DIR = 0x40;P1OUT = ~0x40;delay_50us(1);P8OUT = seg_data[disp_buf[7]]; //数据反码P1DIR = 0x80;P1OUT = ~0x80;delay_50us(1);P1DIR = 0x00;}//***************************************************************************// // // // Init_Port(void): 设置IO端口//// // //***************************************************************************// void Init_Port(void){P5DIR |= POWER ; // 主电源MAIN_POWER_ON ;}//***************************************************************************//// // //函数:Init_CLK(void) ////功能:初始化主时钟: MCLK = XT2=16MHZ // // // //***************************************************************************// void Init_CLK(void){P5SEL |= 0x0c; //选择内部16MHZ晶振,将引脚作为第二功能使用P5DIR |= 0x0c;UCSCTL6 &= ~XT2OFF; //EN XT2//因为XT1未开启,所以给默认为XT1的时钟重新选择时钟来源UCSCTL4 |= SELA_1; //先将ACLK配置为VLOCLKUCSCTL3 |= SELREF_2; //将FLLREFCLK配置为REFCLKwhile (SFRIFG1 & OFIFG){UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // 清除时钟标志位SFRIFG1 &= ~OFIFG; // 清除时钟错误标志位}UCSCTL4 |=SELS_5; //将SMCLK时钟源配置为XT2}//***************************************************************************// // // // Init_IRUART(void): 设置红外端口//// // //***************************************************************************// void Init_IRUART(void){P1SEL |= (0x01<<2); //捕获的输入引脚P1.2P1DIR &= ~(0x01<<2);}/********以下是解码函数********/void Decode(void){if(width > 8600) //如果高电平时间大于4.3ms,则判断为引导码并将解码标志en置为1{en = 1;n = 0;}if(en == 1) //判断是否执行解码操作{if(width >=1700&&width <=4000) //当高电平时间>=0.85ms,<=2ms时判断为1 {IR[n] = 1;n++;width = 0;}if(width > 600&&width<1700) //当高电平时间<0.85ms,>0.3ms时判断为0{IR[n] = 0;n++;width = 0;}if(n >= 32) //当数组存满32位时,n清零,en使能标志位清零{en = 0;n = 0;}}}/*将IR[]里的值八位一组分开并转换到IR_buf[]里面,并将IR_buf的值转换成数码管显示的缓存*/void Process(void){if(n == 0){ //如果n == 0将IR[]的值转存到IR_buf[]里IR_buf[0]=IR[8*0]*128+IR[8*0+1]*64+IR[8*0+2]*32+IR[8*0+3]*16+IR[8*0+4]*8+IR[8*0+5]*4+IR[ 8*0+6]*2+IR[8*0+7];IR_buf[1]=IR[8*1]*128+IR[8*1+1]*64+IR[8*1+2]*32+IR[8*1+3]*16+IR[8*1+4]*8+IR[8*1+5]*4+IR[ 8*1+6]*2+IR[8*1+7];IR_buf[2]=IR[8*2]*128+IR[8*2+1]*64+IR[8*2+2]*32+IR[8*2+3]*16+IR[8*2+4]*8+IR[8*2+5]*4+IR[ 8*2+6]*2+IR[8*2+7];IR_buf[3]=IR[8*3]*128+IR[8*3+1]*64+IR[8*3+2]*32+IR[8*3+3]*16+IR[8*3+4]*8+IR[8*3+5]*4+IR[ 8*3+6]*2+IR[8*3+7];//if(IR_buf[2] == ~IR_buf[3]) //校验{disp_buf[0]=IR_buf[0]>>4; //取键码的低四位送显示缓冲disp_buf[1]=IR_buf[0]&0x0f; //右移4次,高四位变为低四位送显示缓冲disp_buf[2]=IR_buf[1]>>4;disp_buf[3]=IR_buf[1]&0x0f;disp_buf[4]=IR_buf[2]>>4;disp_buf[5]=IR_buf[2]&0x0f;disp_buf[6]=IR_buf[3]>>4;disp_buf[7]=IR_buf[3]&0x0f;}}}/********以下是主函数********/void main(void){WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗Init_Port(); // 电源初始化Init_IRUART(); //红外端口初始化Init_CLK() ; //初始化时钟TA0CTL = TASSEL_2+ID_3+TACLR+TAIE+MC_1; //定时器A时钟信号选择SMCLK,8分频,//同时设置定时器A计数模式为增计模式TA0CCTL1 = CM0+SCS+CAP+CCIE; //输入上升沿捕获,CCI0A为捕获信号源TA0CCR0 = 20000; //设置计数器溢出时间为10ms_EINT() ; //开启全局中断while(1){Process(); //将IR[]数组缓存转换为数码管显示缓存函数Display(); //数码管显示函数}}#pragma vector=TIMER0_A1_VECTOR //定时器A中断处理__interrupt void Timer0_A1(void){switch(TA0IV) //向量查询{ case 2: //捕获中断if(TA0CCTL1&CM0) //捕获到上升沿{TA0CCTL1=(TA0CCTL1&(~CM0))|CM1; //更变设置为下降沿触发start=TA0R; //记录初始时间}else if (TA0CCTL1&CM1) //捕获到下降沿{TA0CCTL1=(TA0CCTL1&(~CM1))|CM0; //==更变设置为上升沿触发end=TA0R; //用start,end,overflow计算脉冲宽度if(end>start)width = end - start; //实际高电平宽度Decode(); //解码end = 0;start = 0;TA0R=0;}break;default:break;}}。
#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;}}。
红外接收与控件电路原理图:141红外遥控器原理图:红外遥控器实物图:红外接收与控制实物图:程序:接收控制主程序:#include<reg52.h>#include "hongwai.c"#include "5110.c"sbit hy=P0^0;//LED指示灯sbit hz=P2^0;sbit qy=P1^4;sbit qz=P3^7;sbit djf1=P1^0;//电机1的方向控制sbit djd1=P1^1;//电机1的动力控制sbit djf2=P1^2;//电机2的方向控制sbit djd2=P1^3;//电机2的动力控制unsigned char flag,flag1,PW;bit fan,fan1,tf=0;unsigned char fafg=0;unsigned char time_flag;unsigned char data time[2];//=====================================//ms延时//===================================== void delayms(unsigned int ms){unsigned char i;while(ms--)for(i=0;i<120;i++);}//=====================================//LED灯闪烁//===================================== void LED(unsigned char ms){unsigned char i;for(i=0;i<ms;i++){delayms(200);qz=~qz;qy=~qy;hz=~hz;hy=~hy;}}//======================================//控制//=====================================void kongzi(void){switch(shu[2]){case 0x20: {//前进fafg=1;qz=qy=0;hz=hy=1;TR1=ET1=1;djd1=djd2=1;djf1=djf2=0;fan=0;break;}case 0x30: {//后退fafg=2;qz=qy=1;hz=hy=0;TR1=ET1=1;djd1=djd2=1;djf1=djf2=1;fan=1;break;}case 0x40: {//前左转弯fafg=3;djf1=djf2=0;qz=0;qy=hz=hy=1;djd1=1;djd2=0;fan1=0;TR1=ET1=1;break;}case 0x60: { //后左转弯fafg=4;djf1=djf2=1;hz=0;hy=qz=qy=1;djd1=1;djd2=0;fan1=0;TR1=ET1=1;break;}case 0x50: {//前右转弯fafg=5;djf1=djf2=0;qy=0;qz=hy=hz=1;djd1=0;djd2=1;fan1=1;TR1=ET1=1;break;}case 0x70: { //后退fafg=6;djf1=djf2=1;hy=0;hz=qz=qy=1;djd1=0;djd2=1;fan1=1;TR1=ET1=1;break;}case 0x80: {if(tf==1){qy=qz=hy=hz=1;TR1=ET1=0;djd1=djd2=0;NOKIA5110_clear(); // 清屏W_LCD_chinese(20,0,21);//停W_LCD_chinese(40,0,22);//止W_LCD_zifu(15,3,time[1]/10);// W_LCD_zifu(23,3,time[1]%10);// W_LCD_zifu(33,3,11);//:W_LCD_zifu(42,3,time[0]/10);//W_LCD_zifu(50,3,time[0]%10);//time[0]=time[1]=0;tf=0;}break;}}}//***********************************************//显示//************************************************ void LCD_display(void){NOKIA5110_clear(); // 清屏W_LCD_zifu(15,3,time[1]/10);//W_LCD_zifu(23,3,time[1]%10);//W_LCD_zifu(33,3,11);//:W_LCD_zifu(42,3,time[0]/10);//W_LCD_zifu(50,3,time[0]%10);//if(fafg==1){W_LCD_chinese(20,0,0);//前W_LCD_chinese(40,0,1);//进}if(fafg==2){W_LCD_chinese(20,0,2);//后W_LCD_chinese(40,0,3);//退}if(fafg==3){W_LCD_chinese(5,0,0);//前W_LCD_chinese(25,0,4);//左W_LCD_chinese(45,0,5);//转W_LCD_chinese(65,0,6);//弯}if(fafg==4){W_LCD_chinese(5,0,2);//后W_LCD_chinese(25,0,4);//左W_LCD_chinese(45,0,5);//转W_LCD_chinese(65,0,6);//弯}if(fafg==5){W_LCD_chinese(5,0,0);//前W_LCD_chinese(25,0,7);//右W_LCD_chinese(45,0,5);//转W_LCD_chinese(65,0,6);//弯}if(fafg==6){W_LCD_chinese(5,0,2);//后W_LCD_chinese(25,0,7);//右W_LCD_chinese(45,0,5);//转W_LCD_chinese(65,0,6);//弯}}//=====================================//定时器T1//===================================== void wan_T1(void) interrupt 3{time_flag++;tf=1;TH1=(65536-50000)/256;TL1=(65536-50000)%256;if(time_flag>15){time[0]++;time_flag=0;if(time[0]>59){time[0]=0;time[1]++;if(time[1]>59) time[1]=0;}}}//=====================================//主函数//=====================================void main(void){djd1=djd2=0;NOKIA5110_init();NOKIA5110_clear(); // 清屏W_LCD_chinese(0,0,8);//正delayms(100);W_LCD_chinese(15,0,9);//在delayms(100);W_LCD_chinese(30,0,10);//初delayms(100);W_LCD_chinese(45,0,11);//始delayms(100);W_LCD_chinese(60,0,12);//化delayms(100);W_LCD_chinese(10,3,13);//请delayms(100);W_LCD_chinese(25,3,14);//稍delayms(100);W_LCD_chinese(40,3,2);//后delayms(100);W_LCD_zifu(60,3,10);//...PW=20;TH1=(65536-50000)/256;TL1=(65536-50000)%256;IP=0x09;//设置中断优先级IPH=0x08;open_interrupt();TR1=ET1=0;LED(10);qy=qz=hy=hz=1;NOKIA5110_clear(); // 清屏 W_LCD_chinese(1,0,10);//初delayms(100);W_LCD_chinese(16,0,11);//始delayms(100);W_LCD_chinese(31,0,12);//化delayms(100);W_LCD_chinese(46,0,15);//完delayms(100);W_LCD_chinese(61,0,16);//成delayms(100);W_LCD_chinese(0,3,17);//等delayms(100);W_LCD_chinese(15,3,18);//待delayms(100);W_LCD_chinese(30,3,19);//信delayms(100);W_LCD_chinese(45,3,20);//号delayms(100);W_LCD_zifu(65,3,10);//...while(1){kongzi();if(tf==1&&time_flag==7) LCD_display();}}红外解码:/*************************************************************************//**** 红外解码/*** 晶振:11.0592MHZ/*** 数据口:外中断0/*** 计数器:定时器T0/************************************************************************/#include<reg52.h>sbit Dat=P3^2; //数据口bit tru;unsigned char shu[4];/****************开中断************************/void open_interrupt(void){TMOD=0x11; //定时器T0工作在方式1IT0=1; //中断0在下降沿触发TR0=1;EX0=1; //开外部中断0EA=1; //开中断}/**************接收数据**********************/void R_Dat(void) interrupt 0{unsigned char i,j;unsigned int dtime=0;unsigned char temp;// P1=0xff;TH0=TL0=0;while(!Dat){if(TH0*256+TL0>20000) return;}while(Dat)if(TH0*256+TL0>20000) return;dtime=TH0*256+TL0;TH0=TL0=0;if(8000<dtime&&dtime<14000) //9MS的引导码+4.5MS的结束码{for(i=0;i<4;i++){temp=0;for(j=0;j<8;j++){while(!Dat){if(TH0*256+TL0>20000) return;}while(Dat){if(TH0*256+TL0>20000) return;}dtime=TH0*256+TL0;TH0=TL0=0;if(1450<dtime&&dtime<3000) {temp=(temp>>1)|0x80;}//是否为1 else if(700<dtime&&dtime<1450) {temp=(temp>>1)|0x00;}//是否为0}shu[i]=temp;}if(shu[0]==~shu[1]&&shu[2]==~shu[3]) tru=1;//查错}}LCD5110驱动程序:#include<reg52.h>#include "ziku.C"//-----------------管脚定义-------------------------sbit LCD_sce = P2^7; //片选,低最平有效sbit LCD_rst = P2^6; //复位,0复位sbit LCD_dc = P2^5; //1写数据,0写指令sbit LCD_sdin = P2^4; //数据sbit LCD_sclk = P2^3; //时钟//********************************************************************** // NOKIA5110_w_byte : 使用SPI接口写数据到LCD// 输入参数:data :写入的数据;// command :写数据/命令选择;//********************************************************************** void NOKIA5110_w_byte(unsigned char dat,unsigned char command){unsigned char i;LCD_sce=0; //LCD使能LCD_dc=command;//for(i=0;i<8;i++) //传输8位数据(1个字节){if(dat&0x80) LCD_sdin=1;else LCD_sdin=0;dat=dat<<1;LCD_sclk=0;LCD_sclk=1;}LCD_sce=1; //LCD不使能}//**********************************************************************//NOKIA5110_init : LCD初始化//**********************************************************************void NOKIA5110_init(void){unsigned char k;LCD_rst=0;for(k=0;k<250;k++);LCD_rst=1;//-------------------------------------------------------------NOKIA5110_w_byte(0x21, 0); // 使用扩展命令设置LCD模式NOKIA5110_w_byte(0xd0, 0); // 设置偏置电压NOKIA5110_w_byte(0x06, 0); // 温度校正NOKIA5110_w_byte(0x13, 0); // 1:48NOKIA5110_w_byte(0x20, 0); // 使用基本命令NOKIA5110_w_byte(0x0c, 0); // 设定显示模式,正常显示}//**********************************************************************// NOKIA5110_set_XY : 设置LCD坐标函数// 输入参数:X:0-83// Y:0-5//**********************************************************************void NOKIA5110_set_XY(unsigned char x, unsigned char y){NOKIA5110_w_byte(0x40 | y, 0); // 列(竖)NOKIA5110_w_byte(0x80 | x, 0); // 行(横)}//*********************************************************************//写汉字到LCD//*********************************************************************void W_LCD_chinese(unsigned char X,unsigned char Y,unsigned char dat)unsigned char i;NOKIA5110_set_XY(X,Y);for(i=0;i<16;i++) NOKIA5110_w_byte(hanzi[dat][i],1);NOKIA5110_set_XY(X,Y+1);for(i=16;i<32;i++)NOKIA5110_w_byte(hanzi[dat][i],1);}//*********************************************************************//写字符到LCD5110//********************************************************************* void W_LCD_zifu(unsigned char X,unsigned char Y,unsigned char dat){unsigned char i;NOKIA5110_set_XY(X,Y);for(i=0;i<8;i++) NOKIA5110_w_byte(zifu[dat][i],1);NOKIA5110_set_XY(X,Y+1);for(i=16;i<24;i++)NOKIA5110_w_byte(zifu[dat][i],1);}//**********************************************************************//NOKIA5110_clear : LCD清屏//**********************************************************************void NOKIA5110_clear(void){unsigned char t;unsigned char k;NOKIA5110_set_XY(0,0);for(t=0;t<6;t++){for(k=0;k<84;k++)NOKIA5110_w_byte(0x00,1);}}字库:unsigned char code zifu[][32]={{0xF0,0xF8,0x0C,0x04,0x0C,0xF8,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"0"的点阵*/{0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"1"的点阵*/{0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"2"的点阵*/{0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"3"的点阵*/{0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"4"的点阵*/{0x00,0xF8,0x98,0x48,0x48,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1C,0x10,0x20,0x20,0x18,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"5"的点阵*/,0x00,0x00,0x0F,0x19,0x20,0x20,0x30,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"6"的点阵*/{0x00,0x08,0x08,0x08,0x08,0xE8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x38,0x1F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"7"的点阵*/{0x00,0x70,0xD8,0x08,0x08,0xD8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x1E,0x31,0x21,0x21,0x31,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"8"的点阵*/{0x00,0xF0,0x18,0x08,0x08,0x18,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x19,0x33,0x22,0x22,0x19,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*以上为"9"的点阵*/{0x80,0x80,0x00,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*10以上为"..."的点阵*/{0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*11以上为":"的点阵*/};unsigned char code hanzi[][32]={{0x00,0x08,0x08,0xC8,0x48,0x4A,0x4C,0xC8,0x08,0x08,0xCE,0x0A,0x08,0xE8,0x 08,0x00,0x00,0x00,0x80,0xFF,0x09,0x09,0x49,0x7F,0x00,0x00,0x0F,0x40,0x40,0x7F,0x00,0x00},/*0以上为"前"的点阵*/{0x00,0x40,0x44,0xC8,0x00,0x10,0x10,0x10,0xFE,0x10,0x10,0xFE,0x10,0x10,0x10 ,0x00,0x00,0x60,0x20,0x3F,0x20,0x21,0x51,0x4F,0x41,0x41,0x41,0x5F,0x41,0x41,0x41,0x00},/*1以上为"进"的点阵*/0x00,0x00,0x20,0x3C,0x07,0x00,0x7E,0x22,0x22,0x22,0x22,0x22,0x22,0x7E,0x00,0x00,0x00},/*2以上为"后"的点阵*/{0x00,0x80,0x84,0x9C,0x00,0x00,0xFC,0x54,0x54,0x54,0x54,0x54,0x7C,0x7C,0x0 0,0x00,0x00,0x40,0x60,0x3F,0x20,0x20,0x5F,0x50,0x48,0x4B,0x42,0x44,0x4E,0x59,0x40,0x00},/*3以上为"退"的点阵*/{0x00,0x00,0x10,0x10,0x10,0x90,0x7C,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10 ,0x00,0x00,0x10,0x10,0x0C,0x46,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x00},/*4以上为"左"的点阵*/{0x00,0x88,0xE8,0x1E,0xCA,0x08,0x08,0x40,0x48,0xC8,0x7E,0x48,0x48,0x48,0x4 8,0x00,0x00,0x09,0x09,0x09,0x7F,0x09,0x05,0x00,0x10,0x13,0x22,0x72,0xCE,0x06,0x02,0x00},/*5以上为"转"的点阵*/{0x00,0x44,0x64,0xB4,0x94,0x84,0xFC,0x86,0x86,0xFC,0x84,0x84,0x94,0x24,0x4 4,0x00,0x00,0x00,0x00,0x0E,0x0A,0x0A,0x0A,0x0A,0x0A,0xCA,0x4A,0x4A,0x7B,0x18,0x00,0x00},/*6以上为"弯"的点阵*/{0x00,0x10,0x10,0x10,0x10,0x90,0x70,0x1E,0x12,0x10,0x10,0x10,0x10,0x10,0x10, 0x00,0x00,0x08,0x08,0x04,0x43,0x7F,0x21,0x21,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00},/*7以上为"右"的点阵*/{0x00,0x00,0x08,0xC8,0xC8,0x08,0x08,0x08,0xF8,0x88,0x88,0x88,0x88,0x08,0x00 ,0x00,0x00,0x20,0x20,0x3F,0x3F,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*8以上为"正"的点阵*/{0x00,0x00,0x08,0x08,0x88,0xE8,0x38,0x0E,0x08,0x08,0xE8,0x08,0x08,0x08,0x08 ,0x00,0x00,0x04,0x06,0x03,0x7F,0x20,0x21,0x21,0x21,0x21,0x3F,0x21,0x21,0x21,0x20,0x00},/*9以上为"在"的点阵*/{0x00,0x00,0x10,0x90,0xD6,0x30,0x80,0x80,0x08,0x08,0xF8,0x08,0x08,0x08,0xF8 ,0x00,0x00,0x06,0x03,0x01,0x7F,0x03,0x47,0x64,0x30,0x0E,0x03,0x40,0x60,0x7C,0x1F,0x00},/*10以上为"初"的点阵*/,0x00,0x00,0x40,0x63,0x34,0x0E,0x1B,0x10,0x00,0x7E,0x22,0x22,0x22,0x22,0x7E,0x00,0x00},/*11以上为"始"的点阵*/{0x00,0x80,0xC0,0x30,0xFC,0x06,0x00,0x00,0x00,0xFE,0x80,0xC0,0x60,0x10,0x0 0,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x04,0x04,0x02,0x7F,0x41,0x40,0x40,0x60,0x30,0x00},/*12以上为"化"的点阵*/{0x00,0x20,0x10,0xF6,0x00,0x00,0x44,0x54,0x54,0x54,0x7E,0x54,0x54,0x54,0x44, 0x00,0x00,0x00,0x00,0x7F,0x10,0x08,0x00,0xFF,0x15,0x15,0x15,0x15,0xD5,0x7F,0x00,0x00},/*13以上为"请"的点阵*/{0x00,0x40,0x44,0xFC,0xFC,0x46,0x40,0x04,0xD8,0x40,0x7E,0x42,0x50,0xC8,0x0 4,0x00,0x00,0x08,0x06,0x7F,0x7F,0x03,0x06,0x00,0xFF,0x09,0x09,0x09,0x49,0xFF,0x00,0x00},/*14以上为"稍"的点阵*/{0x00,0x00,0x38,0x08,0x68,0x48,0x48,0x4A,0x4E,0x48,0x48,0x68,0x08,0x38,0x00, 0x00,0x00,0x40,0xC1,0x41,0x21,0x1D,0x07,0x01,0x01,0x7F,0x41,0x41,0x41,0x71,0x21,0x00},/*15以上为"完"的点阵*/{0x00,0x00,0x00,0xF0,0x90,0x90,0x90,0x10,0x10,0xFE,0x10,0x12,0xD6,0x10,0x10 ,0x00,0x00,0x40,0x78,0x0F,0x00,0x10,0x5F,0x40,0x60,0x37,0x1C,0x1F,0x61,0x40,0x60,0x00},/*16以上为"成"的点阵*/{0x00,0x10,0x18,0x46,0x46,0x7C,0x44,0x44,0xF0,0x5C,0x46,0x44,0x5C,0x14,0x0 4,0x00,0x00,0x02,0x0A,0x0A,0x0A,0x2A,0x6A,0x0A,0x0B,0xCA,0x4A,0x7E,0x0A,0x0A,0x0A,0x00},/*17以上为"等"的点阵*/{0x00,0x00,0x10,0xCC,0x66,0x20,0x48,0x48,0x48,0x7E,0x4A,0x48,0xC8,0x48,0x4 0,0x00,0x00,0x02,0x01,0x7F,0x00,0x02,0x02,0x0A,0x12,0x02,0x42,0x42,0x7F,0x02,0x02,0x00},/*18以上为"待"的点阵*/{0x00,0x80,0x60,0xFC,0x06,0x88,0xA8,0xA8,0xA8,0xAA,0xAC,0xA8,0xA8,0xA8,0x 88,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x7C,0x24,0x24,0x24,0x24,0x24,0x7C,0x00,0x00},/*19以上为"信"的点阵*/{0x00,0x80,0x80,0xA0,0xBC,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xBC,0x80,0x 80,0x00,0x00,0x00,0x00,0x00,0x04,0x07,0x04,0x04,0x44,0x44,0x44,0x74,0x1C,0x00,0x00,0x00},/*20以上为"号"的点阵*/{0x00,0xC0,0x70,0xFE,0x02,0x04,0x14,0x74,0x54,0x56,0x56,0x54,0x54,0x74,0x04 ,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x01,0x05,0x45,0x45,0x7D,0x05,0x05,0x05,0x03,0x00},/*21以上为"停"的点阵*/{0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFE,0x40,0x40,0x40,0x40,0x40,0x00 ,0x00,0x00,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00}/*22以上为"止"的点阵*/};红外遥控器程序:#include<reg52.h>sbit ir=P1^1;//红外输出//sbit P1_0=P1^0;sbit LED=P1^2;sbit qian=P2^1;sbit hou=P2^2;sbit zuo=P2^5;sbit you=P2^7;bit flag;unsigned int flag1;//=====================================//MS延时函数//=====================================void delayms(ms){while(ms--)for(i=0;i<120;i++);}//=====================================//定时器T0初始化//=====================================void T0_init(void){TMOD=0x02;TH0=0xe6;TL0=0xe6;EA=ET0=1;}//====================================//定时器T0中断函数//====================================void Timer0(void) interrupt 1{flag1++;if(flag) ir=~ir;else ir=0;}//===================================//数据处理//=================================== void cend_data(unsigned char add,unsigned char dat){unsigned char unadd,undat;unsigned char i;unadd=~add;undat=~dat;TH0=0xe6;TL0=0xe6;LED=~LED;flag1=0;flag=1;while(flag1<300); //9MS初始码flag1=0;flag=0;while(flag1<150);//4.5MS结束码for(i=0;i<8;i++) //发送用户码{flag1=0;flag=1;while(flag1<18);bir=(add>>i)&0x01;flag1=0;flag=0;if(bir==0x01) while(flag1<56);else while(flag1<18);}for(i=0;i<8;i++) //发送用户反码{flag1=0;flag=1;while(flag1<18);bir=(unadd>>i)&0x01;flag1=0;flag=0;if(bir==0x01) while(flag1<56);else while(flag1<18);}for(i=0;i<8;i++) //发送数据码{flag1=0;flag=1;while(flag1<18);bir=(dat>>i)&0x01;flag1=0;flag=0;if(bir==0x01) while(flag1<56);else while(flag1<18);}for(i=0;i<8;i++) //发送数据反码{flag1=0;flag=1;while(flag1<18);bir=(undat>>i)&0x01;flag1=0;flag=0;if(bir==0x01) while(flag1<56);else while(flag1<18);}flag1=0;flag=1;while(flag1<10);flag=0;}//=============================//主函数//=============================void main(void){T0_init();//TR0=1;LED=0;while(1){if(!qian==1&&zuo!=0&&you!=0)//前进{TR0=1;while(!qian==1&&zuo!=0&&you!=0) {cend_data(0x08,0x20);delayms(100);}TR0=0;LED=0;}elseif(!hou==1&&zuo!=0&&you!=0)//后退{TR0=1;while(!hou==1&&zuo!=0&&you!=0) {cend_data(0x08,0x30);delayms(100);}TR0=0;LED=0;}elseif(!zuo==1&&!qian==1)//前左转弯{TR0=1;while(!zuo==1&&!qian==1) {cend_data(0x08,0x40);delayms(100);}TR0=0;LED=0;}elseif(!you==1&&!qian==1)//前右转弯{TR0=1;while(!you==1&&!qian==1) {cend_data(0x08,0x50);delayms(100);}TR0=0;LED=0;}elseif(!zuo==1&&!hou==1)//后左转弯{TR0=1;while(!zuo==1&&!hou==1) {cend_data(0x08,0x60);delayms(100);}TR0=0;LED=0;}elseif(!you==1&&!hou==1)//后右转弯{TR0=1;while(!you==1&&!hou==1) {cend_data(0x08,0x70);delayms(100);}TR0=0;LED=0;}else //停止{TR0=1;cend_data(0x08,0x80);delayms(50);TR0=0;LED=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。