1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 51单片机超声波测距带语音播报(源程序+原理图+原理图讲解)

51单片机超声波测距带语音播报(源程序+原理图+原理图讲解)

时间:2023-11-22 17:32:47

相关推荐

51单片机超声波测距带语音播报(源程序+原理图+原理图讲解)

本设计

51单片机超声波测距带语音播报(源程序+原理图+原理图讲解)

原理图:Altium Designer

程序编译器:keil 4

编程语言:C语言

编号S0004

功能说明:

1.本设计采用STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机作为主控制器;

2.LCD1602液晶显示测量的距离和温度;

3.带有温度补偿功能(DS18B20传感器);

4.测量范围0.02m~4m,精度为0.01m;

5.带实时语音播报功能;

6.按键功能:按键2:加报警值按键3:减报警值按键1:设置按键(只有在按下设置的时候才可以加减报警值),在未按下按键1时,按下按键3播报测量距离。

使用方法:

开机即可测试,前面的障碍物尽量不要太乱,尽量平整(如墙壁)。只有在设置的时候才可以加减报警值始计时

原理图:

程序:

复制到浏览器/sheet/DS0xIa0llTmtNakRW//宏定义#define uchar unsigned char #define uint unsigned int#define ULint unsigned long int //温度零上与零下的标志位char flag=0;//超声波char flags=0;//超声波距离char flag1s=0;//计算定时间uint time=0;//计算距离ULint L_=0;//温度uint t_=0;//显示模式 0正常 1最大值调整 2最小值调整uchar mode=0;uint Max=490;uint Min=10;//按键标志uchar k=0;//数值有误uchar FW=0;//头函数#include <reg52.h>#include <intrins.h>#include "BJ_Key.h" //报警按键#include "display.h" //显示头函数#include "ultrasonic_wave.h"//超声波头函数#include "DS18B20.h" //温度传感器头函数uchar ONE1[6]={0x7E,0x04,0x03,0x00,0X0D,0xEF};//现在距离为uchar ONE2[6]={0x7E,0x04,0x03,0x00,0X0C,0xEF};//米uchar ONE3[6]={0x7E,0x04,0x03,0x00,0X0B,0xEF};//点uchar ONE4[6]={0x7E,0x04,0x03,0x00,0X00,0xEF};//百位uchar ONE5[6]={0x7E,0x04,0x03,0x00,0X00,0xEF};//十位uchar ONE6[6]={0x7E,0x04,0x03,0x00,0X00,0xEF};//个位void delayms(uint ms){uchar i=100,j;for(;ms;ms--){while(--i){j=10;while(--j);}}}/******** UART初始化 波特率:9600 ******/void UART_init(void){SCON = 0x50; // 10位uart,允许串行接受TMOD = 0x20; // 定时器1工作在方式2(自动重装)TH1 = 0xFD;TL1 = 0xFD; //设置波特率为9600TR1 = 1;}/** UART 发送一字节入口参数uint8的数据类型 即要发送的数据*/void UART_send_byte(uchar dat){SBUF = dat;while (TI == 0);TI = 0;}/** UART 发送字符串 第一个参数要发送字符串或数据的首地址第二个参数是要发送的数据或字符串的长度*/void UART_send_string(uchar *buf,uchar len){uchar i;for(i=0;i<len;i++)UART_send_byte(*buf++);}//主函数void main(){UART_init();Init_ultrasonic_wave();//屏幕初始化Init1602();//温度初始化tmpchange(); t_=tmp();tmpchange();t_=tmp();tmpchange();t_=tmp();//循环显示while(1){Key();if(yuyin_flag==1){yuyin_flag=0;ONE4[4]=L_/100;ONE5[4]=L_/10%10;ONE6[4]=L_%10;if(ONE4[4]==0)ONE4[4]=0x0A;if(ONE5[4]==0)ONE5[4]=0x0A;if(ONE6[4]==0)ONE6[4]=0x0A;UART_send_string(ONE1,6);delayms(1);UART_send_string(ONE4,6);delayms(1);UART_send_string(ONE3,6);delayms(1);UART_send_string(ONE5,6);delayms(1);UART_send_string(ONE6,6);delayms(1);UART_send_string(ONE2,6);delayms(1);}//正常显示if(mode==0){StartModule();//启动超声波while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数delayms(20); //20MStmpchange(); //温度转换t_=tmp();//度温度Conut(t_/10); //计算距离if(L_>Max||L_<Min){Feng_Start();}else{if(FW!=1)Feng_Stop();}Display_1602(t_/10,L_);}//调整显示else if(mode!=0){//最大最小值Init_MaxMin();while(mode!=0){Key();if(k==1&&mode==1){Init_MaxMin();write_com(0x8d);//设置位置}else if(k==1&&mode==2){Init_MaxMin();write_com(0x8d+0x40);//设置位置}k=0;}//界面初始化Init1602();}}}//T0中断用来计数器溢出,超过测距范围void CJ_T0() interrupt 1{flags=1; //中断溢出标志}

百度云分享下载链接:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。