您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 基于51单片机红外小车控制C程序
/**********************************************************平台:AT89C52单片机,L293D电机驱动模块,8位数码管,红外遥控及红外接收头实验目的:通过红外控制实现小车前进,后退,左转,右转,停止,加速,减速。同时数码管显示相应键值编程组成:红外接收发射,电机处理,数码管显示编写:坑口yano日期:2014.9.17***********************************************************/#includereg52.h#defineucharunsignedchar#defineuintunsignedint//电机控制位定义,基于L293D电机控制芯片sbitEN_A=P1^0;//电机A使能sbitEN_B=P1^1;//电机B使能sbitIN_A1=P1^2;//电机A方向控制位1sbitIN_A2=P1^3;//电机A方向控制位2sbitIN_B1=P1^4;//电机B方向控制位1sbitIN_B2=P1^5;//电机B方向控制位2//PWM加减速指示LED位定义sbitled1=P1^6;sbitled2=P1^7;//数码管位定义sbitdula=P2^6;sbitwela=P2^7;//数码管段选数组ucharcodesmg_du[]={0x3f,//00x06,//10x5b,//20x4f,//30x66,//40x6d,//50x7d,//60x07,//70x7f,//80x6f,//90x77,//A0x7c,//B0x39,//C0x5e,//D0x79,//E0x71//F};//数码管位选数组ucharcodesmg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义红外全局变量ucharirtime;ucharstartflag;ucharbitnum;ucharirdata[33];ucharirreceok;ucharircode[4];ucharirprosok;uchardis[8];//定义PWM全局变量uchare1;uchare2;ucharpwm;ucharpwm_num;ucharadd_flag;uchardec_flag;//函数声明voiddelay_ms(ms);voidtime0_init(void);voidint0_init(void);voidirpros(void);voidirwork(void);voiddisplay(void);voidtime1_init(void);voidadd_work(void);voiddec_work(void);voidforward(void);voidback(void);voidleft(void);voidright(void);voidstop(void);voidadding(void);voiddecreasing(void);voidmotor(void);//延时函数,延时1ms(晶振为11.0592MHz时得0.96831272ms,约为1ms)voiddelay_ms(ms){uchari,j;for(i=ms;i0;i--)for(j=110;j0;j--);}/************************************************红外遥控************************************************///定时器T0初始化,完成红外计时voidtime0_init(void){TMOD=0X12;//方式2,自动重装初值的8位定时器TH0=0X00;TL0=0X00;EA=1;ET0=1;TR0=1;}//外部中断INT0初始化voidint0_init(void){IT0=1;EX0=1;EA=1;}//定时器T0中断服务函数voidtime0(void)interrupt1{irtime++;//256//每加1计数256次}//外部中断INT0中断服务函数voidint0(void)interrupt0{if(startflag){if(irtime=33&&irtime64)//引导码时间13.5ms,13.5/0.256约等于52.7{bitnum=0;}irdata[bitnum]=irtime;//把irtime的值赋给数组irdata[bitnum]循环32次irtime=0;bitnum++;if(bitnum==33){bitnum=0;irreceok=1;//irtime读完标志位}}else{irtime=0;startflag=1;}}//取码voidirpros(void){uchari,j,k;ucharvalue;k=1;//跳过引导码for(j=0;j4;j++){for(i=0;i8;i++){value=value1;//左移7次判断8次if(irdata[k]6){value=value|0x80;}k++;}ircode[j]=value;value=0;}irprosok=1;}/**********************************************数码管显示***********************************************///转码,把接收到的4位红外码转成8位数码管显示voidirwork(void){dis[0]=ircode[0]/16;dis[1]=ircode[0]%16;dis[2]=ircode[1]/16;dis[3]=ircode[1]%16;dis[4]=ircode[2]/16;dis[5]=ircode[2]%16;dis[6]=ircode[3]/16;dis[7]=ircode[3]%16;}//数码管显示voiddisplay(void){uchari;for(i=0;i8;i++){dula=1;P0=smg_du[dis[i]];dula=0;P0=0xff;wela=1;P0=smg_we[i];wela=0;delay_ms(1);P0=0xff;delay_ms(1);}}/**********************************************PWM1.拟产生一个100hz的PWM,故周期为10ms2.设定一个周期由100次中断产生,故中断一次为100us***********************************************///定时器T1初始化,用于产生PWM周期计时。voidtime1_init(void){TMOD=0X12;//方式1TH1=(65536-100)/256;TL1=(65536-100)%256;EA=1;ET1=1;TR1=1;//PT1=1;//设定PWM中断为最高优先级}//pwm加速工作voidadd_work(void){add_flag=1;if(add_flag==1){delay_ms(50);//延时消抖if(add_flag==1){if(pwm100){pwm++;}else{led1=1;led2=1;}}}}//pwm减速工作voiddec_work(void){dec_flag=1;if(dec_flag==1){delay_ms(50);//延时消抖if(dec_flag==1){if(pwm1){pwm--;}else{led1=0;led2=0;}}}}//定时器T1中断服务函数voidtime1(void)interrupt3{TR1=0;//进入中断暂停定时器T1工作,并重新赋初值TH1=(65536-100)/256;TL1=(65536-100)%256;pwm_num++;//中断递增计数if(pwm_num100){pwm_num=0;}if(pwm_num=pwm){e1=1;e2=1;led1=0;//随着PWM增大LED越来越亮led2=0;}else{e1=0;e2=0;led1=1;//随着PWM减少LED越来越暗led2=1;}TR1=1;}/**********************************************电机控制**********************************************///前进voidforward(void){EN_A=1;//开两个电机使能EN_B=1;IN_A1=1;//电机A正转IN_A2=0;IN_B1=1;//电机B正转IN_B2=0;}//后退voidback(void){EN_A=1;//开两个电机使能EN_B=1;IN_A1=0;//电机A反转IN_A2=1;IN_B1=0;//电机B反转IN_B2=1;}//左转voidleft(void){EN_A=1;//开两个电机使能EN_B=1;IN_A1=0;//电机A不转IN_A2=0;IN_B1=1;//电机B正转IN_B2=0;}//右转voidright(void){EN_A=1;//开两个电机使能EN_B=1;IN_A1=1;//电机A正转IN_A2=0;IN_B1=0;//电机B不转IN_B2=0;}//停止voidstop(void){EN_A=0;//两个电机关使能EN_B=0;}//加速voidadding(void){add_work();EN_A=e1;//开两个电机使能EN_B=e2;IN_A1=1;//电机A正转IN_A2=0;IN_B1=1;//电机B正转IN_B2=0;}//减速voiddecreasing(void){dec_work();EN_A=e1;//开两个电机使能EN_B=e2;IN_A1=1;//电机A正转IN_A2=0;IN_B1=1;//电机B正转IN_B2=0;}//电机控制voidmotor(void){switch(ircode[2]){case0x18:forward();break;//2前进case0x1c:back();break;//5后退case0x0c:left();break;//1左转case0x5e:right();break;//3右转case0x16:stop();break;//0停止case0x15:adding();break;//+加速case0x07:decreasing();break;//-减速default:break;}}//主函数voidmain(void){time0_init();//初始化定时器和外部中断int0_init();time1_init();while(1){if(irreceok)//如果红外接收完毕就取码{irpros();irreceok=0;}if(irprosok)//如果取码完毕就转化成数码管8位显示{irwork();irprosok=0;}display();//数码管显示delay_ms(1);motor();//电机工作}}
本文标题:基于51单片机红外小车控制C程序
链接地址:https://www.777doc.com/doc-3603053 .html