




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于單片機(jī)的鍵電子琴課程設(shè)計(jì)報(bào)告(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)
基于單片機(jī)的鍵電子琴課程設(shè)計(jì)報(bào)告(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)單片機(jī)原理及系統(tǒng)課程設(shè)計(jì)評語:考勤10分守紀(jì)10分過程30分設(shè)計(jì)報(bào)告30分答辯20分總成績(100)專業(yè):自動(dòng)化班級:姓名:學(xué)號:指導(dǎo)教師:蘭州交通大學(xué)自動(dòng)化與電氣工程學(xué)院2015年12月30日基于單片機(jī)的16鍵電子琴一、電子琴設(shè)計(jì)的目的、要求與設(shè)計(jì)方法1.1設(shè)計(jì)目的現(xiàn)代樂器中,電子琴是高新科技在音樂領(lǐng)域的一個(gè)代表,體現(xiàn)了人類電子技術(shù)和藝術(shù)的完美結(jié)合。電子琴自動(dòng)伴奏的穩(wěn)定性、準(zhǔn)確性,以及鮮明的強(qiáng)弱規(guī)律、隨人設(shè)置的速度要求,都更便于人們由易到難、深入淺出的準(zhǔn)確掌握歌曲節(jié)奏和樂曲風(fēng)格,對其節(jié)奏的穩(wěn)定性和準(zhǔn)確性訓(xùn)練能起到非常大的作用.1.2設(shè)計(jì)要求本設(shè)計(jì)主要是用AT89C52單片機(jī)為核心控制元件,設(shè)計(jì)一個(gè)微縮版的電子琴。單片機(jī)與按鍵構(gòu)成主控制模塊,在主控制模塊上設(shè)置有9個(gè)按鍵,分別達(dá)成不同目標(biāo)。本系統(tǒng)主要為了完成電子琴的三大功能:電子琴彈奏和音樂播放及錄音。1。3電子琴設(shè)計(jì)方法1.3。1設(shè)計(jì)工具表1軟件簡介軟件名稱設(shè)計(jì)作用KeiluVision4編寫程序與編譯PROTEUS繪制硬件電路圖、數(shù)字仿真MicrosoftVisio繪制程序流圖與框圖1。3.2設(shè)計(jì)思路(1)功能按鍵觸發(fā)外部中斷,以完成不同曲目的的切換。(2)設(shè)置定時(shí)器產(chǎn)生不同頻率的方波,I/O口輸出,經(jīng)功放后揚(yáng)聲器發(fā)聲.(3)采用4×4矩陣鍵盤彈奏16個(gè)音(低XI到高DO).電子琴的設(shè)計(jì)方案及原理2.1設(shè)計(jì)總體方案本系統(tǒng)采用AT89C52為主控芯片.輸入電路有16個(gè)琴鍵按鍵,通過按鍵隨意按下所要表達(dá)的音符,作為電平送給主體電路,中央處理器通過識別,解碼輸出音符,在揚(yáng)聲器中發(fā)出有效的聲音。1個(gè)音樂按鍵用于播放音樂和切換歌曲,通過按鍵觸發(fā)中斷,重置定時(shí)器初值,于另一個(gè)揚(yáng)聲器中發(fā)出有效音響.總設(shè)計(jì)框圖如下圖1所示.單單片機(jī)時(shí)鐘復(fù)位電路時(shí)鐘復(fù)位電路數(shù)碼管顯示電路數(shù)碼管顯示電路琴鍵控制電路琴鍵控制電路音頻播放電路音頻播放電路音樂切換電路音樂切換電路圖1基于單片機(jī)的電子琴電路原理框圖2。2發(fā)聲原理利用AT89C52的內(nèi)部定時(shí)器使其工作計(jì)數(shù)器模式(MODE1)下,改變計(jì)數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階,例如,頻率為523Hz,其周期T=1/523=1912μs,因此只要令計(jì)數(shù)器計(jì)時(shí)956μs/1μs=956,每計(jì)數(shù)956次時(shí)將I/O反相,就可得到中音DO(523Hz)。
計(jì)數(shù)脈沖值與頻率的關(guān)系式是:
N=fi÷2÷fr。式中,N是計(jì)數(shù)值;fi是機(jī)器頻率(晶體振蕩器為12MHz時(shí),其頻率為1MHz);fr是想要產(chǎn)生的頻率。
電子琴的硬件設(shè)計(jì)基于單片機(jī)AT89C51的電子琴電路由琴鍵控制電路、數(shù)碼管顯示電路、音頻播放電路、時(shí)鐘—復(fù)位電路、音樂切換電路和電源電路六部分所構(gòu)成.3.1琴鍵控制電路琴鍵控制電路作為人機(jī)聯(lián)系的輸入部分,也是間接控制數(shù)碼顯示和音頻功放的重要組成部分。鍵盤按照連接方式可以分為獨(dú)立式和矩陣式鍵盤兩類.3.1。1矩陣式鍵盤如圖2所示為4X4矩陣式鍵盤電路,由一個(gè)4X4的行、列結(jié)構(gòu)可以構(gòu)成一個(gè)16個(gè)按鍵鍵盤。
矩陣中無按鍵按下時(shí),行線為高電平;當(dāng)有按鍵按下時(shí),行線電平狀態(tài)將由與此行線相連的列線的電平?jīng)Q定。列線的電平如果為低,則行線電平為低;列線的電平如果為高,則行線的電平也為高,這是識別按鍵是否按下的關(guān)鍵所在。圖2矩陣式鍵盤3。1.2獨(dú)立式鍵盤
獨(dú)立式鍵盤的特點(diǎn)是一鍵一線,各鍵相互獨(dú)立,每個(gè)鍵各接一條I/O口線,通過檢測I/O輸入線的電平狀態(tài),可判斷出被按下的按鍵。
3。1。3
方案比較
表2鍵盤類型比較鍵盤類型優(yōu)點(diǎn)缺點(diǎn)獨(dú)立式電路簡單,編程簡單占用I/O口線多矩陣式占用I/O口線較少編程比較復(fù)雜由于此次設(shè)計(jì)的琴鍵控制電路需要16個(gè)按鍵,故單純從I/O口線的占用的角度比較,獨(dú)立式需要占用16條I/O口線,而矩陣式卻只需8條.故選擇矩陣式鍵盤電路比較合理。3。2數(shù)碼管顯示電路LED(Light
Emitting
Diode)發(fā)光二極管縮寫.LED數(shù)碼管是由發(fā)光二極管構(gòu)成的.常見的LED數(shù)碼管為“8”字型的,共計(jì)8段。一般來說分共陽極和共陰極兩種接法.3。2.1LED數(shù)碼管靜態(tài)顯示
靜態(tài)顯示方式即無論多少位LED數(shù)碼管,同時(shí)處于顯示狀態(tài)。如果送往各個(gè)LED數(shù)碼管所顯示字符的段碼一經(jīng)確定,則相應(yīng)I/O口鎖存器鎖存的段碼輸出將維持不變,直到送入另一個(gè)字符的段碼為止。3.2.2LED數(shù)碼管動(dòng)態(tài)顯示
靜態(tài)顯示方式就是無論在任何時(shí)刻只有一個(gè)LED數(shù)碼管處于顯示狀態(tài),即單片機(jī)采用“掃描”方式控制各個(gè)數(shù)碼管輪流顯示。
3.3.3方案比較
對于以上兩種數(shù)碼管驅(qū)動(dòng)電路的的優(yōu)缺點(diǎn)比較如表3所示。由于靜態(tài)驅(qū)動(dòng)方式的顯示無閃爍,亮度較高,編程簡單,加上本次設(shè)計(jì)的數(shù)碼管顯示電路只需要2個(gè)數(shù)碼管,且分別接兩部分管腳,故選擇靜態(tài)驅(qū)動(dòng)方式來顯示數(shù)碼管更為合理.如圖3所示為數(shù)碼管顯示電路,采用靜態(tài)驅(qū)動(dòng)方式和共陽極接法.表3數(shù)碼管顯示方式比較驅(qū)動(dòng)方式優(yōu)點(diǎn)缺點(diǎn)靜態(tài)顯示顯示無閃爍,亮度較高,編程簡單數(shù)碼管越多,所需的電流越大,電源的要求越高動(dòng)態(tài)顯示電路簡單,數(shù)碼管越多,優(yōu)勢越明顯不如靜態(tài)顯示的亮度高,
可能出現(xiàn)閃爍現(xiàn)象圖3數(shù)碼管靜態(tài)顯示電路3。3音樂切換電路通過按鍵拉低電平,觸發(fā)中斷0.3.4音頻播放電路使用兩個(gè)揚(yáng)聲器,一個(gè)作為琴鍵輸出,一個(gè)作為樂曲輸出。3.5時(shí)鐘復(fù)位電路3。5。1時(shí)鐘電路
時(shí)鐘頻率直接影響單片機(jī)的速度,時(shí)鐘電路的質(zhì)量也直接影響單片機(jī)系統(tǒng)的穩(wěn)定性。常用的時(shí)鐘電路有兩種方式,一種是內(nèi)部時(shí)鐘方式,另一種是外部時(shí)鐘方式.
本設(shè)計(jì)采用內(nèi)部時(shí)鐘方式做時(shí)鐘電路.3。5。2復(fù)位電路
在單片機(jī)的實(shí)用系統(tǒng)中,一般有兩種復(fù)位操作形式:上電復(fù)位和手動(dòng)復(fù)位。
上電復(fù)位在單片機(jī)系統(tǒng)每次通電時(shí)執(zhí)行。手動(dòng)復(fù)位在系統(tǒng)出現(xiàn)操作錯(cuò)誤或程序運(yùn)行出錯(cuò)時(shí)使用。
由于本設(shè)計(jì)的需要,同時(shí)采用這兩種復(fù)位方式。整體電路圖如下圖4所示.圖4整體硬件設(shè)計(jì)電子琴的軟件設(shè)計(jì)系統(tǒng)功能的實(shí)現(xiàn)一般包括硬件部分和軟件部分,一旦硬件確定下來,軟件要實(shí)現(xiàn)的功能也隨之確定。而為使編程思路清晰,應(yīng)先繪制程序流程圖.
4。1
系統(tǒng)硬件接口定義
表4系統(tǒng)硬件接口定義引腳名接口說明備注P0.0~P0。7琴鍵數(shù)碼管與單片機(jī)通信數(shù)碼管顯示電路P2.0~P2.7曲目數(shù)碼管與單片機(jī)通信數(shù)碼管顯示電路P3。2(INT0)外部中斷源輸入端音樂切換電路P1.0~P1.7矩陣鍵盤接口琴鍵控制電路P3.0,P3。7控制揚(yáng)聲器音頻播放電路4。2主函數(shù)
主函數(shù)流程圖如圖5所示。利用模塊化的思想,主函數(shù)只執(zhí)行初始化函數(shù)、鍵盤掃碼函數(shù)、音頻處理函數(shù)和數(shù)碼管顯示函數(shù).圖5主函數(shù)流程圖4。3初始化函數(shù)初始化的流程框圖如圖6所示。該函數(shù)對所需的I/O口、外部中斷0、定時(shí)器0、定時(shí)器T1以及數(shù)碼管進(jìn)行初始化配置。TMOD=0x11;//T0方式1,T1方式1IP=0x01;//INT0中斷優(yōu)先級最高EA=1;ET0=1;ET1=1;EX0=1;//允許中斷TR0=0;//關(guān)定時(shí)器0P1=0xbf;//鍵盤初始化flag=0;//標(biāo)志位置0圖6初始化流程圖4.4數(shù)碼管顯示及音頻處理函數(shù)根據(jù)鍵值掃描函數(shù)讀取的鍵碼,揚(yáng)聲器發(fā)聲并結(jié)合數(shù)碼管顯示出來。圖7數(shù)碼管顯示流程圖4.5中斷函數(shù)中斷函數(shù)用到了外部中斷和定時(shí)器中斷.外部中斷的流程框圖如圖8所示,當(dāng)按鍵按下時(shí),外部信號觸發(fā)外部中斷,執(zhí)行鍵值掃描函數(shù),讀取對應(yīng)的鍵值。定時(shí)中斷的流程框圖如圖9所示,定時(shí)器溢出中斷后,進(jìn)行重裝載初值,同時(shí)執(zhí)行相應(yīng)的音頻控制操作。
4.6鍵值掃描函數(shù)將輸入端置為高電平,輸出端置為低電平.這樣,當(dāng)按鍵沒有按下時(shí),所有的輸入端無變化,代表無鍵按下。一旦有鍵按下,則輸入線就受輸出線的影響被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。流程圖如圖10所示.圖8外部鍵盤中斷流程圖圖9定時(shí)器中斷流程圖圖10鍵值掃描流程圖電子琴的系統(tǒng)仿真5.1部分仿真結(jié)果表5仿真結(jié)果按鍵編號發(fā)聲音調(diào)數(shù)碼管顯示備注0低XI0,-1中DO1,—2中RI2,-無播放曲目及停止1,2,或—重復(fù)按切換音樂圖11音樂顯示為“—”或不顯示的時(shí)候,琴鍵按下DO有效圖12按音樂鍵,播放音樂1,琴鍵彈奏無效5。2調(diào)試中出現(xiàn)的問題及解決電子琴的設(shè)計(jì)并非一帆風(fēng)順,在這期間遇到了很多問題,下面談幾個(gè)關(guān)鍵的問題。首先是數(shù)碼管顯示亂碼的問題,原本以為是數(shù)碼管字形碼表的代碼有錯(cuò),檢查幾遍發(fā)現(xiàn)代碼基沒錯(cuò),后來結(jié)合硬件圖一看,才知道硬件圖中數(shù)碼管是共陽極接法,軟件中的數(shù)碼管字形碼表是共陰極的。其二是按鍵引入中斷檢測時(shí)遇到的問題,按音樂鍵后琴鍵無法發(fā)聲和顯示,浪費(fèi)了很多時(shí)間,最終發(fā)現(xiàn)是程序的判斷條件有問題。其三是揚(yáng)聲器發(fā)出的音調(diào)不對,甚至沒有聲音,這個(gè)問題后來還是不能解決,最后放棄了LM386的功放電路,直接接揚(yáng)聲器,但是導(dǎo)致了部分琴鍵發(fā)聲帶雜音??偨Y(jié)在本次設(shè)計(jì)八路多功能搶答器的課設(shè)過程中,我利用AT89C52單片機(jī)及外圍接口實(shí)現(xiàn)電子琴,利用單片機(jī)的定時(shí)器/計(jì)數(shù)器定時(shí)和計(jì)數(shù)的原理實(shí)現(xiàn)對彈奏和播放的功能,利用Proteus和Keil軟件設(shè)計(jì)出實(shí)驗(yàn)電路,完成了課設(shè)的任務(wù)。在本次課設(shè)中,我意識到將理論知識與實(shí)踐相結(jié)合的重要性,對于單片機(jī)這樣的課程,僅僅通過了解課本上的知識是遠(yuǎn)遠(yuǎn)不夠的,我通過查資料和搜集有關(guān)文獻(xiàn),培養(yǎng)了自學(xué)能力,通過利用軟件仿真和焊接電路,在很大程度上提高了我的動(dòng)手能力.我們在課設(shè)的過程中,遇到了很多問題,比如我在仿真的過程中錯(cuò)把共陰極數(shù)碼管字模當(dāng)作共陽極使用,使得數(shù)碼管無法正常顯示,通過查資料我明白了共陰極數(shù)碼管是高電平驅(qū)動(dòng),公共端是負(fù)極,共陽極數(shù)碼管是低電平驅(qū)動(dòng),公共端是正極,類似的問題出現(xiàn)了很多,我們通過一一排查,終于完成了課設(shè)任務(wù),結(jié)果表明,有付出必有收獲,把握重點(diǎn)、攻克難關(guān),活學(xué)活用對于牢固的掌握知識,是非常有用的。在此次課設(shè)中,我學(xué)到了很多,也通過不斷糾正自己的錯(cuò)誤,意識到自身的不足,我對知識的掌握還沒有實(shí)現(xiàn)深層次的理解記憶,我相信這些教訓(xùn)都為我以后的學(xué)習(xí)奠定了良好的基礎(chǔ),時(shí)刻牢記團(tuán)隊(duì)合作、堅(jiān)持與努力的重要性。參考文獻(xiàn)[1]王思明,張金敏,茍軍年.單片機(jī)原理及應(yīng)用系統(tǒng)設(shè)計(jì)[M]。北京:人民郵電出版社,2008.[2]馮育長,鄒小兵.單片機(jī)系統(tǒng)設(shè)計(jì)與實(shí)例指導(dǎo)[M]。西安:西安電子科技大學(xué)出社,2004.[3]彭偉。單片機(jī)C語言程序設(shè)計(jì)實(shí)訓(xùn)100例[M].北京:電子工業(yè)出版社,2009.[4]單丹,馬淑云?;贏T89C51單片機(jī)電子琴的設(shè)計(jì)[J].中國高新技術(shù)企業(yè),2002.附錄#include<reg52.h〉#defineucharunsignedchar#defineuintunsignedint//共陽極數(shù)碼管UcharcodeLED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};sbitbee(cuò)p=P3^0;ucharkey;//鍵號sbitbuzzer=P3^7;uchardis_buf;ucharflag;//音符延時(shí)表uintcodeTone_Delay_Table[]={64524,64580,64684,64777,64820,64896,64966,65030,65058,65110,65157,65178,65217,65252,65283,65316};//音調(diào)與節(jié)拍ucharcodeSong1_Tone[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0xff};ucharcodeTime1_Tone[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};ucharcodeSong2_Tone[]={3,5,5,3,2,1,2,3,5,3,2,3,5,5,3,2,1,2,3,2,1,1,0xff};ucharcodeTime2_Tone[]={2,1,1,2,1,1,1,2,1,1,1,2,1,1,2,1,1,1,2,1,1,1,0xff};ucharcodeSong3_Tone[]={1,1,5,5,6,6,5,4,4,3,3,2,2,1,0xff};ucharcodeTime3_Tone[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};//定義按鍵序號ucharkeyno;//音樂片段索引,音符索引ucharsong_index=0;uchartone_index=0;//音符指針,延時(shí)指針uchar*tone_pointer,*delay_pointer;//從當(dāng)前數(shù)組中取出音符的位置uchari=0;//毫秒延時(shí)voiddelayms(uintms){uchart;while(ms-—)for(t=0;t<120;t++);}//按鍵產(chǎn)生外部中斷voidKey_Press()interrupt0{TR0=0;//切換歌曲song_index=(song_index+1)%3;switch(song_index){case2:tone_pointer=Song1_Tone;delay_pointer=Time1_Tone;break;case1:tone_pointer=Song2_Tone;delay_pointer=Time2_Tone;break;case0:tone_pointer=0;delay_pointer=0;break;}//重新開始i=0;TR0=1;flag=1;}//T0中斷播放voidplay_music()interrupt1{if(song_index!=0){TH0=Tone_Delay_Table[tone_index]/256;TL0=Tone_Delay_Table[tone_index]%256;buzzer=~buzzer;}else{buzzer=0;}}/*voidkey_scan(){uchartemp,k;//高四位置0,放入四行P1=0x0f;delayms(2);//按鍵后00001111變成0000xxxx,x中1個(gè)為0,3個(gè)仍為1//以下亦或操作把3個(gè)1變成0,唯一0變成1temp=P1^0x0f;//判斷按鍵發(fā)生于0-3列的哪一列switch(temp){case1:k=0;break;case2:k=1;break;case4:k=2;break;case8:k=3;break;default:return;}//底四位置0,放入四列P1=0xf0;delayms(2);//按鍵后11110000變成xxxx0000,x為1個(gè)0,三個(gè)仍為1//高四位移動(dòng)至底四位,唯一0變1,其余為0temp=(P1>〉4)^0x0f;//對0~3行分別賦起始值0,4,8,12switch(temp){case1:k+=0;break;case2:k+=4;break;case4:k+=8;break;case8:k+=12;break;default:return;}keyno=k;}*///矩陣鍵盤掃描子程序voidkey_scan(void){uchartemp;P1=0x0F;//低四位輸入delayms(2);//稍稍延時(shí)temp=P1;//讀P1口temp=temp&0x0F;//取低四位temp=~(temp|0xF0);if(temp==1)//檢測按下的鍵所在的列號,在第一列key=0;elseif(temp==2)//在第二列key=1;elseif(temp==4)//在第三列key=2;elseif(temp==8)//在第四列key=3;elsekey=16;//否則顯示-P1=0xF0;//高四位輸入delayms(2);temp=P1;//讀P1口temp=temp&0xF0;temp=~((temp〉>4)|0xF0);if(temp==1)//檢測按下的鍵所在的行號,在第一行key=key+0;elseif(temp==2)//在第二行key=key+4;elseif(temp==4)//在第三行key=key+8;elseif(temp==8)//在第四行key=key+12;elsekey=16;//否則顯示—/*根據(jù)行號和列號得到按下的鍵號*/dis_buf=LED[key];//查表得鍵值}//T1中斷,發(fā)聲DORIMI。。。。voidplay()interrupt3{TH1=Tone_Delay_Table[key]/256;TL1=Tone_Delay_Table[key]%256;beep=~beep;}//主程序voidmain(){TMOD=0x11;//T0方式1,T1方式1IP=0x01;//INT0中斷優(yōu)先級最高EA=1;ET0=1;ET1=1;EX0=1;//允許中斷TR0=0;P1=0xbf;flag=0;while(1){//if(flag==0){P1=0xf0;//發(fā)送掃描碼if(P1!=0xf0)//有鍵按下{if(song_index!=2&&song_index!=1){key_scan();P0=dis_buf;//鍵值賦給P0口,顯示TR1=1;}}else{TR1=0;//停止播放}//}if(flag==1&&song_index!=0){delayms(2);tone_index=tone_pointer[i];if(tone_index==0xff){i=0;delayms(2000);continue;}TR0=1;delayms(delay_pointer[tone_index]*240);TR0=0;i++;switch(song_index){case2:P2=LED[2];break;case1:P2=LED[1];break;case0:P2=0xbf;break;}}}}《單片機(jī)原理與接口技術(shù)》課程設(shè)計(jì)報(bào)告頻率計(jì)目錄TO(shè)C\o”1—3"\h\z\uHYPERLINK\l”_Toc308456722”1功能分析與設(shè)計(jì)目標(biāo)PAGEREF_Toc308456722\h1HYPERLINK #include"display.h” ?? /******************************************************//*??? 主函數(shù) ??? ? ???//*****************************************************/voidmain(){ beer=1;??? ?//關(guān)閉蜂鳴器 led=1; ? ?? //關(guān)閉LED燈?timer1_init(0); ??//初始化定時(shí)器1(未啟動(dòng)定時(shí)器1) get_temperature(1);??//首次啟動(dòng)DS18B20獲取溫度(DS18B20上電后自動(dòng)將EEPROM中的上下限溫度復(fù)制到TH和TL寄存器) while(1)? ?? ?{ ??keyscan();? ?? get_temperature(0);???display(temp,temp_d*0.625);??alarm();? ????}}/*********************************************************************程序名;DS18B20頭文件*編程者:彭明闖*編程時(shí)間:2014/5/30*說明:用到的全局變量是:無符號字符型變量temp(測得的溫度整數(shù)部分),temp_d*(測得的溫度小數(shù)部分),標(biāo)志位f(測量溫度的標(biāo)志位‘0’表示“正溫度"‘1’表*示“負(fù)溫度”),標(biāo)志位f_max(上限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表*示“負(fù)溫度”),標(biāo)志位f_min(下限溫度的標(biāo)志位‘0’表示“正溫度"、‘1'表*示“負(fù)溫度"),標(biāo)志位w(報(bào)警標(biāo)志位‘1’啟動(dòng)報(bào)警‘0’關(guān)閉報(bào)警).??*********************************************************************/#ifndef__ds18b20_h(yuǎn)__(dá) ? ?//定義頭文件#define__(dá)ds18b20_h(yuǎn)__#defineuintunsignedint?? #defineucharunsignedchar???sbitDQ=P2^3;?? ? ?//DS18B20接口sbitbeer=P1^0;?? ?//用beer表示P1。0sbitled=P1^1; ? ?//用led表示P1.1uchartemp=0;? ?//測量溫度的整數(shù)部分uchartemp_d=0; //測量溫度的小數(shù)部分bitf=0; ? ?//測量溫度的標(biāo)志位,0’表示“正溫度”‘1’表示“負(fù)溫度”)bitf_max=0;? ? //上限溫度的標(biāo)志位‘0’表示“正溫度"‘1'表示“負(fù)溫度")bitf_min=0; ? //下限溫度的標(biāo)志位‘0’表示“正溫度”、‘1'表示“負(fù)溫度”)bitw=0; ? ?? //報(bào)警標(biāo)志位‘1’啟動(dòng)報(bào)警‘0’關(guān)閉報(bào)警/******************************************************//* ??? ?? 延時(shí)子函數(shù)?? ? ?? ? ?//*****************************************************/voidds18b20_delayus(uintt)//延時(shí)幾μs{while(t——);}voidds18b20_delayms(uintt)? //延時(shí)1ms左右{ uinti,j; for(i=t;i〉0;i-—)?for(j=120;j>0;j--);}/******************************************************//*? ? ??DS18B20初始化函數(shù)? ? ????//*****************************************************/voidds18b20_init()?? ??{ ucharc=0; DQ=1; DQ=0;? ??? ?//控制器向DS18B20發(fā)低電平脈沖?ds18b20_delayus(80); ?//延時(shí)15-80μs?DQ=1;?? ?? ? ? //控制器拉高總線,?while(DQ);? ?? //等待DS18B20拉低總線,在60—240μs之間?ds18b20_delayus(150); ?//延時(shí),等待上拉電阻拉高總線 DQ=1; ? ?? ?? //拉高數(shù)據(jù)線,準(zhǔn)備數(shù)據(jù)傳輸;}/******************************************************//* ?? ?DS18B20字節(jié)讀函數(shù) ? ??? ?//*****************************************************/uchards18b20_read() ? ?{ uchari;?uchard=0;?DQ=1; ??? ?//準(zhǔn)備讀; for(i=8;i>0;i—-)?{ ?d>>=1;???//低位先發(fā); ?DQ=0; ?? ?? ? _nop_(); _nop_(); ? ?? DQ=1; ? ???//必須寫1,否則讀出來的將是不預(yù)期的數(shù)據(jù); ?if(DQ) ? ??//在12us處讀取數(shù)據(jù);? d|=0x80; ds18b20_delayus(10); ? ?}?returnd;? ?? ?//返回讀取的值}/******************************************************//* ? ? ?DS18B20字節(jié)寫函數(shù) ????//*****************************************************/voidds18b20_write(uchard) ?{uchari;for(i=8;i>0;i-—){ DQ=0;??DQ=d&0x01;? ds18b20_delayus(5);? DQ=1; ?d>>=1;}}/******************************************************//*?? ?????獲取溫度函數(shù)? ???? ??//*****************************************************/voidget_temperat(yī)ure(bitflag) { uchara=0,b=0,c=0,d=0;uinti; ds18b20_init(); ?ds18b20_write(0xcc);? //向DS18B20發(fā)跳過讀ROM命令?ds18b20_write(0x44); ??//寫啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換命令,轉(zhuǎn)換結(jié)果存入內(nèi)部RAM if(flag==1)?{ ??? ??? ?//首次啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換需要500ms,若轉(zhuǎn)換時(shí)間不夠就出錯(cuò),讀出的是85度的錯(cuò)誤值。 display1(1);? //用開機(jī)動(dòng)畫耗時(shí) }?else ds18b20_delayms(1); ???ds18b20_init(); ? ?ds18b20_write(0xcc); ? ds18b20_write(0xbe);??? a=ds18b20_read(); ??? //
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年百色職業(yè)學(xué)院單招職業(yè)適應(yīng)性考試題庫標(biāo)準(zhǔn)卷
- 2025年安徽郵電職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性考試題庫往年題考
- 2025年安徽工業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性考試題庫及完整答案一套
- 2025年人防工程安全生產(chǎn)與質(zhì)量管理合同范本
- 2025年合作方合同廉潔承諾
- 2025年分包地磚鋪設(shè)合同標(biāo)準(zhǔn)文本
- 2025年中外合作經(jīng)營企業(yè)合同范本(汽車零部件)
- 2025年家具訂購與供應(yīng)合同
- 2025年不銹鋼鑄件購銷合同規(guī)范
- 2025年醫(yī)療診斷設(shè)備年維修合同
- 食堂食品安全隱患排查報(bào)告
- 汽車維修廠車輛進(jìn)出廠登記制度
- (2023版)高中化學(xué)新課標(biāo)知識考試題庫大全(含答案)
- 七年級語文下冊《孫權(quán)勸學(xué)》課后習(xí)題參考答案
- 2023年河北省安全生產(chǎn)舉報(bào)和獎(jiǎng)勵(lì)答試題及答案
- 馬鞍山晟捷新能源科技有限公司40萬噸-年N-甲基吡咯烷酮項(xiàng)目環(huán)境影響報(bào)告表
- 工傷保險(xiǎn)待遇申請表
- 食品分析復(fù)習(xí)資料
- ROCHE甲功及腫瘤項(xiàng)目介紹專家講座
- 血液透析病人情況表
- 現(xiàn)代物流管理課后習(xí)題答案黃中鼎主編
評論
0/150
提交評論