仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define NOP() {_nop_();_nop_();_nop_();_nop_();}
//------LCD引脚-----
sbit lcd_rs=P0^6;
sbit lcd_en=P0^7;
//------超声波引脚-------
sbit Tx=P3^3; //触发控制信号输入
sbit Rx=P3^2; //回响信号输出
uchar xuehao[]={"ID:1606050220"};
uchar xingming[]={"NAME:zhoujikai"};
uchar code table[]={" Distance Test:"}; //LCD第一行显示
uchar temp_dis[]= {" 000.0 cm"}; //LCD第二行
long int t,distance;
uchar cache[4]={0,0,0,0};
//--------延时-------
void delay(uint ms)
{
uint t;
while(ms--)
for(t=0;t<120;t++);
}
void write_com(uchar com);//init_lcd()函数需要用到,所以先提前声明
//************LCD1602初始化函数************************
void init_lcd()
{
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x08); //写一个字符后地址指针加1
write_com(0x01); //显示清零,数据指针清零
write_com(0x06); //写一个字符后地址指针加1
write_com(0x0c); //关显示,光标不显示不闪烁
}
//************LCD1602写指令函数************************
void write_com(uchar com) //lcd1602写指令:rs低电平,rw低电平,en从高电平变为低电平
{
delay(5);
lcd_rs = 0; // 选择写指令
lcd_en = 0; // 将使能端置0
P2 = com; // 将要写的命令送到数据总线上
delay(5); // 延时5ms,待数据稳定
lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,
delay(5); // 延时5ms,待数据稳定
lcd_en = 0; // 将使能端置0以完成脉冲
}
//************LCD1602写数据函数************************
void write_data(uchar date)//lcd1602写数据:rs高电平,rw低电平,en从高电平变低电平
{
delay(5);
lcd_rs = 1; // 选择写数据
lcd_en = 0; // 将使能端置0
P2 = date; // 将要写的数据送到数据总线上
delay(5); // 延时5ms,待数据稳定
lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,
delay(5); // 延时5ms,待数据稳定
lcd_en = 0; // 将使能端置0以完成脉冲
}
//************LCD1602显示函数******************
void lcd1602_display(uchar *q,uchar *p)//*通过指针p和q分别指向两个数组的第一个数,然后进行数组扫描显示,一次性显示两行字符
{
write_com(0x80); // 现将数据指针定位到第一行第一个字处
while(*q!='\0')
{
write_data(*q);
q++;
delay(1);
}
write_com(0xc0); // 现将数据指针定位到第二行第一个字处
while(*p!='\0')
{
write_data(*p);
p++;
delay(1);
}
}
//************LCD1602显示欢迎函数******************
void welcome() //扫描显示学号加姓名,几秒延时后结束
{
init_lcd();
lcd1602_display(xuehao,xingming);
delay(2000);
}
void HC05_Init() //超声波模块初始化函数
{
Tx=1; //触发脉冲
NOP();NOP();NOP();NOP();
Tx=0;
distance=0.172*t; //距离计算
}
void distance_convert(long int dat) //距离计算函数
{
cache[0]=dat/1000;
cache[1]=dat/100%10;
cache[2]=dat/10%10;
cache[3]=dat%10;
temp_dis[4]=cache[0]+'0';
temp_dis[5]=cache[1]+'0';
temp_dis[6]=cache[2]+'0';
temp_dis[8]=cache[3]+'0';
}
//------------主程序-----------
void main()
{
welcome();
init_lcd();
delay(5);
TMOD=0x09; //定时器T0工作方式1 GATE0=1
EA=1; //开总中断
TR0=1; //启动定时器
EX0=1; //开外部中断
IT0=1; //设置为下降沿中断方式
while(1)
{
HC05_Init();
distance_convert(distance);
lcd1602_display(table,temp_dis);
}
}
//外部中断0
void int0() interrupt 0
{
t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
TH0=0;
TL0=0;
}
代码很简单,lcd显示屏直接修改程序就能显示
全部资料51hei下载地址:
超声波测距二代2.rar
(31.12 KB, 下载次数: 208)
|