基于c51多功能電子密碼鎖設(shè)計(jì)源程序代碼_第1頁(yè)
已閱讀1頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  摘要</b></p><p>  摘要:在日常的生活和工作中, 住宅與部門(mén)的安全防范、單位的文件檔案、財(cái)務(wù)報(bào)表以及一些個(gè)人資料的保存多以加鎖的辦法來(lái)解決。若使用傳統(tǒng)的機(jī)械式鑰匙開(kāi)鎖,人們常需攜帶多把鑰匙, 使用極不方便, 且鑰匙丟失后安全性即大打折扣。隨著科學(xué)技術(shù)的不斷發(fā)展,人們對(duì)日常生活中的安全保險(xiǎn)器件的要求越來(lái)越高。為滿(mǎn)足人們對(duì)鎖的使用要求,增加其安全性,用

2、密碼代替鑰匙的密碼鎖應(yīng)運(yùn)而生。密碼鎖具有安全性高、成本低、功耗低、易操作等優(yōu)點(diǎn)。</p><p>  在安全技術(shù)防范領(lǐng)域,具有防盜報(bào)警功能的電子密碼鎖逐漸代替?zhèn)鹘y(tǒng)的機(jī)械式密碼鎖,克服了機(jī)械式密碼鎖密碼量少、安全性能差的缺點(diǎn),使密碼鎖無(wú)論在技術(shù)上還是在性能上都大大提高一步。隨著大規(guī)模集成電路技術(shù)的發(fā)展,特別是單片機(jī)的問(wèn)世,出現(xiàn)了帶微處理器的智能密碼鎖,它除具有電子密碼鎖的功能外,還引入了智能化管理、專(zhuān)家分析系統(tǒng)等功

3、能,從而使密碼鎖具有很高的安全性、可靠性,應(yīng)用日益廣泛。</p><p>  本次設(shè)計(jì)使用 STC公司的STC89C52實(shí)現(xiàn)一基于單片機(jī)的電子密碼鎖的設(shè)計(jì),其主要具有如下功能: </p><p>  1.密碼通過(guò)鍵盤(pán)輸入,若密碼正確,則將鎖打開(kāi),語(yǔ)音提示開(kāi)鎖,蜂鳴器播放一段開(kāi)鎖音樂(lè)。 </p><p>  2.密碼可由管理員修改設(shè)定,鎖打開(kāi)后才能修改密碼。修改密碼之

4、前必須再次輸入密碼,在輸入新密碼時(shí)需要二次確認(rèn),以防止誤操作。</p><p>  3.報(bào)警、鎖定鍵盤(pán)功能。密碼輸入錯(cuò)誤,LCD液晶顯示器會(huì)出現(xiàn)錯(cuò)誤提示,同時(shí)語(yǔ)音提示錯(cuò)誤信息,蜂鳴器鳴響;若密碼輸入錯(cuò)誤次數(shù)達(dá)到3次,蜂鳴器報(bào)警并且鎖定鍵盤(pán),蜂鳴器播放一段報(bào)警音樂(lè)。 </p><p><b>  主要的設(shè)計(jì)過(guò)程:</b></p><p>  首先

5、,選用STC公司的單片機(jī)STC89C52,以及選用其他電子元器件。</p><p>  第二步,使用Alitm Designer 設(shè)計(jì)硬件電路原理圖,完成人工布線。</p><p>  第三步,使用 Keil C51 軟件編寫(xiě)單片機(jī)的 C 語(yǔ)言程序、仿真、軟件調(diào)試。最后,聯(lián)合軟、硬件調(diào)試電路板,完成本次電子綜合設(shè)計(jì)。 </p><p>  關(guān)鍵詞:4×4

6、矩陣鍵盤(pán);STC89C52;ISD1760;LCD液晶顯示器;密碼二次確認(rèn) </p><p><b>  目錄</b></p><p>  第一部分 總 述4</p><p><b>  一.引言4</b></p><p>  二.課題內(nèi)容及要求4</p><p> 

7、 第二部分 硬件設(shè)計(jì)部分5</p><p><b>  一.設(shè)計(jì)總框圖5</b></p><p>  二.單片機(jī)STC89C52介紹5</p><p><b>  三.輸入鍵盤(pán)6</b></p><p>  四.LCD液晶顯示8</p><p>  五.ISD176

8、0語(yǔ)音提示9</p><p>  六.蜂鳴器發(fā)聲10</p><p>  第三部分 軟件設(shè)計(jì)部分11</p><p>  一.程序流程圖11</p><p>  二.鍵盤(pán)掃描設(shè)計(jì)11</p><p>  三.液晶顯示設(shè)計(jì)13</p><p>  四.語(yǔ)音提示設(shè)計(jì)18</p&g

9、t;<p>  五.蜂鳴器發(fā)聲設(shè)計(jì)9</p><p>  第四部分 調(diào)試報(bào)告20</p><p><b>  一.硬件調(diào)試24</b></p><p><b>  二.軟件調(diào)試24</b></p><p><b>  三.調(diào)試心得24</b></p

10、><p><b>  總結(jié)25</b></p><p><b>  參考資料25</b></p><p><b>  附錄26</b></p><p>  一.元器件清單26</p><p><b>  二.工具27</b>&

11、lt;/p><p>  三.硬件設(shè)計(jì)總圖27</p><p><b>  四.源程序28</b></p><p><b>  第一部分 總 述</b></p><p><b>  一.引言</b></p><p>  科技的發(fā)展是電子產(chǎn)品的應(yīng)用越來(lái)越廣

12、泛,電子電路的設(shè)計(jì)也越來(lái)越重要。隨著人們生活水平的提高,如何實(shí)現(xiàn)家庭防盜這一問(wèn)題也變的尤其的突出,傳統(tǒng)的機(jī)械鎖由于結(jié)構(gòu)簡(jiǎn)單,被撬的事件屢見(jiàn)不鮮,電子鎖由于其保密性高,使用靈活性好,安全系數(shù)高,受到了廣大用戶(hù)的青睞。同時(shí)隨著電子產(chǎn)品向智能化和微型化的不斷發(fā)展,數(shù)字邏輯電路電子芯片已成為電子產(chǎn)品研制和開(kāi)發(fā)的首選控制器。用電子邏輯電路設(shè)計(jì)的密碼鎖經(jīng)實(shí)際操作表明,該密碼鎖具有安全、實(shí)用、成本低等優(yōu)點(diǎn),符合一般鎖的需要,具有一定的現(xiàn)實(shí)意義。<

13、;/p><p>  本系統(tǒng)采用STC公司的單片機(jī)STC89C52作為主控芯片,結(jié)合外圍的矩陣鍵盤(pán)輸入、LCD顯示、報(bào)警系統(tǒng)和開(kāi)鎖等電路,用C語(yǔ)言編寫(xiě)主控芯片的控制程序,設(shè)計(jì)了一款可以多次更改密碼且具有報(bào)警功能的電子密碼鎖。用戶(hù)想要打開(kāi)鎖,必先通過(guò)提供的鍵盤(pán)輸入正確的密碼才能將鎖打開(kāi),且密碼輸入錯(cuò)誤時(shí)有提示,為了提高安全性,當(dāng)密碼連續(xù)輸入錯(cuò)誤三次將報(bào)警。密碼只可以由管理員自己修改、設(shè)定,鎖打開(kāi)后只有管理員才能修改密碼。

14、修改之前必須先輸入管理員登錄密碼,然后再次輸入舊密碼,在輸入新密碼時(shí)需要二次確認(rèn),以防止誤操作。</p><p><b>  二.課題內(nèi)容及要求</b></p><p><b>  1.設(shè)計(jì)內(nèi)容:</b></p><p>  采用LCD液晶顯示,4*4的矩形鍵盤(pán)輸入的基于單片機(jī)的電子密碼鎖,能夠?qū)崿F(xiàn)修改密碼,糾錯(cuò),確認(rèn)的功

15、能。</p><p><b>  2.基本要求:</b></p><p>  硬件布局基本合理,焊接比較美觀,器件運(yùn)用基本合理,用比較簡(jiǎn)單的電路實(shí)現(xiàn)修改密碼、糾錯(cuò)、確認(rèn)等基本功能。</p><p><b>  提高部分:</b></p><p>  電子密碼鎖能夠?qū)崿F(xiàn)管理員登陸、動(dòng)態(tài)顯示登陸密碼、登

16、陸密碼驗(yàn)證,登陸成功與否給出提示、超次鎖定并報(bào)警鳴示、在登陸成功的情況下管理員可以進(jìn)行修改和確認(rèn)密碼,新密碼位數(shù)不夠或太簡(jiǎn)單給出提示,能在修改密碼成功的情況下給出提示。</p><p>  另外,可以用語(yǔ)音發(fā)聲芯片發(fā)出相應(yīng)的提示信息,并用蜂鳴器報(bào)警,播放簡(jiǎn)單的音樂(lè)段。</p><p>  本方案采用一種以STC89C52為核心的單片機(jī)控制方案。利用單片機(jī)靈活的編程設(shè)計(jì)和豐富的I/O端口,及

17、其控制的準(zhǔn)確性,實(shí)現(xiàn)基本的密碼鎖功能,以及一些擴(kuò)展功能。</p><p>  第二部分 硬件設(shè)計(jì)部分</p><p><b>  一.設(shè)計(jì)總框圖</b></p><p><b>  圖一 總體設(shè)計(jì)框圖</b></p><p>  單片機(jī)STC89C52介紹</p><p> 

18、 STC89C52是一種帶8K字節(jié)閃爍可編程可檫除只讀存儲(chǔ)器(FPEROM-Flash Programable and Erasable Read Only Memory )的低電壓,高性能COMOS8的微處理器,俗稱(chēng)單片機(jī)。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。</p><p>  STC89C52具體介紹如下:</p><p&g

19、t; ?、?主電源引腳(2根)</p><p>  VCC(Pin40):電源輸入,接+5V電源</p><p>  GND(Pin20):接地線</p><p> ?、谕饨泳д褚_(2根)</p><p>  XTAL1(Pin19):片內(nèi)振蕩電路的輸入端</p><p>  XTAL2(Pin20):片內(nèi)振蕩電路的

20、輸出端</p><p><b> ?、劭刂埔_(4根)</b></p><p>  RST/VPP(Pin9):復(fù)位引腳,引腳上出現(xiàn)2個(gè)機(jī)器周期的高電平將使單片機(jī)復(fù)位。</p><p>  ALE/PROG(Pin30):地址鎖存允許信號(hào)</p><p>  PSEN(Pin29):外部存儲(chǔ)器讀選通信號(hào)</p>

21、;<p>  EA/VPP(Pin31):程序存儲(chǔ)器的內(nèi)外部選通,接低電平從外部程序存儲(chǔ)器讀指令,如果接高電平則從內(nèi)部程序存儲(chǔ)器讀指令。</p><p> ?、芸删幊梯斎?輸出引腳(32根)</p><p>  STC89C52單片機(jī)有4組8位的可編程I/O口,分別位P0、P1、P2、P3口,每個(gè)口有8位(8根引腳),共32根。</p><p>  P

22、0口(Pin39~Pin32):8位雙向I/O口線,名稱(chēng)為P0.0~P0.7</p><p>  P1口(Pin1~Pin8):8位準(zhǔn)雙向I/O口線,名稱(chēng)為P1.0~P1.7 </p><p>  P2口(Pin21~Pin28):8位準(zhǔn)雙向I/O口線,名稱(chēng)為P2.0~P2.7 </p><p>  P3口(Pin10~Pin17):8位準(zhǔn)雙向I/O口線,名稱(chēng)為P3

23、.0~P3.7</p><p>  STC89C52主要功能如表二所示。</p><p>  表二 STC89C52主要功能</p><p><b>  輸入鍵盤(pán)</b></p><p>  由于本設(shè)計(jì)所用到的按鍵數(shù)量較多而不適合用獨(dú)立按鍵式鍵盤(pán)。采用的是矩陣式按鍵鍵盤(pán),它由行線和列線組成,也稱(chēng)行列式鍵盤(pán),按鍵位于行列

24、的交叉點(diǎn)上,密碼鎖的密碼由鍵盤(pán)輸入完成,與獨(dú)立式按鍵鍵盤(pán)相比,要節(jié)省很多I/O口。本設(shè)計(jì)中使用的這個(gè)4*4鍵盤(pán)不但能完成密碼的輸入還能作特別功能鍵使用,比如清空顯示功能等。鍵盤(pán)的每個(gè)按鍵功能在程序設(shè)計(jì)中設(shè)置。其原理圖如下:</p><p><b>  圖二 矩陣鍵盤(pán)</b></p><p>  每一條水平(行線)與垂直線(列線)的交叉處不相通,而是通過(guò)一個(gè)按鍵來(lái)連通,

25、利用這種行列式矩陣結(jié)構(gòu)只需要N條行線和M條列線,即可組成具有N×M個(gè)按鍵的鍵盤(pán)。</p><p>  在這種行列式矩陣鍵盤(pán)非鍵盤(pán)編碼的單片機(jī)系統(tǒng)中,鍵盤(pán)處理程序首先執(zhí)行等待按鍵并確認(rèn)有無(wú)按鍵按下的程序段。</p><p>  當(dāng)確認(rèn)有按鍵按下后,下一步就要識(shí)別哪一個(gè)按鍵按下。對(duì)鍵的識(shí)別通常有兩種方法:一種是常用的逐行掃描查詢(xún)法;另一種是速度較快的線反轉(zhuǎn)法。</p>

26、<p>  對(duì)照?qǐng)D四所示的4×4鍵盤(pán),說(shuō)明線反轉(zhuǎn)法工作原理:</p><p>  首先辨別鍵盤(pán)中有無(wú)鍵按下,有單片機(jī)I/O口向鍵盤(pán)送全掃描字,然后讀入行線狀態(tài)來(lái)判斷。方法是:向行線輸出全掃描字00H,把全部列線置為低電平,然后將列線的電平狀態(tài)讀入累加器A中。如果有按鍵按下,總會(huì)有一根行線電平被拉至低電平從而使行線不全為1。</p><p>  判斷鍵盤(pán)中哪一個(gè)鍵被按下使

27、通過(guò)將列線逐列置低電平后,檢查行輸入狀態(tài)來(lái)實(shí)現(xiàn)的。方法是:依次給列線送低電平,然后查所有行線狀態(tài),如果全為1,則所按下的鍵不在此列;如果不全為1,則所按下的鍵必在此列,而且是在與零電平行線相交的交點(diǎn)上的那個(gè)鍵。</p><p>  圖三 按鍵操作面板示意圖</p><p> ?。樞蛞詫?shí)際電路為準(zhǔn))</p><p>  10個(gè)數(shù)字鍵用來(lái)輸入密碼,0鍵有切換模式的功

28、能,另外6個(gè)功能鍵分別是:權(quán)限鍵、退出鍵、清零鍵、開(kāi)啟鍵、刪除鍵、確定鍵。其中權(quán)限鍵的功能是設(shè)置密碼修改權(quán)限,只有管理員可以登錄修改密碼。退出鍵的功能是退出當(dāng)前程序。清零鍵鍵的功能是當(dāng)前輸入數(shù)據(jù)清零。開(kāi)啟鍵的功能是退出屏幕保護(hù)界面,開(kāi)啟LCD顯示功能:未按下時(shí)LCD動(dòng)態(tài)顯示屏保圖形,需要開(kāi)鎖時(shí)按下此鍵,LCD上會(huì)顯示“Hello Enter your code”。未輸入密碼時(shí),單獨(dú)按下0鍵具有切換模式功能,密碼輸入后0作為數(shù)字鍵。&l

29、t;/p><p><b>  LCD液晶顯示</b></p><p>  為了提高密碼鎖的密碼顯示效果能力。本設(shè)計(jì)的顯示部分由液晶顯示器LCD1602取代普通的數(shù)碼管來(lái)完成。只有按下鍵盤(pán)上的開(kāi)啟按鍵后,顯示器才處于開(kāi)啟狀態(tài)。同理只有按下退出按鍵后顯示器才處于屏保狀態(tài)。否則顯示器將一直處于開(kāi)啟狀態(tài),當(dāng)需要對(duì)密碼鎖進(jìn)行開(kāi)鎖時(shí),按下鍵盤(pán)上的開(kāi)啟按鍵后利用鍵盤(pán)上的數(shù)字鍵0-9輸入

30、密碼,每按下一個(gè)數(shù)字鍵后在顯示器上顯示一個(gè)*,輸入多少位就顯示多少個(gè)*(設(shè)定為6個(gè))。當(dāng)密碼輸入完成時(shí),按下確認(rèn)鍵,如果輸入的密碼正確的話, LCD上顯示“Successfully Lock Is Opened”,單片機(jī)其中P3.1引角會(huì)輸出低電平,使三極管Q1導(dǎo)通,電磁鐵吸合,電子密碼鎖被打開(kāi),如果密碼不正確,LCD顯示屏?xí)@示“Code Error”,P3.1輸出的是高電平,電子密碼鎖不能被打開(kāi)。若連續(xù)三次密碼輸入錯(cuò)誤,則密碼

31、所被鎖定,LCD上顯示“Please Wait….”。若密碼修改太簡(jiǎn)單,則顯示“Code Is Too Simple”。若輸入的密碼大于原密碼,則LCD上顯示“Large”,若輸入的密碼小于原密碼,LCD上顯示“Small”。通過(guò)LCD顯示屏,可以清楚的判斷出</p><p>  圖四 顯示電路原理圖</p><p>  ISD1760語(yǔ)音提示</p><p>  

32、本設(shè)計(jì)采用ISD760單片60秒高保真語(yǔ)音錄放電路進(jìn)行語(yǔ)音操作,實(shí)時(shí)提示當(dāng)前狀態(tài)。當(dāng)密碼連續(xù)輸入3次錯(cuò)誤之后語(yǔ)音芯片給出語(yǔ)音提示“連續(xù)3次密碼輸入錯(cuò)誤,鍵盤(pán)已鎖定”。語(yǔ)音電路如圖:</p><p>  圖五 語(yǔ)音電路原理圖</p><p><b>  蜂鳴器發(fā)聲</b></p><p>  報(bào)警模塊由蜂鳴器和單片機(jī)組成。選擇一只壓電式蜂鳴器,壓

33、電式蜂鳴器工作時(shí)約需要100mA驅(qū)動(dòng)電流。蜂鳴器電路如圖七所示。當(dāng)89C52的P3.1口輸出為低電平時(shí),蜂鳴器產(chǎn)生蜂鳴音,89C52輸出為高電平時(shí),蜂鳴器不發(fā)聲。</p><p>  圖六 報(bào)警電路原理圖</p><p>  第三部分 軟件設(shè)計(jì)部分</p><p><b>  一.程序流程圖</b></p><p>&l

34、t;b>  圖七 程序流程圖</b></p><p><b>  二.鍵盤(pán)掃描設(shè)計(jì)</b></p><p>  鍵盤(pán)采用查詢(xún)的方式,放在主程序中,當(dāng)沒(méi)有按鍵按下的時(shí)候,單片機(jī)循環(huán)主程序,一旦有按鍵按下,便轉(zhuǎn)向相應(yīng)的子程序處理,處理結(jié)束再返回。</p><p><b>  主要程序如下:</b></p

35、><p>  uchar KeyScan(void) //鍵盤(pán)掃描函數(shù),使用行列逐級(jí)掃描法</p><p><b>  {</b></p><p>  uchar Val;</p><p>  KeyPort=0xf0; //高四位置高,低四位拉低</p>&l

36、t;p>  if(KeyPort!=0xf0) //表示有按鍵按下</p><p><b>  {</b></p><p>  delay(10); //去抖</p><p>  if(KeyPort!=0xf0)</p><p>  {

37、 //表示有按鍵按下</p><p>  KeyPort=0xfe; //檢測(cè)第一行</p><p>  if(KeyPort!=0xfe)</p><p><b>  {</b></p><p>  Val=KeyPort&0xf0;</p><p> 

38、 Val+=0x0e;</p><p>  while(KeyPort!=0xfe);</p><p>  delay(10); //去抖</p><p>  while(KeyPort!=0xfe);</p><p>  return Val;</p><p><b>  }</b>&

39、lt;/p><p>  KeyPort=0xfd; //檢測(cè)第二行</p><p>  if(KeyPort!=0xfd)</p><p><b>  {</b></p><p>  Val=KeyPort&0xf0;</p><p>  Val+=0x0d;</p>

40、;<p>  while(KeyPort!=0xfd);</p><p>  delay(10); //去抖</p><p>  while(KeyPort!=0xfd);</p><p>  return Val;</p><p><b>  }</b></p><p> 

41、 KeyPort=0xfb; //檢測(cè)第三行</p><p>  if(KeyPort!=0xfb)</p><p><b>  {</b></p><p>  Val=KeyPort&0xf0;</p><p>  Val+=0x0b;</p><p>  while(Ke

42、yPort!=0xfb);</p><p>  delay(10); //去抖</p><p>  while(KeyPort!=0xfb);</p><p>  return Val;</p><p><b>  }</b></p><p>  KeyPort=0xf7; //

43、檢測(cè)第四行</p><p>  if(KeyPort!=0xf7)</p><p><b>  {</b></p><p>  Val=KeyPort&0xf0;</p><p>  Val+=0x07;</p><p>  while(KeyPort!=0xf7);</p>

44、<p>  delay(10); //去抖</p><p>  while(KeyPort!=0xf7);</p><p>  return Val;</p><p><b>  }</b></p><p><b>  }</b></p><p><b

45、>  }</b></p><p>  return 0xff;</p><p><b>  }</b></p><p>  /**********************按鍵值處理函數(shù),返回掃鍵值******************/</p><p>  uchar KeyPro(void)</p

46、><p><b>  {</b></p><p>  switch(KeyScan())</p><p><b>  {</b></p><p>  case 0xee:return 1;break;//1按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值</p><p>  case 0xde:re

47、turn 2;break;//2</p><p>  case 0xbe:return 3;break;//3</p><p>  case 0xed:return 4;break;//4</p><p>  case 0xdd:return 5;break;//5</p><p>  case 0xbd:return 6;break;//6

48、</p><p>  case 0xeb:return 7;break;//7</p><p>  case 0xdb:return 8;break;//8</p><p>  case 0xbb:return 9;break;//9</p><p>  case 0xe7:return 10;break;//刪除</p>&l

49、t;p>  case 0xd7:return 0;break;//0模式</p><p>  case 0xb7:return 11;break;//確定</p><p>  case 0x7e:return 13;break;//開(kāi)啟</p><p>  case 0x7d:return 14;break;//清零</p><p> 

50、 case 0x7b:return 15;break;//退出</p><p>  case 0x77:return 16;break;//權(quán)限</p><p>  default:return 12;break;</p><p><b>  }</b></p><p><b>  }</b><

51、;/p><p><b>  三.液晶顯示設(shè)計(jì)</b></p><p>  由于是顯示數(shù)據(jù),所以就要用到如下幾個(gè)顯示子程序,分別是:開(kāi)鎖狀態(tài)顯示子程序、密碼輸入及修改狀態(tài)顯示子程序、密碼輸入錯(cuò)誤后的提示子程序。密碼在規(guī)定的時(shí)間內(nèi)輸入錯(cuò)誤次數(shù)超過(guò)3次后的鎖定狀態(tài)顯示子程序,輸入密碼錯(cuò)誤的情況下清除密碼子程序等。</p><p><b>  動(dòng)

52、態(tài)顯示主要程序:</b></p><p>  void delay_gd(int ms)</p><p>  { // 延時(shí)子程序</p><p><b>  int i;</b></p><p>  while(ms--)</p><p

53、><b>  {</b></p><p>  for(i = 0; i< 250; i++)</p><p><b>  {</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b>&l

54、t;/p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }<

55、;/b></p><p>  bit lcd_bz()</p><p>  { // 測(cè)試LCD忙碌狀態(tài)</p><p>  bit result;</p><p><b>  rs = 0;</b></p><p>  lcdrw = 1;

56、</p><p>  lcden = 1;</p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_

57、();</b></p><p>  result = (bit)(P0 & 0x80);</p><p>  lcden = 0;</p><p>  return result; </p><p><b>  }</b></p><p>  void lcd_wcmd(uch

58、ar cmd)</p><p>  { // 寫(xiě)入指令數(shù)據(jù)到LCD</p><p>  while(lcd_bz());</p><p><b>  rs = 0;</b></p><p>  lcdrw = 0;</p><p>  lcden

59、= 0;</p><p><b>  _nop_();</b></p><p><b>  _nop_(); </b></p><p><b>  P0 = cmd;</b></p><p><b>  _nop_();</b></p>&l

60、t;p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p>  lcden = 1;</p><p><b>  _nop_();</b>&

61、lt;/p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p>  lcden = 0; </p><p><b>  }<

62、;/b></p><p>  void lcd_pos(uchar pos)</p><p>  { //設(shè)定顯示位置</p><p>  lcd_wcmd(pos | 0x80);</p><p><b>  }</b></p><p> 

63、 void lcd_wdat(uchar dat) </p><p>  { //寫(xiě)入字符顯示數(shù)據(jù)到LCD</p><p>  while(lcd_bz());</p><p><b>  rs = 1;</b></p><p>  lcdrw = 0;</p>

64、;<p>  lcden = 0;</p><p><b>  P0 = dat;</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</

65、b></p><p><b>  _nop_();</b></p><p>  lcden = 1;</p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  

66、_nop_();</b></p><p><b>  _nop_();</b></p><p>  lcden = 0; </p><p><b>  }</b></p><p>  void lcd_init()</p><p>  {

67、 //LCD初始化設(shè)定</p><p>  lcd_wcmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)</p><p>  delay_gd(1);</p><p>  lcd_wcmd(0x0c); //顯示開(kāi),關(guān)光標(biāo)</p><p>  delay_gd(1);<

68、;/p><p>  lcd_wcmd(0x06); //移動(dòng)光標(biāo)</p><p>  delay_gd(1);</p><p>  lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容</p><p>  // delay_gd(1);</p><p><b>  }&l

69、t;/b></p><p>  void lcd_gundong(uchar *dis1)</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  lcd_init(); // 初始化LCD</p>

70、;<p>  display2(date);</p><p>  delay_gd(10);</p><p>  lcd_wcmd(0x06); //向右移動(dòng)光標(biāo)</p><p>  lcd_pos(0); //設(shè)置顯示位置為第一行的第1個(gè)字符</p><p><b>

71、;  i = 0;</b></p><p>  while(dis1[ i ] != '\0')</p><p>  { //顯示字符"CQ University"</p><p>  lcd_wdat(dis1[ i ]);</p><p>

72、<b>  i++;</b></p><p>  temp=KeyPro();</p><p>  if(temp==13) break;</p><p>  delay_gd(30); //控制兩字之間顯示速度</p><p><b>  }</b></p>

73、;<p>  delay_gd(200); //控制停留時(shí)間</p><p>  lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容</p><p>  display2(date);</p><p><b>  }</b></p><p><

74、b>  靜態(tài)顯示主要程序:</b></p><p>  void write_com(uchar com)</p><p><b>  {</b></p><p><b>  P0=com;</b></p><p><b>  rs=0;</b></p&

75、gt;<p><b>  lcden=0;</b></p><p><b>  delay(5);</b></p><p><b>  lcden=1;</b></p><p><b>  delay(5);</b></p><p><

76、b>  lcden=0;</b></p><p><b>  }</b></p><p>  void write_date(uchar date)</p><p><b>  {</b></p><p><b>  P0=date;</b></p&g

77、t;<p><b>  rs=1;</b></p><p><b>  lcden=0;</b></p><p><b>  delay(5);</b></p><p><b>  lcden=1;</b></p><p><b>

78、  delay(5);</b></p><p><b>  lcden=0;</b></p><p><b>  }</b></p><p>  void init()</p><p><b>  {</b></p><p><b&g

79、t;  lcden=0;</b></p><p>  write_com(0x38);</p><p>  delay(10);</p><p>  write_com(0x0c);</p><p>  delay(10);</p><p>  write_com(0x06);</p><

80、;p>  delay(10);</p><p>  write_com(0x01);</p><p>  delay(10);</p><p><b>  }</b></p><p>  /************************定時(shí)中斷***********************/</p>

81、<p>  void intrupt()</p><p>  {TMOD=0X10;</p><p>  TH1=(65536-50000)/256;</p><p>  TL1=(65536-50000)%256;</p><p><b>  EA=1;</b></p><p>

82、<b>  ET1=1;</b></p><p><b>  TR1=1;</b></p><p><b>  }</b></p><p>  void w_cht(uchar dat)</p><p><b>  {</b></p><

83、;p>  uchar dat1,dat2;</p><p>  dat1=dat/10;</p><p>  dat2=dat%10;</p><p>  write_com(0x80+0x40+0x06);</p><p>  write_date(0x30+dat1);</p><p>  write_dat

84、e(0x30+dat2);</p><p><b>  }</b></p><p>  void T_rupt() interrupt 3</p><p><b>  {</b></p><p>  TH1=(65536-50000)/256;</p><p>  TL1=(

85、65536-50000)%256;</p><p><b>  t0++;</b></p><p>  if(t0==20)</p><p><b>  {</b></p><p><b>  t0=0;</b></p><p><b>  m

86、iao--;</b></p><p>  if(miao>0)</p><p>  w_cht(miao);</p><p><b>  else</b></p><p><b>  TR1=0;</b></p><p><b>  }</b

87、></p><p><b>  }</b></p><p>  /**********************顯示部分************************/</p><p>  void display1(uchar *tab)</p><p><b>  {</b></p&

88、gt;<p><b>  uchar i;</b></p><p>  write_com(0x80);</p><p>  for(i=0;i<16;i++)</p><p>  {write_date(*tab);</p><p><b>  tab++;</b></p

89、><p><b>  }</b></p><p><b>  }</b></p><p>  void display2(uchar *tab)</p><p><b>  {</b></p><p><b>  uchar i;</b>

90、;</p><p>  write_com(0x80+0x40);</p><p>  for(i=0;i<16;i++)</p><p>  {write_date(*tab);</p><p><b>  tab++;</b></p><p><b>  }</b>

91、</p><p><b>  }</b></p><p><b>  四.語(yǔ)音提示設(shè)計(jì)</b></p><p>  使用獨(dú)立按鍵模式,將需要播放的錄音錄入ISD1760芯片內(nèi)部,再使用SPI程序控制方式將ISD1760芯片內(nèi)部的指定地址的錄音播放出來(lái)。</p><p>  void Play(uch

92、ar num) //形參=1放1段,2放2段,3放3段,4放4段。16個(gè)地址是2秒。</p><p><b>  {</b></p><p>  if(num==0x01){StartAdr=0x001e;EndAdr=0x0028;}</p><p>  else if(num==0x02){StartAdr=0x0029;End

93、Adr=0x0033;}</p><p>  else if(num==0x03){StartAdr=0x0034;EndAdr=0x003c;}</p><p>  else if(num==0x04){StartAdr=0x003d;EndAdr=0x0045;}</p><p>  else if(num==0x05){StartAdr=0x0046;EndA

94、dr=0x004f;}</p><p>  else if(num==0x06){StartAdr=0x0050;EndAdr=0x005b;}</p><p>  else if(num==0x07){StartAdr=0x005f;EndAdr=0x006b;}</p><p>  else if(num==0x08){StartAdr=0x006c;EndAd

95、r=0x0079;}</p><p>  else if(num==0x09){StartAdr=0x007a;EndAdr=0x0087;}</p><p>  else if(num==0x0a){StartAdr=0x0088;EndAdr=0x0095;}</p><p>  else if(num==0x0b){StartAdr=0x0097;EndAdr

96、=0x00a2;}</p><p>  else if(num==0x0c){StartAdr=0x00a3;EndAdr=0x00b1;}</p><p>  else if(num==0x0d){StartAdr=0x00b2;EndAdr=0x00c0;}</p><p>  else if(num==0x0e){StartAdr=0x00c5;EndAdr=

97、0x00d6;}</p><p>  else if(num==0x0f){StartAdr=0x00d7;EndAdr=0x00e4;}</p><p>  else if(num==0x10){StartAdr=0x00e7;EndAdr=0x00f6;}</p><p>  else if(num==0x11){StartAdr=0x00f7;EndAdr=0

98、x0107;}</p><p>  else if(num==0x12){StartAdr=0x0108;EndAdr=0x0120;}</p><p>  else if(num==0x13){StartAdr=0x0123;EndAdr=0x0140;}</p><p>  ISD_SendData(0x03);//RESET 復(fù)位</p><

99、;p>  ISD_SendData(0x00);// </p><p><b>  SS=1; </b></p><p>  delay_ms(50);</p><p>  ISD_SendData(0x01);//PU 上電</p><p>  ISD_SendData(0x00); </p>&

100、lt;p><b>  SS=1; </b></p><p>  delay_ms(50);</p><p>  ISD_SendData(0x65);//WR_APC1 </p><p>  ISD_SendData(0xa8);//RD_REC_PTR 錄音寄存器 </p><p>  ISD_SendDat

101、a(0x0C);</p><p><b>  SS=1; </b></p><p>  delay_ms(50);</p><p><b>  statu=0;</b></p><p>  while((statu&0x01)==0x00)</p><p><b

102、>  {</b></p><p>  ISD_SendData(0x05);//RD_STATUS 狀態(tài)寄存器</p><p>  ISD_SendData(0x00); </p><p>  statu=ISD_SendData(0x00);</p><p><b>  SS=1; </b></

103、p><p><b>  }</b></p><p>  delay_ms(50);</p><p>  ISD_SendData(0x80);//SETPLAY 從起始地址開(kāi)始播放到結(jié)束地址</p><p>  ISD_SendData(0x00); </p><p>  ISD_SendData(S

104、tartAdr&0x00ff); </p><p>  ISD_SendData(StartAdr>>8); </p><p>  ISD_SendData(EndAdr&0x00ff);</p><p>  ISD_SendData(EndAdr>>8); </p><p>  ISD_SendDa

105、ta(0x00); </p><p><b>  SS=1;</b></p><p>  ISD_SendData(0x05);//RD_STATUS 狀態(tài)寄存器</p><p>  ISD_SendData(0x00); </p><p>  statu=ISD_SendData(0x00);</p>&

106、lt;p><b>  SS=1; </b></p><p>  while((statu&0x04)==0x04)</p><p><b>  {</b></p><p>  ISD_SendData(0x05);//RD_STATUS 狀態(tài)寄存器</p><p>  ISD_Send

107、Data(0x00); </p><p>  statu=ISD_SendData(0x00);</p><p><b>  SS=1; </b></p><p><b>  } </b></p><p>  ISD_SendData(0x07);//PD 掉電</p><

108、p>  ISD_SendData(0x00); </p><p><b>  SS=1; </b></p><p><b>  }</b></p><p>  //******************功 能: 發(fā)送數(shù)據(jù) 返回接收數(shù)據(jù) </p><p>  uchar ISD_Send

109、Data(uchar BUF_ISD)</p><p><b>  { </b></p><p>  uchar i,dat=BUF_ISD; </p><p><b>  SCLK=1; </b></p><p><b>  SS=0; </b></p><

110、;p>  for(i=0;i<8;i++)</p><p><b>  { </b></p><p><b>  SCLK=0; </b></p><p>  I_delay(); </p><p>  if(dat&0x01)</p><p><b

111、>  { </b></p><p><b>  MOSI=1; </b></p><p><b>  } </b></p><p><b>  else</b></p><p><b>  { </b></p><p&

112、gt;<b>  MOSI=0; </b></p><p><b>  } </b></p><p><b>  dat>>=1; </b></p><p><b>  if(MISO)</b></p><p><b>  { <

113、;/b></p><p>  dat|=0x80; </p><p><b>  } </b></p><p><b>  SCLK=1; </b></p><p>  I_delay(); </p><p><b>  } </b></p&

114、gt;<p><b>  MOSI=0; </b></p><p>  return(dat); </p><p><b>  } </b></p><p><b>  五.蜂鳴器發(fā)聲設(shè)計(jì)</b></p><p><b>  蜂鳴器的工作原理</b

115、></p><p>  蜂鳴器發(fā)聲原理是電流通過(guò)電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)來(lái)驅(qū)動(dòng)振動(dòng)膜發(fā)聲的,因此需要一定的電流才能驅(qū)動(dòng)它,單片機(jī) IO 引腳輸出的電流較小,單片機(jī)輸出的 TTL 電平基本上驅(qū)動(dòng)不了蜂鳴器,因此需要增加一個(gè)電流放大的電路,一多半采取一個(gè)三極管來(lái)放大驅(qū)動(dòng)蜂鳴器。蜂鳴器的正極接到 Q1 的集電極 C 極上面,蜂鳴器的負(fù)極地,三極管發(fā)射極 E 極接電源 VCC,基極 B 經(jīng)過(guò)限流電阻 R33 后

116、由單片機(jī)的P3.1引腳控制,當(dāng)P3.1輸出高電平時(shí),三極管 T1 截止,沒(méi)有電流流過(guò)線圈,蜂鳴器不發(fā)聲;當(dāng)P3.1輸出低電平時(shí),三極管導(dǎo)通,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過(guò)程序控制P3.1腳的電平來(lái)使蜂鳴器發(fā)出聲音和關(guān)閉聲音。程序中改變單片機(jī)P3.1引腳輸出波形的頻率,就可以調(diào)整控制蜂鳴器音調(diào),產(chǎn)生各種不同音色音調(diào)的聲音,另外改變P3.1輸出電平的高低電平占空比則可以控制蜂鳴器的聲音大小。</p>&

117、lt;p>  蜂鳴器簡(jiǎn)單發(fā)聲程序:</p><p>  void beep_( uint frq,uint time)</p><p><b>  {</b></p><p>  uint tt1,tt2;</p><p>  for(tt1=time;tt1>0;tt1--)</p><

118、p>  { beep=0;</p><p>  for(tt2=frq;tt2>0;tt2--); </p><p><b>  beep=1;</b></p><p>  for(tt2=frq;tt2>0;tt2--);</p><p><b>  }<

119、/b></p><p><b>  }</b></p><p><b>  蜂鳴器播放歌曲</b></p><p>  首先,蜂鳴器按其結(jié)構(gòu)可分為兩種蜂鳴器:壓電式、電磁式。有源蜂鳴器內(nèi)部帶振蕩源,無(wú)源蜂鳴器內(nèi)部不帶振蕩源。這里所說(shuō)的“源”不是指“電源”,而是指“振蕩源”。 有源蜂鳴器直接接上額定電源就可連續(xù)發(fā)聲;而

120、無(wú)源的需要在其供電端上加上高低不斷變化的電信號(hào)才可以驅(qū)動(dòng)發(fā)出聲音。對(duì)于無(wú)源的我們可以先讓 BUZZ=1 接著延時(shí)一小段時(shí)間,在又關(guān)閉 BUZZ(即 BUZZ=0);這樣才能聽(tīng)到連續(xù)變化的聲音。</p><p>  蜂鳴器播放歌曲程序:</p><p>  unsigned char timer0h, timer0l, time;</p><p>  //------

121、--------------------------------</p><p>  //單片機(jī)晶振采用12MHz</p><p>  //頻率-半周期數(shù)據(jù)表 高八位 本軟件共保存了四個(gè)八度的28個(gè)頻率數(shù)據(jù)</p><p>  code unsigned char FREQH[] = {</p><p>  0xF2, 0xF3, 0

122、xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567</p><p>  0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i</p><p>  0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567</p&

123、gt;<p>  0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567</p><p>  //頻率-半周期數(shù)據(jù)表 低八位</p><p>  code unsigned char FREQL[] = {</p><p>  0x42, 0xC1, 0x17, 0xB6, 0xD0,

124、0xD1, 0xB6, //低音1234567</p><p>  0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F,//1,2,3,4,5,6,7,i</p><p>  0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567</p><p>  0

125、x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567</p><p>  //--------------------------------------</p><p>  //世上只有媽媽好 數(shù)據(jù)表 要想演奏不同的樂(lè)曲, 只需要修改這個(gè)數(shù)據(jù)表</p><p>  code

126、unsigned char sszymmh5[] = {</p><p>  6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, 6, 2, 4, </p><p>  3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1, 6, 1, 1

127、, 5, 2, 1, 3, 2, 1, 2, 2, 4, </p><p>  2, 2, 3, 3, 2, 1, 5, 2, 2, 5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4,</p><p>  5, 2, 3, 3, 2, 1, 2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5,

128、1, 6, </p><p>  0, 0, 0}; </p><p>  //--------------------------------------</p><p>  //可惜不是你 數(shù)據(jù)表</p><p>  code unsigned char sszymmh1[] = {</p><p>  6,

129、2,1, 5,3,1, 3,3,1, 1,3,1, 2,3,1, 2,3,4,</p><p>  5,2,1, 5,3,1, 3,3,1, 5,2,1, 1,3,1, 1,3,4,</p><p>  6,2,1, 5,3,1, 3,3,1, 1,3,1, 7,2,2, 7,2,1, 1,3,1, 2,3,1,</p><p>  4,3,3, 3,3,1, 3,

130、3,1, 3,3,4,</p><p>  0, 0, 0}; </p><p>  //--------------------------------------</p><p>  //北京歡迎你 數(shù)據(jù)表</p><p>  code unsigned char sszymmh2[] = {</p><p&g

131、t;  3,2,2, 5,2,2, 1,3,1, 5,2,1, 6,2,2, </p><p>  6,2,1, 5,2,1, 3,2,1, 3,2,1, 5,2,1, 5,2,4, </p><p>  3,2,1, 5,2,1, 6,2,1, 1,3,1, 2,3,1, 1,3,1, 5,2,1, 3,2,1, 2,2,1, 5,2,1, 3,2,1, 3,2,1, 3,2,2,<

132、;/p><p>  0, 0, 0}; </p><p>  //--------------------------------------</p><p>  //送別 數(shù)據(jù)表</p><p>  code unsigned char sszymmh3[] = {</p><p>  5,2,2, 3,2,1,

133、 5,2,1, 1,3,4, </p><p>  6,2,2, 1,3,1, 6,2,1, 5,2,4,</p><p>  5,2,2, 1,2,1, 2,2,1, 3,2,2,</p><p>  2,2,1, 1,2,1, 2,2,4,</p><p><b>  0,0,0}; </b></p>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論