《单片机循迹小车程序.docx》由会员分享,可在线阅读,更多相关《单片机循迹小车程序.docx(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、单片机循迹小车程序单片机循迹小车程序/*功能:寻迹小车 使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C51 晶振:12MHZ 编译环境:Keil 作者:MH */ #include / 引用标准库的头文件 #include #define uchar unsigned char #define uint unsigned int/=电机驱动= sbit dianji_r = P30; /右边电机控制口,低电平转? sbit dianji_l = P37; /左边电机控制口,低电平转 /=循迹感应接口= sbit xjmk_r = P32;/ 右边寻迹模块检测口
2、 INT0 sbit xjmk_l = P33;/ 左边寻迹模块检测口 INT1 void check_righet();/右边时候检测到黑线测试程序 void check_left();/左边时候检测到黑线测试程序 void delay_50us(uint t); void delayms(uint Ms); uchar r_count;/右边传感器检测到的次数计数单元 uchar l_count; uint time;/*主程序* main() time=50; dianji_r=0;/上电时右侧电机运行 dianji_l=0;/上电时左侧电机运行 EA=1; EX1=1; EX0=1;
3、IT1=0; IT0=0; 51单片机循迹小车程序 xjmk_r=1;/置IO为1,准备读取数据 xjmk_l=1; _nop_(); r_count=0; l_count=0; while(1) _nop_(); / check_righet();/调用右边寻迹检测传感器 / check_left();/ if(r_count=1) delayms(time); dianji_r=0; dianji_l=0; r_count=0; _nop_(); if(l_count=1) delayms(time); dianji_r=0; dianji_l=0; l_count=0; _nop_();
4、 void init0int() interrupt 2 l_count=5; dianji_l=1; dianji_r=0; if(r_count0) EX0=0; delayms(20); if(time=20)time-=19; EX0=0; return; 51单片机循迹小车程序 void init1int() interrupt 0 r_count=5; dianji_r=1; dianji_l=0; if(l_count0) EX1=0; delayms(20); if(time=20)time-=19; EX1=1; return; /*/函数名称: /功能:左边边时候检测到黑线
5、测试程序 void check_left() if(xjmk_l=0)/检测右边的传感器是否感应到黑线 delay_50us(1);/延时,去除机械振动 _nop_(); if(xjmk_l=0)/再次检测 delay_50us(1);/延时,去除机械振动 if(xjmk_l=0) l_count+; xjmk_l=1; /*/函数名称: /功能:右边时候检测到黑线测试程序 void check_righet() if(xjmk_r=0)/检测右边的传感器是否感应到黑线 51单片机循迹小车程序 delay_50us(1);/延时,去除机械振动 if(xjmk_r=0)/再次检测 delay_50us(1);/延时,去除机械振动 if(xjmk_r=0) r_count+; xjmk_r=1; /*/函数名称:void delay_50US(unsigned int t) /功能: 延时50*t(us) void delay_50us(uint t) uchar j; for(;t0;t-) for(j=19;j0;j-); /*= 设定延时时间:x*1ms=*/ void delayms(uint Ms) uint i,TempCyc; for(i=0;iMs;i+) TempCyc =70; while(TempCyc-);
限制150内