刷卡機應答碼c5
網上關于刷卡機應答碼c5,基于紅外通信的單片機綜合編程控制技術實現遙控密碼鎖功能的刷卡知識比較多,也有關于刷卡機應答碼c5的問題,今天第一pos網(www.yadikedp.com)為大家整理刷卡常見知識,未來的我們終成一代卡神。
本文目錄一覽:
1、刷卡機應答碼c5
刷卡機應答碼c5
一、設計的目的及意義
1.1、設計的現狀及背景
在日常的生活和工作中, 住宅與部門的安全防范、單位的文件檔案、財務報表以及一些個人資料的保存多以加鎖的辦法來解決。若使用傳統的機械式鑰匙開鎖,人們常需攜帶多把鑰匙, 使用極不方便, 且鑰匙丟失后安全性即大打折扣。隨著科學技術的不斷發展,人們對日常生活中的安全保險器件的要求越來越高。為滿足人們對鎖的使用要求,增加其安全性,用密碼代替鑰匙的密碼鎖應運而生。密碼鎖具有安全性高、成本低、功耗低、易操作等優點。
在安全技術防范領域,具有防盜報警功能的電子密碼鎖逐漸代替傳統的機械式密碼鎖,克服了機械式密碼鎖密碼量少、安全性能差的缺點,使密碼鎖無論在技術上還是在性能上都大大提高一步。隨著大規模集成電路技術的發展,特別是單片機的問世,出現了帶微處理器的智能密碼鎖,它除具有電子密碼鎖的功能外,還引入了智能化管理、專家分析系統等功能,從而使密碼鎖具有很高的安全性、可靠性,應用日益廣泛。
隨著人們對安全的重視和科技的發展,許多電子智能鎖(指紋識別、IC卡辨認)已在國內外相繼面世。但是這些產品的特點是針對特定的指紋和有效卡,只能適用于保密要求的箱、柜、門等。而且指紋識識別器若在公共場所使用存在容易機械損壞,IC卡還存在容易丟失、損壞等特點。加上其成本較高,一定程度上限制了這類產品的普及和推廣。鑒于目前的技術水平與市場的接收程度,電子密碼鎖是這類電子防盜產品的主流。紅外遙控是單工的紅外通信方式,本設計的紅外遙控采用以通信方式為基礎的紅外遙控,而且本設計也使用了紅外通信技術,故著重分析紅外通信的基本原理。
紅外通信是利用紅外技術實現兩點間的近距離保密通信和信息轉發。它一般由紅外發射和接收系統兩部分組成。發射系統對一個紅外輻射源進行調制后發射紅外信號,而接收系統用光學裝置和紅外探測器進行接收,就構成紅外通信系統。但是接觸式密碼鎖系統都相應的存在著不同的缺點。例如:接觸式密碼鎖系統成本較低,體積小,卡片本身無須電源,但使用不太方便,而且有接觸磨損。相比之下,紅外遙控密碼鎖系統的成本與接觸式密碼鎖系統相當,而且可以進行近距離遙控,使用十分方便。而且它已經與 PC 機的數據庫相結合,可以組成一套酒店房間的門禁管理系統。 由于紅外遙控具有許多優點, 例如紅外線發射裝置采用紅外發光二極管遙控發射器易于小型化且價格低廉; 采用數字信號編碼和二次調制方式,不僅可以實現多路信息的控制,增加遙控功能,提高信號傳輸的抗干擾性,減少誤動作,而且功率消耗低;紅外線不會向室外泄露,不會產生信號串擾;反應速度快、傳輸效率高、工作穩定可靠等。工業設備中,在高壓、輻射、有毒氣體、粉塵等環境下,采用紅外線遙控不僅完全可靠而且能有效地隔離電氣干擾。所以紅外線遙控是目前使用最廣泛的一種通信和遙控手段。
1.2、設計的目的
在科技高速發展的今天,非接觸式控制越來越受大家歡迎,利用紅外遙控,方便又安全。另外,紅外線不會產生信號干擾,反應速度迅速、工作穩定度高等特點。而在工業制造中,在高壓、輻射、腐蝕等惡劣環境下,采用紅外遙控能夠很好地隔離這些干擾。在本次設計中,為了更加方便操作,除了采用矩陣鍵盤對密碼鎖進行控制外,還可以用遙控器進行控制,以達到雙控的目的??梢约由钭约簩λ鶎W專業的認識,關聯知識,增強自己的動手能力,積累實踐經驗,為以后的工作打好基礎。
1.3、設計的意義
隨著科技的發展,人們生活的節奏也越來越快,隨之人們對方便,快捷的要求也隨之不斷增高。遙控器的出現,在一定程度上滿足了人們這個要求。遙控器是由高產的發明家Robert Adler在五十年代發明的[1]。而紅外遙控是20世紀70年代才開始發展起來的一種遠程控制技術,其原理是利用紅外線來傳遞控制信號,實現對控制對象的遠距離控制,具體來講,就是有發射器發出紅外線指令信號,有接收器接收下來并對信號進行處理,最后實現對控制對象的各種功能的遠程控制。
紅外遙控具有獨立性、物理特性與可見光相似性、無穿透障礙物的能力及較強的隱蔽性等特點。隨著紅外遙控技術的開發和迅速發展,很多電器都應用了紅外遙控,在日常的生活和工作中, 住宅與部門的安全防范、單位的文件檔案、財務報表以及一些個人資料的保存多以加鎖的辦法來解決。若使用傳統的機械式鑰匙開鎖,人們常需攜帶多把鑰匙, 使用極不方便, 且鑰匙丟失后安全性即大打折扣。隨著科學技術的不斷發展,人們對日常生活中的安全保險器件的要求越來越高。為滿足人們對鎖的使用要求,增加其安全性,用密碼代替鑰匙的密碼鎖應運而生。密碼鎖具有安全性高、成本低、功耗低、易操作等優點。 在安全技術防范領域,具有防盜報警功能的電子密碼鎖逐漸代替傳統的機械式密碼鎖,克服了機械式密碼鎖密碼量少、安全性能差的缺點,使密碼鎖無論在技術上還是在性能上都大大提高一步。隨著大規模集成電路技術的發展,特別是單片機的問世,出現了帶微處理器的智能密碼鎖,它除具有電子密碼鎖的功能外,還引入了智能化管理、專家分析系統等功能,從而使密碼鎖具有很高的安全性、可靠性,應用日益廣泛。
二、主要器件介紹
系統主要有STC89C52RC單片機最小系統和LCD1602液晶顯示、數據存儲芯片24C02、紅外發射接收模塊等組成。
2.1、主控器件
本設計是STC89C52RC單片機為控制核心,矩陣鍵盤輸入,紅外遙控輸入基于紅外通信的單片機控制技術綜合實現所有功能。系統框圖如下圖:
單片機是STC公司最新推出的一種新型51內核的單片機。片內含有Flash程序存儲器、SRAM、UART、SPI、PWM等模塊。封裝圖如下圖:
2.1.1、主要特性
1. 增強型8051單片機,6時鐘/機器周期和12時鐘/機器周期可以任意選擇,指令代碼完全兼容傳統8051.
2. 工作電壓:5.5V~3.3V(5V單片機)/3.8V~2.0V(3V單片機)
3. 工作頻率范圍:0~40MHz,相當于普通8051的0~80MHz,實際工作頻率可達48MHz
4. 用戶應用程序空間為8K字節 5. 片上集成512字節RAM
6. 通用I/O口(32個),復位后為:P1/P2/P3/P4是準雙向口/弱上拉,
P0口是漏極開路輸出,作為總線擴展用時,不用加上拉電阻,作為I/O口用時,需加上拉電阻。
7. ISP(在系統可編程)/IAP(在應用可編程),無需專用編程器,無需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數秒即可完成一片
8. 具有EEPROM功能
9. 具有看門狗功能
10. 共3個16位定時器/計數器。即定時器T0、T1、T2
11. 外部中斷4路,下降沿中斷或低電平觸發電路,Power Down模式可由外部中斷低電平觸發中斷方式喚醒
12. 通用異步串行口(UART),還可用定時器軟件實現多個UART
13. 工作溫度范圍:-40~+85℃(工業級)/0~75℃(商業級)
2.1.2、引腳功能
VCC(40引腳):電源電壓
VSS(20引腳):接地
P0端口(P0.0~P0.7,39~32引腳):P0口是一個漏極開路的8位雙向I/O口。作為輸出端口,每個引腳能驅動8個TTL負載,對端口P0寫入“1”時,可以作為高阻抗輸入。在訪問外部程序和數據存儲器時,P0口也可以提供低8位地址和8位數據的復用總線。此時,P0口內部上拉電阻有效。在Flash ROM編程時,P0端口接收指令字節;而在校驗程序時,則輸出指令字節。驗證時要求外接上拉電阻。
P1端口(P1.0~P1.7,1~8引腳):P1口是一個帶內部上拉電阻的8位雙向I/O口。P1的輸出緩沖器可驅動(吸收或者輸出電流方式)4個TTL輸入。對端口寫入1時,通過內部的上拉電阻把端口拉到高電位,這是可用作輸入口。P1口作輸入口使用時,因為有內部上拉電阻,那些被外部拉低的引腳會輸出一個電流。
P2端口(P2.0~P2.7,21~28引腳):P2口是一個帶內部上拉電阻的8位雙向I/O端口。P2的輸出緩沖器可以驅動(吸收或輸出電流方式)4個TTL輸入。對端口寫入1時,通過內部的上拉電阻把端口拉到高電平,這時可用作輸入口。P2作為輸入口使用時,因為有內部的上拉電阻,那些被外部信號拉低的引腳會輸出一個電流
P3口引腳復用功能 引腳號 復用功能
P3.0 RXD(串行輸入口)
P3.1 TXD(串行輸出口)
P3.2 (外部中斷0)
P3.3 (外部中斷1)
P3.4 T0(定時器0的外部輸入)
P3.5 T1(定時器1的外部輸入)
P3.6 (外部數據存儲器寫選通)
P3.7 (外部數據存儲器讀選通)
RST(9引腳):復位輸入。當輸入連續兩個機器周期以上高電平時為有效,用來完成單片機單片機的復位初始化操作??撮T狗計時完成后,RST引腳輸出96個晶振周期的高電平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能無效。DISRTO默認狀態下,復位高電平有效。
ALE/(30引腳):地址鎖存控制信號(ALE)是訪問外部程序存儲器時,鎖存低8位地址的輸出脈沖。在Flash編程時,此引腳()也用作編程輸入脈沖。 在一般情況下,ALE以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或時鐘使用。然而,特別強調,在每次訪問外部數據存儲器時,ALE脈沖將會跳過。如果需要,通過將地址位8EH的SFR的第0位置“1”,ALE操作將無效。這一位置“1”,ALE僅在執行MOVX或MOV指令時有效。否則,ALE將被微弱拉高。這個ALE使能標志位(地址位8EH的SFR的第0位)的設置對微控制器處于外部執行模式下無效。
VPP(31引腳):訪問外部程序存儲器控制信號。為使能從0000H到FFFFH的外部程序存儲器讀取指令,必須接GND。注意加密方式1時,將內部鎖定位RESET。為了執行內部程序指令,應該接VCC。在Flash編程期間,也接收12伏VPP電壓。
XTAL1(19引腳):振蕩器反相放大器和內部時鐘發生電路的輸入端。
XTAL2(18引腳):振蕩器反相放大器的輸入端。
2.1.3、串口通信
一條信息的各位數據被逐位順序傳送的通信方式成為串行通信。根據信息的傳送方向,串行通信可以可以進一步劃分為單工、半雙工和全雙工 3 種。信息只能單方向傳送為單工;信息能雙向傳送但不能同時雙向傳送為半雙工;信息能夠同時雙向傳送則成為全雙工。 8051 系列單片機有一個全雙工串行口, 全雙工的串行通信只需要一根輸出線和輸入線。
串行通信又有異步通信和同步通信這兩種方式。異步通信用起始位“0”表示字符的開始,然后從低位到高位逐位傳送數據,最后用停止位“1”表示字符結束。一個字符又稱作一幀信息,一幀信息包括 1 位起始位、8 位數據位、1 位停止位,若數據位增加到第 9 位, 在 8051 系列單片機中, 第九位數據可以用作奇偶校驗位, 也可以用作地址/數據幀標志。
8051 系列單片機串行 I/O 接口的工作原理就是: 當要發送數據時, 單片機自動將 SBUF 內的 8 位并行數據轉換為一定格式的串行數據, 從 TXD 引腳按規定的波特率來輸出; 當要接收數據時, 要監視 RXD 引腳,一旦出現起始位“0” ,按規定的波特率將外圍設備送來的一定格式的串行數據轉換成 8 位并行數據,等待用戶讀取 SBUF 寄存器,若不及時讀取,SBUF 中的數據有可能被刷新。8051 系列單片機上有通用異步接收/發送器用于串行通信,發送時數據由 TXD 引腳輸出,接收時數據從 RXD 引腳輸入。有兩個緩沖器(Serial Buffer) ,一個作發送緩沖器,另外一個作為接收緩沖器。UART 是可編程的全雙工的串行口。
SBUF是可以直接尋址的專用寄存器。物理上,它對應著兩個寄存器,即一個發送寄存器一個接收寄存器,CPU寫SBUF就是修改發送寄存器;讀SBUF就是讀接收寄存器。接收器是雙緩沖的,以避免在接收下一幀數據之前,CPU未能及時的響應接收器的中斷,沒有把上一幀的數據讀走而產生兩幀數據重疊的問題。對于發送器,為了保持最大的傳輸速率,一般不需要雙緩沖,因為發送時CPU是主動的,不會產生重疊問題。
SCON是一個逐位定義的8位寄存器,用于控制串行通信的方式選擇、接收和發送,指示串口的狀態,SCON即可以字節尋址也可以位尋址,字節地址98H,地址位為98H~9FH。它的各個位定義如下:
SM2在工作方式2和3中是多機通信的使能位。在工作方式0中,SM2必須為0。在工作方式1中,若SM2=1且沒有接收到有效的停止位,則接收中斷標志位RI不會被激活。在工作方式2和3中若SM2=1且接收到的第9位數據(RB8)為0,則接收中斷標志RB8不會被激活,若接收到的第9位數據(RB8)為1,則RI置位。此功能可用于多處理機通信。
REN為允許串行接收位,由軟件置位或清除。置位時允許串行接收,清除時禁止串行接收。
TB8是工作方式2和3要發送的第9位數據。在許多通信協議中該位是奇偶位,可以按需要由軟件置位或清除。在多處理機通信中,該位用于表示是地址幀還是數據幀。
RB8是工作方式2和3中接收到的第9位數據(例如是奇偶位或者地址/數據標識位),在工作方式1中若SM2=0,則RB8是已接收的停止位。在工作方式0中RB8不使用。
TI 為發送中斷標志位,由硬件置位,軟件清除。工作方式0中在發送第8位末尾由硬件置位;在其他工作方式時,在發送停止位開始時由硬件置位。TI=1時,申請中斷。CPU響應中斷后,發送下一幀數據。在任何工作方式中都必須由軟件清除TI。
RI為接收中斷標志位,由硬件置位,軟件清除。工作方式0中在接收第8位末尾由硬件置位;在其他工作方式時,在接收停止位的中間由硬件置位。RI=1時,申請中斷,要求CPU取走數據。但在工作方式1中,SM2=1且未接收到有效的停止位時,不會對RI置位。
在任何工作方式中都必須由軟件清除RI。
系統復位時,SCON的所有位都被清除。
(1) 工作方式0
SM0=0且SM1=0時,串口選擇工作方式0,實質這是一種同步移位寄存器模式。其數據傳輸的波特率固定為Fosc/12,數據由RXD引腳輸入或輸出,同步時鐘由TXD引腳輸出。接收/發送的是8位數據,傳輸是低位在前,幀格式如下:
…….. D0 D1 D2 D3 D4 D5 D6 D7 …….
(2)工作方式1
當SM0=0且SM1=1時,串口選擇工作方式1,其數據傳輸的波特率由定時/計數器T1、T2的溢出速率決定,可通過程序設定。當T2CON寄存器中的RCLK和TCLK置位時,用T2作為發送和接收波特率發生器,而RCLK=TCLK=0時,用T1作為波特率發生器,兩者還可以交叉使用,即發送和接收采用不同的波特率。數據由TXD引腳發送,由RXD引腳接收。發送或接收一幀的數據為10位,即1位起始位(0)、8位數據位(低位在先)和1位停止位(1)。幀格式如下:
起始位0 D0 D1 D2 D3 D4 D5 D6 D7 停止位1
類似于工作方式0,當執行任一條SBUF指令時,就啟動串行數據的發送。在執行寫入SBUF的指令時,也將“1”寫入發送移位寄存器的第9位,并通知發送控制器有發送請求。實際上,發送過程始于內部的16分頻計數器下次滿度翻轉(全“1”變全“0”)后的那幾個機器周期的開始。所以,每位的發送過程與16分頻計數器同步,而不是與“寫SBUF”同步。
(3)方式 2 和方式 3
這兩種方式都是 11 位異步接收/發送方式。他們的操作過程都是完全一樣
的,所不同的是波特率而已。方式 3 波特率同方式 1(定時器 1 作為波特率時鐘發生器) 。
方式 2 和方式 3 的發送起始于任何一條 SBUF 數據裝載指令。當第 9 位數據(TB8)輸出之后,TI 將被置位(TI=1) 。
方式 2 和方式 3 的接收數據前提條件也是 REN 被編程為 1。 在第 9 位數據接收到后, 如果下列條件同時滿足,即 RI=0 且 SM2=0 或者接收到的第 9 位為 1,則將已接受的數據裝入 SBUF 緩沖器和 RB8,并將RI 置位(RI=1)否則接收數據無效。
8051 串行口的不同尋常的特征是包括第 9 位方式。它允許把在串行口通信增加的第 9 位用于標志特殊字節的接收。用這種方式,一個單片機可以和大量的其他單片機對話而不打擾不尋址的單片機,這種多機通信方式必須工作在嚴格的主從方式,由軟件進行分析。
2.2 、LCD1602的原理
2.2.1 LCD1602的概述
液晶顯示的原理是利用液晶的物理特性,通過電壓對其顯示區域進行控制,有電就有顯示。LCD1602是有32個5x7點陣組成的行字符型顯示屏。其操作方法如下:讀寫時序操作
讀狀態RS=L,R/W=H,E=H輸出D0—D7
寫指令RS=L,R/W=L,D0—D7指令碼,E=高脈沖
讀數據RS=H,R/W=H,E=H輸出D0—D7數據
寫數據RS=H,R/W=L,D0—D7數據,E=高脈沖
2.2.2LCD1602的操作時序
寫操作時序圖
2.2.3 LCD1602的基本命令
1、RAM地址映射圖
2、指令碼
1602液晶模塊內部的控制器共有11條控制指令,如表10-14所示:
指令1:清顯示,指令碼01H,光標復位到地址00H位置。指令2:光標復位,光標返回到地址00H。
指令3:光標和顯示模式設置I/D:光標移動方向,高電平右移,低電平左移S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。
指令4:顯示開關控制。D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示C:控制光標的開與關,高電平表示有光標,低電平表示無光標B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。
指令5:光標或顯示移位S/C:高電平時移動顯示的文字,低電平時移動光標。
指令6:功能設置命令DL:高電平時為4位總線,低電平時為8位總線N:低電平時為單行顯示,高電平時雙行顯示F:低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。指令7:字符發生器RAM地址設置。
指令8:DDRAM地址設置。
指令9:讀忙信號和光標地址BF:為忙標志位,高電平表示忙,此時模塊不能接收命令或者數據,如果為低電平表示不忙。
指令10:寫數據。
指令11:讀數據。
2.3、紅外一體化接收頭
2.3.1紅外一體化接收頭的概述
紅外遙控信號是一連串的二進制脈沖碼。為了使其在無線傳輸過程中免受其他紅外信號的干擾,通常都是先將其調制在特定的載波頻率上,然后再經紅外發射二極管發射出去,而紅外線接收裝置則要濾除其他雜波,只接收該特定頻率的信號并將其還原成二進制脈沖碼,也就是解調.
目前,對于這種進行了調制的紅外遙控信號,通常是采用一體化紅外線接收頭進行調解.一體化紅外線接收頭將低噪音放大器,限幅器,帶通濾波器,解調器,,以及整形驅動電路等集成在一起.一體化紅外線接收頭體積小,靈敏度高,外接元件少,抗干擾能力強,使用十分方便。
紅外信號收發系統的典型電路如圖1所示,紅外接收電路通常被廠家集成在一個元件中,成為一體化紅外接收頭。 內部電路包括紅外監測二極管,放大器,限幅器,帶通濾波器,積分電路,比較器等。紅外監測二極管監測到紅外信號,然后把信號送到放大器和限幅器,限幅器把脈沖幅度控制在一定的水平,而不論紅外發射器和接收器的距離遠近。交流 信號進入帶通濾波器,帶通濾波器可以通過30khz到60khz的負載波,通過解調電路和積分電路進入比較器,比較器輸出 高低電平,還原出發射端的信號波形。注意輸出的高低電平和發射端是反相的,這樣的目的是為了提高接收的靈敏度。
紅外接收頭的種類很多,引腳定義也不相同,一般都有三個引腳,包括供電腳,接地和信號輸出腳。根據發射端調制 載波的不同應選用相應解調頻率的接收頭。
紅外接收頭內部放大器的增益很大,很容易引起干擾,因此在接收頭的供電腳上須加上濾波電容,一般在22uf以上。 有的廠家建議在供電腳和電源之間接入330歐電阻,進一步降低電源干擾。
2.3.2紅外一體化接收頭的應用
紅外遙控是以調制的方式發射數據,就是把數據和一定頻率的載波進行“與”操作,這樣既可以提高發射效率又可以降低電源 功耗。
調制載波頻率一般在30khz到60khz之間,大多數使用的是38kHz,占空比1/3的方波,如圖2所示,這是由發射端所使用的 455kHz晶振決定的。在發射端要對晶振進行整數分頻,分頻系數一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。
單片機可以準備接收下面的數據。地址碼由8位二進制組成,共256種.圖中地址碼重發了一次。主要是加強發射機的可靠性.如果兩次地址碼不相同.則說明本幀數據有錯.應丟棄。不同的設備可以擁有不同的地址碼.因此。同種編碼的發射機只要設置地址碼不同,也不會相互干擾。在同一個發射機中.所有按鍵發出的地址碼都是相同的。數據碼為8位,可編碼256種狀態,代表實際所按下的鍵。數據反碼是數據碼的各位求反,通過比較數據碼與數據反碼.可判斷接收到的數據是否正確。如果數據碼與數據反碼之間的關系不滿足相反的關系.則本次遙控接收有誤.數據應丟棄。在同一個發射機上,所有按鍵的數據碼均不相同。
數據格式包括了引導碼、用戶碼、數據碼和數據碼反碼,編碼總占32位。數據反碼是數據碼反相后的編碼,編碼時可用于對數據的糾錯。注意:第二段的用戶碼也可以在遙控應用電路中被設置成第一段用戶碼的反碼。
用戶碼或數據碼中的每一個位可以是位‘1’,也可以是位‘0’。區分‘0’和‘1’是利用脈沖的時間間隔來區分,這種編碼方式稱為脈沖位置調制方式,英文簡寫PPM。
以接收TC9012遙控器編碼為例,解碼方法如下:
設外部中斷為下降沿中斷,定時器0(或者1)為16位計時器.初始值均為0
(2)第一次進入遙控中斷后,開始計時。
(3)從第二次進入遙控中斷起,先停止計時。并將計時值保存后,再重新計時。如果計時值等于前導碼的時間,設立前導碼標志。準備接收下面的一幀遙控數據,如果計時值不等于前導碼的時間,但前面已接收到前導碼,則判斷是遙控數據的0還是1。
(4)繼續接收下面的地址碼、數據碼、數據反碼。
(5)當接收到32位數據時,說明一幀數據接收完畢。此時可停止定時器的計時,并判斷本次接收是否有效.如果兩次地址碼相同且等于本系統的地址,數據碼與數據反碼之和等于0FFH,則接收的本幀數據碼有效。否則丟棄本次接收到的數據。
(6)接收完畢,初始化本次接收的數據,準備下一次遙控接收。
三、程序設計
紅外遙控鎖系統主要由單片機通過紅外通信控制,當其完成紅外信號,讀取數據,,其數據的傳輸根據協議的內容,發生錯誤時,有單片機發出警報,超出一定次數就把鍵盤鎖死報警。紅外遙控鎖系統程序需要完成以下的功能:
1、矩陣鍵盤,可以設置密碼開鎖及密碼重置;
3、遙控器輸入密碼開鎖及密碼重置;
5、密碼輸入輸入信息或密碼輸入錯誤報警及鍵盤鎖死;
6、用1602液晶顯示功能狀態。
矩陣鍵盤設置程序流程圖如下:
四、過程分享
PCB圖
原理圖
程序代碼:
//(智能存錢管) //晶振12Mkz
//功能:該系統具有存錢取錢功能,存錢時需要輸入密碼 密碼為000000
//密碼可修改 萬能密碼為:131420 改密碼可初始化密碼為:000000 密碼與存錢數有掉電保存功能
#include<reg52.h> //頭文件
#include<intrins.h>
#define uchar unsigned char //宏定義
#define uint unsigned int
#define LCD1602_dat P0
uchar irbyte[4];
uchar irtime,irflag,bitnum,irdateok;
uchar irdate[33];
sbit LCD1602_rs=P1^0;
sbit LCD1602_rw=P1^1;
sbit LCD1602_e=P1^2;
sbit led=P2^0;
sbit beep=P2^7;
sbit Scl=P3^5;//24C02串行時鐘
sbit Sda=P3^4;//24C02串行數據
uchar ptem,mm[6],mm_n1[6],mm_n2[6],n,j;
uchar step,ms,time,cw;
uchar zt[2];
bit cq,beep1,beep2;
void mDelay(uint t) //延時
{
uchar i;
while(t--)
{
for(i=0;i<125;i++)
{;}
}
}
void Nop(void) //空操作
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*起始條件*/
void Start(void)
{
Sda=1;
Scl=1;
Nop();
Sda=0;
Nop();
}
/*停止條件*/
void Stop(void)
{
Sda=0;
Scl=1;
Nop();
Sda=1;
Nop();
}
/*應答位*/
void Ack(void)
{
Sda=0;
Nop();
Scl=1;
Nop();
Scl=0;
}
/*反向應答位*/
void NoAck(void)
{
Sda=1;
Nop();
Scl=1;
Nop();
Scl=0;
}
/*發送數據子程序,Data為要求發送的數據*/
void Send(uchar Data)
{
uchar BitCounter=8;
uchar temp;
do
{
temp=Data;
Scl=0;
Nop();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*讀一字節的數據,并返回該字節值*/
uchar Read(void)
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
Sda=1;
do{
Scl=0;
Nop();
Scl=1;
Nop();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Send(*(PData+i));
Ack();
Stop();
mDelay(20);
}
}
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl=0;
NoAck();
Stop();
}
}
void delay(uint T) //延時函數
{
while(T--);
}
void qing() // 清楚數據
{
uint i;
for(i=0;i<33;i++)
{
irdate[i]=0;
}
}
void deal_with() //解碼處理部分
{
uchar i,j,k,temp;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
temp=temp>>1;
if(irdate[k]>7)
{
temp=temp|0x80;
}
k++;
}
irbyte[j]=temp;
}
}
void LCD1602_write(uchar order,dat) //1602 一個字節 處理
{
LCD1602_e=0;
LCD1602_rs=order;
LCD1602_dat=dat;
LCD1602_rw=0;
LCD1602_e=1;
delay(1);
LCD1602_e=0;
}
void LCD1602_writebyte(uchar *prointer) //1602 字符串 處理
{
while(*prointer!=\'\\0\')
{
LCD1602_write(1,*prointer);
prointer++;
}
}
void LCD1602_cls() //1602 初始化
{
LCD1602_write(0,0x01); //1602 清屏 指令
delay(1500);
LCD1602_write(0,0x38); // 功能設置 8位、5*7點陣
delay(1500);
LCD1602_write(0,0x0c); //設置 光標 不顯示開關、不顯示光標、字符不閃爍
LCD1602_write(0,0x06);
LCD1602_write(0,0xd0);
delay(1500);
}
uchar key_fs() //矩陣按鍵返回按碼
{
uchar fs=255;
P1=0x0f;
if(P1!=0x0f)
{
delay(800);
P1=0x0f;
if(P1!=0x0f)
{
ptem=P1;
P1=0xf0;
ptem=ptem|P1;
switch (ptem)
{
case 0xe7:
fs=1;
break;
case 0xd7:
fs=2;
break;
case 0xb7:
fs=3;
break;
case 0x77:
fs=10;
break;
case 0xeb:
fs=4;
break;
case 0xdb:
fs=5;
break;
case 0xbb:
fs=6;
break;
case 0x7b:
fs=11;
break;
case 0xed:
fs=7;
break;
case 0xdd:
fs=8;
break;
case 0xbd:
fs=9;
break;
case 0x7d:
fs=12;
break;
case 0xee:
fs=13;
break;
case 0xde:
fs=0;
break;
case 0xbe:
fs=14;
break;
case 0x7e:
fs=15;
break;
}
P1=0x0f;
while(P1!=0x0f)
{
P1=0x0f;
}
}
}
return(fs);
}
void show() //顯示程序
{
LCD1602_write(0,0x80);
LCD1602_writebyte("===Coded Lock===");
}
unsigned char coding_1(unsigned char m)
{
unsigned char k;
switch(m)
{
case (0x0c): k=1;break;
case (0x18): k=2;break;
case (0x5e): k=3;break;
case (0x08): k=4;break;
case (0x1c): k=5;break;
case (0x5a): k=6;break;
case (0x42): k=7;break;
case (0x52): k=8;break;
case (0x4a): k=9;break;
case (0x09): k=13;break;
case (0x16): k=0;break;
case (0x19): k=14;break;
case (0x0d): k=15;break;
case (0x07): k=12;break;
}
return(k);
}
void key() //按鍵鍵碼處理程序
{
uchar fz=255,i;
if(irbyte[2]!=0)
{
fz=coding_1(irbyte[2]);
do
{
qing();
deal_with();
}while(irbyte[2]!=0);
}else
{
fz=key_fs();
}
if(fz!=255)
{
beep2=1;beep=0;
delay(10000);
beep2=0;beep=1;
}
if(step==0)
{
if(fz<10&&cq==0&&n<6)
{
if(n==0)
{
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc0);
LCD1602_writebyte("Pass:");
}
mm_n1[n]=fz;
n++;
LCD1602_write(0,0xc5);
for(i=0;i<n;i++)
{
LCD1602_writebyte("*");
}
}
}else if(step==1|step==2)
{
if(fz<10&&n<6)
{
mm_n1[n]=fz;
n++;
LCD1602_write(0,0xc9);
for(i=0;i<n;i++)
{
LCD1602_writebyte("*");
}
}
}else if(step==3)
{
if(fz<10&&n<6)
{
mm_n2[n]=fz;
n++;
LCD1602_write(0,0xc6);
for(i=0;i<n;i++)
{
LCD1602_writebyte("*");
}
}
}
switch(fz)
{
case 11:
break;
case 12:
if(n!=0)
{
n--;
if(step==0)
{
mm_n1[n+1]=0xff;
LCD1602_write(0,0xc5);
for(i=0;i<n;i++)
{
LCD1602_writebyte("*");
}
for(i=0;i<6-n;i++)
{
LCD1602_writebyte(" ");
}
}else if(step==1|step==2)
{
mm_n1[n+1]=0xff;
LCD1602_write(0,0xc9);
for(i=0;i<n;i++)
{
LCD1602_writebyte("*");
}
for(i=0;i<6-n;i++)
{
LCD1602_writebyte(" ");
}
}else if(step==3)
{
mm_n2[n+1]=0xff;
LCD1602_write(0,0xc6);
for(i=0;i<n;i++)
{
LCD1602_writebyte("*");
}
for(i=0;i<6-n;i++)
{
LCD1602_writebyte(" ");
}
}
}
break;
case 13:
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc0);
LCD1602_writebyte("Password");
step=0;
cq=0;
n=0;
led=0;
zt[0]=\'N\';
zt[1]=\'O\';
WrToROM(zt,10,2);
break;
case 14:
if(step==0)
{
if(n==6)
{
n=0;
for(i=0;i<6;i++)
{
if(mm[i]!=mm_n1[i])
{
break;
}
}
if(i==6)
{
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc5);
LCD1602_writebyte("Open");
led=1;
zt[0]=\'O\';
zt[1]=\'K\';
WrToROM(zt,10,2);
cq=1;
cw=0;
}else if(mm_n1[0]==1&&mm_n1[1]==3&&mm_n1[2]==1&&mm_n1[3]==4&&mm_n1[4]==2&&mm_n1[5]==0)
{
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc3);
LCD1602_writebyte("Pass init");
for(j=0;j<6;j++)
{
mm[j]=0;
}
cw=0;
WrToROM(mm,0,6);
}else
{
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc5);
LCD1602_writebyte("Error");
time=3;
cw++;
if(cw>2)
{
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc2);
LCD1602_writebyte("Locked state");
while(1)
{
beep1=1;
cw=3;
time=5;
}
}
}
}else
{
n=0;
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc5);
LCD1602_writebyte("Error");
time=3;
cw++;
if(cw>2)
{
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc2);
LCD1602_writebyte("Locked state");
while(1)
{
beep1=1;
cw=3;
time=5;
}
}
}
}else if(step==1)
{
if(n==6)
{
n=0;
for(i=0;i<6;i++)
{
if(mm[i]!=mm_n1[i])
{
break;
}
}
if(i==6)
{
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc0);
LCD1602_writebyte("New pass:");
step=2;
}else
{
step=0;
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc5);
LCD1602_writebyte("Error");
}
}else
{
step=0;
n=0;
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc5);
LCD1602_writebyte("Error");
}
}else if(step==2)
{
if(n==6)
{
n=0;
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc0);
LCD1602_writebyte("Again:");
step=3;
}else
{
step=0;
n=0;
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc5);
LCD1602_writebyte("Error");
}
}else
{
step=0;
if(n==6)
{
n=0;
for(i=0;i<6;i++)
{
if(mm_n1[i]!=mm_n2[i])
{
break;
}
}
if(i==6)
{
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc4);
LCD1602_writebyte("Pass OK");
for(i=0;i<6;i++)
{
mm[i]=mm_n1[i];
}
WrToROM(mm,0,6);
}else
{
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc5);
LCD1602_writebyte("Error");
}
}else
{
n=0;
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc5);
LCD1602_writebyte("Error");
}
}
break;
case 15:
step=1;
n=0;
LCD1602_write(0,0xc0);
LCD1602_writebyte(" ");
LCD1602_write(0,0xc0);
LCD1602_writebyte("Old pass:");
break;
}
}
void main() //主程序
{
TMOD=0x12;
TH0=0;
TL0=0;
TH1=0x3c;
TL1=0xb0;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EX0=1;
IT0=1;
LCD1602_cls();
RdFromROM(zt,10,2);
if(zt[0]==\'O\'&&zt[1]==\'K\')
{
led=1;
}else
{
led=0;
}
show();
LCD1602_write(0,0xc0);
LCD1602_writebyte("Password");
RdFromROM(mm,0,6);
while(1)
{
if(irdateok==1) //解碼完成處理
{
irdateok=0;
deal_with();
}
key();
}
}
void time3_interrupt()interrupt 3
{
TH1=0x3c;
TL1=0xb0;
ms++;
if(ms%3==0)
{
if(beep2==0)
{
if(beep1==1)
{
beep=!beep;
}else
{
beep=1;
}
}
}
if(ms>19)
{
ms=0;
if(time!=0)
{
time--;
beep1=1;
}
else beep1=0;
}
}
//==================================定時器0中斷函數,用于數碼管掃描顯示====================================
void time0_interrupt()interrupt 1
{
irtime++;
}
void int0() interrupt 0 //遙控器解碼
{
if(irflag==1)
{
if(irtime>32)
{
bitnum=0;
}
irdate[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irdateok=1;
}
}
else
{
irflag=1;
irtime=0;
}
}
以上就是關于刷卡機應答碼c5,基于紅外通信的單片機綜合編程控制技術實現遙控密碼鎖功能的知識,后面我們會繼續為大家整理關于刷卡機應答碼c5的知識,希望能夠幫助到大家!

轉載請帶上網址:http://www.yadikedp.com/shuaka/60226.html