超声波避障小车c语言程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#define uchar unsigned char
#define uint unsigned int
#include
unsigned char ly_dis[4];//定义显示缓冲区

sbit lcd_rs_port = P2^6; /*定义LCD控制端口*/
sbit lcd_rw_port = P2^5;
sbit lcd_en_port = P2^7;

sbit RX=P3^6; //回响信号
sbit TX=P3^7; //触发信号
sbit h=P2^4;

sbit z_1=P2^0; //警报继电器发出
sbit z_2=P2^1; //警报蜂鸣器发出

sbit y_1=P2^2; //警报继电器发出
sbit y_2=P2^3; //警报蜂鸣器发出

#define lcd_data_port P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识

uchar jishu;
uchar lb=0;
uchar lb_1=0;
uchar zhuanxiang;
uchar code mun_to_char[] = {"0123456789ABCDEF.'cm+-"}; /*定义数字跟ASCII码的关系*/
uchar code mun_to_char1[] = {"Welcome to the graduation design"}; /*欢迎毕业设计*/
uchar code mun_to_char2[] = {" The car reversing radar "}; /*倒车雷达*/
uchar code mun_to_char4[] = {"Designer: li"}; /*设计者:李*/

unsigned int time=0; //探测时间
unsigned long S=0; //实际检测距离
bit flag =0; //标志位
int ltemp; //实际测量温度
unsigned int j=0;
unsigned char disbuff[4]={ 0,0,0,0,}; //距离数据储存单元
void inti() /*初始化函数*/
{ T2CON=0x00; //定是计时器
EA=1; //总中断开

TMOD=0x11; //定时器0,1初始化,16位定时
TH0=0; //10ms后进中断,产生舵机pwm
TL0=0;
ET0=1;
TH1=0xd8; //10ms后进中断,产生电机pwm
TL1=0xf0;
ET1=1;
TR1=0;
}
void lcd_busy_wait() /*LCD1602 忙等待*/
{
lcd_rs_port = 0;
lcd_rw_port = 1;
lcd_en_port = 1;
lcd_data_port = 0xff;
while (lcd_data_port&0x80);
lcd_en_port = 0;

}
void lcd_command_write(uchar command) /*LCD1602 命令字写入*/
{
lcd_busy_wait();
lcd_rs_port = 0;
lcd_rw_port = 0;
lcd_en_port = 0;
lcd_data_port = command;
lcd_en_port = 1;
lcd_en_port = 0;
}
void lcd_char_write(uchar x_pos,y_pos,lcd_dat) /*LCD1602 字符数据写入*/
{
x_pos &= 0x0f; /* X位置范围 0~15 */
y_pos &= 0x01; /* Y位置范围 0~ 1 */
if(y_pos==1) x_pos += 0x40;
x_pos += 0x80;
lcd_command_write(x_pos);
lcd_busy_wait();
lcd_rs_port = 1;
lcd_rw_port = 0;
lcd_en_port = 0;
lcd_data_port = lcd_dat;
lcd_en_port = 1;
lcd_en_port = 0;
lcd_data_port = 0xff; /*释放数据端口*/
}



void display(void)
{
lcd_char_write(9,1,mun_to_char[disbuff[3]]); //显示距离***.*cm
lcd_char_write(10,1,mun_to_char[disbuff[2]]);
lcd_char_write(11,1,mun_to_char[disbuff[1]]);
lcd_char_write(12,1,mun_to_char[16]);
lcd_char_write(13,1,mun_to_char[disbuff[0]]);
lcd_char_write(14,1,mun_to_char[18]);
lcd_char_write(15,1,mun_to_char[19]);
}
void lcd_delay(uint ms) /*LCD1602 延时*/
{


uchar j;
while(ms--){
for(j=0;j<250;j++)
{;}
}
}


void lcd_system_reset() /*LCD1602 初始化*/
{
lcd_delay(20);
lcd_command_write(0x38);
lcd_delay(100);
lcd_command_write(0x38);
lcd_delay(50);
lcd_command_write(0x38);
lcd_delay(10);
lcd_command_write(0x08);
lcd_command_write(0x01);
lcd_command_write(0x06);
lcd_command_write(0x0c);
lcd_data_port = 0xff; /*释放数据端口*/
}


void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;

S=(time*1.7)/10; //算出来是MM

if(S<=200) //超出测量范围 //可以跟改此处数值达到设定的距离将200更改
{
lb++;
if(lb>=5){
lb_1=0;
y_1=0; y_2=1; z_1=0; z_2=0;

}
}
else
{
lb_1++;
if(lb_1>=5){
lb=0;
y_1=0; y_2=1; z_1=0; z_2=0;
}
}


if(flag==1) flag=0;

disbuff[0]=S%10;
disbuff[1]=S/10%10;
disbuff[2]=S/100%10;
disbuff[3]=S/1000;
}
void StartModule() //启动模块
{
TX=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
void Timer_Count(void)
{
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算

}
void main() /*主函数*/
{

unsigned int i=0;

unsigned int valA;
void inti();
lcd_system_reset(); /*LCD1602 初始化*/
for(j=0;j<16;j++) //显示Welcome to the g
{
lcd_char_write(j,0,mun_to_char1[j]);
}
for(j=0;j<16;j++) //显示raduation design
{
lcd_char_write(j,1,mun_to_char1[j+16]);
}
lcd_delay(2000); //延时函数

for(j=0;j<16;j++) //清屏
{
lcd_char_write(j,0,mun_to_char8[j]);
}
for(j=0;j<16;j++) //清屏
{
lcd_char_write(j,1,mun_to_char8[j+16]);
}

for(j=0;j<16;j++) //显示The car
{
lcd_char_write(j,0,mun_to_char2[j]);
}
for(j=0;j<16;j++) //显示reversing radar
{
lcd_char_write(j,1,mun_to_char2[j+16]);
}
lcd_delay(2000); //延时函数

for(j=0;j<16;j++) //清屏
{
lcd_char_write(j,0,mun_to_char8[j]);
}
for(j=0;j<16;j++) //清屏
{
lcd_char_write(j,1,mun_to_char8[j+16]);
}


for(j=0;j<16;j++) //显示Designer:
{
lcd_char_write(j,0,mun_to_char4[j]);
}
for(j=0;j<16;j++) //显示li
{
lcd_char_write(j,1,mun_to_char4[j+16]);
}
lcd_delay(2000); //延时函数

for(j=0;j<16;j++) //清屏
{
lcd_char_write(j,0,mun_to_char8[j]);
}
for(j=0;j<16;j++) //清屏

{
lcd_char_write(j,1,mun_to_char8[j+16]);
}


while(1)
{
RX=1;
StartModule();
for(valA=7510;valA>0;valA--) //多次测量提升可靠性
{

if(RX==1)
{
Timer_Count(); //时间计数
}
}
void display(); //调用显示
}
}
void timer0() interrupt 1 /*定时器0中断函数*/
{
flag=1; //中断溢出标志
RX=0;
}

void timer1() interrupt 3 /*定时器1中断函数*/
{
jishu++;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
if(jishu>=20){
jishu=0;
}
if((zhuanxiang==1)&&(jishu>=10)){
y_1=0; y_2=0; z_1=0; z_2=0;
}
if((zhuanxiang==1)&&(jishu<10)){
y_1=0; y_2=0; z_1=1; z_2=0;
}
if((zhuanxiang==0)&&(jishu>=10)){
y_1=0; y_2=0; z_1=0; z_2=0;
}
if((zhuanxiang==0)&&(jishu<10)){
y_1=1; y_2=0; z_1=1; z_2=0;
}
}

相关文档
最新文档