本设计采用AT89C52为主要控制芯片的智能车,HC-SR04为超声波测距传感器。该汽车避障系统拥有自动声光报警、超声波测距,自动避开障碍物等功能。当汽车与障碍物之间的距离小于安全距离35cm时,汽车能够及时避开障碍物,同时LCD1602液晶屏上会显示汽车与障碍物之间的距离以及蜂鸣器会声光报警。附件内容含有电路图、仿真图及程序。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1_ZJ-8VRG9AnMD8jcExkbsA?pwd=8888
部分代码展示
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#include "LCD.h" //包含LCD1602显示屏工作时序头文件
#include<math.h> //包含数学运算的头文件
#include "I2C.h" //包含I2C工作时序头文件
#include<stdio.h> //包含Printf等标准输入输出头文件
unsigned char code digit[10]={"0123456789"}; //定义字符数组显示数字
unsigned char code Str[]={"Test by DS18B20"}; //说明显示的是温度
unsigned char code Error[]={"Error!Check!"}; //说明没有检测到DS18B20
unsigned char code Temp[]={"Temp:"}; //说明显示的是温度
unsigned char code Cent[]={"Cent"}; //温度单位
sbit safe=P1^0;
sbit danger=P1^1;
sbit sound=P1^2;
sbit anybody=P2^4;
/*****************************************************
函数功能:延时1ms
(2j+3)*i+5=(2×98+3)×5+5=1000(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<5;i++)
for(j=0;j<98;j++)
;
}
/*****************************************************
函数功能:延时10ms
((2k+3)*j+3)*5+5=(2×98+3)×5+5=10000(微秒),可以认为是10毫秒
***************************************************/
void delay10ms(void)
{ unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函数功能:定时器中断输出方波,驱动蜂鸣器
频率:200Hz
***************************************************/
void InitTimer0(void)//定时器初始化
{
TMOD = 0x01;
TH0 = 0x0EE;
TL0 = 0x00;
EA = 1;
ET0 = 1;
//TR0 = 1;
}
void Timer0Interrupt(void) interrupt 1
{ //定时器中断
TH0 = 0x0EE;
TL0 = 0x00;
sound=~sound;
}
/************************************************************************
以下是PCF的操作程序
************************************************************************/
unsigned char count = 0;
#define AddWr 0x90 //写数据地址
#define AddRd 0x91 //读数据地址
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Val;
Start_I2c(); //启动总线
SendByte(AddWr); //发送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl); //发送器件子地址
if(ack==0)return(0);
Stop_I2c();
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
Ack_I2c(); //发送非应位
Stop_I2c(); //结束总线
return(Val);
}
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
sbit DQ=P2^3;
unsigned char time; //设置全局变量,专门用于严格延时
/*****************************************************
函数功能:将DS18B20传感器初始化,读取应答信号
出口参数:flag
***************************************************/
bit Init_DS18B20(void)
{
bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ = 1; //先将数据线拉高
for(time=0;time<2;time++) //略微延时约6微秒
;
DQ = 0; //再将数据线从高拉低,要求保持480~960us
for(time=0;time<200;time++) //略微延时约600微秒
; //以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ = 1; //释放数据线(将数据线拉高)
for(time=0;time<10;time++)
; //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕
;
return (flag); //返回检测成功标志
}
/*****************************************************
函数功能:从DS18B20读取一个字节数据
出口参数:dat