久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 22592|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的電子鎖設(shè)計(jì) word格式論文下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
實(shí)物圖:


word格式的完整論文下載(可編輯)http://www.zg4o1577.cn/bbs/dpj-76487-1.html



下面是部分內(nèi)容預(yù)覽:



基于51單片機(jī)的電子鎖設(shè)計(jì)


學(xué)院名稱:          電氣信息工程學(xué)院         
專    業(yè):    電子信息工程   
班    級(jí):
姓    名:
學(xué)    號(hào):
指導(dǎo)教師:


摘要:隨著電子產(chǎn)品向智能化和微型化的不斷發(fā)展,單片機(jī)已成為電子產(chǎn)品研制和開發(fā)中首選的控制器。隨著人們生活水平的提高,如何實(shí)現(xiàn)家庭防盜這一問(wèn)題也變的尤其的突出,傳統(tǒng)的機(jī)械鎖由于其構(gòu)造的簡(jiǎn)單,安全性能低,無(wú)法滿足人們的需要。本設(shè)計(jì)采用單片機(jī)為主控芯片,結(jié)合外圍電路,組成電子密碼鎖,用戶想要打開鎖,必先通過(guò)提供的鍵盤輸入正確的密碼才能將鎖打開,密碼輸入錯(cuò)誤有提示,為了提高安全性,當(dāng)密碼輸入錯(cuò)誤三次將報(bào)警。經(jīng)實(shí)驗(yàn)證明,該密碼鎖具有設(shè)計(jì)方法合理,簡(jiǎn)單易行,成本低,安全實(shí)用等特點(diǎn),符合住宅、辦公室用鎖要求,具有推廣價(jià)值。

關(guān)鍵詞:電子密碼鎖,89C51,鍵盤接口,LCD1602顯示

Controller system design of digital lock

Abstract:With the continuous development of electronic products to intelligent and miniaturization, microcontroller has become electronic product development and the development of the preferred controller. As people living standard rise, how to realize the family anti-theft this problem is particularly prominent, the traditional mechanical lock because of its simple structure, safety performance is low, cannot satisfy the needs of the people. This design USES the single chip microcomputer as main control chip, combining with the peripheral circuit, composed of electronic trick lock, the user wants to play the lock, must first by providing keyboard input the correct password to open the lock, password input error, in order to improve the security, when the password input error three times will report to the police. Proved by the experiment, the design method of the combination lock is reasonable, simple, low cost, safe and practical characteristics, conform to the requirements of the residential, office use, locks, has promotion value.

Keywords:electronic code lock, 89C51, keyboard interface, LCD1602 display            



目  錄

前言              1

第1章  緒論              2

1.1 課題的意義和目的              2

1.2 課題的研究?jī)?nèi)容              2

1.3 課題的任務(wù)要求              2

第2章  系統(tǒng)方案設(shè)計(jì)              4

2.1系統(tǒng)方案設(shè)計(jì)              4

2.2 方案的選擇與論證              5

2.2.1 方案的比較與論證              5

2.2.2 系統(tǒng)結(jié)構(gòu)實(shí)現(xiàn)框圖設(shè)計(jì)              5

第3章  系統(tǒng)各模塊的硬件設(shè)計(jì)              7

3.1 電源模塊設(shè)計(jì)              7

3.2 掉電存儲(chǔ)模塊設(shè)計(jì)              7

3.2.1 AT24C02介紹              8

3.2.2掉電存儲(chǔ)電路設(shè)計(jì)              9

3.3 單片機(jī)控制模塊設(shè)計(jì)              9

3.3.1 單片機(jī)時(shí)鐘電路設(shè)計(jì)              10

3.3.2 單片機(jī)復(fù)位電路設(shè)計(jì)              11

3.4 按鍵模塊設(shè)計(jì)              11

3.5 顯示模塊設(shè)計(jì)              12

3.6 蜂鳴器模塊設(shè)計(jì)              14

第4章  系統(tǒng)軟件設(shè)計(jì)              15

4.1 系統(tǒng)軟件設(shè)計(jì)總體思路              15

4.2 系統(tǒng)軟件主程序流程圖設(shè)計(jì)              15

4.3 系統(tǒng)軟件子程序設(shè)計(jì)              16

4.3.1按鍵功能程序設(shè)計(jì)              16

4.3.2 密碼設(shè)置程序設(shè)計(jì)              16

4.3.3 開鎖程序設(shè)計(jì)              17

第5章  系統(tǒng)調(diào)試與數(shù)據(jù)分析              19

5.1 硬件電路的制作和調(diào)試              19

5.1.1 硬件電路的制作              19

5.1.2 硬件電路的調(diào)試              19

5.1.3 故障方析              20

5.2 軟硬件功能分析              20

5.3 測(cè)試結(jié)果分析              20

第6章  總結(jié)與展望              22

參考文獻(xiàn)              23

致謝              24

附錄1  電路原理圖              25

附錄2  程序              26

附錄3  實(shí)物圖              42

附錄4  元器件清單              43






《綜合工程實(shí)踐報(bào)告》
前言

目前,最常用的鎖是20世紀(jì)50年代意大利人設(shè)計(jì)的機(jī)械鎖,其機(jī)構(gòu)簡(jiǎn)單、使用方便、價(jià)格便宜。但在使用中暴露了很多缺點(diǎn):一是機(jī)械鎖是靠金屬制成的鑰匙上的不同齒形與鎖芯的配合來(lái)工作的。據(jù)統(tǒng)計(jì),每4000把鎖中就有兩把鎖的鑰匙齒牙相同或類似,故安全性低。二是鑰匙一旦丟失,無(wú)論誰(shuí)撿到都可以將鎖打開。三是機(jī)械鎖的材料大多為黃銅,質(zhì)地較軟,容易損壞。四是機(jī)械鎖鑰匙易于復(fù)制,不適于諸如賓館等公共場(chǎng)所使用。由于人們對(duì)鎖的安全性,方便性等性能有更高的要求,許多智能鎖(如指紋辨別、IC卡識(shí)別)也相繼問(wèn)世,但這類產(chǎn)品的特點(diǎn)是針對(duì)特定指紋或有效卡,但能適用于保密要求高且僅供個(gè)別人使用的箱、柜、房間,其成本一般較高,在一定程度上限制了這類產(chǎn)品的普及和推廣。

電子密碼鎖是一種通過(guò)密碼輸入來(lái)控制電路或是芯片工作,控制機(jī)械開關(guān)的閉合,完成開鎖、閉鎖任務(wù)的電子產(chǎn)品。它的種類很多,有簡(jiǎn)易的電路產(chǎn)品,也有基于芯片的性價(jià)比較高的產(chǎn)品。現(xiàn)在應(yīng)用較廣的電子密碼鎖是以芯片為核心,通過(guò)編程來(lái)實(shí)現(xiàn)的。其性能和安全性已大大超過(guò)了機(jī)械鎖,特點(diǎn)如下:

1.保密性好,編碼量多,遠(yuǎn)遠(yuǎn)大于彈子鎖。隨機(jī)開鎖成功率幾乎為零。
2.密碼可變。 用戶可以經(jīng)常更改密碼,防止密碼被盜,同時(shí)也可以避免因人員的更替而使鎖的密級(jí)下降。
3.誤碼輸入保護(hù)。當(dāng)輸入密碼多次錯(cuò)誤時(shí),報(bào)警系統(tǒng)自動(dòng)啟動(dòng)。



第1章  緒論

1.1 課題的意義和目的

隨著人們生活水平的提高,電子密碼防盜鎖作為防盜衛(wèi)士的作用日趨重要。電子密碼防盜鎖用密碼代替鑰匙,不但省去了佩戴鑰匙的煩惱,也從根本上解決了普通門鎖保密性差的缺點(diǎn)。根據(jù)國(guó)外的統(tǒng)計(jì)資料顯示,裝有電子防盜裝置的商業(yè)區(qū)或居民區(qū)盜竊犯罪率平均下降30%左右。目前西方發(fā)達(dá)國(guó)家已經(jīng)大量地應(yīng)用這種智能門禁系統(tǒng),但在我國(guó)的應(yīng)用還不廣泛,成本還很高。鍵盤式電子密碼在鍵盤上輸入,與打電話差不多,因而易于掌握,其突出優(yōu)點(diǎn)是“密碼”是記在被授權(quán)人腦子里的數(shù)字和字符,既準(zhǔn)確又可靠,不會(huì)丟失,難以被竊。

本設(shè)計(jì)系統(tǒng)主機(jī)采用8051單片機(jī),MCS-51單片機(jī)的程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器的地址空間是相互獨(dú)立的,而且程序存儲(chǔ)器一般為ROM或EPROM,只能讀出不能寫入。擴(kuò)展用的程序存儲(chǔ)器芯片大多采用EPROM芯片,最大可擴(kuò)展到64K字節(jié)。該設(shè)計(jì)使用矩陣鍵盤輸入,LCD1602顯示輸入密碼, AT24C01存儲(chǔ)器存儲(chǔ)密碼。密碼正確,二極管發(fā)光。輸入密碼錯(cuò)誤次數(shù)超過(guò)三次則系統(tǒng)報(bào)警,蜂鳴器發(fā)出報(bào)警音。

1.2 課題的研究?jī)?nèi)容

本設(shè)計(jì)采用單片機(jī)為主控芯片,結(jié)合外圍電路,組成電子密碼鎖,用戶想要打開鎖,必先通過(guò)提供的鍵盤輸入正確的密碼才能將鎖打開,密碼輸入錯(cuò)誤有提示,為了提高安全性,當(dāng)密碼輸入錯(cuò)誤三次將報(bào)警。密碼可以由用戶自己修改設(shè)定,鎖打開后才能修改密碼。修改密碼之前必須再次輸入密碼,在輸入新密碼時(shí)候需要二次確認(rèn),以防止誤操作。

1.3 課題的任務(wù)要求

主要完成以下功能:

1、設(shè)置6位密碼,密碼通過(guò)鍵盤輸入,若密碼正確,則將鎖打開。

2、密碼可以由用戶自己修改設(shè)定(只支持6位密碼),鎖打開后才能修改密碼。修改密碼之前必須再次輸入密碼,在輸入新密碼時(shí)候需要二次確認(rèn),以防止誤操作。

3、報(bào)警、鎖定鍵盤功能。密碼輸入錯(cuò)誤顯示器會(huì)出現(xiàn)錯(cuò)誤提示,若密碼輸入錯(cuò)誤次數(shù)超過(guò)3次,蜂鳴器報(bào)警并且鎖定鍵盤。

4、AT24C02保存密碼,支持復(fù)位保存,掉電保存功能。




第2章  系統(tǒng)方案設(shè)計(jì)

2.1系統(tǒng)方案設(shè)計(jì)

本設(shè)計(jì)采用STC89C52單片機(jī)為主控芯片,結(jié)合外圍電路矩陣鍵盤、液晶顯示器LCD1602和密碼存儲(chǔ)AT24C02等部分組成。其中矩陣鍵盤用于輸入數(shù)字密碼和進(jìn)行各種功能的實(shí)現(xiàn)。由用戶通過(guò)連接單片機(jī)的矩陣鍵盤輸入密碼,后經(jīng)過(guò)單片機(jī)對(duì)用戶輸入的密碼與自己保存的密碼進(jìn)行對(duì)比,從而判斷密碼是否正確,然后控制引腳的高低電平傳到開鎖電路或者報(bào)警電路控制開鎖還是報(bào)警,有以下幾種方案可供選擇。

方案一:選用單片機(jī)作為系統(tǒng)的核心部件,實(shí)現(xiàn)控制與處理的功能。單片機(jī)具有資源豐富、速度快、編程容易等優(yōu)點(diǎn)。該方案的設(shè)計(jì)框圖如圖1所示:

圖1 方案一設(shè)計(jì)框圖

方案二:采用數(shù)字電路控制,用以74LS112雙JK觸發(fā)器構(gòu)成的數(shù)字邏輯電路作為密碼鎖的核心控制,將密碼保存在JK觸發(fā)器中,與輸入密碼通過(guò)比較器比較,判斷結(jié)果是否相符合。該方案的設(shè)計(jì)框圖如圖2所示。

圖2 方案二設(shè)計(jì)框圖

2.2 方案的選擇與論證

2.2.1 方案的比較與論證

比較以上兩個(gè)方案,在同樣能達(dá)到技術(shù)指標(biāo)要求的前提下。采用數(shù)字電路設(shè)計(jì)的方案好處就是設(shè)計(jì)簡(jiǎn)單,但控制的準(zhǔn)確性和靈活性差,故不采用。利用單片機(jī)內(nèi)部的隨機(jī)存儲(chǔ)器(RAM)和只讀存儲(chǔ)器(ROM)及其引腳資源,外接液晶顯示(LCD),鍵盤輸入等實(shí)現(xiàn)數(shù)據(jù)的處理傳輸和顯示功能,基本上能實(shí)現(xiàn)設(shè)計(jì)指標(biāo)。因此綜合考慮,本系統(tǒng)采用方案一。

2.2.2 系統(tǒng)結(jié)構(gòu)實(shí)現(xiàn)框圖設(shè)計(jì)

設(shè)計(jì)采用單片機(jī)為主控芯片,結(jié)合外圍電路,組成電子密碼控制系統(tǒng),密碼鎖共6位密碼,每位的取值范圍為0~9,用戶可以自行設(shè)定和修改密碼,每個(gè)密碼按鍵都有聲提示。用戶想要打開鎖,必先通過(guò)提供的鍵盤輸入正確的密碼才可以,密碼輸入錯(cuò)誤有提示,為了提高安全性,當(dāng)密碼輸入錯(cuò)誤三次將報(bào)警,期間輸入密碼無(wú)效,以防竊賊多次試探密碼。方案具體如下:

(1)矩陣鍵盤:矩陣鍵盤的工作過(guò)程可分為兩步:第一步是CPU首先檢測(cè)鍵盤上是否有鍵按下;第二步是識(shí)別哪一個(gè)鍵按下。

(2)復(fù)位電路:STC89C51的復(fù)位輸入引腳RST為單片機(jī)提供初始化的手段,可以使程序從指定處開始執(zhí)行,在STC89C51的時(shí)鐘電路工作后,只要RST引腳上出現(xiàn)兩個(gè)機(jī)器周期以上的高電平時(shí),即可產(chǎn)生復(fù)位操作。只要RST保持高電平,則單片機(jī)循環(huán)復(fù)位。只要當(dāng)RST有高電平變?yōu)榈碗娖揭院螅瑔纹瑱C(jī)才從0000H地址開始執(zhí)行程序,本系統(tǒng)采用按鍵復(fù)位方式的復(fù)位電路,當(dāng)復(fù)位鍵按下,系統(tǒng)自動(dòng)切換到初始狀態(tài)。

(3)時(shí)鐘電路:STC89C51的時(shí)鐘可以有兩種方式,一種是內(nèi)部方式,利用芯片內(nèi)部的振蕩電路;另一種為外部方式。采用內(nèi)部振蕩方式。STC89C51內(nèi)部有一個(gè)用于構(gòu)成振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端,這個(gè)放大器作為反饋元件的片外晶體和陶瓷諧振器一起構(gòu)成一個(gè)自激振動(dòng)器。

(4)電源模塊:由于整個(gè)系統(tǒng)采用的電源電壓只需+5V,故利用PC機(jī)的USB串口直接供電。

(5)系統(tǒng)控制模塊:采用單片機(jī)控制芯片,它是一種低功耗、高性能的微型控制器,可以接受檢測(cè)信號(hào),外接口亦能方便的輸出控制信號(hào)。

(6)LCD顯示模塊:該模塊主要用來(lái)顯示開鎖提示。LCD的數(shù)據(jù)端通過(guò)1K歐姆的上拉電阻接到單片機(jī)P0口。

(7)掉電存儲(chǔ)模塊:采用的是AT24C02,SCL移位脈沖口和SDA數(shù)據(jù)地址口接到單片機(jī)I/O口。



第3章  系統(tǒng)各模塊的硬件設(shè)計(jì)

本設(shè)計(jì)主要由單片機(jī)、矩陣鍵盤、液晶顯示器和密碼存儲(chǔ)等部分組成。其中矩陣鍵盤用于輸入數(shù)字密碼和進(jìn)行各種功能的實(shí)現(xiàn)。由用戶通過(guò)連接單片機(jī)的矩陣鍵盤輸入密碼,后經(jīng)過(guò)單片機(jī)對(duì)用戶輸入的密碼與自己保存的密碼進(jìn)行對(duì)比,從而判斷密碼是否正確,然后控制引腳的高低電平傳到開鎖電路或者報(bào)警電路控制開鎖還是報(bào)警。硬件部分由電源輸入部分、鍵盤輸入部分、復(fù)位部分、晶振部分、顯示部分、報(bào)警部分組成。

3.1 電源模塊設(shè)計(jì)

STC單片機(jī)USB下載線原理圖,也可以用USB口和電腦進(jìn)行串口通信PL-2303hx的USB轉(zhuǎn)TTL電平串口的電路。如圖3-1所示。

  • 電腦的原有的串口,叫作RS232接口,這是一種cmos接口,接口電壓從-15v到+15v之間,而單片機(jī)C51都是TTL電平,電平電壓只用0v或是5v兩種。用這個(gè)電腦做出來(lái)的就是單片機(jī)上用的TTL電平,所以,不要再接MAX232芯片了。這是它的一大好處。
  • 電路可以提取出USB接口的+5v電壓,正好用于C51單片機(jī)的使用,非常方便。另外PL-2303hx還能對(duì)外提供一個(gè)+3.3v的電壓,這個(gè)電壓,對(duì)于AVR單片機(jī),非常合適。

圖3-1  USB-TTL下載器原理圖

3.2 掉電存儲(chǔ)模塊設(shè)計(jì)

3.2.1 AT24C02介紹

AT24C02是美國(guó)Atmel公司的低功耗CMOS型E2PROM,內(nèi)含256×8位存儲(chǔ)空間,具有工作電壓寬(2.5~5.5 V)、擦寫次數(shù)多(大于10000次)、寫入速度快(小于10 ms)、抗干擾能力強(qiáng)、數(shù)據(jù)不易丟失、體積小等特點(diǎn)。而且他是采用了I2C總線式進(jìn)行數(shù)據(jù)讀寫的串行器件,占用很少的資源和I/O線,并且支持在線編程,進(jìn)行數(shù)據(jù)實(shí)時(shí)的存取十分方便。AT24C02中帶有的片內(nèi)地址寄存器。每寫入或讀出一個(gè)數(shù)據(jù)字節(jié)后,該地址寄存器自動(dòng)加1,以實(shí)現(xiàn)對(duì)下一個(gè)存儲(chǔ)單元的讀寫。所有字節(jié)均以單一操作方式讀取。為降低總的寫入時(shí)間,一次操作可寫入多達(dá)8個(gè)字節(jié)的數(shù)據(jù)。I2C總線是一種用于IC器件之間連接的二線制總線。他通過(guò)SDA(串行數(shù)據(jù)線)及SCL(串行時(shí)鐘線)兩根線在連到總線上的器件之間傳送信息,并根據(jù)地址識(shí)別每個(gè)器件。AT24C02正是運(yùn)用了I2C規(guī)程,使用主/從機(jī)雙向通信,主機(jī)(通常為單片機(jī))和從機(jī)(AT24C02)均可工作于接收器和發(fā)送器狀態(tài)。主機(jī)產(chǎn)生串行時(shí)鐘信號(hào)(通過(guò)SCL引腳)并發(fā)出控制字,控制總線的傳送方向,并產(chǎn)生開始和停止的條件。無(wú)論是主機(jī)還是從機(jī),接收到一個(gè)字節(jié)后必須發(fā)出一個(gè)確認(rèn)信號(hào)ACK。AT24C02的控制字由8位二進(jìn)制數(shù)構(gòu)成,在開始信號(hào)發(fā)出以后,主機(jī)便會(huì)發(fā)出控制字,以選擇從機(jī)并控制總線傳送的方向。其電路如圖3-2-1所示。


SCL 為串行時(shí)鐘:串行時(shí)鐘輸入管腳用于產(chǎn)生器件所有數(shù)據(jù)發(fā)送或接收的時(shí)鐘這是一個(gè)輸入管腳。

SDL 為串行數(shù)據(jù)/地址:雙向串行數(shù)據(jù)/地址管腳用于器件所有數(shù)據(jù)的發(fā)送或接收SDL,是一個(gè)開漏輸出管腳可與其它開漏輸出或集電極開路輸出進(jìn)行線或。

A0、A1、A2 為器件地址輸入端:當(dāng)使用24C02 時(shí)最大可級(jí)聯(lián)8個(gè)器件,如果只有一個(gè)24C02被總線尋址,這三個(gè)地址輸入腳A0、A1、A2可懸空或連接到Vss。

WP為寫保護(hù): 如果WP 管腳連接到Vcc 所有的內(nèi)容都被寫保護(hù)只能讀當(dāng)WP, 管腳連接到Vss 或懸空,允許器件進(jìn)行正常的讀/寫操作。

3.2.2掉電存儲(chǔ)電路設(shè)計(jì)

采用AT24C02設(shè)計(jì)的掉電存儲(chǔ)電路如圖3-2-2所示。圖中R是上拉電阻,其作用是減少AT24C02的靜態(tài)功耗,由于AT24C02的數(shù)據(jù)線和地址線是復(fù)用的,采用串口的方式傳送數(shù)據(jù),所以只用兩根線SCL(移位脈沖)和SDA(數(shù)據(jù)/地址)與單片機(jī)傳送數(shù)據(jù)。

每當(dāng)設(shè)定一次密碼,系統(tǒng)就自動(dòng)調(diào)用存儲(chǔ)程序,將信息保存在芯片內(nèi);當(dāng)系統(tǒng)重新上電的時(shí)候,自動(dòng)調(diào)用讀存儲(chǔ)器程序,將存儲(chǔ)器內(nèi)的密碼等信息,讀到緩存單元中,供主程序使用。


3.3 單片機(jī)控制模塊設(shè)計(jì)

單片機(jī)是由運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備以及輸出設(shè)備共五個(gè)基本部分組成的。單片機(jī)是把包括運(yùn)算器、控制器、少量的存儲(chǔ)器、最基本的輸入輸出口電路、串行口電路、中斷和定時(shí)電路等都集成在一個(gè)尺寸有限的芯片上。

通常,單片機(jī)由單個(gè)集成電路芯片構(gòu)成,內(nèi)部包含有計(jì)算機(jī)的基本功能部件:中央處理器、存儲(chǔ)器和I/O接口電路等。因此,單片機(jī)只需要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個(gè)單片機(jī)控制系統(tǒng)。

在STC89C52中有四個(gè)雙向I/O端口P0 ~ P3口,每個(gè)端口都是由鎖存器、輸出驅(qū)動(dòng)器、輸入緩沖器組成。當(dāng)CPU控制系統(tǒng)與外部設(shè)備交換信息時(shí),都是通過(guò)端口鎖存器進(jìn)行的。四個(gè)I/O端口都可作輸出輸入使用,其中P0和P2口通常用于對(duì)外部存儲(chǔ)器的訪問(wèn)。

接通鎖存器時(shí),P0口作為雙向I/O使用,如P0口的鎖存器的值為1,使輸出驅(qū)動(dòng)器中的場(chǎng)效應(yīng)管截止,引腳空,此時(shí)端口可作高阻輸入。鎖存器的值為0時(shí),下面的場(chǎng)效應(yīng)管導(dǎo)通,輸出為0。P0口作為地址/數(shù)據(jù)總線口使用時(shí),由“控制”線控制將電子開關(guān)接通至“地址/數(shù)據(jù)”端,分別輸出擴(kuò)展外存的低8位地址A0 ~ A7和數(shù)據(jù)D0 ~D7。一般情況下,當(dāng)P0口作輸入輸出線使用時(shí),都要外接拉高電阻。

在P1、P2、P3端口內(nèi),都接有內(nèi)部上拉電阻,此上拉電阻分為固定部分和附加部分,當(dāng)端口的狀態(tài)要從0變?yōu)?時(shí),在發(fā)生變化的哪個(gè)機(jī)器周期的S1P1和S1P2接通附加的拉高電路以增加變化的速度,否則這個(gè)狀態(tài)的變化將十分緩慢。附加的拉高電路允許通過(guò)的電流比普通的上拉電阻大100倍。

STC89C52有40條引腳,分為端口線、電源線和控制線三類。如圖3-3為STC89C52的引腳結(jié)構(gòu)圖:

圖3-3  89C52引腳圖

3.3.1 單片機(jī)時(shí)鐘電路設(shè)計(jì)

時(shí)鐘電路由一個(gè)晶體振蕩器12MHZ和兩個(gè)22pF的瓷片電容組成,瓷片電容叫晶振的負(fù)載電容。時(shí)鐘電路用于產(chǎn)生單片機(jī)工作所需要的時(shí)鐘信號(hào),而時(shí)序所研究的是指令執(zhí)行中各信號(hào)之間的相互關(guān)系。單片機(jī)本身就如一個(gè)復(fù)雜的同步時(shí)序電路,為了保證同步工作方式的實(shí)現(xiàn),電路應(yīng)在唯一的時(shí)鐘信號(hào)控制下嚴(yán)格地工作。時(shí)鐘電路接法是,AT89C52的外接晶體引腳為XTAL1和XTAL2,是利用單片機(jī)內(nèi)部的振蕩器產(chǎn)生,只要在XTAL1、XTAL2引腳上外接定時(shí)反饋電路,內(nèi)部振蕩器便自激振蕩,產(chǎn)生時(shí)鐘輸出到內(nèi)部的定時(shí)控制邏輯。其電路如圖3-3-1所示:

圖3-3-1 時(shí)鐘電路圖

3.3.2 單片機(jī)復(fù)位電路設(shè)計(jì)

單片機(jī)在啟動(dòng)時(shí)都需要復(fù)位,以使CPU及系統(tǒng)各部件處于確定的初始狀態(tài),并從初態(tài)開始工作。89系列單片機(jī)的復(fù)位信號(hào)是從RST引腳輸入到芯片內(nèi)的施密特觸發(fā)器中的。當(dāng)系統(tǒng)處于正常工作狀態(tài)時(shí),且振蕩器穩(wěn)定后,如果RST引腳上有一個(gè)高電平并維持2個(gè)機(jī)器周期(24個(gè)振蕩周期)以上,則CPU就可以響應(yīng)并將系統(tǒng)復(fù)位。單片機(jī)系統(tǒng)的復(fù)位方式有:手動(dòng)按鈕復(fù)位和上電復(fù)位。

本設(shè)計(jì)采用手動(dòng)按鈕復(fù)位,需要人為在復(fù)位輸入端RST上加入高電平。一般采用的辦法是在RST端和正電源Vcc之間接一個(gè)按鈕。當(dāng)人為按下按鈕時(shí),則Vcc的+5V電平就會(huì)直接加到RST端。手動(dòng)按鈕復(fù)位的電路如所示。由于人的動(dòng)作再快也會(huì)使按鈕保持接通達(dá)數(shù)十毫秒,所以,完全能夠滿足復(fù)位的時(shí)間要求。根據(jù)實(shí)際操作的經(jīng)驗(yàn),下面給出這種復(fù)位電路的電容、電阻參考值。C=10uF,Rl=10K,R2=1K,如圖3-3-2所示。

圖3-3-2復(fù)位電路圖

3.4 按鍵模塊設(shè)計(jì)

本系統(tǒng)需要的按鍵數(shù)量較多,為了減少I/O口的占用,將按鍵排列成矩陣形式,如圖3-4所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過(guò)一個(gè)按鍵加以連接。這樣,一個(gè)端口(如P1口)就可以構(gòu)成4*4=16個(gè)按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,由此可見,在需要的鍵數(shù)比較多時(shí),采用矩陣法來(lái)做鍵盤是合理的。

圖3-4 矩陣鍵盤圖

矩陣鍵盤的工作過(guò)程可分為兩步:第一步是CPU首先檢測(cè)鍵盤上是否有鍵按下;第二步是識(shí)別哪一個(gè)鍵按下。

檢測(cè)鍵盤上是否有鍵按下的處理方法是:將行線送入全掃描字,讀入列線的狀態(tài)來(lái)判別。

識(shí)別鍵盤中哪一個(gè)鍵按下的處理方法是:將行線逐列置成低電平,檢查列輸入狀態(tài),稱為逐行掃描。

例如:P0.7~P0.0設(shè)為11111110,然后與11110000相與,如果結(jié)果不等于11110000,則判斷有按鍵按下,即這種情況是有按鍵按下,而且是P0.0為低電平,可知是第一行有一個(gè)按鍵按下,接下來(lái)就通過(guò)判斷P0口的值來(lái)檢測(cè)是哪個(gè)按鍵,如果值為11101110,即P0.4為低電平,初始值可知P0.0也是低電平,這是就可以判斷是第一行第一個(gè)按鍵是按下的;如果為11011110,則是第一行第二個(gè)按鍵是按下的;如果為10111110,則是第一行第三個(gè)按鍵是按下的;如果為01111110,則是第一行第四個(gè)按鍵是按下的。由此類推,便可以判斷是哪個(gè)按鍵按下,之后便可以進(jìn)行接下來(lái)的操作。

3.5顯示模塊設(shè)計(jì)

液晶顯示模塊已作為很多電子產(chǎn)品中都可以看到,顯示的主要是數(shù)字、專用符號(hào)和圖形。1602型LCD顯示模塊具有體積小,功耗低,顯示內(nèi)容豐富等特點(diǎn)。1602型LCD可以顯示2行16個(gè)字符,有8位數(shù)產(chǎn)品的通過(guò)器件,如在計(jì)算器、萬(wàn)用表、電子表及很多家用電子據(jù)總線D0-D7和RS,R/W,EN三個(gè)控制端口,工作電壓為5V,并且具有字符對(duì)比度調(diào)節(jié)和背光功能。引腳功能說(shuō)明:

LCD1602采用標(biāo)準(zhǔn)的14腳(無(wú)背光)或16腳(帶背光)接口,各引腳接口說(shuō)明:

第1腳:VSS為地電源。

第2腳:VDD接5V正電源。

第3腳:VL為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比 度最高,對(duì)比度過(guò)高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過(guò)一個(gè)10K的電位器調(diào)整對(duì)比度。

第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。

第5腳:R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。

第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。

第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。

第15腳:背光源正極。

第16腳:背光源負(fù)極。

LCD連線圖如圖3-5所示。

圖3-5 LCD1602連線圖

只有按下鍵盤上的開啟按鍵后,顯示器才處于開啟狀態(tài)。同理只有按下關(guān)閉按鍵后顯示器才處于關(guān)閉狀態(tài)。否則顯示器將一直處于初始狀態(tài),當(dāng)需要對(duì)密碼鎖進(jìn)行開鎖時(shí),按下鍵盤上的開鎖按鍵后利用鍵盤上的數(shù)字鍵0-9輸入密碼,每按下一個(gè)數(shù)字鍵后在顯示器上顯示一個(gè)*,輸入多少位就顯示多少個(gè)*。當(dāng)密碼輸入完成時(shí),按下確認(rèn)鍵,如果輸入的密碼正確的話, LCD子顯示“RIGHT”,單片機(jī)其中P2.0引角會(huì)輸出低電平,使三極管T2導(dǎo)通,電磁鐵吸合,電子密碼鎖被打開,如果密碼不正確,LCD顯示屏?xí)@示“ERROR”,P2.0輸出的是高電平,電子密碼鎖不能被打開。通過(guò)LCD顯示屏,可以清楚的判斷出密碼鎖所處的狀態(tài)。

3.6蜂鳴器模塊設(shè)計(jì)

三極管起開關(guān)作用,單片機(jī)驅(qū)動(dòng)口輸出驅(qū)動(dòng)電平并通過(guò)三極管放大驅(qū)動(dòng)電流就能使蜂鳴器發(fā)出聲音。三極管基極低電平時(shí)導(dǎo)通,蜂鳴器發(fā)聲,基極高電平則使三極管關(guān)閉,蜂鳴器停止發(fā)聲。蜂鳴器報(bào)警電路如圖3-6所示。

圖3-6蜂鳴器連線圖


第4章  系統(tǒng)軟件設(shè)計(jì)

4.1 系統(tǒng)軟件設(shè)計(jì)總體思路

當(dāng)用戶需要開鎖時(shí),先按鍵盤開鎖鍵之后按鍵盤的數(shù)字鍵0-9輸入密碼。密碼輸完后按下確認(rèn)鍵,如果密碼輸入正確則開鎖,不正確顯示密碼錯(cuò)誤重新輸入密碼,當(dāng)三次密碼錯(cuò)誤則發(fā)出報(bào)警;當(dāng)用戶需要修改密碼時(shí),先按下鍵盤設(shè)置鍵后輸入原來(lái)的密碼,只有當(dāng)輸入的原密碼正確后才能設(shè)置新密碼。

4.2 系統(tǒng)軟件主程序流程圖設(shè)計(jì)

如圖4-2所示為主程序流程圖,開始接上電源,程序進(jìn)行初始化設(shè)置,然后在鍵盤上輸入密碼,此系統(tǒng)進(jìn)行鍵盤掃描,密碼正確,開鎖成功,密碼錯(cuò)誤3次出錯(cuò)報(bào)警,選擇是否修改密碼,若要修改密碼,先輸入舊密碼密碼,密碼正確后設(shè)置新密碼,錯(cuò)誤時(shí)報(bào)警,需要兩次確認(rèn)新密碼,確認(rèn)后,密碼修改成功,否則結(jié)束最終返回。

4.3 系統(tǒng)軟件子程序設(shè)計(jì)

4.3.1按鍵功能程序設(shè)計(jì)

如圖4-3-1為按鍵功能流程圖,在按鍵當(dāng)中,有與輸入、開鎖、清除、設(shè)置、確認(rèn)的程序相對(duì)應(yīng)的按鍵,并按順序與輸入的數(shù)相比較,當(dāng)輸入正確時(shí),進(jìn)入密碼程序,錯(cuò)誤時(shí)進(jìn)行清除,輸入兩次新密碼正確時(shí),可進(jìn)行重新設(shè)置密碼,最后確認(rèn)程序。

圖4-3-1 按鍵功能程序流程圖

4.3.2 密碼設(shè)置程序設(shè)計(jì)

如圖4-3-2為密碼設(shè)置流程圖,開始按下設(shè)置鍵,輸入舊密碼,如果錯(cuò)誤累計(jì)三次,進(jìn)行報(bào)警程序。如輸入正確,可以修改密碼,確認(rèn)后再次輸入新密碼,如兩次輸入一樣,則更改成功。如果兩次輸入的新密碼不一樣,則修改密碼失敗,重新返回設(shè)置新密碼。

圖4-3-2密碼重置程序流程圖

4.3.3 開鎖程序設(shè)計(jì)

如圖4-3-3為開鎖流程圖,開始時(shí)按開鎖鍵,輸入密碼,如果輸入正確,則開鎖成功。如果輸入錯(cuò)誤累計(jì)達(dá)到三次,則執(zhí)行報(bào)警程序。

圖4-3-3 開鎖程序流程圖



第5章  系統(tǒng)調(diào)試與數(shù)據(jù)分析

5.1 硬件電路的制作和調(diào)試

5.1.1 硬件電路的制作

本電路由相關(guān)元器件在通用板上面焊接而成,在焊接之前,用萬(wàn)用表檢查各個(gè)元器件是否有損壞,比如電容、發(fā)光二極管是否開路,之后設(shè)計(jì)好各個(gè)元器件在電路板上面的布局,做到合理、美觀。布局完成之后就可以進(jìn)行焊接了,元器件之間的連線由帶有絕緣皮的導(dǎo)線完成。焊接的過(guò)程中不可三心二意,不要造成短路、開路等錯(cuò)誤,盡量做到一步到位

5.1.2 硬件電路的調(diào)試

本次調(diào)試主要采用proteus軟件仿真。首先設(shè)計(jì)電子密碼鎖的源程序,源程序經(jīng)過(guò)匯編后,生成的目標(biāo)文件經(jīng)過(guò)仿真調(diào)試。依次按下密碼后按確定鍵,二極管亮,表示密碼正確開門。

系統(tǒng)調(diào)試包括硬件調(diào)試和軟件調(diào)試,硬件調(diào)試的任務(wù)排除系統(tǒng)的硬件電路.包括設(shè)計(jì)和工藝故障,軟件調(diào)試是利用開發(fā)工具進(jìn)行在線住址調(diào)試,除發(fā)現(xiàn)和解決程序錯(cuò)誤之外,也可以發(fā)現(xiàn)硬件故障.

(1) 靜態(tài)調(diào)試

第一步為目測(cè),單片機(jī)應(yīng)用系統(tǒng)中大部分電路安裝在印制電路板上,因此對(duì)每一塊加工好的印制電路板要進(jìn)行仔細(xì)的檢查。第二步為示波器測(cè)試,目測(cè)檢查后,可進(jìn)行示波器測(cè)試。第三步為加電檢查,第四步實(shí)際聯(lián)機(jī)檢查。但注意示波器必須接在入口而不能接在電壓大的端口上。

(2) 動(dòng)態(tài)調(diào)試

一般方法是由近及遠(yuǎn)、由分到合。首先按邏輯功能將用戶系統(tǒng)硬件電路分為若干份,先分塊調(diào)試,當(dāng)調(diào)試某塊電路時(shí),與該電路無(wú)關(guān)的器件全部從用戶系統(tǒng)中去掉,這樣,可將故障范圍限定在某個(gè)局部電路上。當(dāng)各塊電路調(diào)試無(wú)故障后,將各塊電路加入系統(tǒng)中,再對(duì)個(gè)塊電路功能及電路間可能存在的相互聯(lián)系進(jìn)行試驗(yàn)。經(jīng)歷這樣一個(gè)調(diào)試過(guò)程后,大部分硬件故障基本可以排除。

軟件調(diào)試一般步驟:

先獨(dú)立后聯(lián)機(jī):一個(gè)子程序一個(gè)子程序的進(jìn)行調(diào)試,最后單片機(jī)連起來(lái)總調(diào)。

先分塊后組合:逐個(gè)芯片逐步調(diào)試再和整體芯片一起進(jìn)行總調(diào)。

先單步后連續(xù):先執(zhí)行一條指令,在每步后,又返回監(jiān)控調(diào)試狀態(tài)在從程序任意一條地址處啟動(dòng),最后全速運(yùn)行。

5.1.3 故障方析

現(xiàn)象一:通電調(diào)試硬件的時(shí)候,無(wú)論單片機(jī)P2.0~P2.5與單片機(jī)20腳(GND)相連,還是將單片機(jī)P3.4~P3.7與單片機(jī)20腳(GND)相連,發(fā)光二極管和LCD都不亮;

故障方析:可能電路未供上電,或者各個(gè)發(fā)光二極管陰極和數(shù)碼管位選端均未與單片機(jī)相連;

解決方法:用數(shù)字萬(wàn)用表蜂鳴擋兩個(gè)表筆分別搭到單片機(jī)40腳(VCC)和電源排針,不響,可知電源未接通,將其接通,排除故障。

5.2 軟硬件功能分析

在軟硬件聯(lián)調(diào)時(shí),按基本功能依次調(diào)試。當(dāng)電路通上+5v電源后,程序自動(dòng)調(diào)入初始密碼,此時(shí)依次輸入:000000,然后按確認(rèn)鍵,此時(shí)鎖會(huì)打開,可以看到顯示open,密碼鎖打開。首次使用輸入:131420,對(duì)密碼進(jìn)行初始化,顯示出現(xiàn):initpassword,證明密碼初始化完成,此時(shí)初始密碼即為:000000。按下取消鍵,此時(shí)鎖關(guān)閉,所有輸入清除。在開鎖狀態(tài)下,再次輸入正確的密碼并按下確認(rèn)鍵,此時(shí)聽到兩聲提示,輸入新的六位密碼并按重設(shè)鍵,再重復(fù)輸入一次新密碼并按重設(shè)鍵,會(huì)聽到兩聲提示音,重設(shè)密碼成功,內(nèi)部保存新密碼并存儲(chǔ)到AT24C02。如兩次輸入的新密碼不一樣,則重設(shè)密碼失敗。報(bào)警并鎖定鍵盤:當(dāng)輸入密碼錯(cuò)誤后,報(bào)警并鎖定鍵盤3秒,如3秒內(nèi)又有按鍵,3秒再啟動(dòng)。

5.3 測(cè)試結(jié)果分析

經(jīng)通電測(cè)試檢查完畢,本系統(tǒng)可以實(shí)現(xiàn)的功能如下:

1、設(shè)置6位密碼,密碼通過(guò)鍵盤輸入,若密碼正確,則將鎖打開。

2、密碼可以由用戶自己修改設(shè)定(只支持6位密碼),鎖打開后才能修改密碼。修改密碼之前必須再次輸入密碼,在輸入新密碼時(shí)候需要二次確認(rèn),以防止誤操作。

3、報(bào)警、鎖定鍵盤功能。密碼輸入錯(cuò)誤顯示器會(huì)出現(xiàn)錯(cuò)誤提示,若密碼輸入錯(cuò)誤次數(shù)超過(guò)3次,蜂鳴器報(bào)警并且鎖定鍵盤。

4、AT24C02保存密碼,支持復(fù)位保存,掉電保存功能。

第6章  總結(jié)與展望

本次設(shè)計(jì)的電子密碼鎖是以手動(dòng)鍵盤輸入密碼的,通過(guò)這幾個(gè)星期對(duì)電子密碼鎖的研究學(xué)習(xí),發(fā)覺(jué)這種密碼輸入方式可以進(jìn)行改革。在越來(lái)越高科技化的今天,遙控控制顯的愈發(fā)重要,今后的電子密碼鎖應(yīng)該具有以紅外技術(shù)或無(wú)線電技術(shù)為輔助的密碼按鍵輸入遠(yuǎn)程交互技術(shù),這樣就能遠(yuǎn)程輸入密碼完成操作。也可以放棄傳統(tǒng)的按鍵輸入密碼模式,借助傳感器技術(shù)運(yùn)用聲控來(lái)實(shí)現(xiàn)密碼輸入,又或者人臉識(shí)別技術(shù),還有一種就是用戶指紋輸入方式,這些都可以使開鎖的時(shí)間更短更方便。電子密碼鎖產(chǎn)業(yè)將向靜態(tài)功耗更低,外圍電路更簡(jiǎn)化,可提供的功能或控制口更多,更人性化高科技化的方向發(fā)展。

通過(guò)本次畢業(yè)設(shè)計(jì)的鍛煉,我學(xué)到了很多有關(guān)電子密碼鎖的設(shè)計(jì)方法與工作原理,鞏固了單片機(jī)知識(shí)。無(wú)論從理論到實(shí)踐都使我學(xué)到了很多東西,它不僅可以鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書本上所沒(méi)有學(xué)到過(guò)的知識(shí)。同時(shí)也明白了理論與實(shí)踐相結(jié)合的重要性,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。

參考文獻(xiàn)

[1] 葉啟明.單片機(jī)制作的新型安全密碼鎖[J].家庭電子.2000,第六期:24-27
[2] 胡喬木. 中國(guó)大百科全書.中國(guó)大百科全書出版社. 1993
[3]李明喜.新型電子密碼鎖的設(shè)計(jì)[J].機(jī)電產(chǎn)品開發(fā)與創(chuàng)新.2004,第八期:77-79
[4]董繼成.一種新型安全的單片機(jī)密碼鎖[J].電子技術(shù).2004,第三期:55-60
[5]王寬仁.可靠安全的智能密碼鎖[J].電子技術(shù)應(yīng)用.2001年第2期
[6]何立民.MCS-51系列單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)系統(tǒng)配置與接口技術(shù)[M].北京:北京航空航天大學(xué)出版社,1999
[7]胡漢才.單片機(jī)原理及其接口技術(shù)(第2版)[M].北京:清華大學(xué)出版社,2004
[8]江志紅. 51單片機(jī)技術(shù)與應(yīng)用系統(tǒng)開發(fā)[M]. 清華大學(xué)出版社, 2008
[9]童詩(shī)白,華成英. 模擬電子技術(shù)基礎(chǔ)[M] 高等教育出版社,2000
[10]閻石. 數(shù)字電子技術(shù)基礎(chǔ)[第四版][M].高等教育出版社.1998.11
[11]任艷艷.  基于AT89C51單片機(jī)多功能密碼鎖的研究[J]. 重慶職業(yè)技術(shù)學(xué)院學(xué)報(bào).2008.5
[12]周功明. 基于AT89C2051單片機(jī)的防盜自動(dòng)報(bào)警密碼鎖系統(tǒng)的設(shè)計(jì)[J]. 綿陽(yáng)師范學(xué)院學(xué)報(bào).2007.5
[13]周鑫,何建新, 劉琥. 基于單片機(jī)的電子密碼鎖控制電路設(shè)計(jì)[J] 成都信息工程學(xué)院學(xué)報(bào). 2009,(08)
[14] 郭海英. 基于單片機(jī)的電子安全密碼鎖的設(shè)計(jì)[J]. 佛山職業(yè)技術(shù)學(xué)院現(xiàn)代電子技術(shù)2005 (13)
[15] 王金國(guó).采用單片機(jī)的電子密碼鎖控制電路[J].山東煤炭科技 ,2000 ,(3) :30 - 33.
[16] 寧愛民. 應(yīng)用AT89C2051 單片機(jī)設(shè)計(jì)電子密碼鎖[J]. 淮海工學(xué)院學(xué)報(bào)2003 ,6
[17] AT89S51 DATA SHEEP Philips SemiSonduStors [J]. 2009
[18] AT89S51 DATA SHEEP Philips SemiSonduStors [J]. 2009
[19] Texas Instruments InSorporated, AT89S51 Family User’s Guide.
[20] Voice of Electronic Password-lock Design, China Control Net ,2008
[21] Design Serial Infrared PhysiSalL ayer SpeSifiSation, Version 1.3. Ostober 15,

致謝

在這一個(gè)月的設(shè)計(jì)和制作過(guò)程中,在老師和同學(xué)的幫助下,我順利的完成了此次實(shí)訓(xùn)。通過(guò)這次電子綜合實(shí)訓(xùn),使我深刻地認(rèn)識(shí)到學(xué)好專業(yè)知識(shí)的重要性,也理解了理論聯(lián)系實(shí)際的含義,并且檢驗(yàn)了大學(xué)四年的學(xué)習(xí)成果。雖然在這次設(shè)計(jì)中對(duì)于知識(shí)的運(yùn)用和銜接還不夠熟練。但是我將在以后的工作和學(xué)習(xí)中繼續(xù)努力、不斷完善。這四周的課程設(shè)計(jì)是對(duì)過(guò)去所學(xué)知識(shí)的系統(tǒng)提高和擴(kuò)充的過(guò)程,為今后的發(fā)展打下了良好的基礎(chǔ),而且為我們下學(xué)期的畢業(yè)設(shè)計(jì)提供了模板。



附錄1  電路原理圖

附錄2  程序



  1. #include<REG51.h>
  2. #include<intrins.h>
  3. #define LCM_Data  P0
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define w 8//定義密碼位數(shù)
  7. sbit lcd1602_rs=P2^6;
  8. sbit lcd1602_en=P2^7;
  9. sbit Scl=P3^4; //24C02串行時(shí)鐘
  10. sbit Sda=P3^5; //24C02串行數(shù)據(jù)
  11. sbit ALAM = P2^0; //報(bào)警
  12. sbit KEY = P3^7; //開鎖
  13. bit  operation=0; //操作標(biāo)志位
  14. bit  pass=0; //密碼正確標(biāo)志
  15. bit  ReInputEn=0; //重置輸入充許標(biāo)志
  16. bit  s3_keydown=0; //3秒按鍵標(biāo)志位
  17. bit  key_disable=0; //鎖定鍵盤標(biāo)志
  18. unsigned char countt0,second; //t0中斷計(jì)數(shù)器,秒計(jì)數(shù)器
  19. void Delay5Ms(void);
  20. unsigned char time=0;
  21. unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盤掃描控制表
  22. unsigned char code start_line[]= {"password:       "};
  23. unsigned char code name[]={"===CodedLock==="};//顯示名稱
  24. unsigned char code Correct[]= {"     correct    "};//輸入正確
  25. unsigned char code Error[] ={"      error     "};  //輸入錯(cuò)誤
  26. unsigned char code codepass[]= {"      pass      "};
  27. unsigned char code LockOpen[]= {"      open      "};//OPEN
  28. unsigned char code SetNew[]= {"SetNewWordEnable"};
  29. unsigned char code Input[] = {"input:          "};//INPUT
  30. unsigned char code ResetOK[]= {"ResetPasswordOK "};
  31. unsigned char code initword[]= {"Init password..."};
  32. unsigned char code Er_try[]= {"error,try again!"};
  33. unsigned char code again[]= {"input again     "};
  34. unsigned char InputData[6]; //輸入密碼暫存區(qū)
  35. unsigned char CurrentPassword[6]={1,3,1,4,2,0}; //當(dāng)前密碼值
  36. unsigned char TempPassword[6];
  37. unsigned char N=0; //密碼輸入位數(shù)記數(shù)
  38. unsigned char ErrorCont;//錯(cuò)誤次數(shù)計(jì)數(shù)
  39. unsigned char CorrectCont;//正確輸入計(jì)數(shù)
  40. unsigned char ReInputCont; //重新輸入計(jì)數(shù)
  41. unsigned char code initpassword[6]={0,0,0,0,0,0};
  42. void Delay5Ms(void)
  43. {unsigned int TempCyc = 5552;
  44. while(TempCyc--);}
  45. void Delay400Ms(void)
  46. { unsigned char TempCycA = 5;
  47. unsigned int TempCycB;
  48. while(TempCycA--)
  49. {TempCycB=7269;
  50.   while(TempCycB--); }}
  51. void mDelay(uint t) //延時(shí)
  52. { uchar i;
  53. while(t--)
  54.    {for(i=0;i<125;i++)
  55. {;}}}
  56. void Nop(void) //空操作
  57. {_nop_();
  58. _nop_();
  59. _nop_();
  60. _nop_();
  61. }
  62. /*起始條件*/
  63. void Start(void)
  64. {Sda=1;
  65. Scl=1; Nop();
  66. Sda=0;
  67. Nop();}
  68. /*停止條件*/
  69. void Stop(void)
  70. {Sda=0;
  71. Scl=1;
  72. Nop();
  73. Sda=1;
  74. Nop();}
  75. /*應(yīng)答位*/
  76. void Ack(void)
  77. {Sda=0;
  78. Nop();
  79. Scl=1;
  80. Nop();
  81. Scl=0;}
  82. /*反向應(yīng)答位*/
  83. void NoAck(void)
  84. { Sda=1;
  85. Nop();
  86. Scl=1;
  87. Nop();
  88. Scl=0;}
  89. /*發(fā)送數(shù)據(jù)子程序,Data為要求發(fā)送的數(shù)據(jù)*/
  90. void Send(uchar Data)
  91. { uchar BitCounter=8;
  92.    uchar temp;
  93.    do
  94.    {temp=Data;
  95. Scl=0;
  96. Nop();
  97. if((temp&0x80)==0x80)
  98.    Sda=1;
  99.    else
  100.    Sda=0;
  101.   Scl=1;
  102. temp=Data<<1;
  103. Data=temp;
  104. BitCounter--;}
  105. while(BitCounter);
  106. Scl=0;}
  107. /*讀一字節(jié)的數(shù)據(jù),并返回該字節(jié)值*/
  108. uchar Read(void)
  109. {uchar temp=0;
  110. uchar temp1=0;
  111. uchar BitCounter=8;
  112. Sda=1;
  113. do{
  114. Scl=0;
  115. Nop();
  116. Scl=1;
  117. Nop();
  118. if(Sda)
  119. temp=temp|0x01;
  120. else
  121. temp=temp&0xfe;
  122. if(BitCounter-1)
  123. {temp1=temp<<1;
  124. temp=temp1;}
  125. BitCounter--;}
  126. while(BitCounter);
  127. return(temp);}
  128. void WrToROM(uchar Data[],uchar Address,uchar Num)
  129. { uchar i;
  130.   uchar *PData;
  131.   PData=Data;
  132.   for(i=0;i<num;i++)
  133.   {Start();
  134.   Send(0xa0);
  135.   Ack();
  136.   Send(Address+i);
  137.   Ack();
  138.   Send(*(PData+i));
  139.   Ack();
  140.   Stop();
  141.   mDelay(20);}}
  142. void RdFromROM(uchar Data[],uchar Address,uchar Num)
  143. {uchar i;
  144.   uchar *PData;
  145.   PData=Data;
  146.   for(i=0;i<num;i++)
  147.   {Start();
  148.   Send(0xa0);
  149.   Ack();
  150.   Send(Address+i);
  151.   Ack();
  152.   Start();
  153.   Send(0xa1);
  154.   Ack();
  155.   *(PData+i)=Read();
  156.   Scl=0;
  157.   NoAck();
  158.   Stop();}}
  159. void delay(uint xms)//延時(shí)函數(shù),有參函數(shù)
  160. {uint x,y;
  161. for(x=xms;x>0;x--)
  162. for(y=110;y>0;y--);}
  163. //--------------------------寫指令---------------------------//
  164. write_1602com(uchar com)//****液晶寫入指令函數(shù)****
  165. {lcd1602_rs=0;//命令
  166. P0=com;
  167. delay(5);
  168. lcd1602_en=1;
  169. delay(5);
  170. lcd1602_en=0;}
  171. //-------------------------寫數(shù)據(jù)-----------------------------//
  172. write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
  173. {lcd1602_rs=1;//數(shù)據(jù)
  174. P0=dat;
  175. delay(5);
  176. lcd1602_en=1;
  177. delay(5);
  178. lcd1602_en=0;}
  179. //-------------------------初始化-------------------------//
  180. void lcd_init(void)
  181. {write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
  182. write_1602com(0x0c);//開顯示不顯示光標(biāo)
  183. write_1602com(0x06);//整屏不移動(dòng),光標(biāo)自動(dòng)右移
  184. write_1602com(0x01);//清顯示}
  185. //==============將按鍵值編碼為數(shù)值========================//
  186. unsigned char coding(unsigned char m)
  187. {unsigned char k;
  188. switch(m)
  189. {case (0x18): k=1;break;
  190. case (0x28): k=2;break;
  191. case (0x48): k=3;break;
  192. case (0x88): k='A';break;
  193. case (0x14): k=4;break;
  194. case (0x24): k=5;break;
  195. case (0x44): k=6;break;
  196. case (0x84): k='B';break;
  197. case (0x12): k=7;break;
  198. case (0x22): k=8;break;
  199. case (0x42): k=9;break;
  200. case (0x82): k='C';break;
  201. case (0x11): k='*';break;
  202. case (0x21): k=0;break;
  203. case (0x41): k='#';break;
  204. case (0x81): k='D';break;}
  205. return(k);}
  206. //=====================按鍵檢測(cè)并返回按鍵值===============================//
  207. unsigned char keynum(void)
  208. {unsigned char row,col,i;
  209. P1=0xf0;
  210. if((P1&0xf0)!=0xf0)
  211. {Delay5Ms();
  212.      Delay5Ms();
  213.    if((P1&0xf0)!=0xf0)
  214. {row=P1^0xf0;          //確定行線
  215. i=0;
  216. P1=a[i];          //精確定位
  217. while(i<4)
  218. {if((P1&0xf0)!=0xf0)
  219. {col=~(P1&0xff);  //確定列線
  220. break;            //已定位后提前退出  
  221. }
  222. else
  223. {
  224. i++;
  225. P1=a[i];
  226. }
  227. }
  228. }
  229. else
  230. {
  231. return 0;
  232. }
  233. while((P1&0xf0)!=0xf0);
  234. return(row|col); //行線與列線組合后返回
  235. }
  236. Else return 0; //無(wú)鍵按下時(shí)返回0
  237. }
  238. //=======================一聲提示音,表示有效輸入========================//
  239. void OneAlam(void)
  240. {
  241. ALAM=0;
  242. Delay5Ms();
  243.     ALAM=1;
  244. }
  245. //========================二聲提示音,表示操作成功========================
  246. void TwoAlam(void)
  247. {
  248. ALAM=0;
  249. Delay5Ms();
  250.     ALAM=1;
  251.     Delay5Ms();
  252. ALAM=0;
  253. Delay5Ms();
  254.     ALAM=1;
  255. }
  256. //========================三聲提示音,表示錯(cuò)誤========================//
  257. void ThreeAlam(void)
  258. {
  259. ALAM=0;
  260. Delay5Ms();
  261.     ALAM=1;
  262.     Delay5Ms();
  263. ALAM=0;
  264. Delay5Ms();
  265.     ALAM=1;
  266.     Delay5Ms();
  267. ALAM=0;
  268. Delay5Ms();
  269.     ALAM=1;
  270. }
  271. void FourAlam(void)
  272. {ALAM=0;
  273. mDelay(700);
  274.     ALAM=1;
  275.     mDelay(1000);
  276. ALAM=0;
  277. mDelay(700);
  278.     ALAM=1;
  279. mDelay(1000);
  280. ALAM=0;
  281. mDelay(700);
  282.     ALAM=1;
  283.     mDelay(1000);
  284. }
  285. void DisplayOne(void)
  286. {
  287. //DisplayOneChar(9+N,1,'*');
  288. write_1602com(yi+5+N);
  289. write_1602dat('*');
  290. }
  291. //=======================顯示提示輸入=========================//
  292. void DisplayChar(void)
  293. {
  294. unsigned char i;
  295. if(pass==1)
  296. {             //DisplayListChar(0,1,LockOpen);
  297. write_1602com(er);
  298. for(i=0;i<16;i++)
  299. {
  300. write_1602dat(LockOpen[i]);}
  301. }
  302. else
  303. {
  304. if(N==0)          //DisplayListChar(0,1,Error);
  305. write_1602com(er);
  306. for(i=0;i<16;i++)
  307. {
  308. write_1602dat(Error[i]);}
  309. }
  310. else
  311. {           //DisplayListChar(0,1,start_line);
  312. write_1602com(er);
  313. for(i=0;i<16;i++)
  314. {
  315. write_1602dat(start_line[i]);
  316. }
  317. }
  318. }
  319. }
  320. void DisplayInput(void)
  321. {
  322. unsigned char i;
  323. if(CorrectCont==1)
  324. {
  325. //DisplayListChar(0,0,Input);
  326. write_1602com(er);for(i=0;i<16;i++)
  327. write_1602dat(Input[i]);
  328. }
  329. }
  330. void ResetPassword(void)
  331. {
  332. unsigned char i;
  333. unsigned char j;
  334. if(pass==0)
  335. {
  336. pass=0;
  337. DisplayChar();
  338. ThreeAlam();
  339. }
  340. else
  341. {
  342.     if(ReInputEn==1)
  343. {
  344. if(N==6)
  345. {
  346. ReInputCont++;
  347. if(ReInputCont==2)
  348. {
  349. for(i=0;i<6;)
  350. if(TempPassword[i]==InputData[i]) //將兩次輸入的新密碼作對(duì)比
  351. i++;
  352. else
  353. {
  354. //DisplayListChar(0,1,Error);
  355. write_1602com(er);
  356. for(j=0;j<16;j++)
  357. {
  358. write_1602dat(Error[j]);
  359. }
  360. ThreeAlam();
  361. pass=0;
  362. ReInputEn=0; //關(guān)閉重置功能,
  363. ReInputCont=0;
  364. DisplayChar();
  365. break;
  366. }
  367. }
  368. if(i==6)
  369. {
  370. //DisplayListChar(0,1,ResetOK);
  371. write_1602com(er);
  372. for(j=0;j<16;j++)
  373. {
  374. write_1602dat(ResetOK[j]);
  375. }
  376. TwoAlam();//操作成功提示
  377. WrToROM(TempPassword,0,6); //將新密碼寫入24C02存儲(chǔ)
  378. ReInputEn=0;
  379. }
  380. ReInputCont=0;
  381. CorrectCont=0;
  382. }
  383. else
  384. {
  385. OneAlam();
  386. //DisplayListChar(0, 1, again); //顯示再次輸入一次
  387. write_1602com(er);
  388. for(j=0;j<16;j++)
  389. {
  390. write_1602dat(again[j]);
  391. }
  392. for(i=0;i<6;i++)
  393. {
  394. TempPassword[i]=InputData[i]; //將第一次輸入的數(shù)據(jù)暫存起來(lái)
  395. }
  396. }
  397. N=0; //輸入數(shù)據(jù)位數(shù)計(jì)數(shù)器清零
  398. }
  399.   }
  400. }

  401. }
  402. void Alam_KeyUnable(void)
  403. {
  404. P1=0x00;
  405. ALAM=~ALAM;
  406. Delay5Ms();
  407. }
  408. void Clean(void)
  409. {
  410.      if(N<7)
  411.   { if(N<1)N=1;
  412.    N--;
  413. write_1602com(er+6+N);
  414. write_1602dat(' ');  
  415.   }
  416. OneAlam();
  417. }
  418. void Cancel(void)
  419. {
  420. unsigned char i;
  421. unsigned char j;
  422. //DisplayListChar(0, 1, start_line);
  423. write_1602com(er);
  424. for(j=0;j<16;j++)
  425. {
  426. write_1602dat(start_line[j]);
  427. }
  428. TwoAlam();//提示音
  429. for(i=0;i<6;i++)
  430. {
  431. InputData[i]=0;
  432. }
  433. KEY=1; //關(guān)閉鎖
  434. ALAM=1; //報(bào)警關(guān)
  435. operation=0//操作標(biāo)志位清零
  436. pass=0;//密碼正確標(biāo)志清零
  437. ReInputEn=0;//重置輸入充許標(biāo)志清零
  438. ErrorCont=0;//密碼錯(cuò)誤輸入次數(shù)清零
  439. CorrectCont=0;//密碼正確輸入次數(shù)清零
  440. ReInputCont=0;//重置密碼輸入次數(shù)清零
  441. //open_led=1;
  442. s3_keydown=0;
  443. key_disable=0;
  444. N=0;
  445. }
  446. //=======確認(rèn)鍵,并通過(guò)相應(yīng)標(biāo)志位執(zhí)行相應(yīng)功能=============//
  447. void Ensure(void)
  448. {unsigned char i,j;
  449. RdFromROM(CurrentPassword,0,6); //從24C02里讀出存儲(chǔ)密碼
  450.     if(N==6)
  451. {
  452.     if(ReInputEn==0) //重置密碼功能未開啟
  453. {
  454. for(i=0;i<6;)
  455.    {if(CurrentPassword[i]==InputData[i])
  456. {
  457. i++;
  458. }
  459. else
  460. {ErrorCont++;
  461. if(ErrorCont==3) //錯(cuò)誤輸入計(jì)數(shù)達(dá)三次時(shí),報(bào)警并鎖定鍵盤
  462. {
  463. write_1602com(er);
  464. for(i=0;i<16;i++)
  465. {
  466. write_1602dat(Error[i]);
  467. }
  468.     Alam_KeyUnable();
  469.                         Delay400Ms();
  470.                        Delay400Ms();
  471.     Delay400Ms();
  472.    Delay400Ms();
  473. Delay400Ms();
  474. Delay400Ms();
  475. Delay400Ms();
  476. Delay400Ms();
  477. Delay400Ms();
  478. Delay400Ms();
  479. Delay400Ms();
  480. Delay400Ms();
  481. Delay400Ms();
  482. Delay400Ms();
  483. Delay400Ms();
  484. Delay400Ms();
  485. Delay400Ms();
  486. Delay400Ms();
  487. Delay400Ms();
  488. Delay400Ms();
  489. Delay400Ms();
  490. Delay400Ms();
  491. }
  492. else
  493. {TR0=1; //開啟定時(shí)
  494. key_disable=1; //鎖定鍵盤
  495. pass=0;
  496. break;
  497. }
  498. }
  499. }
  500. if(i==6)
  501. {
  502. CorrectCont++;
  503. if(CorrectCont==1) //正確輸入計(jì)數(shù),當(dāng)只有一次正確輸入時(shí),開鎖,
  504. {
  505. //DisplayListChar(0,1,LockOpen);
  506. write_1602com(er);
  507. for(j=0;j<16;j++)
  508. {
  509. write_1602dat(LockOpen[j]);
  510. }
  511. TwoAlam();//操作成功提示音
  512. KEY=0; //開鎖
  513. pass=1; //置正確標(biāo)志位
  514. TR0=1; //開啟定時(shí)
  515. //open_led=0; //開鎖指示燈亮
  516. for(j=0;j<6;j++)//將輸入清除
  517. {
  518. InputData[i]=0;
  519. }
  520. }
  521. else//當(dāng)兩次正確輸入時(shí),開啟重置密碼功能
  522. {
  523. //DisplayListChar(0,1,SetNew);
  524. write_1602com(er);
  525. for(j=0;j<16;j++)
  526. {
  527. write_1602dat(SetNew[j]);
  528. }
  529. TwoAlam();   //操作成功提示
  530. //允許重置密碼輸入
  531. CorrectCont=0; //正確計(jì)數(shù)器清零
  532. }
  533. }
  534. else
  535. {
  536.               if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0)){
  537. WrToROM(initpassword,0,6); //強(qiáng)制將初始密碼寫入24C02存儲(chǔ)
  538. //DisplayListChar(0,1,initword); //顯示初始化密碼
  539. write_1602com(er);
  540. for(j=0;j<16;j++)
  541. {
  542. write_1602dat(initword[j]);
  543. }
  544. TwoAlam();
  545. Delay400Ms();
  546. TwoAlam();
  547. N=0;
  548. }
  549. else
  550. {
  551. //DisplayListChar(0,1,Error);
  552. write_1602com(er);
  553. for(j=0;j<16;j++)
  554. {
  555. write_1602dat(Error[j]);
  556. }
  557. ThreeAlam();//錯(cuò)誤提示音
  558. pass=0;
  559. }
  560. }
  561. }
  562. else//當(dāng)已經(jīng)開啟重置密碼功能時(shí),而按下開鎖鍵,
  563. {
  564. //DisplayListChar(0,1,Er_try);
  565. write_1602com(er);
  566. for(j=0;j<16;j++)
  567. {
  568. write_1602dat(Er_try[j]);
  569. }
  570. ThreeAlam();
  571. }
  572. }
  573. else
  574. {
  575. //DisplayListChar(0,1,Error);
  576. write_1602com(er);
  577. for(j=0;j<16;j++)
  578. {
  579. write_1602dat(Error[j]);
  580. }
  581. ThreeAlam();//錯(cuò)誤提示音
  582. pass=0;
  583. }
  584. N=0; //將輸入數(shù)據(jù)計(jì)數(shù)器清零,為下一次輸入作準(zhǔn)備

  585. operation=1;
  586. }
  587. void main(void)
  588. {
  589. unsigned char KEY,NUM;
  590. unsigned char i,j;
  591. P1=0xFF;
  592. MOD=0x11;
  593. TL0=0xB0;
  594. TH0=0x3C;
  595. EA=1;
  596. ET0=1;
  597. TR0=0;
  598. Delay400Ms();//啟動(dòng)等待,等LCM講入工作狀態(tài)
  599. lcd_init();//LCD初始化
  600. write_1602com(yi);//日歷顯示固定符號(hào)從第一行第0個(gè)位置之后開始顯示
  601. for(i=0;i<16;i++)
  602. {
  603. write_1602dat(name[i]);//向液晶屏寫日歷顯示的固定符號(hào)部分
  604. }
  605. write_1602com(er);//時(shí)間顯示固定符號(hào)寫入位置,從第2個(gè)位置后開始顯示
  606. for(i=0;i<16;i++)
  607. {
  608. write_1602dat(start_line[i]);//寫顯示時(shí)間固定符號(hào),兩個(gè)冒號(hào)
  609. }
  610. write_1602com(er+9); //設(shè)置光標(biāo)位置
  611. //write_1602com(0x0f); //設(shè)置光標(biāo)為閃爍
  612. Delay5Ms(); //延時(shí)片刻(可不要)
  613. N=0; //初始化數(shù)據(jù)輸入位數(shù)
  614. while(1)
  615. {
  616. if(key_disable==1)
  617. Alam_KeyUnable();
  618. else
  619. ALAM=1; //關(guān)報(bào)警
  620. KEY=keynum();
  621. if(KEY!=0)
  622. {
  623. f(key_disable==1)
  624. {
  625. econd=0;
  626. }
  627. else
  628. {
  629. NUM=coding(KEY);
  630. {
  631. switch(NUM)
  632. {
  633. case ('A'):  FourAlam() ;      break;
  634. case ('B'):
  635. case('C'):Clean();break;
  636. ase('D'): ResetPassword();break;      //重新設(shè)置密碼
  637. case('*'):Cancel();break;      //取消當(dāng)前輸入
  638. case('#'):Ensure();break;  //確認(rèn)鍵,
  639. default:
  640. {
  641. //DisplayListChar(0,1,Input);
  642. write_1602com(er);
  643. for(i=0;i<16;i++)
  644. {
  645. write_1602dat(Input[i]);
  646. }
  647.     operation=0;
  648. if(N<6)          //當(dāng)輸入的密碼少于6位時(shí),接受輸入并保存,大于6位時(shí)則無(wú)效。
  649. {
  650. OneAlam();//按鍵提示音
  651. //DisplayOneChar(6+N,1,'*');
  652. for(j=0;j<=N;j++)
  653. {
  654. write_1602com(er+6+j);
  655. write_1602dat('*');
  656. }
  657. InputData[N]=NUM;
  658. N++;
  659. }
  660. else//輸入數(shù)據(jù)位數(shù)大于6后,忽略輸入
  661. {
  662. N=6;
  663. break; }}}}}} }}
復(fù)制代碼


附錄4  元器件清單

9X15cm萬(wàn)用板
1片
單片機(jī)+IC座
1套
10K排阻
1只
AT24C02+IC座
1套
1602液晶顯示屏
1個(gè)
單排座(16針)
2條
2.4K電阻
1只
按鍵
17只
12M晶振
1只
22P瓷片電容
2只
10uF極性電容
1只
10K電阻
1只
1K色環(huán)電阻
3只
蜂鳴器
1只
三極管S8550
2只
發(fā)光二極管
1只
USB電源線+dc插頭
1條

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:345844 發(fā)表于 2018-6-12 03:05 | 只看該作者
程序有問(wèn)題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲小视频在线观看 | 在线免费看91 | 欧美在线一区二区三区 | 美国a级毛片免费视频 | 国产精品毛片一区二区在线看 | 久久精品免费观看 | 日韩中文字幕在线视频 | 在线日韩中文字幕 | 欧美精品欧美精品系列 | 天天夜碰日日摸日日澡 | 日韩久久成人 | 午夜欧美 | 天天色综网 | 久久天堂 | 亚洲综合在线一区二区 | 精品国产一区二区三区成人影院 | 日韩视频在线观看一区二区 | 日本一区二区不卡 | 欧美精品综合在线 | 亚洲精品白浆高清久久久久久 | 亚洲欧美视频在线观看 | wwwxxx国产 | 国产亚洲一区二区三区在线 | 一区二区免费看 | 在线观看免费观看在线91 | 激情 婷婷 | 成人欧美一区二区三区黑人孕妇 | 中文字幕亚洲视频 | 一区在线观看 | 亚洲人人 | 中文在线视频 | 国产视频一二三区 | 一区二区高清不卡 | 综合天天久久 | 欧美精品一区二区在线观看 | 天天躁天天操 | 日本精品视频在线 | 午夜一区| 亚洲精久| 91大神在线看 | www九色|