当前位置:首页 > 基于单片机的迷宫小车论文 有程序电路图
广东海洋大学2013届本科生毕业论文
4.4 避障及停止子程序设计
根据硬件设计部分的规划,单片机的P2.3~P2.7是用作红外避障传感器的检查信息信号的输入端。单片机的P2.0~P2.1是用作终点寻黑线信号的输入端。定义I/0口程序是为初始化单片机,为下面程序模块化编程做好准备。程序片段如下:
单片机通过避障传感器模块得到前方信息,从而驱动电机控制模型车运行状态。迷宫小车的避障子程序流程图,如图4.2
开始 延时 前? Y 直走 显示 N
左? Y
左转 显示 N 右? N 后? N 停? Y
右转 显示 Y
后转 显示 Y
停止 显示 结束 图4.2 避障子程序流程图
//=============避障子程序=========================== //=================================================
#include
#include \#include \#include \
- 30 -
广东海洋大学2013届本科生毕业论文
sbit Tcr0 = P2^0; //左侧光电开关TCR5000输出端 sbit Tcr1 = P2^1; //右侧光电开关TCR5000输出端
sbit zuo = P2^7; //左侧红外输出端 sbit zuoled = P2^6; //左前侧红外输出端 sbit zhong = P2^5; //中间红外输出端 sbit youled = P2^4; //右前侧红外输出端 sbit you = P2^3; //右侧红外输出端
extern void Iread(void) //红外检测处理函数 { if((Tcr0==0)||(Tcr1==0)) //下侧光电传感器有一个检测到黑线 { //则小车停止运行 move_stop(); Set_PWM(0,0); TR0=0; //关定时器0 EX0=0; //关外部中断0 write_com(0x80+5);//第一行第六个位置 lcm_w_word(\停止\ Delay_Ms(5000); } if((zuo == 0)&&(zhong == 1)&&(you == 0)) //直行道行走情况 { move_forward(); Set_PWM(83,84); //PWM控制小车直线行走参数 if((zuoled == 1)&&(youled == 0)) //偏右,右侧电机速度转快 { move_forward(); Set_PWM(83,88); } if((zuoled == 0)&&(youled == 1)) //偏左,左侧电机速度转快 { move_forward(); Set_PWM(88,84); } if((zuoled == 0)&&(youled == 0)) //直接行使速度 { move_forward(); Set_PWM(83,84); } write_com(0x80+5);//第一行第六个位置 lcm_w_word(\直行\ } else if((zuo == 1)&&(zhong == 1)&&(you == 0)) //左转路口行走情况 { move_forward(); Set_PWM(75,76); if((zuoled == 0)&&(youled == 0)&&(zhong == 0)) { move_left(); Set_PWM(85,90); Delay_Ms(400);
- 31 -
广东海洋大学2013届本科生毕业论文
write_com(0x80+5);//第一行第六个位置 lcm_w_word(\左转\ } if(((zuoled == 0)||(youled == 0))&&(zhong == 1)) { move_left(); Set_PWM(85,90); Delay_Ms(400); write_com(0x80+5);//第一行第六个位置 lcm_w_word(\右转\ } }
else if((zuo == 0)&&(zhong == 1)&&(you == 1)) //右转路口行走情况 { move_forward(); Set_PWM(75,77); if((zuoled == 0)&&(youled == 0)&&(zhong == 0)) { move_right(); Set_PWM(88,89); Delay_Ms(450); write_com(0x80+5);//第一行第六个位置 lcm_w_word(\右转\ } }
else if((zuo == 0)&&(zhong == 1)&&(you == 1)) //右转及前行路口行走情况 { Set_PWM(75,77); Delay_Ms(300); if(((zuoled == 0)||(youled == 0))&&(zhong == 1)) { move_forward(); Set_PWM(83,84); write_com(0x80+5);//第一行第六个位置 lcm_w_word(\直行\ } }
else if((zuo == 1)&&(zhong == 1)&&(you == 1)) //T字路和十字路口行走情况 { if((zuoled == 0)||(youled == 0)) { move_left(); Set_PWM(85,90); Delay_Ms(400); write_com(0x80+5);//第一行第六个位置 lcm_w_word(\左转\ Delay_Ms(200); move_forward(); //转完之后由于左右两侧都为1, Set_PWM(80,81);
//要在转完之后加个延时200ms让小车前进一段距离在判断
Delay_Ms(500); }
if((zuoled == 1)&&(youled == 1)) {
- 32 -
广东海洋大学2013届本科生毕业论文
}
}
move_forward(); Delay_Ms(5); Set_PWM(83,84); }
move_forward(); Set_PWM(85,86); Delay_Ms(5);
write_com(0x80+5);//第一行第六个位置 lcm_w_word(\直行\
else if((zuo == 0)&&(zhong == 0)&&(zuoled == 0)&&(youled == 0)&&zhong == 0) //死胡同路,原地右后转180度迅速转弯 { move_right(); Set_PWM(95,96); Delay_Ms(750); write_com(0x80+5);//第一行第六个位置 lcm_w_word(\后转180\ move_stop(); Set_PWM(0,0); Delay_Ms(50); }
4.5 显示子程序设计
液晶显示子程序主要显示的是行车的时间,以及模型车在模式切换时,动态显示按键输入的信息。使用LCD12864需要对该芯片进行初始化,使用了P1.0,P1.1,P1.2分别对它进行读、写,使能控制。该程序如下:
/****************************************************************************** 文件名 : .c
模块名称:并行方式驱动12864液晶驱动 完成日期:2013.05.19
驱动芯片:st7920 SP=0x5f; init_lcd();
******************************************************************************/ #include
#define DATA P0 //P0接数据口
sbit RS = P1^0; //H=data; L=\sbit RW = P1^1; //H=read; L=\sbit E = P1^2; //input enable;
sbit busy=P0^7; //lcd busy bit
uchar shit,ge; //两位数,拆开为十位,个位
uchar code tab1[]={\当前状态: %uchar code tab2[]={\行驶: 00: 00: 00\
- 33 -
共分享92篇相关文档