循迹小车51单片机参考程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includeintrins.h#includereg52.h//头文件/#defineucharunsignedchar#defineuintunsignedintuchart=0;//定时器中断计数器//ucharPWM_TL=0;//定义左电机的占空比控制变量//unsignedcharPWM_TR=0;//定义右电机的占空比控制变量//ucharcodedis1[]={0123456789};ucharcodedis2[]={2011.04.28};ucharcodedis3[]={time:};ucharcodedis4[]={date:};bitflag=0;//标志位,用来判断轮子是否一圈转完,进行占空比控制//#definetempP2/*******************************************************控制口定义//*******************************************************/sbitDIN1=P1^0;//左轮电机端口1//sbitDIN2=P1^1;//左轮电机端口2//sbitDIN3=P1^2;//右轮电机端口1//sbitDIN4=P1^3;//右轮电机端口2//sbitPWML=P1^6;//左轮电机的PWM控制//sbitPWMR=P1^5;//右轮电机的PWM控制//sbitLCD_RS=P2^0;sbitLCD_RW=P2^1;sbitLCD_EN=P2^2;/************************************************************定时器0服务程序、用来产生两路的PWM波//************************************************************/voidtimer0()interrupt1//定时器T0中断服务程序//{//定时器中断PWM计数//if(tPWM_TL)PWML=1;elsePWML=0;//产生左电机的PWM信号//if(tPWM_TR)PWMR=1;elsePWMR=0;//产生右电机的PWM信号//t++;if(t=100)t=0;//1个PWM信号由100次循环产生//}/*************************************************************循迹程序*************************************************************/voidxunji(void){switch(temp){case0x10:{flag=0;DIN1=0;DIN2=1;DIN3=1;DIN4=0;PWM_TL=60;PWM_TR=40;break;}//00010000状态//case0x08:{flag=0;DIN1=1;DIN2=0;DIN3=0;DIN4=1;PWM_TL=40;PWM_TR=60;break;}//00001000状态//case0x20:{flag=0;DIN1=0;DIN2=1;DIN3=1;DIN4=0;PWM_TL=70;PWM_TR=40;break;}//00100000状态//case0x04:{flag=0;DIN1=1;DIN2=0;DIN3=0;DIN4=1;PWM_TL=40;PWM_TR=70;break;}//00000100状态//case0x40:{flag=0;DIN1=0;DIN2=1;DIN3=1;DIN4=0;PWM_TL=80;PWM_TR=30;break;}//01000000状态//case0x02:{flag=0;DIN1=1;DIN2=0;DIN3=0;DIN4=1;PWM_TL=30;PWM_TR=80;break;}//00000010状态//case0x80:{flag=0;DIN1=0;DIN2=1;DIN3=1;DIN4=0;PWM_TL=85;PWM_TR=35;break;}//10000000状态//case0x01:{flag=0;DIN1=1;DIN2=0;DIN3=0;DIN4=1;PWM_TL=35;PWM_TR=85;break;}//00000001状态//case0x00:{flag=0;DIN1=1;DIN2=0;DIN3=1;DIN4=0;PWM_TL=80;PWM_TR=80;break;}//00000000状态//case0xff:{flag=0;DIN1=0;DIN2=0;DIN3=0;DIN4=0;PWM_TL=0;PWM_TR=0;break;}//11111111状态//case0x30:{flag=0;DIN1=0;DIN2=1;DIN3=1;DIN4=0;PWM_TL=70;PWM_TR=50;break;}//00110000状态//case0x0c:{flag=0;DIN1=1;DIN2=0;DIN3=0;DIN4=1;PWM_TL=50;PWM_TR=70;break;}//00001100状态//case0x60:{flag=0;DIN1=0;DIN2=1;DIN3=1;DIN4=0;PWM_TL=70;PWM_TR=45;break;}//01100000状态//case0x06:{flag=0;DIN1=1;DIN2=0;DIN3=0;DIN4=1;PWM_TL=45;PWM_TR=70;break;}//00000110状态//case0xc0:{flag=0;DIN1=0;DIN2=1;DIN3=1;DIN4=0;PWM_TL=75;PWM_TR=40;break;}//11000000状态//case0x03:{flag=0;DIN1=1;DIN2=0;DIN3=0;DIN4=1;PWM_TL=40;PWM_TR=75;break;}//00000011状态//default:break;}}voidInit(void){TMOD=0x02;//设定定时器T0工作在模式2//TH0=0xB6;//装入定时器的初值//TL0=0xB6;EA=1;//开总中断//ET0=1;//定时器0中断允许//TR0=1;//启动定时器0//}/*1602部分子函数*/voiddelay(intms){inti;while(ms--){for(i=0;i250;i++){_nop_();_nop_();_nop_();_nop_();}}}bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);LCD_EN=0;returnresult;}voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();_nop_();_nop_();LCD_EN=1;_nop_();_nop_();_nop_();_nop_();LCD_EN=0;}voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;_nop_();_nop_();_nop_();_nop_();LCD_EN=1;_nop_();_nop_();_nop_();_nop_();LCD_EN=0;}voidlcd_pos(ucharpos){lcd_wcmd(pos|0x80);//数据指针=80+地址变量}voidlcd_init(){delay(15);//等待LCD电源稳定lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据delay(5);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x0c);//显示开,关光标delay(5);lcd_wcmd(0x06);//移动光标delay(5);lcd_wcmd(0x01);//清除LCD的显示内容delay(5);}voidlcd_clr(){lcd_wcmd(0x01);//清除LCD的显示内容delay(5);}/**************************************************************主函数**************************************************************/voidmain(void)//主函数//{uchari,min,sec,n;min=0;sec=0;n=0x3A;Init();lcd_init();lcd_pos(0x00);i=0;for(i=0;i5;i++)lcd_wdat(dis3[i]);lcd_pos(0x40);i=0;for(i=0;i5;i++)lcd_wdat(dis4[i]);lcd_pos(0x46);i=0;for(i=0;i16;i++)lcd_wdat(dis2[i]);while(1){if(temp==0xff){PWM_TL=80;//设置PWM占空比的初值都为80%//PWM_TR=80;//启动定时器0////调用系统初始化函数//DIN1=1;DIN2=0;DIN3=1;DIN4=0;//电机控制端初始化为两电机都正转//};if(temp!=0xff){P2=0xff;//从P2口读入前方传感器的状态,并调用循迹处理程序//xunji();};//当传感器检测到的情况始终没有全1时循环检测或是while(1)//delay(10);lcd_pos(0x08);lcd_wdat(dis1[min/10]);lcd_wdat(dis1[min%10]);lcd_wdat(n);lcd_wdat(dis1[sec/10]);lcd_wdat(dis1[sec%10]);delay(112);sec++;if(sec==60){min++;sec=0;}}}

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功