基于51单片机的US100超声波模块1602显示程序.docx
《基于51单片机的US100超声波模块1602显示程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机的US100超声波模块1602显示程序.docx(12页珍藏版)》请在冰点文库上搜索。
![基于51单片机的US100超声波模块1602显示程序.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/40015fe6-0280-4a77-895d-4676b0f8f3ce/40015fe6-0280-4a77-895d-4676b0f8f3ce1.gif)
基于51单片机的US100超声波模块1602显示程序
基于51单片机的US-100(超声波模块)1602显示程序
/*****************************************************************************/
Name:
LCD1602+US-100+STC89C52
HC-SR04超声波测距模块串口程序
晶振:
11.0592M
Designedby:
庶野琴风Date:
2016/08/11
QQ:
397739038接线:
模块TRIG接P3.1ECH0接P3.0RS(CS)接P2.0;
RW(SID)接P2.1;
E(SCLK)接P2.2;
BF接P0.7;
/*****************************************************************************/
#include
#include
#definenops{_nop_();_nop_();_nop_();_nop_();}
/******************************引脚及变量的定义****************************/
sbitRS=P2^0;//寄存器选择位
sbitRW=P2^1;//读取选择位
sbitE=P2^2;//使能信号位
sbitBF=P0^7;//忙碌信号位
unsignedcharcodeTab[]={"0123456789"};
unsignedcharcodestring[]={"range:
2cm--4.5m"};
charpart,ge,shi,bai;
charidataGLengthLoh[2];//接收缓冲区
bitsuccess_flag;//定义测试成功标志位
/*********************************************************/
/*********函数名称:
delay1ms(void)******************/
/*********函数功能:
延时1毫秒******************/
/*********函数参数:
void******************/
/*********************************************************/
voiddelay1ms(void)//误差-0.651041666667us
{
chara,b;
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}
/*********************************************************/
/*********函数名称:
delaynms(charn)******************/
/*********函数功能:
延时n个1毫秒******************/
/*********函数参数:
n******************/
/*********************************************************/
voiddelaynms(charn)
{
chara;
for(a=0;a>n;a--)
delay1ms();
}
/*********************************************************/
/*********函数名称:
BusyTest(void)******************/
/*********函数功能:
判断液晶模块忙碌状态******************/
/*********函数参数:
返回值:
result******************/
/*********************************************************/
unsignedcharBusyTest()
{
bitresult;
RS=0;
RW=1;//RS为低电平,RW为高电平时,可以读状态
E=1;//使能为高电平时可读取信息
nops;//延时40us,给硬件反应时间
result=BF;//将忙碌标志位电平赋给result
E=0;//使能1到0:
执行指令
returnresult;
}
/*********************************************************/
/*********函数名称:
WriteInstruction(chardictate)*******/
/*********函数功能:
将模式设置指令或显示地址写入液晶模块**/
/*********函数参数:
dictate******************/
/*********************************************************/
voidWriteInstruction(chardictate)
{
while(BusyTest()==1);//如果忙碌标志位忙碌则等待
RS=0;
RW=0;//RS/RW位同时为低电平时可写入指令
E=0;//使能0到1:
写入指令
nops;
P0=dictate;//将数据送入P0口,写入数据或地址
nops;
E=1;//使能0到1:
写入指令
nops;
E=0;//使能1到0:
执行指令
}
/*********************************************************/
/*********函数名称:
WriteAddress(charx)*******/
/*********函数功能:
指定字符显示的实际地址***********/
/*********函数参数:
x******************/
/*********************************************************/
voidWriteAddress(charx)
{
WriteInstruction(x|0x80);//80H+地址码
}
/*********************************************************/
/*********函数名称:
WriteData(chary)*******/
/*********函数功能:
将数据(字符的标准ASCII码)写入液晶模块*/
/*********函数参数:
y******************/
/*********************************************************/
voidWriteData(chary)
{
while(BusyTest()==1);//如果忙碌标志位忙碌则等待
RS=1;
RW=0;//RS为高电平,RW为低电平时,可以写入数据
E=0;
P0=y;
nops;
E=1;
nops;
E=0;
}
/*********************************************************/
/*********函数名称:
LCDInit(void)*******/
/*********函数功能:
液晶模块初始化****************/
/*********函数参数:
void******************/
/*********************************************************/
voidLCDInit(void)
{
delaynms(15);//延时15毫秒,首次写入液晶指令应给反应时间
WriteInstruction(0x38);//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delaynms(5);//延时5秒,反应时间
WriteInstruction(0x38);
delaynms(5);//延时5秒,反应时间
WriteInstruction(0x38);
delaynms(5);//连续三次,确保初始化成功
WriteInstruction(0x0c);//显示模式设置:
显示开,无光标,光标不闪烁
delaynms(5);
WriteInstruction(0x06);//显示模式设置:
显示光标右移,屏幕不移动
delaynms(5);
WriteInstruction(0x01);//清屏
delaynms(5);
}
/*********************************************************/
/*********函数名称:
UART_Send(chardat)*******/
/*********函数功能:
串口发送函数****************/
/*********函数参数:
dat******************/
/*********************************************************/
voidUART_Send(chardat)
{
TI=0;//清发送标志
SBUF=dat;//如果TI为0等待
while(!
TI);//等待发送数据
}
/*********************************************************/
/*********函数名称:
UART_Init()***************/
/*********函数功能:
串口初始化函数****************/
/*********函数参数:
无******************/
/*********************************************************/
voidUART_Init()
{
TH1=0xFD;
TL1=0xFD;
TMOD=0x21;//设置定时器1为模式2;定时器0为模式1
TH0=(65536-2500)/256;//约2.50MS定时器初值
TL0=(65536-2500)%256;//约2.50MS定时器初值
ET0=1;
TR0=1;//启动定时器
TR1=1;//启动定时器SM0SM1
SM0=0;//串口通信模式设置00=0
SM1=1;//01=1
//10=2
//11=3
REN=1;//串口允许接收数据
ES=1;//开串中断
EA=1;
}
/*********************************************************/
/*********函数名称:
UART_ISR(void)***************/
/*********函数功能:
串口中断函数****************/
/*********函数参数:
void******************/
/*********************************************************/
voidUART_ISR(void)interrupt4
{
chartemp,k;
ES=0;//关中断
if(RI)
{
RI=0;//清接收标志
temp=SBUF;
GLengthLoh[k]=temp;
k++;
if(k==2)//k=数据长度
k=0;
}
ES=1;//开中断
}
/*********************************************************/
/*********函数名称:
timer0()***************/
/*********函数功能:
定时器函数****************/
/*********函数参数:
void******************/
/*********************************************************/
timer0()interrupt1//定时器0中断是1号
{
TH0=(65536-2500)/256;//约2.50MS定时器初值
TL0=(65536-2500)%256;//约2.50MS定时器初值TH0=0xef;TL0=0x94;//写入定时器0初始值
}
/*********************************************************/
/*********函数名称:
conversion(int8temp_data)*******/
/*********函数功能:
数据转换****************/
/*********函数参数:
temp_data******************/
/*********************************************************/
voidconversion(inttemp_data)
{
charpart_data,ge_data,shi_data,bai_data;
bai_data=temp_data/1000;
shi_data=(temp_data%1000)/100;
ge_data=(temp_data%100)/10;
part_data=temp_data%10;
EA=0;
bai=bai_data;
shi=shi_data;
ge=ge_data;
part=part_data;
EA=1;
}
/*********************************************************/
/*********函数名称:
main(void)*******/
/*********函数功能:
主函数****************/
/*********函数参数:
void******************/
/*********************************************************/
voidmain(void)
{
intk;
longPreLength;
LCDInit();//调用液晶初始化函数
delaynms(10);
UART_Init();
PreLength=0;
k=0;
while
(1)
{
WriteAddress(0x01);
while(string[k]!
='\0')
{
WriteData(string[k]);
k++;
}
UART_Send(0X55);
PreLength=GLengthLoh[0]*256+GLengthLoh[1]-5;
conversion(PreLength);
WriteAddress(0x41);//从第2行第6列开始显示
WriteData('J');//将特定的字符常量写入LCD
WriteData('U');
WriteData('L');
WriteData('I');
WriteData(':
');
if(PreLength<=4500&&PreLength>=20)
{
WriteData(Tab[bai]);//将百位数字的字符常量写入LCD
WriteData(Tab[shi]);//将十位数字的字符常量写入LCD
WriteData(Tab[ge]);//将个位数字的字符常量写入LCD
WriteData('.');
WriteData(Tab[part]);
}
else
{
WriteData('-');
WriteData('-');
WriteData('-');
WriteData('-');
WriteData('-');
}
WriteData('');
WriteData('c');
WriteData('m');
}
}