本設(shè)計(jì)
51單片機(jī)超聲波測(cè)距帶語(yǔ)音播報(bào)(源程序+原理圖+原理圖講解)
原理圖:Altium Designer
程序編譯器:keil 4
編程語(yǔ)言:C語(yǔ)言
編號(hào)S0004
功能說明:
1.本設(shè)計(jì)采用STC89C51/52(與AT89S51/52、AT89C51/52通用,可任選)單片機(jī)作為主控制器;
2.LCD1602液晶顯示測(cè)量的距離和溫度;
3.帶有溫度補(bǔ)償功能(DS18B20傳感器);
4.測(cè)量范圍0.02m~4m,精度為0.01m;
5.帶實(shí)時(shí)語(yǔ)音播報(bào)功能;
6.按鍵功能:按鍵2:加報(bào)警值按鍵3:減報(bào)警值按鍵1:設(shè)置按鍵(只有在按下設(shè)置的時(shí)候才可以加減報(bào)警值),在未按下按鍵1時(shí),按下按鍵3播報(bào)測(cè)量距離。
使用方法:
開機(jī)即可測(cè)試,前面的障礙物盡量不要太亂,盡量平整(如墻壁)。只有在設(shè)置的時(shí)候才可以加減報(bào)警值始計(jì)時(shí)
原理圖:
程序:
復(fù)制到瀏覽器https://docs.qq.com/sheet/DS0xIa0llTmtNakRW
//宏定義
#define uchar unsigned char
#define uint unsigned int
#define ULint unsigned long int
//溫度零上與零下的標(biāo)志位
char flag=0;
//超聲波
char flags=0;
//超聲波距離
char flag1s=0;
//計(jì)算定時(shí)間
uint time=0;
//計(jì)算距離
ULint L_=0;
//溫度
uint t_=0;
//顯示模式 0正常 1最大值調(diào)整 2最小值調(diào)整
uchar mode=0;
uint Max=490;
uint Min=10;
//按鍵標(biāo)志
uchar k=0;
//數(shù)值有誤
uchar FW=0;
//頭函數(shù)
#include <reg52.h>
#include <intrins.h>
#include "BJ_Key.h" //報(bào)警按鍵
#include "display.h" //顯示頭函數(shù)
#include "ultrasonic_wave.h"http://超聲波頭函數(shù)
#include "DS18B20.h" //溫度傳感器頭函數(shù)
uchar ONE1[6]={0x7E,0x04,0x03,0x00,0X0D,0xEF};//現(xiàn)在距離為
uchar ONE2[6]={0x7E,0x04,0x03,0x00,0X0C,0xEF};//米
uchar ONE3[6]={0x7E,0x04,0x03,0x00,0X0B,0xEF};//點(diǎn)
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};//個(gè)位
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; // 定時(shí)器1工作在方式2(自動(dòng)重裝)
TH1 = 0xFD;
TL1 = 0xFD; //設(shè)置波特率為9600
TR1 = 1;
}
/*
* UART 發(fā)送一字節(jié)
入口參數(shù)uint8的數(shù)據(jù)類型 即要發(fā)送的數(shù)據(jù)
*/
void UART_send_byte(uchar dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
/*
* UART 發(fā)送字符串
第一個(gè)參數(shù)要發(fā)送字符串或數(shù)據(jù)的首地址
第二個(gè)參數(shù)是要發(fā)送的數(shù)據(jù)或字符串的長(zhǎng)度
*/
void UART_send_string(uchar *buf,uchar len)
{
uchar i;
for(i=0;i<len;i++)
UART_send_byte(*buf++);
}
//主函數(shù)
void main()
{
UART_init();
Init_ultrasonic_wave();
//屏幕初始化
Init1602();
//溫度初始化
tmpchange();
t_=tmp();
tmpchange();
t_=tmp();
tmpchange();
t_=tmp();
//循環(huán)顯示
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();//啟動(dòng)超聲波
while(!RX); //當(dāng)RX為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
delayms(20); //20MS
tmpchange(); //溫度轉(zhuǎn)換
t_=tmp(); //度溫度
Conut(t_/10); //計(jì)算距離
if(L_>Max||L_<Min)
{
Feng_Start();
}
else
{
if(FW!=1)
Feng_Stop();
}
Display_1602(t_/10,L_);
}
//調(diào)整顯示
else if(mode!=0)
{
//最大最小值
Init_MaxMin();
while(mode!=0)
{
Key();
if(k==1&&mode==1)
{
Init_MaxMin();
write_com(0x8d);//設(shè)置位置
}
else if(k==1&&mode==2)
{
Init_MaxMin();
write_com(0x8d+0x40);//設(shè)置位置
}
k=0;
}
//界面初始化
Init1602();
}
}
}
//T0中斷用來計(jì)數(shù)器溢出,超過測(cè)距范圍
void CJ_T0() interrupt 1
{
flags=1; //中斷溢出標(biāo)志
}
百度云分享下載鏈接: