新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 語(yǔ)音播報(bào)超聲波測(cè)距程序

語(yǔ)音播報(bào)超聲波測(cè)距程序

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏

///////////////////讀出顯示結(jié)果子函數(shù)////////////////////////////
void read()
{
play(0xdc); //播報(bào)“測(cè)量距離”這四個(gè)字,0xdc是之前記錄下4004錄這四個(gè)字的地址
delay2(50000);
delay2(50000); //延時(shí)等待播報(bào)完畢電子小制作_我愛(ài)制作_電子DIY制作套件
s=D/100; //D是測(cè)量得到的數(shù)據(jù)值,此語(yǔ)句是取數(shù)據(jù)的最高位
if(s==1) //判斷最高位(十位)如果是“1”則不讀yi而讀shi
{
play(0x5a); //shi的地址
delay2(50000);
}
if(s>1) //如果大于1則讀出相應(yīng)數(shù)字后直接在后面加讀shi
{
speaknum();
delay2(50000);
play(0x5a);
delay2(50000);
}
s=D0/10; //取次高位(個(gè)位)的值
if(s!=0) //次高位不為0則讀出相應(yīng)的值,為0跳過(guò)
{
speaknum();
delay2(50000);
}
play(0x64); //讀小數(shù)點(diǎn)“dian”
delay2(50000);
s=D; //取小數(shù)點(diǎn)后一位的值
speaknum();
delay2(50000);
play(0xbe); //播報(bào)“cm”limi
delay2(50000);
///////////////////////////以下是播報(bào)溫度和當(dāng)前計(jì)算的聲速,方法同上///////////////////
play(0xf0);
delay2(50000);
delay2(50000);
s=TD/100;
if(s==1)
{
play(0x5a);
delay2(50000);
}
if(s>1)
{
speaknum();
delay2(50000);
play(0x5a);
delay2(50000);
}
if(s!=0)
{
s=TD0/10;
speaknum();
delay2(50000);
}
play(0x64);
delay2(50000);
s=TD;
speaknum();
delay2(50000);
play(0xC8);
delay2(50000);
delay2(50000);
play(0xe6);
delay2(50000);
delay2(50000);
s=VD/1000;
speaknum();
delay2(50000);
play(0xfa);
delay2(50000);
s=VD00/100;
speaknum();
delay2(50000);
play(0x5a);
delay2(50000);
s=VD0/10;
speaknum();
delay2(50000);
play(0x64);
delay2(50000);
s=VD;
speaknum();
delay2(50000);
play(0xd2);
}
////////////////////////////////////////////////////////////

void main()
{
initlcd() ; //初始化LCD1602http://www.duankudp.com/
while(1)
{
timer();
readtemp(); //讀溫度
delay25us_40KHz(15);
display();
if(key1==0) read();
}
}
以下是溫度傳感器頭文件ds18b20.h
sbit DQ=P2^2;
uchar tempdata[2];
uchar k=0;
int TD;
float T;
void delay1(uchar i)
{
while(i--);
}
void initDS18B20() //初始化DS18B20
{
DQ = 1; //DQ復(fù)位
delay1(8); //稍做延時(shí)
DQ = 0; //單片機(jī)將DQ拉低
delay1(80); //延時(shí) 大于 480us
DQ = 1; //拉高總線
delay1(30);
}
uchar readchar() //向DS18B20讀取一字節(jié)http://www.duankudp.com/
{
uchar i = 0 ;
uchar dat = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
dat >>= 1 ;
DQ = 1 ;
if(DQ)
dat |= 0x80 ;
delay1(4) ;
}
return (dat) ;
}
void writecmd(uchar cmd) //向DS18B20寫入一字節(jié)
{
uchar i ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = cmd&0x01 ;
delay1(5) ;
DQ = 1 ;
cmd>>=1 ;
}
}

void readtemp()
{
initDS18B20() ;
writecmd(0xCC) ; // 跳過(guò)讀序號(hào)列號(hào)的操作
writecmd(0x44) ; // 啟動(dòng)溫度轉(zhuǎn)換
initDS18B20() ;
writecmd(0xCC) ; //跳過(guò)讀序號(hào)列號(hào)的操作
writecmd(0xBE) ; //讀取溫度寄存器
tempdata[0] = readchar() ; //溫度低8位
tempdata[1] = readchar() ; //溫度高8位
TD=tempdata[1];
TD<<=8;
TD|=tempdata[0];
T=TD*0.0625; //DS18B20在出廠時(shí)以配置為12位,讀取溫度時(shí)共讀取16位,最高5位為符號(hào)位,溫度在0上,符號(hào)位為0,所以把后11位的2進(jìn)制轉(zhuǎn)化為10進(jìn)制后在乘以0.0625便為所測(cè)的溫度
TD=T*10+0.5; //將它放大10倍, 使顯示時(shí)可顯示小數(shù)點(diǎn)后一位, 并對(duì)小數(shù)點(diǎn)后第二2進(jìn)行4舍5入
}

一下是液晶顯示頭文件lcd.h
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;
#define uchar unsigned char
#define DATA P0
#define busy 0x80

void chkbusy() //檢測(cè)狀態(tài)
{
DATA=0xff;
RS=0;
RW=1;
EN=1;
_nop_();
_nop_();
while(busy&DATA);
EN=0;
}
void WIR(uchar CMD,uchar i) //寫命令
{
if(i) chkbusy();
RS=0;
RW=0;
EN=1;
_nop_();
_nop_();
DATA=CMD;
EN=0;
}
void WDR(char c) //寫數(shù)據(jù)
{
chkbusy();
RS=1;
RW=0;
EN=1;
_nop_();
_nop_();
DATA=c;
EN=0;
}
void displaychar(uchar x,uchar y,char c) //指定行列顯示字符
{
if(y==1) x|=0x40; //當(dāng)要顯示第二行時(shí)地址碼+0x40;
x|=0x80;
WIR(x,0);
WDR(c);
}
void displaystring(uchar x,uchar y,char s[]) //指定行列顯示字符串http://www.duankudp.com/
{
uchar p=0;
while(1)
{
displaychar(x,y,s[p]);
p++;
if(s[p]==0)
break;
x++;
if(x>=15) //每行最多顯示16個(gè)字符
{
x=0;
y=!y; //如果一行顯示不完,則轉(zhuǎn)到下一行或上一行顯示
}
}
}
void initlcd() //初始化lcd
{
WIR(0x38,0);
WIR(0x38,1); //顯示模式設(shè)置
WIR(0x08,1); //關(guān)閉顯示
WIR(0x01,1); //清屏
WIR(0x06,1); //光標(biāo)移位設(shè)置
WIR(0x0c,1); //顯示開(kāi)及光標(biāo)設(shè)置
}

上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 語(yǔ)音播報(bào)超聲波測(cè)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉