哈尔滨工业大学课程设计说明书(论文)
}
while(Sin); /SIN信号从高电平变为低电平,此时跳出该循环TR0置0,停止计数 TR0=0; LTime=TL0; HTime=TH0;
Time=HTime*256+LTime; //将高8位乘以256加上低8位得到总值 Dis=Time/(2*29); //计算出所差距离
2.4.3 主函数
主函数的流程图如下
初始化检测DISDIS大于50是快速前进否DIS大于10是慢速前进否左转90度检测DISDIS大于10是慢速前进否右转180度检测DISDIS大于10是慢速前进否右转90度
哈尔滨工业大学课程设计说明书(论文)
主函数如下:
void main() //主程序 {
IO_init(); //初始化 while(1) {
getx(1); //测距
if(Dis>=50) //如果距离大于50 {
Forward_fast(); //快速前进 }
else if(Dis>=10&&Dis<50) //如果距离在10与50之内 {
Forward_slow(); //慢速前进 }
else //否则,小于10,需转向避障 {
Left_90(); // 先左转90度 getx(1); //测量距离
if(Dis>=10) //如果距离大于10 {
Forward_slow(); //慢速前进 }
else //如果距离依旧小于10 {
Right_180(); //右转180 getx(1); //测距
if(Dis>=10) //如果此时距离小于10 {
Forward_slow(); //慢速前进 }
else //否则,继续调试 {
Right_90(); //右转90度 } } } } }
2.4.4 完整程序代码与注释
#include
哈尔滨工业大学课程设计说明书(论文)
sbit Sin=P1^5; //超声波模块控制端口 sbit right=P1^0; //右轮控制信号 sbit left=P1^1; //左轮控制信号 unsigned int Dis,Time; unsigned char LTime,HTime;
void IO_init(void) {
EA=1; ET0=1;
TMOD=0x11;//将T0定时器/计数器设置为16位计数模式 TH0=0x00; //初始值为0 TL0=0x00;
TR0=0; //不开始计数 }
void delay_nus(unsigned int i) //延时函数 {
i=i/10; while(--i); }
void delay_5us() //短时间延时函数,为SIN高电平准备 {
_nop_(); }
void getx(unsigned char a) //测距函数 {
TH0=TL0=0; //初始值设置为0 if(a) {
Sin=0; //Sin置0
Sin=1; //Sin置1,并且延时一段时间,提供一个测距的触发脉冲 delay_5us();
Sin=0; //Sin重新置0 }
while(Sin);
while(!Sin);//SIN信号从低电平变为高电平,此时跳出该循环TR0置1,开始计数 TR0=1;
while(Sin); /SIN信号从高电平变为低电平,此时跳出该循环TR0置0,停止计数 TR0=0; LTime=TL0; HTime=TH0;
Time=HTime*256+LTime; //将高8位乘以256加上低8位得到总值
哈尔滨工业大学课程设计说明书(论文)
Dis=Time/(2*29); //计算出所差距离 }
void Forward_fast(void) //快速前进 {
left=1;
delay_nus(1700); left=0;
delay_nus(20000); right=1;
delay_nus(1300); right=0;
delay_nus(20000); }
void Forward_slow(void) //慢速前进 {
left=1;
delay_nus(1580); //减小左电机的高电平时间,增加右电机的高电平时间,减小速度 left=0;
delay_nus(20000); right=1;
delay_nus(1420); right=0;
delay_nus(20000); }
void Left_90(void) //左转90度 {
unsigned int i=0; while(i<20) { i++; left=1;
delay_nus(1300); //令左、右两轮均顺时针转动 left=0;
delay_nus(20000); right=1;
delay_nus(1300); right=0;
delay_nus(20000); } }
哈尔滨工业大学课程设计说明书(论文)
void Right_180() {
unsigned int i=0; while(i<38) { i++;
left=1; //令左、右两轮均逆时针转动 delay_nus(1700); left=0;
delay_nus(20000); right=1;
delay_nus(1700); right=0;
delay_nus(20000); } }
void Right_90() //{
unsigned int i=0; while(i<20) {
i++; left=1;
delay_nus(1700); left=0;
delay_nus(20000); right=1;
delay_nus(1700); right=0;
delay_nus(20000); } }
void main() //{
IO_init(); // while(1) {
getx(1); // if(Dis>=50) // {
令左、右两轮均逆时针转动主程序 初始化 测距
如果距离大于50