标题:
单片机超声波测距液晶显示加串口
[打印本页]
作者:
我思故我在i
时间:
2019-7-6 16:26
标题:
单片机超声波测距液晶显示加串口
当初刚学51的代码,莫见笑
单片机源程序如下:
/******2018年11.30超声波测距液晶显示加串口******/
#include<reg51.h> //包含51头文件
#include<lcd.c> //包含液晶1602显示
sbit trig=P0^1; //控制端口定义
sbit echo=P0^0; //接收端口定义
unsigned char str[]={"wuxuesiceju!"}; //液晶屏显示数组刷广告
unsigned char juli[]={"0000cm!"}; //液晶屏显示测量距离值数组
unsigned int time; //定义一个整型(全局)变量time
unsigned long s; //定义一个长整型(全局)变量s
unsigned char flag=0; //定义一个字符型(全局)变量flag(计数器数到溢出标记)
/******软件延时函数延时20微秒(晶振11.0592MHz)******/
void Delay20us() //@11.0592MHz
{
unsigned char i;
// _nop_();
i = 6;
while (--i);
}
/******软件延时函数延时1000毫秒(晶振11.0592MHz)******/
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
// _nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/******超声波模块启动函数(由时序图得)******/
void start()
{ trig=1; //控制端高电平持续超过10us以上启动模块
Delay20us(); //延时20us
trig=0; //控制端拉低
}
/******超声波测距距离计算1602显示函数******/
void count()
{ time=TH0*256+TL0; //计数器中的16进制数据转化为10进制数(高位低位拼成一个整数)
s=time*1.7/100; //超声模块测量距离计算公式(发出超声波计数器开始计数,
//当接收到反射回来的时停止,这个就是一个来回的时间,
//除以2再乘上声速340m/s)
if((s>400)||(s<3)||(flag==1) ) //假如测量距离超过4m或者小于3cm或者计数器溢出1602显示错误提示
wstr(0xc0,"chaole!");
else //否则将测量距离显示到1602上
{
juli[3] = s%10+48; //取出十位在转为数字在液晶屏显示
juli[2] = s/10%10+48; //取出百位在转为数字在液晶屏显示
juli[1] = s/100%10+48; //取出千位在转为数字在液晶屏显示
juli[0] = s/1000+48; //取出万位在转为数字在液晶屏显示
wstr(0xc0," ");//清空液晶屏
wstr(0xc0,juli); //指定液晶屏显示位置
}
TH0=0X00; // 定时器初值为0
TL0=0X00; // 定时器初值为0
flag=0; // 溢出标记置0
}
/******串口初始化函数******/
uart () //9600bps@11.0592MHz 【两者波特率要一致】
{
TMOD=TMOD|0x20; //设置T1为定时器,工作在方式2
TH1=0XFD; //定时器T1初值253 波特率为96000b/s
TL1=0XFD; //定时器T1初值253 波特率为96000b/s
SCON=0X50; //设置串口工作方式1
PCON=0X00; //波特率不加倍
ET1=0; //定时器1的中断允许开关
ES=1; //开启串口中断
TR1=1; //启动定时器
}
/******中断服务子程序函数******/
t0int() interrupt 1 //中断t0中断服务子程序,中断类型号为1
{
flag=1; //溢出标记赋值1
}
/******主程序******/
main()
{
unsigned char i; //定义一个字符型(局部)变量
Init(); //液晶屏1602初始化
wstr(0x80,str); //指定地址液晶屏显示数组
TMOD=0x01; //定时器0工作在方式1
TH0=0x00; //定时器0初值为0
TL0=0x00; //定时器0初值为0
EA=1; //开总中断
ET0=1; //定时器0允许中断
uart(); //串口初始化
while(1)
{
start(); //超声波模块初始化
while(echo==0) ; //判断收端口是否为低电平(不是低电平什么也不干)
TR0=1; //启动定时器
while(echo==1) ; //判断收端口是否为高电平(不是高电平什么也不干)
TR0=0; //关闭定时器
count(); //超声波测距距离计算1602显示函数初始化
Delay1000ms() ; //延时1000ms
for(i=0;i<7;i++) //将测量数据发送到电脑串口软件
TL1=0XFD; //定时器T1初值253 波特率为96000b/s 【两者波特率要一致】
{
SBUF=juli[i]; //测量数据写到SBUF,发送到电脑串口软件
while(TI==0) ; //等待发送结束(没发送完成什么也不干)
TI=0; //中断标志清零
}
}
}
复制代码
所有资料51hei提供下载:
2018年11.30超声波测距液晶显示加串口.zip
(34.19 KB, 下载次数: 24)
2019-7-6 16:26 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
TJW。
时间:
2019-12-7 14:18
串口为什么显示00
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1