超声波模块测距+1602显示.,,,基于此程+轴流风机已完美做出风洞
单片机源程序:
- #include<reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit in=P3^3; //超声波接收口
- sbit out=P3^4; //超声波发射口
- //LCD1602端口定义
- sbit RS=P2^6; //寄存器选择位,将RS位定义为P2.0引脚 //1602引脚定义
- sbit RW=P2^5; //读写选择位,将RW位定义为P2.1引脚
- sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚
-
- #define LCD1602data P0 //1602数据口接单片机P1口
- uint time;
- unsigned long s=0;
- bit flag; //超声波超出测量范围标志位
- uint s1,s2,s3;
- /*****************************************************
- 以下为1602模块语句
- ***************************************************/
- /*****************************************************
- 函数功能:延时1ms
- ***************************************************/
- void delay1ms()
- {
- unsigned char i,j;
- for(i=0;i<10;i++)
- for(j=0;j<33;j++);
- }
- /*****************************************************
- 函数功能:延时若干毫秒
- 入口参数:n
- ***************************************************/
- void delay(unsigned int n)
- {
- unsigned int i;
- for(i=0;i<n;i++)
- delay1ms();
- }
- /*****************************************************
- 函数功能:判断液晶模块的忙碌状态
- 返回值:result。result=1,忙碌;result=0,不忙
- ***************************************************/
- bit BusyTest(void)
- {
- bit result;
- RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
- RW=1;
- E=1; //E=1,才允许读写
- _nop_(); //空操作
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
-
- E=0;
- return result;
- }
- /*****************************************************
- 函数功能:将模式设置指令或显示地址写入液晶模块
- 入口参数:dictate
- ***************************************************/
- void Write_com (unsigned char dictate)
- {
- while(BusyTest()==1); //如果忙就等待
- RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
- RW=0;
- E=0; //E置低电平(写指令时,
- // 就是让E从0到1发生正跳变,所以应先置"0"
- _nop_();
- _nop_(); //空操作两个机器周期,给硬件反应时间
- LCD1602data=dictate;//将数据送入P0口,即写入指令或地址
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=1; //E置高电平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
- }
- /*****************************************************
- 函数功能:指定字符显示的实际地址
- 入口参数:x
- ***************************************************/
- void WriteAddress(unsigned char x)
- {
- Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
- }
- /*****************************************************
- 函数功能:将数据(字符的标准ASCII码)写入液晶模块
- 入口参数:y(为字符常量)
- ***************************************************/
- void WriteData(unsigned char y)
- {
- while(BusyTest()==1);
- RS=1; //RS为高电平,RW为低电平时,可以写入数据
- RW=0;
- E=0; //E置低电平(写指令时,,
- // 就是让E从0到1发生正跳变,所以应先置"0"
- LCD1602data=y; //将数据送入P0口,即将数据写入液晶模块
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=1; //E置高电平
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四个机器周期,给硬件反应时间
- E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
- }
- /*****************************************************
- 函数功能:对LCD的显示模式进行初始化设置
- ***************************************************/
- void LcdInt(void)
- {
- delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
- Write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
- delay(5); //延时5ms
- Write_com(0x38);
- delay(5);
- Write_com(0x38); //3次写 设置模式
- delay(5);
- // Write_com(0x0F); //显示模式设置:显示开,有光标,光标闪烁
- // delay(5);
- Write_com(0x0c); //显示模式设置:显示开,不显示光标
- delay(5);
- Write_com(0x06); //显示模式设置:光标右移,字符不移
- delay(5);
- Write_com(0x01); //清屏幕指令,将以前的显示内容清除
- delay(5);
- }
- //add为显示字符的位置(在第二行显示)//x为显示的字符
- //调用此函数请注意:此函数是为显示数字的,display(10,9);display(10,a);
- //分别表示第二行第十位显示数字9和a代表的数字
- //如果想把此函数改写成显示字母的,
- //只需把最后WriteData(0x30+x);中的
- // 0x30+ 去掉即可,调用时注意格式 display(10,'a');
- display(unsigned char add,unsigned char x)
- {
-
- WriteAddress(0x00);
-
- delay(5);
- Write_com(0x80+0x40+add);
- WriteData(0x30+x);
- }
- LCD1602()//1602初显示
- {
-
- LcdInt(); //调用LCD初始化函数
- delay(10);
- Write_com(0x01); //清屏
- delay(5);
- WriteAddress(0x00);
- //设置显示位置为第一行第一个字,这条语句可以不用写,因为默认是从第一行第一个字显示
- delay(5);
- //第一行显示 DISTANCE:
- WriteData('D');
- WriteData('I');
- WriteData('S');
- WriteData('T');
- WriteData('A');
- WriteData('N');
- WriteData('C');
- WriteData('E');
- WriteData(':');
- }
- /*****************************************************
- 以上为1602模块语句
- ***************************************************/
- void FS() //发射超声波
- {
- out=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- out=0;
- }
- void conut(void) //计算并显示超声波测到的距离
- {
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
-
- s=(time*1.7)/100; //算出来单位是CM
- if((s>=700)||flag==1) //超出测量范围显示"ERROR"
- {
- flag=0;
-
- Write_com(0x80+0x40+11);
- WriteData('E'); delay(5);
- WriteData('R'); delay(5);
- WriteData('R'); delay(5);
- WriteData('O'); delay(5);
- WriteData('R'); delay(5);
- }
- else
- {
- s1=s%1000/100;
- s2=s%1000%100/10;
- s3=s%1000%10 %10;
- display(11,s1);
- WriteData('.');
- display(13,s2);
- display(14,s3);
- WriteData('m');
- }
- }
- /********************************************************/
- void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
- {
-
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
下载:
超声波模块测距 1602显示.zip
(44.62 KB, 下载次数: 83)
|