您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > ATMEG128单片机加1838B红外解码遥控小车
/**********************ATMEGA128,8MHZ晶振,ICCAVR************************/#includeiom128v.h#includemacros.h#defineuintunsignedint#defineucharunsignedchar#definebaud51#defineD_MOTOROCR2#defineMOTORAOCR1A#defineMOTORBOCR1B/*#definebaud12*///波特率为38400ucharrecieve_data;ucharsend_data;ucharirtime;//解码时间标志ucharstartflag;//红外解码开始标志ucharirtimedata[33];ucharbitnum;ucharircode[4];//存取用户码数组ucharproccessok;//解码结束标志ucharirrecieveok;voidtimer0init(void);voiddelayms(uintmas);voiduncodefunction();//红外解码程序voidINT0init(void);//外部中断0初始化函数voidUSAT0_init(void);voidMOTOR_CONTROL();voidduoji_pwm2_init();voidmain(void){uchari,code_num,flag,stop;DDRA=0XFF;PORTA=0XFF;MOTOR_CONTROL();duoji_pwm2_init();INT0init();timer0init();USAT0_init();while(1){if(flag==1&&stop==0)//前进{MOTORA=300;MOTORB=0;}elseif(flag==0&&stop==0)//后退{MOTORA=0;MOTORB=300;}if(stop==1)//停车{MOTORA=0;MOTORB=0;}//D_MOTOR=37;if(irrecieveok){irrecieveok=0;uncodefunction();}if(proccessok){proccessok=0;if(ircode[2]==0x87)//右转{PORTA=~PORTA;D_MOTOR=D_MOTOR+1;if(D_MOTOR28){D_MOTOR=23;}}if(ircode[2]==0x89)//左转{PORTA=~PORTA;D_MOTOR=D_MOTOR-1;if(D_MOTOR18){D_MOTOR=23;}}if(ircode[2]==0x81)//停止{PORTA=~PORTA;D_MOTOR=23;stop=1;}if(ircode[2]==0x2B)//后退条件{PORTA=~PORTA;//D_MOTOR=23;flag=0;stop=0;}if(ircode[2]==0x8D)//前进{PORTA=~PORTA;//D_MOTOR=23;stop=0;//停车标志flag=1;//直走标志}}}}/**/voiduncodefunction()//红外解码程序{uchari,j,k,value,n;k=0;for(j=0;j4;j++){for(i=0;i8;i++)//数据处理{value=value1;if(irtimedata[k]6){value|=0x80;}k++;}ircode[j]=value;}proccessok=1;}voidINT0init(void)//外部中断0初始化函数{EIFR|=0X02;//清除外部中断0标志,防止误入中断EICRA=0X02;//外部中断为下降沿触发EIMSK|=0X01;//使能外部中断0SREG|=0X80;//打开总中断}voidtimer0init(void)//定时器计数器0初始化函数{ASSR=0X00;TCNT0=0X00;//装入初值TIMSK|=0X01;//使能定时器0溢出中断SREG|=0X80;//开始总中断TCCR0=0X02;//8分頩,普通定时器模式,将外部晶振预分频为1MHZ}/*****************舵机控制程序************************/voidduoji_pwm2_init(void){DDRB=0XFF;PORTB=0XFF;ASSR=0X00;//禁止模拟比较////MCUCR=0X00;//CLI();//关闭所有中断TCNT2=0X00;OCR2=23;//舵机打到中间1.5MS//TIFR|=(1OCF2);CLI();//关闭所有中断//TIMSK|=(1OCIE2);TCCR2|=0X64;//64分屏,相位修正PWM模式上升匹配时清零,243HZ,启动定时器}/********************电机控制程序*********************/voidMOTOR_CONTROL(void){DDRB|=0X60;PORTB|=0X60;//设置OC1A,对应端口为输出ASSR=0X00;//禁止模拟比较MCUCR=0X00;CLI();//关闭所有中断TCCR1A=0XA3;//10位PWM,TOP=0X03FF;频率为488.7HZ,周期T=2msTCCR1B=0X01;//8分頩//OCR1AH=0x03;//0CR1AL=0xE8;TCNT1=0X00;OCR1A=250;//500占空比为百分之50OCR1B=0;//OCR1A=1000;}voiddelayms(uintmas)//毫秒延时函数{uinti,j;for(i=mas;i0;i--)for(j=1141;j0;j--);}#pragmainterrupt_handlertimer0:17voidtimer0()//定时器函数{//TCNT0=0X00;irtime++;if(irtime255){irtime=0;}}#pragmainterrupt_handlerint0:2voidint0()//中断处理函数{if(startflag==1){if(irtime32)//检测到引导码{bitnum=0;}irtimedata[bitnum]=irtime;irtime=0;bitnum++;if(bitnum==33){bitnum=0;irrecieveok=1;//一帧数据接收结束标志//PORTA=~PORTA;startflag=0;//清零接收标志//}/**/}else{startflag=1;irtime=0;}/*if(irrecieveok){PORTA=~PORTA;}*/}voidUSAT0_init(void){UCSR0C|=0X06;//一位起始位和停止位,8位数据位UCSR0B|=0X98;//使能发送与接收中断,串口发送与接收允许UBRR0H=0;//波特率为9600UBRR0L=51;}#pragmainterrupt_handlerUusand:21voidUusand(){UDR0=recieve_data;}/**/#pragmainterrupt_handlerusart550_recieve:19voidusart550_recieve(){//PORTA=~PORTA;recieve_data=UDR0;}/**/
本文标题:ATMEG128单片机加1838B红外解码遥控小车
链接地址:https://www.777doc.com/doc-6922966 .html