課程設(shè)計(jì)---紅外遙控電子密碼鎖的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
已閱讀1頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  摘要:</b></p><p>  本設(shè)計(jì)是以STC89C52為主要芯片,以中斷、計(jì)數(shù)等基本工作方式來控制、判斷外部器件的工作、工作狀態(tài),結(jié)合采用數(shù)字信號編碼的基本算法,用紅外遙控器遙控發(fā)送密碼、再用紅外接收管接收密碼,單片機(jī)根據(jù)紅外接收管導(dǎo)通與否和持續(xù)時間結(jié)合二次調(diào)制方式的基本算法還原遙控器發(fā)送的密碼,再與外部儲存器AT24C02儲存的密碼對比,判斷密碼是否正

2、確,輔助以LCD12864顯示用戶的操作結(jié)果,以蜂鳴器提醒,再通過矩陣鍵盤實(shí)現(xiàn)輸入或修改密碼等基本功能實(shí)現(xiàn)紅外電子密碼鎖的設(shè)計(jì)。該設(shè)計(jì)運(yùn)用了c語言編寫程序,簡單、明了,很好的實(shí)現(xiàn)了紅外通信的要求。在以往設(shè)計(jì)的基礎(chǔ)上,該設(shè)計(jì)添加了在線燒寫程序,極大的方便了用戶使用,特別是為工業(yè)生產(chǎn)帶來了極大的便利。紅外電子密碼鎖具有成本較低、操作方便、體積小、無污染、反應(yīng)速度快等優(yōu)勢,具有很好的市場價值。</p><p><

3、b>  關(guān)鍵詞:</b></p><p>  編碼、解碼、密碼、紅外</p><p><b>  目錄</b></p><p>  1總體設(shè)計(jì)思路1</p><p>  1.1題目要求1</p><p>  1.2本設(shè)計(jì)主要硬件功能部分1</p><

4、;p>  1.3本設(shè)計(jì)軟件的總體構(gòu)思1</p><p>  2系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)3</p><p>  2.1AT24C02模塊3</p><p>  2.1.1器件及原理介紹3</p><p>  2.1.2電路實(shí)現(xiàn)4</p><p>  2.2紅外通信模塊4</p>&

5、lt;p>  2.2.1遙控發(fā)射器及其編碼4</p><p>  2.2.2電路實(shí)現(xiàn)6</p><p>  2.3矩陣鍵盤模塊7</p><p>  2.4顯示模塊7</p><p>  2.4.1LCD12864介紹7</p><p>  2.4.2LCD12864電路圖:8</p

6、><p>  2.5蜂鳴器模塊8</p><p>  2.6單片機(jī)最小系統(tǒng)模塊9</p><p>  2.6.1單片機(jī)最小系統(tǒng)電路圖:9</p><p><b>  3軟件設(shè)計(jì)10</b></p><p>  3.1程序流程圖10</p><p>  3.1

7、.1主程序流程圖10</p><p>  3.1.2鍵值判斷流程圖11</p><p>  3.1.3開鎖流程圖12</p><p>  3.1.4密碼修改流程圖13</p><p>  3.1.5紅外接收流程圖14</p><p>  3.1.6按鍵掃瞄流程圖15</p><

8、;p>  3.2程序設(shè)計(jì)(見附錄二)15</p><p><b>  4總結(jié):16</b></p><p>  5參考文獻(xiàn):17</p><p><b>  6附錄一18</b></p><p>  6.1整體電路結(jié)構(gòu):18</p><p>  6.

9、2PCB圖:18</p><p><b>  7附錄二19</b></p><p>  7.1AT24C02模塊19</p><p>  7.2紅外通信模塊22</p><p>  7.3矩陣鍵盤模塊24</p><p>  7.4LCD12864顯示26</p>

10、;<p>  7.5主程序29</p><p><b>  總體設(shè)計(jì)思路</b></p><p><b>  題目要求</b></p><p>  紅外遙控電子密碼鎖由紅外遙控發(fā)射板、紅外接收終端、帶控制的電子鎖構(gòu)成。當(dāng)紅外接收終端收到遙控板送來的開鎖密碼信號,并與保存在終端中的密碼對比。當(dāng)對比成功后終端

11、向電子鎖發(fā)出開鎖命令,完成開鎖功能。</p><p>  此題目的重點(diǎn)、難點(diǎn)是實(shí)現(xiàn)紅外信號的接收、密碼儲存和正確識別按鍵并顯示操作結(jié)果。由于紅外遙控不影響周邊環(huán)境、不干擾其他電器設(shè)備,其無法穿透墻壁,因此,不同房間的家用電器可使用通用的遙控器而不會產(chǎn)生相互干擾;電路調(diào)試簡單,只要按給定電路連接無誤,一般不需任何調(diào)試即可投入工作;編解碼容易,可進(jìn)行多路遙控。而且紅外電子密碼所體積較小、操作方便等優(yōu)勢,具有很好的市場

12、前景。</p><p>  本設(shè)計(jì)主要硬件功能部分</p><p>  本系統(tǒng)主要由六大部分組成:</p><p>  單片機(jī)最小系統(tǒng)模塊;</p><p>  LCD顯示電路模塊;</p><p><b>  陣列鍵盤模塊;</b></p><p><b>  

13、紅外接收模塊;</b></p><p>  AT24C02模塊;</p><p><b>  蜂鳴器模塊;</b></p><p>  本設(shè)計(jì)軟件的總體構(gòu)思</p><p>  本設(shè)計(jì)是以STC89C52為核心控制器件。本設(shè)計(jì)是通過STC89C52與AT24C02之間交換密碼后,再與用戶通過鍵盤或紅外遙控器發(fā)

14、送過來的密碼作對比,再用LCD12864顯示操作結(jié)果,用蜂鳴器提示電子鎖是否打開,從而實(shí)現(xiàn)紅外遙控電子密碼鎖的設(shè)計(jì),如下圖。 </p><p>  系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  AT24C02模塊</b></p><p><b>  器件及原理介紹</b></p><p>  A

15、T24C02串行E2PROM具有I2C總線接口功能,功耗低,寬電源電壓(根據(jù)不同型號2.5~6.0V),工作電流約為3mA,靜態(tài)電流隨電源電壓不同為30μA~110μA。</p><p><b>  圖表 2</b></p><p>  I2C通信原理:I2C總線進(jìn)行數(shù)據(jù)傳送時,時鐘信號為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時鐘線上的信號為低電平期間,數(shù)據(jù)線

16、上的高電平或低電平狀態(tài)才允許變化,如圖A。SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號;SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號,如圖4。</p><p><b>  圖表 3</b></p><p><b>  圖表 4</b></p><p><b>  電路實(shí)現(xiàn)&

17、lt;/b></p><p>  A0 、A1 、A2作為地址線,因在此只有一個器件,故全都接GND。SDA作串行數(shù)據(jù)讀寫端接P1.2口,SCL作為時鐘信號接P1.1口。</p><p>  圖表 5 AT24C02硬件結(jié)構(gòu)</p><p><b>  紅外通信模塊</b></p><p>  遙控發(fā)射器及其編碼

18、</p><p>  遙控發(fā)射器專用芯片很多,根據(jù)編碼格式可以分成兩大類,這里我們以運(yùn)用比較廣泛,解碼比較容易的一類來加以說明,現(xiàn)以日本NEC的uPD6121G 組成發(fā)射電路為例說明編碼原理, 我們使用的超薄型紅外線遙控器使用的就是6121 編碼。當(dāng)發(fā)射器按鍵按下后,即有遙控碼發(fā)出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征: 采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.12

19、5ms 的組合表示二進(jìn)制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms 的組合表示二進(jìn)制的“1”, </p><p>  其波形如圖7 所示。 </p><p><b>  圖表 7</b></p><p>  上述“0”和“1”組成的32 位二進(jìn)制碼經(jīng)38kHz 的載頻進(jìn)行二次調(diào)制以提高發(fā)射效率,達(dá)到降低電源功耗的目

20、的。然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射。</p><p>  UPD6121G 產(chǎn)生的遙控編碼是連續(xù)的32 位二進(jìn)制碼組,其中前16 位為用戶識別碼,能區(qū)別不同的電器設(shè)備,防止不同機(jī)種遙控碼互相干擾,如我們可以同時使用電視機(jī)、機(jī)頂盒、功放等遙控器,但它們不會產(chǎn)生誤觸發(fā)。該芯片的用戶識別碼固定為十六進(jìn)制01H;后16位為8 位操作碼(功能碼)及其反碼。UPD6121G 最多額128 種不同組合的編碼。 &

21、lt;/p><p>  遙控器在按鍵按下后,周期性地發(fā)出同一種32 位二進(jìn)制碼,周期約為108ms。一組碼本身的持續(xù)時間隨它包含的二進(jìn)制“0”和“1”的個數(shù)不同而不同,大約在45~63ms 之間, </p><p>  圖表 8 發(fā)射波形圖</p><p>  當(dāng)一個鍵按下超過36ms,振蕩器使芯片激活,將發(fā)射一組108ms

22、 的編碼脈沖,這108ms發(fā)射代碼由一個起始碼(9ms),一個結(jié)果碼(4.5ms),低8 位地址碼(9ms~18ms),高8 位地址碼(9ms~18ms),8 位數(shù)據(jù)碼(9ms~18ms)和這8 位數(shù)據(jù)的反碼(9ms~18ms)組成。如果鍵按下超過108ms 仍未松開,接下來發(fā)射的代碼(連發(fā)代碼)將僅由起始碼(9ms)和結(jié)束碼(2.5ms)組成。 </p><p>  代碼格式(以接收代碼為準(zhǔn),接收代碼與發(fā)

23、射代碼反向) </p><p><b>  位定義 </b></p><p><b>  圖表 9</b></p><p><b>  單發(fā)代碼格式 </b></p><p><b>  圖表 10</b></p><p><

24、b>  連發(fā)代碼格式 </b></p><p><b>  圖表 11</b></p><p><b>  電路實(shí)現(xiàn)</b></p><p>  一體化的紅外接收裝置將遙控信號的接收、放大、檢波、整形集于一身,并且輸出可以讓單片機(jī)識別的TTL 信號,這樣大大簡化了接收電路的復(fù)雜程度和電路的設(shè)計(jì)工作,方便使

25、用。在本系統(tǒng)中我們采用紅外一體化接收頭HS0038,外觀圖如圖所示。</p><p><b>  圖表 12</b></p><p>  HS0038 黑色環(huán)氧樹脂封裝,不受日光、熒光燈等光源干擾,內(nèi)附磁屏蔽,功耗低,靈敏度高。在用小功率發(fā)射管發(fā)射信號情況下,其接收距離可達(dá)35m。它能與TTL、COMS 電路兼容。HS0038 為直立側(cè)面收光型。它接收紅外信號頻率為3

26、8 kHz,周期約26 μs,同時能對信號進(jìn)行放大、檢波、整形,得到TTL 電平的編碼信號。三個管腳分別是地、+5 V 電源、解調(diào)信號輸出端。利用外部中0斷進(jìn)行數(shù)據(jù)的接收。</p><p>  圖表 13 HS0038硬件結(jié)構(gòu)</p><p><b>  矩陣鍵盤模塊</b></p><p>  將12個按鍵分為4排3列排列好,如圖:矩陣鍵盤硬

27、件結(jié)構(gòu)。當(dāng)有一個鍵按下時,通過某一邊引腳賦低電平,掃描全部引腳看是否與最初的賦值一樣,不一樣則根據(jù)相應(yīng)的算法(通過改變后的值與初始值相或,根據(jù)結(jié)果賦值)確定是哪個鍵按下。</p><p>  圖表 14 矩陣鍵盤硬件結(jié)構(gòu)</p><p><b>  顯示模塊</b></p><p>  LCD12864介紹</p><p&g

28、t;  LCD12864分為帶字庫和不帶字庫兩種,帶字庫的在顯示文本時更方便,不帶字庫的在顯示圖像時更有優(yōu)勢。本系統(tǒng)采用帶字庫的LCD12864,采用標(biāo)準(zhǔn)的20腳接口,各引腳接口說明如表所示:</p><p>  編號符號引腳說明編號符號引腳說明</p><p>  1VSS電源地11D4數(shù)據(jù)</p><p>  2VDD電源正

29、極12D5數(shù)據(jù)</p><p>  3V0對比度亮度調(diào)整13D6數(shù)據(jù)</p><p>  4RS數(shù)據(jù)/命令選擇14D7數(shù)據(jù)</p><p>  5R/W讀/寫選擇15PSB串行通信選擇端</p><p>  6E使能信號16NC空腳</p><

30、;p>  7D0數(shù)據(jù)17RET復(fù)位</p><p>  8D1數(shù)據(jù)18VOUTLCD驅(qū)動負(fù)電壓</p><p>  9D2數(shù)據(jù)19LED+背光電源正極</p><p>  10D3數(shù)據(jù)20LED-背光電源地</p><p>  LCD12864電路圖:<

31、;/p><p>  圖表 15 LCD12864硬件結(jié)構(gòu)</p><p><b>  蜂鳴器模塊</b></p><p>  蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時器等電子產(chǎn)品中作發(fā)聲器件。蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。蜂鳴器在電路中用

32、字母“H”或“HA”(舊標(biāo)準(zhǔn)用“FM”、“LB”、“JD”等)表示。</p><p>  有源蜂鳴器直接接上額定電源(新的蜂鳴器在標(biāo)簽上都有注明)就可連續(xù)發(fā)聲;而無源蜂鳴器則和電磁揚(yáng)聲器一樣,需要接在音頻輸出電路中才能發(fā)聲。本系統(tǒng)采用無源蜂鳴器,控制更簡單。</p><p><b>  蜂鳴器硬件如下圖:</b></p><p><b&g

33、t;  圖表 16</b></p><p><b>  單片機(jī)最小系統(tǒng)模塊</b></p><p>  單片機(jī)最小系統(tǒng)電路圖:</p><p>  圖表 17 最小系統(tǒng)</p><p><b>  軟件設(shè)計(jì)</b></p><p><b>  程序流程圖

34、</b></p><p><b>  主程序流程圖</b></p><p><b>  鍵值判斷流程圖</b></p><p>  圖表 19 鍵值判斷流程圖</p><p><b>  開鎖流程圖</b></p><p>  圖表 20 開

35、鎖程序流程圖</p><p><b>  密碼修改流程圖</b></p><p>  圖表 21 密碼修改流程圖</p><p><b>  紅外接收流程圖</b></p><p>  圖表 22 紅外接收流程圖</p><p><b>  按鍵掃瞄流程圖</

36、b></p><p>  圖表 23 按鍵掃描流程圖</p><p>  程序設(shè)計(jì)(見附錄二)</p><p><b>  總結(jié):</b></p><p>  本設(shè)計(jì)不但很好的滿足了題目的要求,即終端能夠接收紅外遙控發(fā)射板發(fā)射的紅外信號(密碼)并能與已存密碼作對比,而且能夠在液晶上顯示操作結(jié)果,還增加了取消這一功能

37、,從而完成了紅外遙控電子密碼鎖的要求。但一開始并不是這么順利,最先將程序下載到機(jī)子里面,鍵盤不能工作,后經(jīng)查發(fā)現(xiàn)鍵盤程序沒有運(yùn)行。改過來后又發(fā)現(xiàn)多了一個鍵,沒有用處,經(jīng)討論將多的鍵設(shè)為取消鍵。原來設(shè)計(jì)的電源是直接用USB從電腦上引出來,后來在此解讀題目時發(fā)現(xiàn)不能滿足題目要求,所以添加了一個用7805穩(wěn)壓的小模塊。美中不足的是此設(shè)計(jì)紅外遙控的距離并不太理想(一米多一點(diǎn)),而且取消功能并不是想象的能夠取消前面自己不想要的內(nèi)容,而是返回主菜單

38、。但這些不足并不能抵消此設(shè)計(jì)帶來的好處。</p><p><b>  參考文獻(xiàn):</b></p><p>  侯 璐 《黑龍江大學(xué)學(xué)生學(xué)術(shù)科技創(chuàng)新項(xiàng)目申請書》</p><p>  甄盈盈 《紅外遙控密碼鎖的設(shè)計(jì)與實(shí)現(xiàn)》</p><p>  《撰寫電子設(shè)計(jì)競賽報告參考格式》</p>&l

39、t;p>  《第7章 電子設(shè)計(jì)競賽設(shè)計(jì)總結(jié)報告寫作》</p><p>  在此感謝以上作者、作品。但由于部分原因沒有完全列舉出作者姓名或作品完整,望諒解。</p><p><b>  附錄一</b></p><p><b>  整體電路結(jié)構(gòu):</b></p><p>  圖表 24 總電路圖&

40、lt;/p><p><b>  PCB圖:</b></p><p>  圖表 25 pcb電路圖</p><p><b>  附錄二</b></p><p><b>  AT24C02模塊</b></p><p>  #include "comm

41、on.h"</p><p>  sbitWP = P1^0;</p><p>  sbitSCL = P1^1;</p><p>  sbitSDA= P1^2;</p><p>  void Delay_US(void)</p><p><b>  {</b></p>

42、;<p><b>  ;;</b></p><p><b>  }</b></p><p>  void Delay_10MS(void)</p><p><b>  {</b></p><p>  uchar i = 0;</p><p>

43、;  uchar j = 0;</p><p>  for(i = 50;i>0;i--)</p><p><b>  {</b></p><p>  for(j=200;j>0;j--);</p><p><b>  }</b></p><p><b>

44、;  }</b></p><p>  void AT24C08_unprotect()</p><p><b>  {</b></p><p><b>  WP = 0;</b></p><p><b>  }</b></p><p>  v

45、oidAT24C02_Start(void)//開始總線</p><p><b>  {</b></p><p><b>  SDA = 1;</b></p><p><b>  SCL = 1;</b></p><p>  Delay_US();</p>

46、<p><b>  SDA = 0;</b></p><p>  Delay_US();</p><p><b>  }</b></p><p>  void AT24C02_Stop(void)//停止總線</p><p><b>  {</b></p&

47、gt;<p><b>  SDA = 0;</b></p><p><b>  SCL = 1;</b></p><p>  Delay_US();</p><p><b>  SDA = 1;</b></p><p>  Delay_US();</p&

48、gt;<p><b>  }</b></p><p>  void AT24C02_Ack(void)//ACK信號</p><p><b>  {</b></p><p>  uchar i = 0;//等待從機(jī)回應(yīng)</p><p><b>  SCL = 1;&

49、lt;/b></p><p>  Delay_US();</p><p>  while((SDA ==1) && (i<200))//等 侍ACK信號</p><p><b>  {</b></p><p><b>  i ++;</b></p><

50、p><b>  }</b></p><p><b>  SCL = 0;</b></p><p>  Delay_US();</p><p><b>  }</b></p><p>  void AT24C02_NOAck(void)//NO ACK</p>

51、;<p><b>  {</b></p><p>  SCL = 1;//主機(jī)發(fā)送給從機(jī)</p><p>  Delay_US();</p><p><b>  SDA = 1;</b></p><p><b>  SCL = 0;</b></p>

52、;<p>  Delay_US();</p><p><b>  }</b></p><p>  void AT24C02_Write_Byte(uchar Value)// 寫8位數(shù)據(jù)到總線</p><p><b>  {</b></p><p>  uchar i = 0;<

53、/p><p>  for(i =0; i<8; i++)</p><p><b>  {</b></p><p><b>  SCL = 0;</b></p><p>  SDA = Value & 0x80;// 1000 0000 </p><p>  Dela

54、y_US();</p><p><b>  SCL = 1;</b></p><p>  Delay_US();</p><p>  Value <<= 1;</p><p><b>  }</b></p><p><b>  SCL = 0;</

55、b></p><p>  Delay_US();</p><p><b>  SDA = 1;</b></p><p><b>  }</b></p><p>  uchar AT24C02_Read_Byte(void)//讀8位數(shù)據(jù)</p><p><b>

56、;  {</b></p><p>  uchar Value = 0;</p><p>  uchar i = 0;</p><p>  SCL = 0;//低電平數(shù)據(jù)可以變化</p><p>  Delay_US();</p><p>  for(i = 0; i <8;i++)</p

57、><p><b>  {</b></p><p>  SCL = 1;//高電平狀態(tài)讀數(shù)據(jù)</p><p>  Delay_US();</p><p><b>  if(SDA)</b></p><p><b>  {</b></p>&l

58、t;p>  Value |= 0x80>>i;//先讀高位數(shù)據(jù)</p><p><b>  }</b></p><p><b>  SCL = 0;</b></p><p>  Delay_US();</p><p><b>  }</b></p>

59、<p>  return Value;</p><p><b>  }</b></p><p>  void AT24C02_Write(uchar Address,uchar Value)</p><p><b>  {</b></p><p>  AT24C02_Start();

60、//起始條件</p><p>  AT24C02_Write_Byte(0xA0);//器件地址1010 0000//寫</p><p>  AT24C02_Ack();//等從機(jī)應(yīng)答</p><p>  AT24C02_Write_Byte(Address);// 1024 字節(jié),其中一個字節(jié)操作25</p><p> 

61、 AT24C02_Ack();</p><p>  AT24C02_Write_Byte(Value);// 0x15</p><p>  AT24C02_Ack();//</p><p>  AT24C02_Stop();</p><p>  Delay_10MS();</p><p><b>

62、  }</b></p><p>  uchar AT24C02_Read(uchar Address)</p><p><b>  {</b></p><p>  uchar Value = 0;</p><p>  AT24C02_Start();//開始總線</p><p>

63、;  AT24C02_Write_Byte(0xA0);// 1010 0000</p><p>  AT24C02_Ack();</p><p>  AT24C02_Write_Byte(Address);//讀數(shù)據(jù)的地址; //25</p><p>  AT24C02_Ack();</p><p>  AT24C02_Start()

64、;//再次開始</p><p>  AT24C02_Write_Byte(0xA1);// 1010 0001</p><p>  AT24C02_Ack();</p><p>  Value = AT24C02_Read_Byte();</p><p>  AT24C02_NOAck();//主機(jī)發(fā)送給從機(jī)無應(yīng)答<

65、/p><p>  AT24C02_Stop();</p><p>  return Value;</p><p><b>  }</b></p><p><b>  紅外通信模塊</b></p><p>  sbit beer=P0^4;</p><p>

66、  sbit RED_DATA=P3^2; //紅外接口</p><p>  //uchar RED_ADD=0;//紅外遙控的地址</p><p>  uchar RED_add=255; //紅外遙控的地址緩存區(qū)</p><p>  uchar RED_key=255; //紅外搖控的鍵值,無鍵按下時為255</p><p>

67、;<b>  //紅外初始化</b></p><p>  void Init_Red(void)</p><p><b>  {</b></p><p>  RED_DATA=1;//P3^2輸出高電平</p><p>  EX0=1;//開啟紅外中斷 P3^2</p>&l

68、t;p><b>  }</b></p><p><b>  //檢測脈沖寬度</b></p><p>  uchar Red_check(void)</p><p><b>  {</b></p><p>  uchar t=0;uchar a=0;</p>

69、<p>  while(RED_DATA)</p><p><b>  {</b></p><p><b>  t++;</b></p><p>  for(a=0;a<4;a++);//</p><p>  if(t==250)</p><p>  ret

70、urn t;//超時溢出</p><p><b>  }</b></p><p><b>  return t;</b></p><p><b>  } </b></p><p>  void exter0() interrupt 0</p><p

71、><b>  { </b></p><p>  uchar res=0; uchar aa=0; </p><p>  bit OK=0; </p><p>  bit RODATA=0; </p><p><b>  while(1)</b></p><

72、;p><b>  { </b></p><p>  if(RED_DATA)//有高脈沖出現(xiàn)</p><p><b>  {</b></p><p>  res=Red_check();//獲得此次高脈沖寬度 </p><p>  if(res==250)</p&

73、gt;<p><b>  {</b></p><p>  break;//非有用信號</p><p><b>  }</b></p><p>  if(res>=200&&res<250)</p><p><b>  {</b><

74、;/p><p>  OK=1; //獲得前導(dǎo)位(4.5ms) </p><p><b>  }</b></p><p>  else if(res>=70&&res<100) //如果是寬脈沖,則RODATA=1</p><p><b>  {</b></p>

75、<p><b>  aa++;</b></p><p>  RODATA=1;// 1.69ms</p><p><b>  }</b></p><p>  else if(res>=10&&res<50) //如果是窄脈沖,則RODATA=0 </p>

76、<p><b>  {</b></p><p><b>  aa++;</b></p><p>  RODATA=0;//500us </p><p><b>  }</b></p><p>  //前1-8位是遙控器地址碼,9-16位是地

77、址反碼,17-24是鍵值碼,25-32是是鍵值反碼</p><p><b>  //獲取正碼</b></p><p>  if(OK&&(aa>=0)&&(aa<8))</p><p><b>  {</b></p><p>  RED_add<&

78、lt;=1;</p><p>  RED_add=RED_add+(uchar)RODATA;</p><p><b>  }</b></p><p>  if(OK&&(aa>=17)&&(aa<25))</p><p><b>  {</b><

79、/p><p>  RED_key<<=1;</p><p>  RED_key=RED_key+(uchar)RODATA;</p><p><b>  } </b></p><p>  if(aa==32&&RED_add==0) </p><p><b>  

80、{</b></p><p>  KEY_main=Red_change(RED_key);break;</p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><

81、p><b>  } </b></p><p>  //把紅外數(shù)據(jù)進(jìn)行轉(zhuǎn)換</p><p>  uchar Red_change(uchar rednum)</p><p><b>  {</b></p><p>  switch(rednum)</p><p><

82、;b>  {</b></p><p>  case 16 :return 0;</p><p>  case 48:return 1;</p><p>  case 176:return 2;</p><p>  case 112:return 3;</p><p>  case 8:return

83、4;</p><p>  case 136:return 5;</p><p>  case 72:return 6;</p><p>  case 40:return 7;</p><p>  case 168:return 8;</p><p>  case 104:return 9;</p><

84、;p>  case 0:return 10;//電源開關(guān)</p><p>  case 32:return 11;//EQ</p><p>  case 144 :return 12;//快退</p><p>  case 80:return 13;//快進(jìn)</p><p>  case 160:return 14;//聲音減 <

85、/p><p>  case 96:return 15;//聲音加 </p><p>  case 128:return 16;//CH - </p><p>  case 64:return 17;//CH + </p><p>  default: return 255;</p><p><b>  }<

86、/b></p><p><b>  } </b></p><p><b>  矩陣鍵盤模塊</b></p><p>  #include "common.h"</p><p>  #define KEY P2</p><p>  void Key

87、(void)</p><p><b>  {</b></p><p>  uchar i = 0;</p><p>  uchar j = 0;</p><p>  uchar k = 0;</p><p>  KEY= 0x0F;</p><p><b>  i

88、 = KEY;</b></p><p>  if(i != 0x0F)</p><p><b>  {</b></p><p><b>  uint l=0;</b></p><p>  Delay(1000);</p><p>  KEY= 0x0F;<

89、/p><p><b>  i = KEY;</b></p><p>  if(i != 0x0F)</p><p><b>  {</b></p><p>  KEY = 0x0F;</p><p><b>  i = KEY;</b></p>

90、<p>  KEY = 0xF0;</p><p><b>  j = KEY;</b></p><p>  k = i | j;</p><p>  KEY_change(k);</p><p><b>  }</b></p><p>  while(KEY !

91、=0xf0 && l<2000)</p><p><b>  {</b></p><p>  KEY = 0xf0;</p><p><b>  l++;</b></p><p><b>  }</b></p><p><b&

92、gt;  }</b></p><p><b>  }</b></p><p>  void KEY_change(uchar i)</p><p><b>  {</b></p><p><b>  switch(i)</b></p><p>

93、;<b>  {</b></p><p>  case 0xED:{KEY_main= 1;break;}</p><p>  case 0xDD:{KEY_main= 2;break;}</p><p>  case 0xBD:{KEY_main= 3;break;}</p><p>  case 0xEB:{KEY_

94、main= 4;break;}</p><p>  case 0xDB:{KEY_main= 5;break;}</p><p>  case 0xBB:{KEY_main= 6;break;}</p><p>  case 0xE7:{KEY_main= 7;break;}</p><p>  case 0xD7:{KEY_main= 8;

95、break;}</p><p>  case 0xB7:{KEY_main= 9;break;}</p><p>  case 0xEE:{KEY_main= 10;break;}</p><p>  case 0xDE:{KEY_main= 0;break;}</p><p>  case 0xBE:{KEY_main= 11;break;

96、}</p><p>  default: break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Delay(unsigned int i)</p><p><b>  {</b><

97、;/p><p>  while(-- i);</p><p><b>  }</b></p><p>  void INIT_TIME_0()</p><p><b>  {</b></p><p>  TMOD = 0X00;</p><p>  TH0

98、 = 0X0E;</p><p><b>  TL0 = 0;</b></p><p><b>  ET0 =1;</b></p><p><b>  TR0 = 1;</b></p><p><b>  }</b></p><p>

99、;  void KEY_TIME_0() interrupt 1 using 0</p><p><b>  {</b></p><p>  TH0 = 0X0E;</p><p><b>  TL0 = 0;</b></p><p><b>  Key();</b><

100、/p><p><b>  }</b></p><p>  LCD12864顯示</p><p>  #include "common.h"</p><p>  sbit CS = P0^3;</p><p>  sbit SID = P0^2;</p><p&g

101、t;  sbit CLK = P0^1;</p><p>  sbit RESET = P0^0;</p><p>  #define lcdcom_w 0xf8</p><p>  #define lcdcom_r 0xfc</p><p>  #define lcddata_w 0xfa</p><p>  #de

102、fine lcddata_r 0xfd</p><p><b>  //漢字地址表</b></p><p>  uchar code addr_tab[]={ //便于根據(jù)漢字坐標(biāo)求出地址</p><p>  0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行漢字位置</p>&l

103、t;p>  0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行漢字位置</p><p>  0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行漢字位置</p><p>  0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行漢字位置</p><p&

104、gt;<b>  };</b></p><p>  //***************************************************** </p><p>  // 函 數(shù) 名:void Delay_LCD(void)</p><p>  // 功 能:5ms延時</p><p>  //

105、****************************************************/</p><p>  void Delayms(uint t) //約延時ms</p><p>  {uint i;while(t--){for(i=0;i<125;i++);}}</p><p>  void LCD_SendByte(uchar

106、 Dbyte)</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p><b>  CLK = 0;</b

107、></p><p>  Dbyte=Dbyte<<1;</p><p><b>  SID = CY;</b></p><p><b>  CLK = 1;</b></p><p><b>  CLK = 0;</b></p><p>

108、<b>  }</b></p><p><b>  }</b></p><p>  /**********************************************************</p><p><b>  接收一個字節(jié)</b></p><p>  **

109、*********************************************************/</p><p>  uchar LCD_ReceiveByte()</p><p><b>  {</b></p><p>  unsigned char i,temp1,temp2;</p><p> 

110、 temp1=temp2=0;</p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  temp1=temp1<<1;</p><p><b>  CLK = 0;</b></p><p>  CLK

111、 = 1; </p><p><b>  CLK = 0;</b></p><p>  if(SID) temp1++;</p><p><b>  }</b></p><p>  for(i=0;i<8;i++)</p><p><

112、b>  {</b></p><p>  temp2=temp2<<1;</p><p><b>  CLK= 0;</b></p><p><b>  CLK= 1;</b></p><p><b>  CLK= 0;</b></p>

113、<p>  if(SID) temp2++;</p><p><b>  }</b></p><p>  return ((0xf0&temp1)+(0x0f&temp2));</p><p><b>  }</b></p><p>  /****************

114、************************************************</p><p><b>  檢查忙狀態(tài)</b></p><p>  ******************************************************************/</p><p>  void LCD_Rea

115、d_busy()</p><p><b>  {</b></p><p><b>  do </b></p><p><b>  {</b></p><p>  LCD_SendByte(lcdcom_r); //11111,RW(1),RS(0),0</p>

116、;<p><b>  }</b></p><p>  while(0x80&LCD_ReceiveByte());</p><p><b>  } </b></p><p>  void LCD_Write(uchar k, uchar value) // k = 0 寫命令,k = 1 寫數(shù)據(jù)&

117、lt;/p><p><b>  {</b></p><p>  uchar com[2] = {lcdcom_w,lcddata_w};</p><p><b>  CS = 1;</b></p><p>  LCD_Read_busy();</p><p>  LCD_Send

118、Byte(com[k]);</p><p>  LCD_SendByte(0xf0 & value);</p><p>  value = value << 4;</p><p>  LCD_SendByte(0xf0 & value);</p><p><b>  CS = 0;</b>&l

119、t;/p><p><b>  }</b></p><p>  void INIT_LCD()</p><p><b>  {</b></p><p>  Delayms(30);</p><p>  LCD_Write(0, 0x30);Delayms(1);</p>

120、<p>  LCD_Write(0, 0x0c);Delayms(1);</p><p>  LCD_Write(0, 0x01);Delayms(1);</p><p>  LCD_Write(0, 0x06);Delayms(1);</p><p>  LCD_Write(0, 0x80);Delayms(1);</p><p&

121、gt;<b>  }</b></p><p>  void LCD_Clear()</p><p><b>  {</b></p><p>  LCD_Write(0, 0x01);</p><p><b>  }</b></p><p>  void

122、LCD_Write_x_y(uchar x, uchar y)</p><p><b>  {</b></p><p>  LCD_Write(0, addr_tab[8*y + x]);</p><p><b>  }</b></p><p>  void LCD_Write_str(uchar

123、x, uchar y, uchar *value)</p><p><b>  {</b></p><p>  LCD_Write(0, addr_tab[8*y + x]);</p><p>  while(*value > 0)</p><p><b>  {</b></p>

124、<p>  LCD_Write(1, *value);</p><p><b>  value++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void LCD_Write_Num(uchar x,

125、uchar y, uchar Value)</p><p><b>  {</b></p><p>  LCD_Write(0, addr_tab[8*y + x]); </p><p>  LCD_Write(1, Value);</p><p><b>  }</b></p>&l

126、t;p>  void LCD_Write_Hanzi(uchar x, uchar y, uchar *Value)</p><p><b>  {</b></p><p>  LCD_Write(0, addr_tab[8*y + x]);</p><p>  while(*Value > 0)</p><p&

127、gt;<b>  {</b></p><p>  LCD_Write(1, *Value);</p><p><b>  Value++;</b></p><p><b>  }</b></p><p><b>  }</b></p><

128、;p><b>  主程序</b></p><p>  #include "common.h"</p><p>  sbit beer = P0^4;</p><p>  uchar KEY_main = 255;</p><p>  uchar minma[8] ={0};</p>

129、<p>  uchar anma[8] ={0};</p><p>  bit OPEN = 0;</p><p>  void main_key();</p><p>  uchar MIMA_shuru();</p><p>  void MIMA_change();</p><p>  void MI

130、MA_zhuanhuan(uchar *minma, uchar *anma);</p><p>  uchar MIMA_bidui(uchar *minma, uchar *anma);</p><p>  void MIMA_save();</p><p>  void show_menu();</p><p>  void show_

131、huanyingjiemian();</p><p>  void SYS_init();</p><p>  void INTERRUPT_ON();</p><p>  void INTERRUPT_OFF();</p><p>  void main()</p><p><b>  {</b>

132、;</p><p>  SYS_init();</p><p>  show_menu();</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  main_key();</p><p>&l

133、t;b>  }</b></p><p><b>  }</b></p><p>  void main_key()</p><p><b>  {</b></p><p>  if(KEY_main != 255)</p><p><b>  {&

134、lt;/b></p><p>  if(OPEN == 0)</p><p><b>  {</b></p><p>  switch(KEY_main)</p><p><b>  {</b></p><p>  case 1://開鎖</p><

135、p><b>  {</b></p><p>  KEY_main=255;</p><p>  INTERRUPT_OFF();</p><p>  LCD_Clear();</p><p>  LCD_Write_Hanzi(0, 0, "請輸入密碼: ");//顯示開鎖界面</p>

136、;<p>  INTERRUPT_ON();</p><p>  if(MIMA_shuru())</p><p><b>  {</b></p><p>  if(MIMA_bidui(minma, anma))//轉(zhuǎn)換為暗碼與存儲器中的進(jìn)行對比</p><p><b>  {</b>

137、;</p><p>  INTERRUPT_OFF();</p><p>  LCD_Clear();</p><p><b>  OPEN = 1;</b></p><p>  LCD_Write_Hanzi(0, 0, "鎖已打開!");//執(zhí)行開鎖動作</p><p> 

138、 Delayms(800);</p><p>  INTERRUPT_ON();</p><p>  show_huanyingjiemian();</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {

139、</b></p><p>  INTERRUPT_OFF();</p><p>  LCD_Clear();</p><p>  LCD_Write_Hanzi(0, 0, "輸入錯誤!");//提示輸入錯誤</p><p>  Delayms(800);</p><p>  INTER

140、RUPT_ON();</p><p>  show_menu();</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  else <

141、/b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  case 2://修改密碼</p><p><b>  {</b></p><p>  KEY_main=255;</p&g

142、t;<p>  INTERRUPT_OFF();</p><p>  LCD_Clear();</p><p>  LCD_Write_Hanzi(0, 0, "請輸入舊密碼:");//顯示修改密碼界面</p><p>  INTERRUPT_ON();</p><p>  if(MIMA_shuru())&

溫馨提示

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

評論

0/150

提交評論