基于51单片机的US100超声波模块1602显示程序.docx

上传人:b****4 文档编号:4135930 上传时间:2023-05-06 格式:DOCX 页数:12 大小:16.54KB
下载 相关 举报
基于51单片机的US100超声波模块1602显示程序.docx_第1页
第1页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第2页
第2页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第3页
第3页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第4页
第4页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第5页
第5页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第6页
第6页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第7页
第7页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第8页
第8页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第9页
第9页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第10页
第10页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第11页
第11页 / 共12页
基于51单片机的US100超声波模块1602显示程序.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的US100超声波模块1602显示程序.docx

《基于51单片机的US100超声波模块1602显示程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机的US100超声波模块1602显示程序.docx(12页珍藏版)》请在冰点文库上搜索。

基于51单片机的US100超声波模块1602显示程序.docx

基于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');

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2