當前位置:首頁 > 單片機 > 單片機
[導讀] 利用ds18b20檢測當前溫度isd1420語音芯片的溫度報警程序功能:利用ds18b20檢測當前溫度,通過和設定參數(shù)的比較,給ISD1420發(fā)出報警脈沖,通過功率放大器LM386驅(qū)動喇叭報警。注:isd1420的報警采用延時方

利用ds18b20檢測當前溫度isd1420語音芯片溫度報警程序
功能:利用ds18b20檢測當前溫度,通過和設定參數(shù)的比較,給ISD1420發(fā)出

報警脈沖,通過功率放大器LM386驅(qū)動喇叭報警。
注:isd1420的報警采用延時方式(isd1420的延時報警取決于錄音時間的長短)


#include
#include
#include

#defineucharunsignedchar
#defineuintunsignedint
#definePLAYE_ADDRXBYTE[0XBFFF]//語音報警地址

#defineBUSY0x80//LCD忙檢測標志
#defineDATAPORTP0

sbitP1_0=P1^4;//時鐘調(diào)整
sbitP1_1=P1^5;//時鐘加
sbitP1_2=P1^6;//時鐘減

sbitRED_ALARM=P1^0;//紅色指示燈
sbitWRITE_ALARM=P1^1;//白色指示燈
sbitGREEN_ALARM=P1^2;//綠色指示燈

sbitDQ=P3^7;//定義ds18b20通信端口
sbitLCM_RS=P2^0;//數(shù)據(jù)/命令端
sbitLCM_RW=P2^1;//讀/寫選擇端
sbitLCM_EN=P2^2;//LCD使能信號
sbitRECLED_EOC=P3^5;//ISD1420放音結(jié)束查詢標志


unsignedcharseconde=0;//定義并初始化時鐘變量
unsignedcharminite=0;
unsignedcharhour=12;
unsignedcharmstcnt=0;
unsignedchartemp1,temp2,teMP3;
unsignedcharruntime;//系統(tǒng)運行總時間
unsignedchart;
unsignedinttemp;

ucharcodestr0[]={"---::---of"};
ucharcodestr1[]={"temp:.C------"};

voiddelay_LCM(uint);//LCD延時子程序
voidinitLCM(void);//LCD初始化子程序
voidlcd_wait(void);//LCD檢測忙子程序
voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//寫指令到ICM子函數(shù)
voidWritEDAtaLCM(ucharWDLCM);//寫數(shù)據(jù)到LCM子函數(shù)
voidDisplayOneChar(ucharX,ucharY,ucharDData);//顯示指定坐標的一個字符子函數(shù)
voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//顯示指定坐標的一串字符子函數(shù)

voidinit_timer0(void);//定時器初始化
voiddisplayfun1(void);

voiddelay_18B20(unsignedinti);
voidInit_DS18B20(void);
ucharReadOneChar(void);
voidWriteOneChar(unsignedchardat);
voidReadTemperature(void);
voidplayalarm(void);

/*********延時K*1ms,12.000mHz**********/

voiddelay_LCM(uintk)
{
uinti,j;
for(i=0;i{
for(j=0;j<60;j++)
{;}
}
}
/**********寫指令到ICM子函數(shù)************/

voidWriteCommandLCM(ucharWCLCM,ucharBusyC)
{
if(BusyC)lcd_wait();
DATAPORT=WCLCM;
LCM_RS=0;//選中指令寄存器
LCM_RW=0;//寫模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}

/**********寫數(shù)據(jù)到LCM子函數(shù)************/

voidWriteDataLCM(ucharWDLCM)
{
lcd_wait();//檢測忙信號
DATAPORT=WDLCM;
LCM_RS=1;//選中數(shù)據(jù)寄存器
LCM_RW=0;//寫模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}

/***********lcm內(nèi)部等待函數(shù)*************/

voidlcd_wait(void)
{
DATAPORT=0xff;
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
_nop_();
_nop_();
while(DATAPORT&BUSY)
{
LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;

}

/**********LCM初始化子函數(shù)***********/

voidinitLCM()
{
DATAPORT=0;
delay_LCM(15);
WriteCommandLCM(0x38,0);//三次顯示模式設置,不檢測忙信號
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);

WriteCommandLCM(0x38,1);//8bit數(shù)據(jù)傳送,2行顯示,5*7字型,檢測忙信號
WriteCommandLCM(0x08,1);//關(guān)閉顯示,檢測忙信號
WriteCommandLCM(0x01,1);//清屏,檢測忙信號
WriteCommandLCM(0x06,1);//顯示光標右移設置,檢測忙信號
WriteCommandLCM(0x0c,1);//顯示屏打開,光標不顯示,不閃爍,檢測忙信號
}

/****************顯示指定坐標的一個字符子函數(shù)*************/

voidDisplayOneChar(ucharX,ucharY,ucharDData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;//若y為1(顯示第二行),地址碼+0X40
X|=0x80;//指令碼為地址碼+0X80
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}

/***********顯示指定坐標的一串字符子函數(shù)***********/

voidDisplayListChar(ucharX,ucharY,ucharcode*DData)
{
ucharListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}

/***********ds18b20延遲子函數(shù)(晶振12MHz)*******/

voiddelay_18B20(unsignedinti)
{
while(i--);
}

/**********ds18b20初始化函數(shù)**********************/

voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ復位
delay_18B20(8);//稍做延時
DQ=0;//單片機將DQ拉低
delay_18B20(80);//精確延時大于480us
DQ=1;//拉高總線
delay_18B20(14);
x=DQ;//稍做延時后如果x=0則初始化成功x=1則初始化失敗
delay_18B20(20);
}

/***********ds18b20讀一個字節(jié)**************/

unsignedcharReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//給脈沖信號
dat>>=1;
DQ=1;//給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20寫一個字節(jié)****************/

voidWriteOneChar(uchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}

/**************讀取ds18b20當前溫度************/

voidReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;

Init_DS18B20();
WriteOneChar(0xCC);//跳過讀序號列號的操作
WriteOneChar(0x44);//啟動溫度轉(zhuǎn)換

delay_18B20(100);//thismessageisweryimportant

Init_DS18B20();
WriteOneChar(0xCC);//跳過讀序號列號的操作
WriteOneChar(0xBE);//讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度

delay_18B20(100);

a=ReadOneChar();//讀取溫度值低8位
b=ReadOneChar();//讀取溫度值高8位
temp1=b<<4;
temp1+=(a&0xf0)>>4;//小數(shù)點前的數(shù)據(jù)
temp2=a&0x0f;//小數(shù)點后的數(shù)據(jù)
temp=temp1;

//temp=((b*256+a)>>4);//當前采集溫度值除16得實際溫度值



//temp1=t/100%10;//溫度值十位
//temp2=t/10%10;//溫度值個位
//temp3=t%10;//溫度值十分位
}

/***************液晶顯示子函數(shù)1正常顯示*****************/

voiddisplayfun1(void)
{
WriteCommandLCM(0x0c,1);//顯示屏打開,光標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);

DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);

DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);

DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);

DisplayOneChar(5,1,temp1/10+0x30);
DisplayOneChar(6,1,temp1%10+0x30);
DisplayOneChar(8,1,temp2/10+0x30);
}

/***************定時器t0初始化*******************/


voidinit_timer0(void)
{
TMOD=0x01;//time0為定時器,方式1
TH0=0x3c;//預置計數(shù)初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}

/***********定時器t0中斷子函數(shù)**************/

voidtimer0(void)interrupt1using0//定時器0方式1,50ms中斷一次
{
TH0=0x3c;
TL0=0xb0;
mstcnt++;
if(mstcnt>=20){seconde++;mstcnt=0;}
if(seconde>=60){minite++;seconde=0;}
if(minite>=60){hour++;minite=0;}
if(hour>=24){hour=0;}
}


/*****************系統(tǒng)報警子函數(shù)***************************/

voidplayalarm(void)//語音提示溫度上升過快
{

if(temp>20&&temp<25)
{
RED_ALARM=0;
PLAYE_ADDR=0x11;
_nop_();
PLAYE_ADDR=0x10;
delay_LCM(2000);//等待放音結(jié)束
RED_ALARM=1;
}

if(temp>25&&temp<30)//語音提示溫度上升過慢
{
GREEN_ALARM=0;
PLAYE_ADDR=0x21;
_nop_();
PLAYE_ADDR=0x20;
delay_LCM(2000);
GREEN_ALARM=1;
}

if(temp>30)//語音提示恒溫控制
{
WRITE_ALARM=0;
PLAYE_ADDR=0x31;
_nop_();
PLAYE_ADDR=0x30;
delay_LCM(1000);
WRITE_ALARM=1;
}
}

/***************themainfuntion****************/

voidmain(void)
{
P1=0xff;//初始化p1口,全設為1
P3=0xff;
delay_LCM(500);
initLCM();//LCD初始化
init_timer0();//時鐘定時器0初始化
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
Init_DS18B20();//DS18B20初始化

while(1)
{
delay_LCM(10);
ReadTemperature();
playalarm();
displayfun1();
delay_LCM(10);
}
}

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉