




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、遙控密碼鎖遙控密碼鎖 -基于基于 51 單片機單片機 附帶程序 目錄目錄 1目的和意義目的和意義 .2 2方案設計方案設計 .2 3 硬件原理分析及設計硬件原理分析及設計 .2 3.1 發射模塊原理.2 3.1.1 紅外發送系統原理.3 3.1.2 nec編碼格式介紹.3 3.2 接收解碼模塊.4 3.2.1 接收解碼原理.4 3.2.2 接收解碼模塊的硬件電路.5 3.4 液晶顯示模塊.6 4 軟件設計軟件設計 .7 4.1 編程語言.7 4.2 主要程序說明及流程圖.7 4.2.1 主程序.7 4.2.2 接收解碼程序.8 4.2.3 按鍵數字分配.11 4.2.4 密碼判斷、報警及修改程
2、序.12 4.2.5 按鍵發聲程序.19 4.2.6 沒操作響應.19 5 功能分析及總結功能分析及總結 .20 5.1 功能分析.20 5.2 c 語言編程的延時技巧.21 5.3 本設計優缺點.23 5.4 設計總結.23 參參 考考 文文 獻獻 .1 附錄附錄 c 實物圖實物圖.3 摘要 單片機遙控系統是將紅外遙控技術和單片機應用技術相結合的一種方案。本系統為 紅外遙控電子密碼鎖的控制管理部分,只要再連接上不同用途的電磁鎖即可成為一個完 整的紅外遙控電子密碼鎖系統應用到各種領域中。而且本系統還設計有學習 nec 紅外編 碼遙控器的功能,通過紅外接收解碼電路,把遙控器的鍵碼還原并儲存起來,
3、再利用查 找對比的方法便能夠識別不同的遙控器,大大提高了系統的靈活性和實用性。 本系統以單片機作為核心元件將電子密碼鎖和無線遙控技術結合起來,使其具有修 改密碼、報警鎖定等功能,不僅能進行遠距離遙控解鎖,還能實現近距離按鍵密碼初始 化及復位解除報警。同時采用 e2prom 作為存儲單元,方便用戶存儲、修改密碼和遙控 器鍵碼;采用 lcd 顯示令使用更加方便直觀。紅外線遙控電子密碼鎖能實現多種控制功 能,改善了傳統機械鎖的各種缺點,有較好的市場發展前景和技術應用價值。而且本系 統的紅外接收解碼部分延時計數準確,并且有錯誤校驗,所以整個接收解碼的準確性非 常高。 設計電路主要由紅外線解碼學習電路、
4、密碼修改和存儲電路、聲光提示報警電路、 lcd 顯示電路組成。系統能完成輸入密碼開鎖、出錯報警、超次鎖定、修改用戶密碼等 基本的密碼鎖的功能,并且還能實現遠距離遙控、按鍵密碼初始化、掉電存儲、聲光提 示、遙控器學習識別等附加功能。本設計詳細介紹了單片機遙控系統的軟硬件設計方法, 并給出了具體的各單元電路設計、程序設計及主程序流程圖。 關鍵詞:電子密碼鎖紅外遙控單片機nec 編碼 1目的和意義 隨著人們生活水平的提高,如何實現家庭防盜這一問題也變得尤其重要。目前國內, 大部分人使用的還是傳統的機械鎖。傳統的機械鎖由于其構造的簡單,被撬的事件屢見 不鮮。即使是一把質量過關的機械鎖,通過急開鎖,甚至
5、可以在不損壞鎖的前提下將鎖 打開。而且,在日常的生活和工作中,若使用傳統的機械式鑰匙開鎖,人們常需攜帶多 把鑰匙,使用極不方便,且鑰匙丟失后安全性即大打折扣。為此,本系統試著設計具有 防盜報警功能的紅外線遙控電子密碼鎖來代替傳統的機械式密碼鎖,克服了機械式密碼 鎖密碼量少、安全性能差的缺點。而且還添加了紅外遙控、遙控器學習識別和 lcd 顯 示等功能,可以實現遠距離開關鎖、修改密碼等,系統靈活性強,操作簡單直觀、使用 非常方便。 2方案設計 用以下方案設計本次系統:發射模塊使用型號為 hz-ft007 的 20 鍵車載 mp3 紅外 遙控器和創維 rc-585 型 dvd 遙控器,因為它們都是
6、采用 nec 編碼格式的紅外遙控芯 片作為主要芯片;使用一體化紅外接收頭 sm0038 和單片機 stc89c51rc 結合的方式 完成接收解碼模塊,學習識別 nec 編碼格式的不同遙控器;使用 at24c02 這一串行 e2prom 作為存儲模塊;使用 lcd1602a 實現系統的顯示模塊。系統的總框圖如圖 3 所 示。這樣的選擇使系統在較低成本的情況下較好地實現系統的功能,而且系統有著較高 的抗干擾性和穩定性。 按鍵 upd6122g sm0038 mcu at24c02 lcd1602 電磁鎖 nec 編碼遙控器 圖 3 選用方案系統框圖 3 硬件原理分析及設計 3.1 發射模塊原理 3
7、.1.1 紅外發送系統原理 紅外遙控信號是一連串的二進制脈沖碼。為了使其在無線傳輸過程中免受其他紅外 信號的干擾,通常都是先將其調制在特定的載波頻率上,然后再經紅外發光二極管發射 出去,紅外線接收裝置則會濾除其它雜波只接收該特定頻率的信號并將其還原成二進制 脈沖碼。在本紅外遙控系統中,紅外信號的載波頻率為 38khz。 通常,紅外遙控系統中所采用的編碼方式有兩種:通過脈沖寬度來實現信號調制的 脈寬調制(pwm)和通過脈沖串之間的時間間隔來實現信號調制的脈時調制(ppm) 。本 系統是采用 ppm 方法,即用兩個脈沖之間的時間間隔來表示二進制信息。 為了確保發送端和接收端之間數據傳輸的準確無誤,
8、紅外線信號還要按照特定的傳 輸協議來進行信號傳輸。常用的紅外線信號傳輸協議有 nec 協議、rc-5 協議、rc-6 協議、sharp 協議等。 3.1.2 nec 編碼格式介紹 本系統使用的型號為 hz-ft007 的 20 鍵車載 mp3 紅外遙控器和創維 rc-585 型 dvd 遙 控器請參看附錄 c 中的實物圖,它們主要芯片都是 nec 編碼格式的紅外遙控芯片。 nec 編碼廣泛應用于電視機,dvd,pc 電腦,音響等,是比較常用的一種紅外編碼格式。 下面以 nec 編碼標準的紅外編碼芯片 upd6122g 作為例子介紹。nec 遙控編碼是連續 的 32 位二進制碼組,其中的前十六位
9、是用戶碼,后 16 位為 8 位的數據碼及其反碼。在 每次編碼之前還會發送 9ms 高電平和 4.5ms 低電平組成的引導碼(或稱起始碼) 。而且 第二段的用戶碼也可以在遙控應用電路中被設置為第一段用戶碼的反碼。它的幀結構如 圖 4 所示。 圖 4 upd6122g 編碼格式 nec 編碼標準是以用不同脈沖的時間間隔來區分0和1的,upd6122g 以脈 寬為 0.56ms、間隔 0.565ms、周期為 1.125ms 的組合表示二進制的0 ;以脈寬為 0.56ms、間隔 1.69ms,周期為 2.25ms 的組合表示二進制的1 。其波形如圖 5 所示。 圖 5 upd6122g0和1波形圖
10、使用 455khz 晶振時各代碼所占的時間如圖 6 所示: 圖 6 使用 455khz 晶振時各代碼所占的時間 upd6122g 按鍵輸出有兩種方式:一種是每次按鍵都輸出完整的一幀數據;另一種 是按下按鍵不松開時,發送完整的一幀數據后再發送重復碼,直到按鍵被松開。其波形 如圖 7 所示。 圖 7 重復碼的波形圖 3.2 接收解碼模塊 3.2.1 接收解碼原理 接收解碼的關鍵是如何識別0和1 ,本系統使用的是一體化紅外接收頭進行紅 外信號接收,在沒有信號的時候其輸出端是高電平,而有信號的時候是低電平,所以其 輸出信號電平正好和遙控發射端相反。從上面的討論可以發現在遙控發射端0和 1均以 0.56
11、ms 的高電平開始,不同的是低電平的寬度, 0為 0.565ms, 1為 1.69ms,所以必須根據低電平的寬度區別0和1 。本系統用中斷的方式實現從接 收頭到 mcu 的信號傳輸。如圖 9 所示,紅外接收頭的輸出端連接到單片機的 int0 腳。 接收頭輸出端有低電平信號輸出時引起單片機的中斷。單片機響應中斷并進行信號的接 收解碼。解碼后的信號就變成相應的遙控器按鍵代碼,從而可以成為密碼鎖的密碼。 接收頭 sm0038 mcu int0 圖 9 中斷接收示意圖 3.2.2 接收解碼模塊的硬件電路 接收解碼電路由一體化紅外接收頭 sm0038 和單片機 stc89c51rc 組成。 stc 系列
12、單片機具有在系統中直接可編程特性,其好處是:省去購買通用編程器, 單片機在用戶系統上即可下載/燒錄用戶程序,而無須將單片機從已生產好的產品上拆 下,再用通用編程器將程序代碼燒錄進單片機內部。有些程序尚未定型的產品可以一邊 生產,一邊完善,加快了產品進入市場的速度,減小了新產品由于軟件缺陷帶來的風險。 由于可以在用戶的目標系統上將程序直接下載進單片機看運行結果對錯,故無須仿真器, 因此選擇使用這款單片機。 一體化紅外接收頭 sm0038 是集信號放大、濾波、檢波、整形于一體的紅外接收器, 電路內置 pin 二極管和前置放大器,采用可以紅外濾波的環氧樹脂材料封裝,可靠性高, 不易受環境影響并可以防
13、止非控制信號的輸出脈沖出現。它的內部電路如圖 10 所示。 圖 10 sm0038 內部結構圖 sm0038 內置帶通濾波器、積分器、和自動增益控制電路以抑制各種干擾和噪音。 數據信號和干擾信號的主要區別在于載波頻率、脈沖波長和工作周期上。所以數據信號 應該滿足以下的要求。而本系統選用的 sm0038 在這三方面和 nec 編碼格式是相配的。 載波信號的頻率盡量接近帶通濾波器的中心頻率(38khz) 。 脈沖長度在 300us 以上。 數據的編碼類型相兼容。 3.4 液晶顯示模塊 系統中采用 lcd1602 作為顯示器件輸出信息。與傳統的 led 數碼管顯示器件相比, 液晶顯示模塊具有體積小、
14、功耗低、顯示內容豐富等優點,而且不需要外加驅動電路, 現在液晶顯示模塊已經是單片機應用設計中最常用的顯示器件了。lcd1602 可以顯示 2 行16 個字符,具有 8 位數據總線 d0-d7,和 rs、r/w、e 三個控制端口,工作電壓 為 5v,并且帶有字符對比度調節和背光設置。lcd1602 與單片機的連接電路圖參考附 錄 a。 其管腳功能簡介如下: vl:lcd 對比度調節端,電壓調節范圍為 05v。接正電源時對比度最弱,接地 電源時對比度最高,可以用一個 10k 的電位器來調整對比度; rs:數據或者指令選擇端。處理器寫入指令時,rs 為低電平,寫入數據時,rs 為 高電平; r/w:
15、讀寫控制端。r/w 為高電平時,讀取數據;r/w 為低電平時,寫入數據; e:lcd 模塊使能信號控制端。寫數據時,需要下降沿觸發模塊; d0d7:8 位數據總線,三態雙向; bla: led 背光正極。需要背光時,bla 串接一個限流電阻接 vcc; blk: led 背光負極。 4 軟件設計 4.1 編程語言 目前,對單片機的編程主要采用匯編和 c 語言。匯編語言有執行效率高、速度快、 與硬件結合緊密等特點。尤其在進行 i/o 端口管理時,使用匯編語言有快捷、直觀的優 點。但是使用匯編語言相對于使用高級語言編程難度要大一些,且程序可讀性低,開放 性差,從系統開發時間來看,效率不是很高。 c
16、 語言是一種結構化語言,可產生緊湊代碼。c 語言可以用許多機器級函數直接控 制操作 8051 硬件。與匯編語言相比,c 語言有如下的優點: 不要求了解單片機的指令系統,僅要求對 8051 的存儲結構有初步了解; 寄存器分配,不同存儲器的尋址及數據類型等細節可由編譯器管理; 程序有規范的結構,可分為不同的函數,這種方式可使程序結構化; 具有將可變的選擇與特殊操作組合在一起的能力,改善了程序的可讀性; 關鍵字及運算符可用近似人的思維方式使用; 編程及程序調試時間顯著縮短,從而提高效率; 提供的庫包含許多標準子程序,具有較強的數據處理能力; 已編好的程序可容易地植入新程序,因為它具有方便的模塊化編程
17、技術。 當然,采用混編模式,就能結合兩者的優點。本著學習的目的,本系統均采用 c51 語言編寫。 4.2 主要程序說明及流程圖 4.2.1 主程序 本系統的軟件程序主要包括主程序、接收解碼程序、密碼判斷和報警程序、密碼修 改程序、遙控器學習識別程序幾個大的模塊程序。完整程序見附錄 b。 主程序首先是初始化程序,然后就等待紅外接收頭輸出端的低電平,低電平出現說 明遙控有鍵按下,外部中斷設定為下降沿觸發,故單片機進入中斷服務程序進行信號的 接收解碼。系統進入密碼輸入界面,并且接收到八位的密碼以后就開始運行密碼核對程 序,當密碼輸入正確后,就可以進行開鎖、上鎖或修改密碼的操作。當密碼輸入錯誤的 時候
18、就會進入密碼輸入提醒程序提醒用戶重新輸入密碼,密碼輸入累積到 3 次時系統會 報警并鎖定。相應的主程序流程圖如圖 12 所示。 初始化 等待遙控識別按鍵 時鐘模式 密碼核對 報警鎖定 開鎖上鎖密碼修改 n 錯誤 正確 密碼鎖按鍵 密碼鎖模式 y 圖 12 主程序流程圖 4.2.2 接收解碼程序 紅外接收解碼的關鍵是如何識別0和1碼,我的做法是根據0和1碼 的高電平寬度不一樣的特點來進行識別。接收程序的流程圖如圖 13 所示。 進入紅外接收程序后先關閉中斷。接著的工作是避開 9ms 高電平、4.5ms 的低電平 的引導碼,并且判斷是否干擾信號或者重復信號。正如前面所說,一體化紅外接收頭的 輸出端
19、電平跟遙控發射端電平相反。如圖 14 所示。 所以只要遙控有鍵按下單片機就會馬上產生中斷接收數據。跟在引導碼后面的是 32 位用戶碼和數據碼,也就是我們想要的數據,單片機把它接收并保存。當接收完 8 位的 數據時要更換另外一個數據緩沖區,當 32 位的鍵碼都接收完的時候就意味這一幀的數 據已經接收完畢。然后根據接收到的數據碼和數據反碼是否對應位相反來確定接收的這 一幀數據是否正確,最后退出接收解碼程序。 紅外中斷程序 關中斷 是否 9ms 低電平 開始接收 32 位編 碼 接收信號 “1” 保存,接收了 8 位? 是否 4.5ms 低電平 低電平大于 800us 接收信號 “0” 保存,接收了
20、 32 位? 開中斷 返回 干擾信號重復信號 n n n n n y y y y y 圖 13 紅外接收程序流程圖 發射模塊mcu 9ms 4.5ms 接收頭 9ms 4.5ms 圖 14 接收頭前導碼信號變相圖 而單片機的接收端的0 1波形圖如圖 15 所示。在保存0碼和1碼的時 候還有一個保存時機的問題,如果從 0.56ms 低電平過后開始延時,0.56ms 以后若讀到 為低電平,說明該位為0 ,反之則為1 。為安全起見,延時必須比 0.56ms 長一些, 但又不能超過 1.12ms,否則如果該位為0讀到的已是下一位的高電平,因此取( 1.12ms + 0.56ms )/2=0.84ms
21、較為可靠,一般取 0.84ms 左右均可。 圖 15 單片機接收端的0 1波形圖 接收解碼關鍵程序: sbit ir = p32; / 紅外中斷輸入端口(int0) void ir_svr(void) interrupt 0 using 0 int width=0,i; ex0 = 0; /關中斷 /*常規狀態下 int0 為高電平,由高電平跳變為低電平時(即下降沿)產生中斷*/ / 引導信號:9ms 低電平 while(!ir) delay_100us(); width+; /計算引導電平的寬度 if (width 80) ex0 = 1; return; / 8ms=80*100us 如果
22、不到 8ms 視為干擾信號 / 計算 4.5ms 高電平寬度 width = 0 x00; while(ir) delay_100us(); width+; if (width 30) ex0 = 1; return;/ 3ms=30*100us 如果不到 3ms 即視為 2.5ms 重復信 號 / 至此,引導碼已校驗,以下接收地址碼和數據碼,一共 32 位 i=0; while(i+ 32) /接收 32 位編碼 while(!ir); /等待高電平 width = 0 x00; while(ir) /記錄高電平寬度 delay_100us(); width+; ir_data 0 x08)
23、ir_data |= 0 x01; /信號1和0判斷 if (i=8) /保存接收到的數據 datair0 = ir_data; if (i=16) datair1 = ir_data; if (i=24) datair2 = ir_data; if (i=32) datair3 = ir_data; if (datair2 != datair3) /糾錯校驗 ex0 = 1; return; ir_data = datair2; ir_flag = 1; /接收成功標志位 tr1=0; /有按鍵關定時器 1 t=0; ex0 = 1; 4.2.3 按鍵數字分配 由于遙控器的編碼是為了不容易出
24、錯而編的,導致數據比較亂,為了編程方便,我們特意修改 了數據。09 號為密碼數據,10 號為退格鍵,11 號為密碼修改鍵,18 號為開鎖鍵,14 號為調整時 間鍵,8 號調時,9 號調分。 /* 按 鍵 數 據 編 碼 */ /* 18,19,20 */ /* 15,16,17 */ /* 12,13,14 */ /* 0, 10,11 */ /* 1, 2, 3 */ /* 4, 5, 6 */ /* 7, 8, 9 */ /* 遙控器 */ uchar key_match() switch(ir_data) case 0 x68: return(0); case 0 x30: return
25、(1); case 0 x18: return(2); case 0 x7a: return(3); case 0 x10: return(4); case 0 x38: return(5); case 0 x5a: return(6); case 0 x42: return(7); case 0 x4a: return(8); case 0 x52: return(9); case 0 x98: return(10); case 0 xb0: return(11); case 0 xe0: return(12); case 0 xa8: return(13); case 0 x90: ret
26、urn(14); case 0 x22: return(15); case 0 x02: return(16); case 0 xc2: return(17); case 0 xa2: return(18); case 0 x62: return(19); case 0 xe2: return(20); default : return(99); 4.2.4 密碼判斷、報警及修改程序 電子密碼鎖的軟件編程主要分為兩方面,分別是接收密碼后判斷及報警部分和密碼 修改控制部分。 首先介紹密碼判斷及報警程序。顯示收到的鍵碼并保存到接收緩存 receive_code8, 直到 8 位鍵碼接收完畢。然后和
27、原密碼緩存 origin_code8比較,判斷密碼是否正確。若 密碼正確則將標志位 code_right=1;若不正確則報警并使密碼輸入錯誤次數 wrong_num+,再判斷錯誤次數是否已達 3 次,若是則程序進入死循環鎖定。程序流程 圖如圖 16 所示。 輸入密碼 接收了 8 位鍵碼? code_right=1 密碼是否正確 wrong_num+ wrong_num=3? 錯誤警告 報警鎖定 n n n y y y 圖 16 密碼判斷及報警流程圖 接著介紹密碼修改控制程序。當密碼輸入正確以后用戶按下“密碼修改鍵”就會進 入密碼修改操作,單片機也就會運行密碼修改程序。程序流程圖如圖 17 所示
28、。 code_right=1 修改密碼? 保存新密碼 新密碼接收完畢? 返回 n n n n y y y y 新密碼確認完畢? 兩次密碼相同? 顯示錯誤 圖 17 密碼修改流程圖 進入密碼修改程序首先等待新密碼的第一次輸入。第一次輸入的新密碼放在接收緩 存 receive_code8中,當輸入完第八個密碼后系統會提示再次輸入密碼,第二次輸入的 新密碼放在密碼比較緩存 com_code8中。第二次輸入密碼完成后就檢驗兩次輸入的新 密碼是否相同,如果相同的話就更換密碼,將新密碼儲存到 at24c02 中。 關鍵程序如下: void check_code(void) if(ir_flag=1) fl
29、ag=0, key_data=key_match() , beep(),ir_flag=0,j=0; /beep 函數發 出按鍵聲音 if(show=1 flag=1; rec_num-; if(key_data=18) /跳到時鐘模式 key_data=99; delay_lcm(10); lcm_cls(); show=0 ; beep_flag=0;rec_num=0; k=1; if(rec_num=8)/輸入八個密碼后密碼檢查 for(j=7;j0;j-) if(origin_codej!=receive_codej)/與原密碼比較 wrong_num+; if(wrong_num=
30、1) delay_lcm(1000);lcm_cls();delay_lcm(1000); displaylistchar(0,0,input it again!); else if(wrong_num=2) delay_lcm(1000);lcm_cls();delay_lcm(1000); displaylistchar(0,0,the last time); else if(wrong_num=3) lcm_cls(); displaylistchar(0,0,wrong!); displaylistchar(0,1,lock); led1=1;led2=1;led3=0; speake
31、r=0; /3 次錯誤報警 delay_lcm(10000); while(1); /3 次錯誤進入死循環鎖定 code_right=0; rec_num=0; return; lcm_cls(); displaylistchar(0,0, (_);/密碼正確,開鎖成功 displaylistchar(0,1,what you want?); rec_num=0; show=0; code_right=1;/密碼正確標識位 void change_code(void) int i,j; if(ir_flag=1) key_data=key_match(),flag=0,beep(),ir_fl
32、ag=0; if( code_right=1 lcm_cls(); displaylistchar(0,0,input new code); new_code1=1;/修 ii 改密碼標識位 1 if(new_code1=1 rec_num-; flag=1; if(code_right=1 lcm_cls(); displaylistchar(0,0,input again!); rec_num=0; new_code2=1;/修改密碼標識位 2 new_code1=0; if(new_code2=1 rec_num-; flag=1; if(code_right=1 new_code2=0
33、; j=8; while(j-) /判斷兩次輸入是否一致 if(com_codej!=com1_codej) delay_lcm(10); lcm_cls(); displaylistchar(0,0,not match!); displaylistchar(0,1,press change key); delay_lcm(200); return; lcm_cls(); for(i=0;i8;i+) /密碼一致,開始修改密碼 origin_codei=com_codei; displaylistchar(0,0,new codes saved!);/修改密碼成功 delay_lcm(5000
34、); wrong_num=0; code_right=0; ir_flag = 0; k=1; /跳到時鐘 return; 4.2.3 時鐘模式 一開始進入運行的是時鐘模式。 while(1) /時鐘部分程序 f1: displaylistchar(0,0, ); displaylistchar(0,1, ); displaylistchar(6,0,(0_0); displaylistchar(3,1, : : ); write_sfm(3,shi); write_sfm(6,fen); write_sfm(9,miao); while(1) delay_lcm(2000); display
35、listchar(6,0,(_); if(ir_flag=1) key_data=key_match(),ir_flag=0; if(key_data=14)key_data=99;goto f2; if(key_data=18) /轉入密碼模式 beep_flag=1; beep(); key_data=99; lcm_cls(); delay_lcm(10); displaylistchar(0,0,input the code! ); show=1; beep_flag=1; goto a1; miao+; if(miao=60) miao=0; fen+; if(fen=60) fen
36、=0; shi+; if(shi=24) shi=0; write_sfm(3,shi); write_sfm(6,fen); write_sfm(9,miao); f2: while(1) if(ir_flag=1) key_data= key_match(); switch(key_data) case 8: if(shi=23)shi=0; else shi+;ir_flag=0;write_sfm(3,shi);break; case 9: if(fen=59)fen=0; else fen+;ir_flag=0;write_sfm(6,fen);break; default: dis
37、playlistchar(6,0,(-_-);ir_flag=0;delay_lcm(3000);displaylistchar(6,0,(0);break; if(key_data=14)key_data=99;goto f1; 4.2.5 按鍵發聲程序 如果有按鍵的話,就執行以下發聲程序 beep() ,靠定時器產生不同頻率的聲音。 void beep(void) int currentfre,temp_t; if(key_data=18) beep_flag=1; speaker = 1; tr0 = 0; ea = 1; if(key_data!=99 /查出對應音符的頻率 temp_
38、t = 65536-(50000/currentfre)*10/(12000000/system_osc); /計算計數器初值 sound_temp_th0 = temp_t/256; sound_temp_tl0 = temp_t%256; th0 = sound_temp_th0; tl0 = sound_temp_tl0 + 12; /加 12 是對中斷延時的補償 tr0=1;/開計時中斷 if(key_data=18) delay_lcm(500);/開機鍵響 0.5 秒,其它 0.2 秒 else delay_lcm(200); tr0=0;/關計時器 speaker = 1; vo
39、id beeptimer0(void) interrupt 1 speaker = !speaker; th0 = sound_temp_th0; tl0 = sound_temp_tl0; 4.2.6 沒操作響應 如果沒有操作的話就開定時器 0,開始計時,5s 過后就返回時鐘模式。在這段時間 之內只要有按鍵操作,就會關定時器 0。 void no_action(void) interrupt 3 if(t100) t+;th1=0x3c;tl1=0xb0; else rec_num=0,k=1,t=0,tr1=0; 5 功能分析及總結 5.1 功能分析 本系統順利完成了輸入正確密碼開鎖、出錯
40、報警、超次鎖定、修改用戶密碼等基本 的密碼鎖功能,并且還能實現遠距離遙控、掉電存儲、聲光提示、遙控器學習識別等功 能。 完成后的實物圖如圖 19 所示。打開系統電源后程序初始化,lcd 提示輸入遙控器識別 按鍵,同時等待紅外接收頭輸出端的低電平,低電平出現說明遙控有鍵按下,外部中斷 設定為下降沿觸發,故單片機進入中斷服務程序進行信號的接收解碼。接收解碼程序有 很好的抗干擾性,脈沖寬度的延時計數準確,能夠識別重復信號,屏蔽多余按鍵避免誤 操作,并且 32 位編碼接收完畢后還要進行錯誤校驗,所以整個接收解碼的準確性非常 高。 圖 19 不帶 lcd 的硬件實物圖 當接收到識別按鍵后,單片機便可解碼
41、出相應的鍵碼和該遙控器的用戶碼,組成該 遙控器的 id。此 id 是單片機識別不同遙控器的根據,單片機從 at24c02 中查找相應 的 id,如果此 id 不存在,就會提示輸入該遙控器其余鍵碼的信息并保存到 at24c02 相應的地址。如果 id 存在,系統即進入電子密碼鎖模式。系統進入密碼輸入界面,每 輸入一位密碼 lcd 就顯示“*”號,而且程序設有回格功能,刪除上一位輸入的密碼, 直到接收完八位的密碼后就開始運行密碼核對程序。若密碼輸入正確,就可以選擇進行 開鎖、上鎖或修改密碼的操作,并伴有 led 燈顯示。當密碼輸入錯誤的時候就會進入 密碼輸入提醒程序提醒錯誤次數,密碼輸入錯誤次數累
42、積到 3 次時系統就會通過蜂鳴器 報警,而且程序進入死循環,系統被鎖定。系統被鎖定后無法通過遙控器解鎖,只能夠 按電子鎖上面的復位鍵使整個程序復位。 密碼初始化 及遙控器 id 清零按鍵 lcd 對比 度調節電阻 at24c02 一體化紅外接 收頭 sm0038 stc89c51rc 復位鍵 led 燈指示 如果選擇了密碼修改操作,lcd 提示輸入第一次新密碼,接收完 8 位新密碼后,保 存并 lcd 提示輸入第二次新密碼。兩次新密碼接收完畢后,進入密碼比較程序,判斷 兩次輸入的密碼是否相同。若相同則把新密碼保存到 origin_code 中,由于沒有外部存 儲器,密碼在下一次開機的時候還是原
43、始密碼。若不相同則 lcd 顯示錯誤,程序返回。 5.2 c 語言編程的延時技巧 編寫單片機程序的時候,經常會遇到需要短時間延時的情況,如本系統紅外接收解 碼的時候就需要用到精確的 100us 的短時間延時來確保接收解碼的準確性,有時甚至還 需要更高的精度。c 語言不像匯編一樣可以計算指令運行所要的時間,所以 c 語言的定 時是 c 語言編寫單片機程序最大的一個缺陷。當然可以在 c 里嵌入匯編來解決這個問題, 但在這里我沒有使用這個方法。還有可以考慮用定時器,但進出中斷程序以及重新裝載 計數初值也是要耗費一些時間的,也很難精確定時到微秒級,而且在極端的情況下,計 時器甚至已經全部有其它的用途。
44、所以在這里使用了循環計時的方式計時,用斷點的方 式來調試。keil uvision2 編譯器有程序調試的功能,通過調試本系統成功地只用 c51 語言產生精確的定時。編寫 100us 的延時程序,程序如下: void delay_100us(void) unsigned char i=48; while(-i); 首先在 keil uvision2 上編譯上面的程序,并打開其匯編代碼。如圖 20 所示然后進 入 keil uvision2 的調試狀態。在延時子程序的開始和結束處設下兩個斷點,見圖中的 兩個紅點。紅點之間的程序就是所調試的延時程序,接著把項目所用的晶振設為 12m, 這與硬件電路相
45、對應。按運行后程序運行到斷點 1 時所用的時間為 0.000616 秒; 第 1 個斷點 到第 1 個 斷點用時 圖 20 第一個斷點調試圖 再次按運行又可以從圖 21 中看到運行到斷點 2 所用的時間是 0.000717 秒。兩時間 相減是 0.000101 秒,就是說延時程序的運行時間是 101us,與理想值只差 1us,延時十 分精確。 圖 21 第二個斷點調試圖 5.3 本設計優缺點 紅外技術是一門相當成熟的技術,而單片機技術也有著相當長的一段發展時間,本 系統把兩門技術結合起來,發揮各自的優點,使紅外技術應用在單片機控制的電子密碼 鎖上,也就是利用紅外遙控實現密碼鎖的開鎖、上鎖和修改
46、密碼的操作。這樣的結合使 到第 2 個 斷點用時 第 2 個斷點 密碼鎖的使用更加方便,安全性能得到進一步的提高。本系統的遙控器使用的是家電遙 控中使用得最多的專用芯片,所以抗干擾能力比較強,而且十分準確可靠,誤碼率很低。 本系統還具有學習識別 nec 編碼遙控器的功能,可以實現多對一操作,不同的遙控器 采用相同的密碼,不用擔心遙控器遺失的問題,而且用戶可以經常更改密碼,防止密碼 被盜。當輸入密碼多次錯誤時,報警系統自動啟動。接收部分用單片機作為主芯片,可 以根據不同要求來修改設定不同的密碼位數或改變、增添一些新功能。這是使用專用的 密碼鎖芯片和以前的機械密碼鎖都不能做到的。而且本系統既可以室
47、內使用,也可以在 野外使用。 但是紅外射束易受塵埃、雨水等物質的吸收,易受氣候的影響。在惡劣的環境使用 出現故障的機率會大大的提高。而且本系統的最大一個技術缺陷是密碼在發送過程中無 法避免通過監測反射的紅外線和濾除環境噪聲的竊聽,這也是紅外通訊的最大的缺點。 還有就是由于紅外遙控編碼的調制方式有很多種,編碼格式也各不相同。所以要對 各種形式的遙控器進行學習就存在著一定的難度,最常用的學習紅外編碼的方法也就是 記錄下編碼的所有高低電平時間,這種方式能實現對大部分的遙控器進行學習,不過這 樣需要大量的存儲空間,尤其是空調的遙控器,空調遙控器的編碼包含很多的信息,編 碼特別長。因此本系統只針對最常用
48、的 nec 編碼格式的遙控器進行學習與識別,舍棄 其它編碼。這樣的優點是專用性強,解碼的準確率高;缺點是并不是所有編碼格式的遙 控器都能學習,有一定的局限性。 5.4 設計總結 本次的課程設計過程中,proteus 仿真軟件中都是沒有此類硬件的,只能放棄仿真。 由于電烙鐵不好用,所一制作了很久。用 keil 寫程序的時候,由于我們受 fpga 和組態 軟件的影響,總是認為程序是并行執行的,所以遇到了一些困難。調試過程中,學習了 外部中斷還有定時中斷,感覺很有用。我們小組參考了一個音樂播放器的程序而想出了 按鍵發音的主意。沒操作返回也是用定時器寫的。液晶顯示方面,參考了一些程序,對 寫命令還有寫
49、數據有了一定的認識。總體感覺就是要認真思考,用不同的方法去思考一 些遇到的問題,或者去驗證我們的想法。 參 考 文 獻 李朝青. 2005. 單片機原理及接口技術(第 3 冊)m. 北京: 北京航空航天大學出版社. 17- 140 來清民. 2008. 傳感器與單片機接口及實例m. 北京: 北京航空航天大學出版社. 213-226 張義和,陳敵北,周金圣. 2006. 例說 protel2004m. 北京: 人民郵電出版社. 142-204 康華光. 2000. 電子技術基礎數字部分(第四版)m. 北京: 高等教育出版社.213-228 譚浩強. 2005. c 語言程序設計(第三版)m. 北
50、京: 清華教育出版社. 204-278 q1 8550 p1.0/t2 1 p1.1/t2ex 2 p1.2 3 p1.3 4 p1.4 5 p1.5 6 p1.6 7 p1.7 8 rst 9 p3.0/rxd 10 p3.1/txd 11 p3.2/int0 12 p3.3/int1 13 p3.4/t0 14 p3.5/t1 15 p3.6/wr 16 p3.7/rd 17 xtal2 18 xtal1 19 vss 20 p2.0/a8 21 p2.1/a9 22 p2.2/a10 23 p2.3/a11 24 p2.4/a12 25 p2.5/a13 26 p2.6/a14 27 p
51、2.7/a15 28 psen 29 ale 30 ea/vpp 31 p0.7/ad7 32 p0.6/ad6 33 p0.5/ad5 34 p0.4/ad4 35 p0.3/ad3 36 p0.2/ad2 37 p0.1/ad1 38 p0.0/ad0 39 vcc 40 u1 89s51 12 y1 xtal 104 c1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 lcd1 lcd1602 vcc 1 2 3 4 5 6 7 8 9 rp1 r_10k 30p c2 30p c3vcc 10uf e1 vcc 1k r3 1k r9 1k r10 d2
52、 led d3 led vcc led1 led2 1k r5 vcc 100 r6 speaker led2 led1 led3 d0 d1 d2 d3 d4 d5 d6 d7 e rw rs d0 d1 d2 d3 d4 d5 d6 d7 e rw rs e0 1 e1 2 e2 3 gnd 4 sda 5 scl 6 wc 7 vcc 8 u3 24c02 vcc 10k r7 10k r8 wc scl sda wc scl sda vcc vcc 1k r4 d1 led 42 13 s1 1k r2r1 10k in 1 3 out 2 gnd u2 7805 1 2 j1 pow
53、erin vcc 104 c4 sw-power1 sw-spst vss 1 vdd 2 out 3 1 vcc 42 13 s2 d4 led 1k r11 led3 speaker speaker1 speaker 附錄 a 電路連接圖 附錄 c 實物圖 圖 1hz-ft007 的 20 鍵車載 mp3 紅外遙控器 圖 2 不帶 lcd 硬件實物圖 圖 3 帶 lcd 硬件實物圖 程序附錄: 主程序: #include sbit ir = p32; / 紅外中斷輸入端口(int0 sbit speaker=p30; sbit led1=p13; sbit led2=p14; sbit l
54、ed3=p15; #define system_osc 12000000/定義晶振頻率 12000000hz #define uchar unsigned char #define uint unsigned int uchar datair4,ir_data,new_code1=0,new_code2=0; uchar key_data=100; int rec_num=0,show=0,wrong_num=0,flag=0; uchar origin_code=1,2,3,4,5,6,7,8,receive_code8,com_code8,com1_code8; int t,ir_flag
55、=0,code_right=0,j=0,n=0,beep_flag=0,shi,fen,miao,k=0; int code fretab21 = 300,400,600,800,800,1200,1400,300,400,600,800,800,1200,1400,300,400,600,800,800,1200,1400 ; /原始 頻率表 uchar sound_temp_th0,sound_temp_tl0;/音符定時器初值暫存 extern void delay_100us(void); extern void write_sfm(uchar add,uchar date); ext
56、ern void initlcm( void); /lcd 初始化子程序 extern void displaylistchar(uchar x,uchar y, unsigned char *ddata); extern void displayonechar(uchar x,uchar y, unsigned char ddata); extern void delay_lcm(uint k); /顯示指定坐標的一串字符子函數 extern void lcm_cls(void); void delay_lcm(uint k); void delay_100us(void); void ch
57、eck_code(void); void change_code(void); void beep(void); /* 按 鍵 數 據 編 碼 */ /* 18,19,20 */ /* 15,16,17 */ /* 12,13,14 */ /* 0, 10,11 */ /* 1, 2, 3 */ /* 4, 5, 6 */ /* 7, 8, 9 */ /* 遙控器 */ uchar key_match() switch(ir_data) case 0 x68: return(0); case 0 x30: return(1); case 0 x18: return(2); case 0 x7a
58、: return(3); case 0 x10: return(4); case 0 x38: return(5); case 0 x5a: return(6); case 0 x42: return(7); case 0 x4a: return(8); case 0 x52: return(9); case 0 x98: return(10); case 0 xb0: return(11); case 0 xe0: return(12); case 0 xa8: return(13); case 0 x90: return(14); case 0 x22: return(15); case
59、0 x02: return(16); case 0 xc2: return(17); case 0 xa2: return(18); case 0 x62: return(19); case 0 xe2: return(20); default : return(99); main(void) th1=0x3c;tl1=0xb0; initlcm(); tmod |= 0 x11;/定時器 0 和定時器 1 工作方式都是 1 et0 = 1; et1=1; it0=1; ex0=1; ea=1; tr0=0; displaylistchar(3,0,welcome!); displaylist
60、char(3,1,00:00:00); shi=0; fen=0; miao=0; delay_lcm(5000); while(1) /時鐘部分程序 f1: displaylistchar(0,0, ); displaylistchar(0,1, ); displaylistchar(6,0,(0_0); displaylistchar(3,1, : : ); write_sfm(3,shi); write_sfm(6,fen); write_sfm(9,miao); while(1) delay_lcm(2000); displaylistchar(6,0,(_); if(ir_flag=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論