《單片機技術(shù)》課件項目八 電子密碼鎖系統(tǒng)設(shè)計_第1頁
《單片機技術(shù)》課件項目八 電子密碼鎖系統(tǒng)設(shè)計_第2頁
《單片機技術(shù)》課件項目八 電子密碼鎖系統(tǒng)設(shè)計_第3頁
《單片機技術(shù)》課件項目八 電子密碼鎖系統(tǒng)設(shè)計_第4頁
《單片機技術(shù)》課件項目八 電子密碼鎖系統(tǒng)設(shè)計_第5頁
已閱讀5頁,還剩76頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

一、學習目標1.掌握I2C總線協(xié)議。2.掌握AT24C02的使用方法。3.掌握讀懂時序?qū)懗绦虻姆椒?。。二、學習任務(wù)在日常生活中,經(jīng)常要碰到人機接口,如鍵盤接口、觸摸屏接口等。在銀行柜臺串口都有輸入密碼的小鍵盤,這就是一種典型的人機接口。本項目的任務(wù)是設(shè)計一電子密碼鎖,通過鍵盤設(shè)置設(shè)置密碼,通過鍵盤可以修改密碼,通過鍵盤輸入密碼,進行開鎖。本項目任務(wù)分解為具體2個學習任務(wù):任務(wù)一I2C總線的模擬;任務(wù)二電子密碼鎖系統(tǒng)實現(xiàn)。三、任務(wù)分解任務(wù)一I2C總線的模擬【任務(wù)描述】通過對I2C總線的模擬,實現(xiàn)向串行存儲芯片AT24C02寫入該芯片的地址,返回應(yīng)答信號0,向串行存儲芯片AT24C02寫入一個非該芯片的地址,返回應(yīng)到信號1,用LCD1602顯示兩種對比結(jié)果?!救蝿?wù)分析】學習I2C總線技術(shù),并模擬I2C總線,以及液晶驅(qū)動技術(shù),前面所學知識,實現(xiàn)電子密碼鎖系統(tǒng)的實現(xiàn)?!鞠嚓P(guān)知識】一、I2C串行總線的組成及工作原理

I2C-BUS

I2C總線是PHLIPS公司推出的一種串行總線,是具備多主機系統(tǒng)所需的包括總線裁決和高低速器件同步功能的高性能串行總線。

I2C總線只有兩根雙向信號線。一根是數(shù)據(jù)線SDA,另一根是時鐘線SCL。I2C總線通過上拉電阻接正電源。當總線空閑時,兩根線均為高電平。連到總線上的任一器件輸出的低電平,都將使總線的信號變低,即各器件的SDA及SCL都是線“與”關(guān)系。

每個接到I2C總線上的器件都有唯一的地址。主機與其它器件間的數(shù)據(jù)傳送可以是由主機發(fā)送數(shù)據(jù)到其它器件,這時主機即為發(fā)送器。由總線上接收數(shù)據(jù)的器件則為接收器。

在多主機系統(tǒng)中,可能同時有幾個主機企圖啟動總線傳送數(shù)據(jù)。為了避免混亂,I2C總線要通過總線仲裁,以決定由哪一臺主機控制總線。

數(shù)據(jù)位的有效性規(guī)定

I2C總線進行數(shù)據(jù)傳送時,時鐘信號為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時鐘線上的信號為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。 I2C總線的數(shù)據(jù)傳送起始和終止信號

SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號;SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號。

起始和終止信號都是由主機發(fā)出的,在起始信號產(chǎn)生后,總線就處于被占用的狀態(tài);在終止信號產(chǎn)生后,總線就處于空閑狀態(tài)。

連接到I2C總線上的器件,若具有I2C總線的硬件接口,則很容易檢測到起始和終止信號。對于不具備I2C總線硬件接口的有些單片機來說,為了檢測起始和終止信號,必須保證在每個時鐘周期內(nèi)對數(shù)據(jù)線SDA采樣兩次。

接收器件收到一個完整的數(shù)據(jù)字節(jié)后,有可能需要完成一些其它工作,如處理內(nèi)部中斷服務(wù)等,可能無法立刻接收下一個字節(jié),這時接收器件可以將SCL線拉成低電平,從而使主機處于等待狀態(tài)。直到接收器件準備好接收下一個字節(jié)時,再釋放SCL線使之為高電平,從而使數(shù)據(jù)傳送可以繼續(xù)進行。

數(shù)據(jù)傳送格式字節(jié)傳送與應(yīng)答

每一個字節(jié)必須保證是8位長度。數(shù)據(jù)傳送時,先傳送最高位(MSB),每一個被傳送的字節(jié)后面都必須跟隨一位應(yīng)答位(即一幀共有9位)。

IO口模擬子程序(1)起始信號voidStart_I2c(void){SDA=1;//發(fā)送起始條件的數(shù)據(jù)信號

DelayNus(2);SCL=1;DelayNus(6);//起始條件建立時間大于4.7us,延時

SDA=0;//發(fā)送起始信號

DelayNus(6);//起始條件建立時間大于4.7us,延時

SCL=0;//鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)}(2)終止信號voidStop_I2c(void){SDA=0;DelayNus(2);SCL=1;DelayNus(6);//起始條件建立時間大于4.7us,延時

SDA=1;DelayNus(6);}

從機地址(SlaveAddress)I2C總線不需要額外的地址譯碼器和片選信號。多個具有I2C總線接口的器件都可以連接到同一條I2C總線上,它們之間通過器件地址來區(qū)分。主機是主控器件,它不需要器件地址,其它器件都屬于從機,要有器件地址。必須保證同一條I2C總線上所有從機的地址都是唯一確定的,不能有重復,否則I2C總線將不能正常工作。D7~D1位組成從機的地址。D0位是數(shù)據(jù)傳送方向位,為“0”時表示主機向從機寫數(shù)據(jù),為“1”時表示主機由從機讀數(shù)據(jù)例:

AT24C系列E2PROM芯片地址的固定部分為1010,A2、A1、A0引腳接高、低電平后得到確定的3位編碼。形成的7位編碼即為該器件的地址碼。子地址帶有I2C總線的器件除了有從機地址(SlaveAddress)外,還可能有子地址。從機地址是指該器件在I2C總線上被主機尋址的地址,而子地址是指該器件內(nèi)部不同部件或存儲單元的編址。例如,帶I2C總線接口的E2PROM就是擁有子地址器件的典型代表。

應(yīng)答在I2C總線傳輸數(shù)據(jù)過程中,每傳輸一個字節(jié),都要跟一個應(yīng)答狀態(tài)位。接收器接收數(shù)據(jù)的情況可以通過應(yīng)答位來告知發(fā)送器。應(yīng)答位的時鐘脈沖仍由主機產(chǎn)生,而應(yīng)答位的數(shù)據(jù)狀態(tài)則遵循“誰接收誰產(chǎn)生”的原則,即總是由接收器產(chǎn)生應(yīng)答位。主機向從機發(fā)送數(shù)據(jù)時,應(yīng)答位由從機產(chǎn)生;主機從從機接收數(shù)據(jù)時,應(yīng)答位由主機產(chǎn)生。I2C總線標準規(guī)定:應(yīng)答位為0表示接收器應(yīng)答(ACK),常常簡記為A;為1則表示非應(yīng)答(NACK),常常簡記為A。發(fā)送器發(fā)送完LSB之后,應(yīng)當釋放SDA線(拉高SDA,輸出晶體管截止),以等待接收器產(chǎn)生應(yīng)答位基本的數(shù)據(jù)傳輸格式在圖4和圖5中,各種符號的意義為:S:起始位(START)SA:從機地址(SlaveAddress),7位從機地址W:寫標志位(Write),1位寫標志R:讀標志位(Read),1位讀標志A:應(yīng)答位(Acknowledge),1位應(yīng)答/A:非應(yīng)答位(NotAcknowledge),1位非應(yīng)答D:數(shù)據(jù)(Data),每個數(shù)據(jù)都必須是8位P:停止位(STOP)陰影:主機產(chǎn)生的信號無陰影:從機產(chǎn)生的信號重復起始條件(RepeatedSTARTcondition)主機與從機進行通信時,有時需要切換數(shù)據(jù)的收發(fā)方向(例如,訪問某一具有I2C總線接口的E2PROM存儲器時,主機先向存儲器輸入存儲單元的地址信息(發(fā)送數(shù)據(jù)),然后再讀取其中的存儲內(nèi)容(接收數(shù)據(jù)))在切換數(shù)據(jù)的傳輸方向時,可以不必先產(chǎn)生停止條件再開始下次傳輸,而是直接再一次產(chǎn)生開始條件。I2C總線在已經(jīng)處于忙的狀態(tài)下,再一次直接產(chǎn)生起始條件的情況被稱為重復起始條件。重復起始條件常常簡記為Sr。讀/寫一字節(jié)子程序voidSendByte(unsignedcharc){unsignedchari;for(i=0;i<8;i++){if((c<<i)&0x80)SDA=1;//判斷發(fā)送位

elseSDA=0;DelayNus(2);SCL=1;DelayNus(6);SCL=0;DelayNus(6);}}unsignedcharRcvByte(void){unsignedchari;unsignedcharc=0;SDA=1;for(i=0;i<8;i++){SCL=0;//置時鐘線為低,準備接收數(shù)據(jù)位

DelayNus(6);//時鐘低電平周期大于4.7μsSCL=1;DelayNus(2);c<<=1;if(SDA){c+=1;}//讀數(shù)據(jù)位,將接收的數(shù)據(jù)存c}SCL=0;returnc;}三、串行E2PROM存儲器24C02初步認識串行E2PROM是在各種串行器件應(yīng)用中使用較頻繁的器件,和并行E2PROM相比,串行E2PROM容量小、數(shù)據(jù)傳送速度較低,但因其體積較小,引腳較少,功耗低,特別適合于需要存放非揮發(fā)數(shù)據(jù),速度要求不高,引腳少的單片機應(yīng)用系統(tǒng)。1.引腳功能VCC:電源+5V。VSS:地線。SCL:串行時鐘輸入端,用于發(fā)送數(shù)據(jù)或接收數(shù)據(jù)時產(chǎn)生所需的時鐘。SDA:串行數(shù)據(jù)I/O端,用于輸入和輸出串行數(shù)據(jù)。該引腳是漏極開路的端口,需接上拉電阻到VCC。WP:寫保護端,該引腳提供了硬件數(shù)據(jù)保護,當WP接地時,允許對芯片執(zhí)行寫操作;當WP接VCC時,則對芯片實施寫保護。A0、A1、A2:器件地址輸入端,用于多個器件級聯(lián)時設(shè)置器件地址,當這些腳懸空時默認值為0,對于24C02可級聯(lián)8個器件,如果線路上只有一片24C02,這三個地址輸入腳A0、A1、A2可懸空或連接到GND。例:如果A2、A1、A0所接的電平為101,由于24C02的器件標識為1010,那么,該芯片的讀地址為0xab,寫地址為0xaa?!救蝿?wù)實施】單片機向24C02發(fā)送一字節(jié)數(shù)據(jù)對應(yīng)的程序代碼如下:Lcd1602.c文件代碼:#include<reg52.h>#include<intrins.h>#defineLCD1602_DBP0sbitLCD1602_RS=P2^0;sbitLCD1602_RW=P2^1;sbitLCD1602_E=P2^2;/*等待液晶是否忙*/bitLcd_bz()//測試忙函數(shù),1-忙,0-不忙{bitresult;LCD1602_DB=0xFF;LCD1602_RS=0;LCD1602_RW=1;LCD1602_E=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(LCD1602_DB&0x80);//bit7等于1表示液晶正忙LCD1602_E=0;returnresult;}/*向LCD1602液晶寫入一字節(jié)命令,cmd-待寫入命令值*/voidLcdWriteCmd(unsignedcharcmd){while(Lcd_bz());//判斷LCD是否忙碌

LCD1602_RS=0;LCD1602_RW=0;LCD1602_DB=cmd;LCD1602_E=1;LCD1602_E=0;}/*向LCD1602液晶寫入一字節(jié)數(shù)據(jù),dat-待寫入數(shù)據(jù)值*/voidLcdWriteDat(unsignedchardat){while(Lcd_bz());//判斷LCD是否忙碌

LCD1602_RS=1;LCD1602_RW=0;LCD1602_DB=dat;LCD1602_E=1;LCD1602_E=0;}/*設(shè)置顯示RAM起始地址,亦即光標位置,(x,y)-對應(yīng)屏幕上的字符坐標*/voidLcdSetCursor(unsignedcharx,unsignedchary){unsignedcharaddr;

if(y==0)//由輸入的屏幕坐標計算顯示RAM的地址

addr=0x00+x;//第一行字符地址從0x00起始

elseaddr=0x40+x;//第二行字符地址從0x40起始

LcdWriteCmd(addr|0x80);//設(shè)置RAM地址}/*在液晶上顯示字符串,(x,y)-對應(yīng)屏幕上的起始坐標,str-字符串指針*/voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str){LcdSetCursor(x,y);//設(shè)置起始地址

while(*str!='\0')//連續(xù)寫入字符串數(shù)據(jù),直到檢測到結(jié)束符

{LcdWriteDat(*str++);}}/*初始化1602液晶*/voidInitLcd1602(){LcdWriteCmd(0x38);//16*2顯示,5*7點陣,8位數(shù)據(jù)接口

LcdWriteCmd(0x0C);//顯示器開,光標關(guān)閉

LcdWriteCmd(0x06);//文字不動,地址自動+1LcdWriteCmd(0x01);//清屏}main.c代碼:#include<reg51.h>//包含51單片機寄存器定義的頭文件#include<intrins.h>//包含_nop_()函數(shù)定義的頭文件#defineucharunsignedchar#defineuintunsignedint#definedelay5us(){_nop_();_nop_();_nop_();_nop_();}sbitSDA=P3^4;//將串行數(shù)據(jù)總線SDA位定義在為P3.4引腳sbitSCL=P3^3;//將串行時鐘總線SDA位定義在為P3.3引腳bitack=0;//此應(yīng)答信號為單片機發(fā)送數(shù)據(jù)時,24C02作出的應(yīng)到信號externvoidInitLcd1602();externvoidLcdShowStr(ucharx,uchary,uchar*str);bitI2CAddresing(ucharaddr);bitSendByte(ucharaddr);voidmain(){ ucharstring[10];InitLcd1602();//初始化液晶

ack=I2CAddresing(0xa0);//發(fā)送AT24c02的器件地址

string[0]='5'; string[1]='0'; string[2]=':'; string[3]=(unsignedchar)ack+'0'; string[4]='\0'; LcdShowStr(0,0,string); ack=I2CAddresing(0x62);//發(fā)送非AT24c02的器件地址

string[0]='6'; string[1]='2'; string[2]=':'; string[3]=(unsignedchar)ack+'0'; string[4]='\0'; LcdShowStr(8,0,string);while(1);}//開始位voidstart(){SDA=1;//SDA初始化為高電平"1"SCL=1;//開始數(shù)據(jù)傳送時,要求SCL為高電平"1"delay5us();//延時5usSDA=0;//SDA的下降沿被認為是開始信號delay5us();//延時5usSCL=0;//SCL為低電平時,SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)}//停止位voidstop(){SDA=0;//SDA初始化為低電平"0"_nSCL=1;//結(jié)束數(shù)據(jù)傳送時,要求SCL為高電平"1"delay5us();//延時5usSDA=1;//SDA的上升沿被認為是結(jié)束信號delay5us();//延時5usSDA=0;SCL=0;}/**************************************************函數(shù)功能:發(fā)送一字節(jié)子函數(shù)***************************************************/bitSendByte(ucharc) {ucharn; for(n=0;n<8;n++)//一字節(jié)為8位,循環(huán)8次

{if(c&0x80)//先高后低,將數(shù)據(jù)線SDA置1或清0 SDA=1; else SDA=0; SCL=1;//SCL為高,通知從機開始接收數(shù)據(jù)

delay5us(); SCL=0;//SCL變低,準備發(fā)送下一位數(shù)據(jù)準備下一位要發(fā)送的數(shù)據(jù)

c=c<<1;//準備下一位要發(fā)送的數(shù)據(jù)} SDA=1; delay5us(); SCL=1;//SCL變低,準備發(fā)送下一位數(shù)據(jù)準備下一位要發(fā)送的數(shù)據(jù)

delay5us(); if(SDA==1)//該24C02產(chǎn)生應(yīng)答了,0表示收到,1表示未收到

ack=0; else ack=1;//24C02如應(yīng)答了0表示收到,為符合一般規(guī)則,將ack標志信號置為1 SCL=0; returnack; }/**************************************************函數(shù)功能:啟動一次地址發(fā)送操作***************************************************/bitI2CAddresing(unsignedcharaddr){ack=0;start();ack=~SendByte(addr);//取反表示恢復at24c02實際有應(yīng)答就為0,不取反實際有應(yīng)答就為1stop();returnack;}【進階提高】向AT24C02指定地址地址"0x36"中寫入數(shù)據(jù)"0x0f",然后從指定地址"0x36中讀取數(shù)據(jù)并送P1口顯示。AT24C02發(fā)送與接收單字節(jié)數(shù)據(jù)對應(yīng)的程序代碼如下:#include<reg51.h>//包含51單片機寄存器定義的頭文件#include<intrins.h>//包含_nop_()函數(shù)定義的頭文件#defineucharunsignedchar#defineuintunsignedint#defineOP_READ0xa1//器件地址以及讀取操作,0xa1即為10100001B#defineOP_WRITE0xa0//器件地址以及寫入操作,0xa1即為10100000BsbitSDA=P3^4;//將串行數(shù)據(jù)總線SDA位定義在為P3.4引腳sbitSCL=P3^3;//將串行時鐘總線SDA位定義在為P3.3引腳bitack_mk;//應(yīng)答標志位,有應(yīng)答為1,無應(yīng)答為0/*****************************************************函數(shù)功能:延時5us***************************************************/voidDelay5us(){_nop_();_nop_();_nop_();_nop_();}voiddelay1ms(){unsignedchari,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/***************************************************函數(shù)功能:開始數(shù)據(jù)傳送***************************************************/voidStart()//開始位{SDA=1;//SDA初始化為高電平"1"SCL=1;//開始數(shù)據(jù)傳送時,要求SCL為高電平"1"Delay5us();//延時5usSDA=0;//SDA的下降沿被認為是開始信號Delay5us();//延時5usSCL=0;//SCL為低電平時,SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)}/***************************************************函數(shù)功能:結(jié)束數(shù)據(jù)傳送***************************************************/voidStop()//停止位{SDA=0;//SDA初始化為低電平"0"_nSCL=1;//結(jié)束數(shù)據(jù)傳送時,要求SCL為高電平"1"Delay5us();//延時5usSDA=1;//SDA的上升沿被認為是結(jié)束信號

Delay5us();//延時5usSDA=0;SCL=0;}//單片機非應(yīng)答信號voidI2C_nAck(void){SCL=0; //為產(chǎn)生脈沖準備

SDA=1; //產(chǎn)生應(yīng)答信號

Delay5us(); //延時你懂得

SCL=1;Delay5us(); SCL=0;Delay5us(); //產(chǎn)生高脈沖 }/**************************************************函數(shù)功能:發(fā)送一字節(jié)***************************************************/voidSendByte(ucharc) {ucharn; for(n=0;n<8;n++)//一字節(jié)為8位,循環(huán)8次

{if(c&0x80)//先高后低,將數(shù)據(jù)線SDA置1或清0 SDA=1; else SDA=0; SCL=1;//SCL為高,通知從機開始接收數(shù)據(jù)

Delay5us(); SCL=0;//SCL變低,準備發(fā)送下一位數(shù)據(jù)準備下一位要發(fā)送的數(shù)據(jù)

c=c<<1;//準備下一位要發(fā)送的數(shù)據(jù)} SDA=1;//一字節(jié)發(fā)送完后釋放數(shù)據(jù)線

Delay5us(); SCL=1;//SCL由低變高,產(chǎn)生一個時鐘

Delay5us(); if(SDA==1)//如果SDA=1,則發(fā)送失敗。

ack_mk=0; else ack_mk=1;//如果SDA=0,則發(fā)送成功。

SCL=0;//SCL變低。

}/**************************************************函數(shù)功能:接收一字節(jié)***************************************************/

ucharRcvByte(){ ucharn,c;{for(n=0;n<8;n++)//一字節(jié)為8位,循環(huán)8次,先高后低

{SDA=1;//置數(shù)據(jù)線SDA為高,進入接收方式

SCL=1;//SCL由低變高,產(chǎn)生一個時鐘

if(SDA==0)//根據(jù)數(shù)據(jù)線SDA的狀態(tài),將c的最高位清0或置1 c=c&0x7f; else c=c|0x80; c=_crol_(c,1);//將c循環(huán)左移一位,為接收下一位準備

SCL=0;//時鐘線SCL清0 } return(c); }}/***************************************************函數(shù)功能:向AT24Cxx中的指定地址寫入數(shù)據(jù)入口參數(shù):add(儲存指定的地址);dat(儲存待寫入的數(shù)據(jù))***************************************************/voidWriteSet(unsignedcharadd,unsignedchardat)//在指定地址addr處寫入數(shù)據(jù)WriteCurrent{Start();//開始數(shù)據(jù)傳遞

SendByte(OP_WRITE);//選擇要操作的AT24Cxx芯片,并告知要對其寫入數(shù)據(jù)

SendByte(add);//寫入指定地址

SendByte(dat);//向當前地址(上面指定的地址)寫入數(shù)據(jù)

Stop();//停止數(shù)據(jù)傳遞

delay1ms();//1個字節(jié)的寫入周期為1ms,最好延時1ms以上}/***************************************************函數(shù)功能:從AT24Cxx中的指定地址讀取數(shù)據(jù)入口參數(shù):set_addr出口參數(shù):x***************************************************/ucharReadSet(unsignedcharset_addr)//在指定地址讀取{ucharData;Start();//開始數(shù)據(jù)傳遞

SendByte(OP_WRITE);//選擇要操作的AT24Cxx芯片,并告知要對其寫入數(shù)據(jù)

if(ack_mk==0)return(0);//如果沒能應(yīng)答,操作失敗

SendByte(set_addr);//寫入指定地址

if(ack_mk==0)return(0);//如果沒能應(yīng)答,操作失敗

Start();

SendByte(OP_READ); //表示進行讀操作

if(ack_mk==0)return(0);//如果沒能應(yīng)答,操作失敗

Data=RcvByte();I2C_nAck();Stop();return(Data);//從指定地址讀出數(shù)據(jù)并返回}/***************************************************函數(shù)功能:主函數(shù)***************************************************/main(void){SDA=1;//SDA=1,SCL=1,使主從設(shè)備處于空閑狀態(tài)

SCL=1;WriteSet(0x36,0x0f);//在指定地址"0x36"中寫入數(shù)據(jù)"0x0f"P1=ReadSet(0x36);//從指定地址"0x36中讀取數(shù)據(jù)并送P1口顯示

while(1);}任務(wù)二電子密碼鎖設(shè)計實現(xiàn)【任務(wù)描述】在日常的生活和工作中,住宅與部門的安全防范、單位的文件檔案、財務(wù)報表以及一些個人資料的保存多以加鎖的辦法來解決。若使用傳統(tǒng)的機械式鑰匙開鎖,人們常需攜帶多把鑰匙,使用極不方便,且鑰匙丟失后安全性即大打折扣。在安全技術(shù)防范領(lǐng)域,具有防盜報警功能的電子密碼鎖逐漸代替了傳統(tǒng)的機械式密碼鎖,電子密碼鎖具有安全性高、成本低、功耗低、易操作等優(yōu)點。電子密碼鎖是一種通過密碼輸入來控制電路或是芯片工作,從而控制機械開關(guān)的閉合,完成開鎖、閉鎖任務(wù)的電子產(chǎn)品。它的種類很多,有簡易的電路產(chǎn)品,也有基于芯片的性價比較高的產(chǎn)品。現(xiàn)在應(yīng)用較廣的電子密碼鎖是以芯片為核心,通過編程來實現(xiàn)的。其性能和安全性已大大超過了機械鎖?!救蝿?wù)分析】學習I2C總線技術(shù),并模擬I2C總線,以及液晶驅(qū)動技術(shù),前面所學知識,比較綜合的運用。本任務(wù)先實現(xiàn)單片機向AT24C02發(fā)送4組數(shù)據(jù),再將這4組數(shù)據(jù)從AT24C02取出送液晶顯示,最后實現(xiàn)電子門密碼鎖系統(tǒng)?!鞠嚓P(guān)知識】本任務(wù)要用到十六進數(shù)組用液晶的顯示的問題,下面通過實例加以說明:用8-14所示電路,把數(shù)組InputData[4]={0x55,0x34,0x56,0xab};中的4個值用液晶1602給顯示出來。Lcd1602.c代碼請參閱任務(wù)1。main.c代碼:#include<reg51.h>//包含51單片機寄存器定義的頭文件#include<intrins.h>//包含_nop_()函數(shù)定義的頭文件#defineucharunsignedchar#defineuintunsignedintexternvoidInitLcd1602();externvoidLcdShowStr(ucharx,uchary,uchar*str);ucharcodeInputData[4]={0x55,0x34,0x56,0xab};uchardisp1[10]={0};//轉(zhuǎn)為液晶顯示voidirwork(void){uchari;

disp1[0]=InputData[0]/16;disp1[1]=InputData[0]%16;disp1[2]=InputData[1]/16;disp1[3]=InputData[1]%16;disp1[4]=InputData[2]/16;disp1[5]=InputData[2]%16;disp1[6]=InputData[3]/16;disp1[7]=InputData[3]%16;disp1[8]='\0';

for(i=0;i<8;i++){ if(disp1[i]>=10)switch(disp1[i]){case10:disp1[i]='A'; break; case11:disp1[i]='B'; break; case12:disp1[i]='C'; break; case13:disp1[i]='D'; break; case14:disp1[i]='E'; break; case15:disp1[i]='F'; break;}else{ disp1[i]=disp1[i]+'0';}}}/***************************************************函數(shù)功能:主函數(shù)***************************************************/main(void){InitLcd1602();//初始化液晶

while(1){irwork();LcdShowStr(0,0,disp1);//發(fā)送的數(shù)據(jù)送液晶顯示

}}【任務(wù)實施】對應(yīng)的代碼部分是實現(xiàn)單片機向AT24C02發(fā)送4組數(shù)據(jù),再將這4組數(shù)據(jù)從AT24C02取出送液晶顯示。在KeilC51中調(diào)試下面代碼:lcd1602.c參閱任務(wù)1.main.c對應(yīng)的代碼:#include<reg51.h>//包含51單片機寄存器定義的頭文件#include<intrins.h>//包含_nop_()函數(shù)定義的頭文件#defineucharunsignedchar#defineuintunsignedintsbitSDA=P3^4;//將串行數(shù)據(jù)總線SDA位定義在為P3.4引腳sbitSCL=P3^3;//將串行時鐘總線SDA位定義在為P3.3引腳externvoidInitLcd1602();externvoidLcdShowStr(ucharx,uchary,uchar*str);unsignedcharDisp1[10];unsignedcharDisp2[10];unsignedcharDisp3[8]={0,0,1,1,2,2,3,3};ucharcodeInputData[4]={0x55,0x34,0x56,0xab};ucharOutputData[4]={0};bitack_mk;//應(yīng)答標志位,有應(yīng)答為1,無應(yīng)答為0/*****************************************************函數(shù)功能:延時5us***************************************************/voidDelay5us(){_nop_();_nop_();_nop_();_nop_();}voidDelayMS(uintValMS){ uintuiVal,ujVal; for(uiVal=0;uiVal<ValMS;uiVal++) for(ujVal=0;ujVal<120;ujVal++);}/***************************************************函數(shù)功能:開始數(shù)據(jù)傳送***************************************************/voidStart()//開始位{SDA=1;//SDA初始化為高電平"1"SCL=1;//開始數(shù)據(jù)傳送時,要求SCL為高電平"1"Delay5us();//延時5usSDA=0;//SDA的下降沿被認為是開始信號Delay5us();//延時5usSCL=0;//SCL為低電平時,SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)}/***************************************************函數(shù)功能:結(jié)束數(shù)據(jù)傳送***************************************************/voidStop()//停止位{SDA=0;//SDA初始化為低電平"0"_nSCL=1;//結(jié)束數(shù)據(jù)傳送時,要求SCL為高電平"1"Delay5us();//延時5usSDA=1;//SDA的上升沿被認為是結(jié)束信號

Delay5us();//延時5usSDA=0;SCL=0;}//單片機接收時單片機產(chǎn)生應(yīng)答信號voidI2C_Ack(void){SCL=0; //為產(chǎn)生脈沖準備

SDA=0; //產(chǎn)生應(yīng)答信號

Delay5us(); //延時你懂得

SCL=1;Delay5us(); SCL=0;Delay5us(); //產(chǎn)生高脈沖

SDA=1; //釋放總線}//單片機非應(yīng)答信號voidI2C_nAck(void){SCL=0; //為產(chǎn)生脈沖準備

SDA=1; //產(chǎn)生應(yīng)答信號

Delay5us(); //延時你懂得

SCL=1;Delay5us(); SCL=0;Delay5us(); //產(chǎn)生高脈沖 }/**************************************************函數(shù)功能:發(fā)送一字節(jié)***************************************************/voidSendByte(ucharc) {ucharn; for(n=0;n<8;n++)//一字節(jié)為8位,循環(huán)8次

{if(c&0x80)//先高后低,將數(shù)據(jù)線SDA置1或清0 SDA=1; else SDA=0; SCL=1;//SCL為高,通知從機開始接收數(shù)據(jù)

Delay5us();

SCL=0;//SCL變低,準備發(fā)送下一位數(shù)據(jù)準備下一位要發(fā)送的數(shù)據(jù)

c=c<<1;//準備下一位要發(fā)送的數(shù)據(jù)

} SDA=1;//一字節(jié)發(fā)送完后釋放數(shù)據(jù)線

Delay5us(); SCL=1;//SCL由低變高,產(chǎn)生一個時鐘

Delay5us(); if(SDA==1)//如果SDA=1,則發(fā)送失敗。

ack_mk=0; else ack_mk=1;//如果SDA=0,則發(fā)送成功。

SCL=0;//SCL變低。

}/**************************************************函數(shù)功能:接收一字節(jié)***************************************************/

ucharRcvByte(){ ucharn,c;{for(n=0;n<8;n++)//一字節(jié)為8位,循環(huán)8次,先高后低

{SDA=1;//置數(shù)據(jù)線SDA為高,進入接收方式

SCL=1;//SCL由低變高,產(chǎn)生一個時鐘

if(SDA==0)//根據(jù)數(shù)據(jù)線SDA的狀態(tài),將c的最高位清0或置1 c=c&0x7f; else c=c|0x80; c=_crol_(c,1);//將c循環(huán)左移一位,為接收下一位準備

SCL=0;//時鐘線SCL清0

} return(c); }}/**************************************************函數(shù)功能:發(fā)送多字節(jié)***************************************************/bitSendStr(ucharsla,ucharsuba,uchar*s,ucharn){uchari;Start(); //發(fā)起始信號,啟動總線

SendByte(sla);//發(fā)送器件地址

if(ack_mk==0)return(0);//沒能應(yīng)答,操作失敗

SendByte(suba);//發(fā)送器件子地址

if(ack_mk==0)return(0);//沒能應(yīng)答,操作失敗

for(i=0;i<n;i++)//循環(huán)n次

{SendByte(*s); if(ack_mk==0)return(0);//沒能應(yīng)答,操作失敗

s++;//指向下一個字節(jié)

} Stop();//發(fā)結(jié)束信號,結(jié)束本次數(shù)據(jù)傳送

return(1);}/**************************************************函數(shù)功能:接收多字節(jié)***************************************************/bitRcvStr(ucharsla,ucharsuba,uchar*s,ucharn){ uchari;Start();//發(fā)起始信號,啟動總線

SendByte(sla);//發(fā)送器件地址if(ack_mk==0)return(0);//如果沒能應(yīng)答,操作失敗

SendByte(suba);//發(fā)送器件子地址if(ack_mk==0)return(0);//如果沒能應(yīng)答,操作失敗

Start();//再次發(fā)起始信號

SendByte(sla+1); //sla+1表示進行讀操作if(ack_mk==

溫馨提示

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

評論

0/150

提交評論