利用STC89C52单片机、超声波模块(HC-RS04)、DS18B20数字温度传感器和LCD1602液晶显示模块制作一个超声波测距仪,液晶屏第一行显示温度和超声波速度“T:30°C V:349m/s”,第二行显示测量距离“S=X.XXXm”。
所设计的测距仪测量单位为米,精确到小数点后面3位(毫米),测量范围:0.05m~5m。
(一)基本部分
1、液晶显示功能
(1)开机时,液晶屏第一行显示温度和超声波速度,例如“T:30°C V:349m/s”,第二行显示测量距离“S=0.000m”
(2)操作对应的功能按键时,液晶屏第一行显示温度和超声波速度,例如“T:30°C V:349m/s”,第二行显示测量距离“S=X.XXXm”。
(3)本超声波测距仪使用4个独立按键。第1个按键为复位清零功能;第2个按键为单次测量功能;第3个按键为瞬时连续测量功能;第4个按键为平均连续测量功能。
(4)第1个按键为复位清零功能。无论什么时候按下该键,液晶屏第二行均显示测量距离“S=0.000m”
(5)第2个按键为单次测量功能。每按一次该键,就发射一次超声波,液晶屏第二行对应显示一次测量距离“S=X.XXXm”
(6)第3个按键为瞬时连续测量功能。按下该键,连续发射超声波,液晶屏第二行对应显示瞬时测量距离“S=X.XXXm”,再按一次该键,数字保持,以便读数
(7)第4个按键为平均连续测量功能。按下该键,连续发射超声波,液晶屏第二行对应显示平均测量距离“S=X.XXXm”,再按一次该键,数字保持,以便读数
(8)第5个按键为自动/手动温度设置按键,转换到手动设置温度值,这时可以利用加键和减键使温度在0度至50度范围内调节,再按一次该键,重新回到自动温控状态,如此循环。
(9)第6个按键为温度加按键,当处于手动温度控制状态时,按下本按键可以加温度,最高可以加到50摄氏度。
(10)第7个按键为温度减按键,当处于手动温度控制状态时,按下本按键可以减温度,最低可以减0摄氏度。
程序代码如下:
/**************************************/
/* 超声波测距(自动/手动温度校正) */
/* (超声波模块+18B20+1602液晶) */
/**************************************/
#include #include #define uchar unsigned char #define uint unsigned int #define LcdData P0 //1602数据端口 sbit LCD_RS=P2^6; //1602 RS端口 sbit LCD_RW=P2^5; //1602 RW端口 sbit LCD_EN=P2^7; //1602 EN端口 sbit Echo=P2^4; //HC-SR04 接收端口 sbit Trig=P2^3; //HC-SR04 发射端口 sbit Resets_Key=P1^0; //复位清零按键 sbit Single_Key=P1^1; //单次测量按键 误差较大 sbit Contin_Key=P1^2; //连续测量按键 误差小 sbit Averag_Key=P1^3; //连续(平均测量)按键 误差较小 sbit Setting_Key=P1^4; //温度修正按键 sbit Add_Key=P1^5; //温度加1按键 sbit Sub_Key=P1^6; //温度减1按键 sbit DQ=P3^7; //DS18B20单总线接口 bit Temp_Flag; //正负温度标志:温度为正Temp_Flag=0,否则为1 uint temp=25; //温度值 bit flag_flow=0,flag_one=0,flag_clear=0,flag_con1=0,flag_con2=0,flag_temp=0; uchar i=0,m,j,k; uint time=0,S=0,S1=0,totle=0; float V=346.0; uint Sav[11]; //连续测量时10次平均值数组 uchar Line1[16]={"T: C V:346m/s"}; //1602第一行初始字符显示数组 uchar Line2[16]={"S= m "}; //1602第二行初始字符显示数组 void Delayms(uchar xms); //延时xms函数 void WriteLcd(uchar Dat,bit x); //1602写函数 void InitLcd(void); //1602初始化函数 void DisplayLcd(); //1602显示函数 void init(); //初始化函数 void keyscan(); //键扫描函数 void StartModule(); //启动模块函数 void Conut(void); //测量计算函数 void Delayus(uchar xus); //us级延时函数 bit Init_DS18B20(void); //初始化DS18B20函数 uchar Read_DS18B20(void); //读DS18B20函数 void Write_DS18B20(uchar Dat); //写DS18B20函数 void GetTemp(); //取温度函数 void CalcTestTemp(); //温度处理函数 void main(void) //主函数 { init(); InitLcd(); while(1) { keyscan(); //键扫描函数 DisplayLcd(); if(flag_temp==0) { GetTemp(); CalcTestTemp(); } if(flag_one==1||flag_con1==1||flag_con2==1) { StartModule(); //开始发射超声波 while(!Echo); //当RX为零时等待 TR0=1; //开启计数 while(Echo); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 Delayus(200); flag_one=0; } } } void Delayms(uchar xms) //延时ms函数 { uchar i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void WriteLcd(uchar Dat,bit x) //1602写函数(写指令时x=0,写数据时x=1) { LCD_EN=0; LcdData=Dat; LCD_RS=x; LCD_RW=0; LCD_EN=1; Delayms(1); LCD_EN=0; } void InitLcd(void) //1602初始化函数 { WriteLcd(0x38,0); //功能设定(38H),8位数据,2行显示,5*7点阵 WriteLcd(0x0C,0); //显示开、关设定(0CH),开显示,不显示光标,光标不闪烁 WriteLcd(0x06,0); //输入模式设定(06H),读写一个字符后,地址指针加1,且光标加1 WriteLcd(0x01,0); //清除显示(01H),清除数据RAM中的数据 } void DisplayLcd() //液晶屏显示函数 { uchar y; V=(331.4+temp*0.607); Line1[2]=temp/10+0x30; Line1[3]=temp%10+0x30; Line1[4]=0xDF; //显示℃中C前面的小圆 Line1[10]=(uint)V/100+0x30; Line1[11]=(uint)V%100/10+0x30; Line1[12]=(uint)V%10+0x30; if(flag_clear==1) S1=0; if((S1>=7000)||flag_flow==1) //超出测量范围显示“-” { flag_flow=0; Line2[2]='-'; Line2[3]='.'; Line2[4]='-'; Line2[5]='-'; Line2[6]='-'; } else { Line2[2]=S1/1000+0x30; Line2[3]='.'; Line2[4]=S1%1000/100+0x30; Line2[5]=S1%100/10+0x30; Line2[6]=S1%10+0x30; } WriteLcd(0x80,0); //设定第一行地址 for(y=0; y<16; y++) WriteLcd(Line1[y],1); WriteLcd(0xc0,0); //设定第二行地址 for(y=0; y<16; y++) WriteLcd(Line2[y],1); } void init() //初始化函数 { TMOD=0x01; //设T0为方式1,GATE=1; TH0=0; TL0=0; ET0=1; //允许T0中断 EA=1; //开启总中断 } void keyscan() //键扫描函数 { if(Resets_Key==0) //复位清零键 { Delayms(5); if(Resets_Key==0) { while(Resets_Key==0); flag_clear=1; } } if(Single_Key==0) //单次测量键 { Delayms(5); if(Single_Key==0) { while(Single_Key==0); flag_one=1; flag_con1=0; flag_con2=0; flag_clear=0; } } if(Contin_Key==0) //连续瞬时测量键
上一篇:单片机舵机控制程序教程及proteus仿真原理图
下一篇:单片机+CXA1019S+锁相环BU2614数字式调频收音机设计
推荐阅读最新更新时间:2024-11-17 00:47
设计资源 培训 开发板 精华推荐
- 基于ST1S10(DFN)的、具有禁止功能的、3A同步900kHz降压DC-DC转换器
- AD9517-3A/PCBZ2,AD9517-3A2 评估板,2000 MHz 极低噪声 PLL 时钟合成器
- 使用 NXP Semiconductors 的 KSZ8721BLI 的参考设计
- EVAL-ADAU1977Z,用于评估 ADAU1977 4 通道 ADC 的评估板
- SY58037U,用于 GB 以太网交换机的时钟缓冲器的评估板
- DC2551A-C,使用 LT1997-1 可配置精密放大器的演示板
- 使用具有调节功能的 LT1054CN8 正倍频器的典型应用
- MIKROE-3439,用于 VCNL36687S 接近传感器的接近 8 点击板
- 使用 Silicon Labs 的 Si3402 的参考设计
- ADR3550 微功耗、高精度电压基准的典型应用