版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)紅外遙控密碼鎖課程設(shè)計(jì)2
- 電子密碼鎖課程設(shè)計(jì)
- 電子密碼鎖課程設(shè)計(jì)
- 電子密碼鎖課程設(shè)計(jì)
- 課程設(shè)計(jì)--電子密碼鎖
- 紅外遙控電子密碼鎖設(shè)計(jì)—硬件設(shè)計(jì)【開題報告】
- 電子密碼鎖課程設(shè)計(jì)
- 電子密碼鎖課程設(shè)計(jì)
- 單片機(jī)電子系統(tǒng)課程設(shè)計(jì)—紅外遙控密碼鎖
- 電子密碼鎖設(shè)計(jì)課程設(shè)計(jì)
- 課程設(shè)計(jì)----電子密碼鎖設(shè)計(jì)
- 紅外遙控電子密碼鎖設(shè)計(jì)—硬件設(shè)計(jì)【文獻(xiàn)綜述】
- 電子密碼鎖課程設(shè)計(jì)
- 紅外遙控電子密碼鎖設(shè)計(jì)—硬件設(shè)計(jì)【畢業(yè)設(shè)計(jì)】
- 電子密碼鎖設(shè)計(jì)課程設(shè)計(jì)
- 課程設(shè)計(jì)電子密碼鎖設(shè)計(jì)
- 課程設(shè)計(jì)-電子密碼鎖設(shè)計(jì)
- 紅外遙控智能電子密碼鎖(硬件)
- 紅外遙控密碼鎖畢業(yè)設(shè)計(jì)
- 基于單片機(jī)的紅外遙控密碼鎖設(shè)計(jì)-紅外遙控密碼鎖畢業(yè)論文
評論
0/150
提交評論