您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 基于51单片机的US-100(超声波模块)1602显示程序
/*****************************************************************************/Name:LCD1602+US-100+STC89C52HC-SR04超声波测距模块串口程序晶振:11.0592MDesignedby:庶野琴风Date:2016/08/11QQ:397739038接线:模块TRIG接P3.1ECH0接P3.0RS(CS)接P2.0;RW(SID)接P2.1;E(SCLK)接P2.2;BF接P0.7;/*****************************************************************************/#includereg52.h#includeintrins.h#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;b0;b--)for(a=3;a0;a--);}/*********************************************************//*********函数名称:delaynms(charn)******************//*********函数功能:延时n个1毫秒******************//*********函数参数:n******************//*********************************************************/voiddelaynms(charn){chara;for(a=0;an;a--)delay1ms();}/*********************************************************//*********函数名称:BusyTest(void)******************//*********函数功能:判断液晶模块忙碌状态******************//*********函数参数:返回值:result******************//*********************************************************/unsignedcharBusyTest(){bitresult;RS=0;RW=1;//RS为低电平,RW为高电平时,可以读状态E=1;//使能为高电平时可读取信息nops;//延时40us,给硬件反应时间result=BF;//将忙碌标志位电平赋给resultE=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为模式1TH0=(65536-2500)/256;//约2.50MS定时器初值TL0=(65536-2500)%256;//约2.50MS定时器初值ET0=1;TR0=1;//启动定时器TR1=1;//启动定时器SM0SM1SM0=0;//串口通信模式设置00=0SM1=1;//01=1//10=2//11=3REN=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初始值}/****************************************
本文标题:基于51单片机的US-100(超声波模块)1602显示程序
链接地址:https://www.777doc.com/doc-5445760 .html