




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一、學(xué)習(xí)目標(biāo)1.掌握I2C總線(xiàn)協(xié)議。2.掌握AT24C02的使用方法。3.掌握讀懂時(shí)序?qū)懗绦虻姆椒?。。二、學(xué)習(xí)任務(wù)在日常生活中,經(jīng)常要碰到人機(jī)接口,如鍵盤(pán)接口、觸摸屏接口等。在銀行柜臺(tái)串口都有輸入密碼的小鍵盤(pán),這就是一種典型的人機(jī)接口。本項(xiàng)目的任務(wù)是設(shè)計(jì)一電子密碼鎖,通過(guò)鍵盤(pán)設(shè)置設(shè)置密碼,通過(guò)鍵盤(pán)可以修改密碼,通過(guò)鍵盤(pán)輸入密碼,進(jìn)行開(kāi)鎖。本項(xiàng)目任務(wù)分解為具體2個(gè)學(xué)習(xí)任務(wù):任務(wù)一I2C總線(xiàn)的模擬;任務(wù)二電子密碼鎖系統(tǒng)實(shí)現(xiàn)。三、任務(wù)分解任務(wù)一I2C總線(xiàn)的模擬【任務(wù)描述】通過(guò)對(duì)I2C總線(xiàn)的模擬,實(shí)現(xiàn)向串行存儲(chǔ)芯片AT24C02寫(xiě)入該芯片的地址,返回應(yīng)答信號(hào)0,向串行存儲(chǔ)芯片AT24C02寫(xiě)入一個(gè)非該芯片的地址,返回應(yīng)到信號(hào)1,用LCD1602顯示兩種對(duì)比結(jié)果?!救蝿?wù)分析】學(xué)習(xí)I2C總線(xiàn)技術(shù),并模擬I2C總線(xiàn),以及液晶驅(qū)動(dòng)技術(shù),前面所學(xué)知識(shí),實(shí)現(xiàn)電子密碼鎖系統(tǒng)的實(shí)現(xiàn)?!鞠嚓P(guān)知識(shí)】一、I2C串行總線(xiàn)的組成及工作原理
I2C-BUS
I2C總線(xiàn)是PHLIPS公司推出的一種串行總線(xiàn),是具備多主機(jī)系統(tǒng)所需的包括總線(xiàn)裁決和高低速器件同步功能的高性能串行總線(xiàn)。
I2C總線(xiàn)只有兩根雙向信號(hào)線(xiàn)。一根是數(shù)據(jù)線(xiàn)SDA,另一根是時(shí)鐘線(xiàn)SCL。I2C總線(xiàn)通過(guò)上拉電阻接正電源。當(dāng)總線(xiàn)空閑時(shí),兩根線(xiàn)均為高電平。連到總線(xiàn)上的任一器件輸出的低電平,都將使總線(xiàn)的信號(hào)變低,即各器件的SDA及SCL都是線(xiàn)“與”關(guān)系。
每個(gè)接到I2C總線(xiàn)上的器件都有唯一的地址。主機(jī)與其它器件間的數(shù)據(jù)傳送可以是由主機(jī)發(fā)送數(shù)據(jù)到其它器件,這時(shí)主機(jī)即為發(fā)送器。由總線(xiàn)上接收數(shù)據(jù)的器件則為接收器。
在多主機(jī)系統(tǒng)中,可能同時(shí)有幾個(gè)主機(jī)企圖啟動(dòng)總線(xiàn)傳送數(shù)據(jù)。為了避免混亂,I2C總線(xiàn)要通過(guò)總線(xiàn)仲裁,以決定由哪一臺(tái)主機(jī)控制總線(xiàn)。
數(shù)據(jù)位的有效性規(guī)定
I2C總線(xiàn)進(jìn)行數(shù)據(jù)傳送時(shí),時(shí)鐘信號(hào)為高電平期間,數(shù)據(jù)線(xiàn)上的數(shù)據(jù)必須保持穩(wěn)定,只有在時(shí)鐘線(xiàn)上的信號(hào)為低電平期間,數(shù)據(jù)線(xiàn)上的高電平或低電平狀態(tài)才允許變化。 I2C總線(xiàn)的數(shù)據(jù)傳送起始和終止信號(hào)
SCL線(xiàn)為高電平期間,SDA線(xiàn)由高電平向低電平的變化表示起始信號(hào);SCL線(xiàn)為高電平期間,SDA線(xiàn)由低電平向高電平的變化表示終止信號(hào)。
起始和終止信號(hào)都是由主機(jī)發(fā)出的,在起始信號(hào)產(chǎn)生后,總線(xiàn)就處于被占用的狀態(tài);在終止信號(hào)產(chǎn)生后,總線(xiàn)就處于空閑狀態(tài)。
連接到I2C總線(xiàn)上的器件,若具有I2C總線(xiàn)的硬件接口,則很容易檢測(cè)到起始和終止信號(hào)。對(duì)于不具備I2C總線(xiàn)硬件接口的有些單片機(jī)來(lái)說(shuō),為了檢測(cè)起始和終止信號(hào),必須保證在每個(gè)時(shí)鐘周期內(nèi)對(duì)數(shù)據(jù)線(xiàn)SDA采樣兩次。
接收器件收到一個(gè)完整的數(shù)據(jù)字節(jié)后,有可能需要完成一些其它工作,如處理內(nèi)部中斷服務(wù)等,可能無(wú)法立刻接收下一個(gè)字節(jié),這時(shí)接收器件可以將SCL線(xiàn)拉成低電平,從而使主機(jī)處于等待狀態(tài)。直到接收器件準(zhǔn)備好接收下一個(gè)字節(jié)時(shí),再釋放SCL線(xiàn)使之為高電平,從而使數(shù)據(jù)傳送可以繼續(xù)進(jìn)行。
數(shù)據(jù)傳送格式字節(jié)傳送與應(yīng)答
每一個(gè)字節(jié)必須保證是8位長(zhǎng)度。數(shù)據(jù)傳送時(shí),先傳送最高位(MSB),每一個(gè)被傳送的字節(jié)后面都必須跟隨一位應(yīng)答位(即一幀共有9位)。
IO口模擬子程序(1)起始信號(hào)voidStart_I2c(void){SDA=1;//發(fā)送起始條件的數(shù)據(jù)信號(hào)
DelayNus(2);SCL=1;DelayNus(6);//起始條件建立時(shí)間大于4.7us,延時(shí)
SDA=0;//發(fā)送起始信號(hào)
DelayNus(6);//起始條件建立時(shí)間大于4.7us,延時(shí)
SCL=0;//鉗住I2C總線(xiàn),準(zhǔn)備發(fā)送或接收數(shù)據(jù)}(2)終止信號(hào)voidStop_I2c(void){SDA=0;DelayNus(2);SCL=1;DelayNus(6);//起始條件建立時(shí)間大于4.7us,延時(shí)
SDA=1;DelayNus(6);}
從機(jī)地址(SlaveAddress)I2C總線(xiàn)不需要額外的地址譯碼器和片選信號(hào)。多個(gè)具有I2C總線(xiàn)接口的器件都可以連接到同一條I2C總線(xiàn)上,它們之間通過(guò)器件地址來(lái)區(qū)分。主機(jī)是主控器件,它不需要器件地址,其它器件都屬于從機(jī),要有器件地址。必須保證同一條I2C總線(xiàn)上所有從機(jī)的地址都是唯一確定的,不能有重復(fù),否則I2C總線(xiàn)將不能正常工作。D7~D1位組成從機(jī)的地址。D0位是數(shù)據(jù)傳送方向位,為“0”時(shí)表示主機(jī)向從機(jī)寫(xiě)數(shù)據(jù),為“1”時(shí)表示主機(jī)由從機(jī)讀數(shù)據(jù)例:
AT24C系列E2PROM芯片地址的固定部分為1010,A2、A1、A0引腳接高、低電平后得到確定的3位編碼。形成的7位編碼即為該器件的地址碼。子地址帶有I2C總線(xiàn)的器件除了有從機(jī)地址(SlaveAddress)外,還可能有子地址。從機(jī)地址是指該器件在I2C總線(xiàn)上被主機(jī)尋址的地址,而子地址是指該器件內(nèi)部不同部件或存儲(chǔ)單元的編址。例如,帶I2C總線(xiàn)接口的E2PROM就是擁有子地址器件的典型代表。
應(yīng)答在I2C總線(xiàn)傳輸數(shù)據(jù)過(guò)程中,每傳輸一個(gè)字節(jié),都要跟一個(gè)應(yīng)答狀態(tài)位。接收器接收數(shù)據(jù)的情況可以通過(guò)應(yīng)答位來(lái)告知發(fā)送器。應(yīng)答位的時(shí)鐘脈沖仍由主機(jī)產(chǎn)生,而應(yīng)答位的數(shù)據(jù)狀態(tài)則遵循“誰(shuí)接收誰(shuí)產(chǎn)生”的原則,即總是由接收器產(chǎn)生應(yīng)答位。主機(jī)向從機(jī)發(fā)送數(shù)據(jù)時(shí),應(yīng)答位由從機(jī)產(chǎn)生;主機(jī)從從機(jī)接收數(shù)據(jù)時(shí),應(yīng)答位由主機(jī)產(chǎn)生。I2C總線(xiàn)標(biāo)準(zhǔn)規(guī)定:應(yīng)答位為0表示接收器應(yīng)答(ACK),常常簡(jiǎn)記為A;為1則表示非應(yīng)答(NACK),常常簡(jiǎn)記為A。發(fā)送器發(fā)送完LSB之后,應(yīng)當(dāng)釋放SDA線(xiàn)(拉高SDA,輸出晶體管截止),以等待接收器產(chǎn)生應(yīng)答位基本的數(shù)據(jù)傳輸格式在圖4和圖5中,各種符號(hào)的意義為:S:起始位(START)SA:從機(jī)地址(SlaveAddress),7位從機(jī)地址W:寫(xiě)標(biāo)志位(Write),1位寫(xiě)標(biāo)志R:讀標(biāo)志位(Read),1位讀標(biāo)志A:應(yīng)答位(Acknowledge),1位應(yīng)答/A:非應(yīng)答位(NotAcknowledge),1位非應(yīng)答D:數(shù)據(jù)(Data),每個(gè)數(shù)據(jù)都必須是8位P:停止位(STOP)陰影:主機(jī)產(chǎn)生的信號(hào)無(wú)陰影:從機(jī)產(chǎn)生的信號(hào)重復(fù)起始條件(RepeatedSTARTcondition)主機(jī)與從機(jī)進(jìn)行通信時(shí),有時(shí)需要切換數(shù)據(jù)的收發(fā)方向(例如,訪問(wèn)某一具有I2C總線(xiàn)接口的E2PROM存儲(chǔ)器時(shí),主機(jī)先向存儲(chǔ)器輸入存儲(chǔ)單元的地址信息(發(fā)送數(shù)據(jù)),然后再讀取其中的存儲(chǔ)內(nèi)容(接收數(shù)據(jù)))在切換數(shù)據(jù)的傳輸方向時(shí),可以不必先產(chǎn)生停止條件再開(kāi)始下次傳輸,而是直接再一次產(chǎn)生開(kāi)始條件。I2C總線(xiàn)在已經(jīng)處于忙的狀態(tài)下,再一次直接產(chǎn)生起始條件的情況被稱(chēng)為重復(fù)起始條件。重復(fù)起始條件常常簡(jiǎn)記為Sr。讀/寫(xiě)一字節(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í)鐘線(xiàn)為低,準(zhǔn)備接收數(shù)據(jù)位
DelayNus(6);//時(shí)鐘低電平周期大于4.7μsSCL=1;DelayNus(2);c<<=1;if(SDA){c+=1;}//讀數(shù)據(jù)位,將接收的數(shù)據(jù)存c}SCL=0;returnc;}三、串行E2PROM存儲(chǔ)器24C02初步認(rèn)識(shí)串行E2PROM是在各種串行器件應(yīng)用中使用較頻繁的器件,和并行E2PROM相比,串行E2PROM容量小、數(shù)據(jù)傳送速度較低,但因其體積較小,引腳較少,功耗低,特別適合于需要存放非揮發(fā)數(shù)據(jù),速度要求不高,引腳少的單片機(jī)應(yīng)用系統(tǒng)。1.引腳功能VCC:電源+5V。VSS:地線(xiàn)。SCL:串行時(shí)鐘輸入端,用于發(fā)送數(shù)據(jù)或接收數(shù)據(jù)時(shí)產(chǎn)生所需的時(shí)鐘。SDA:串行數(shù)據(jù)I/O端,用于輸入和輸出串行數(shù)據(jù)。該引腳是漏極開(kāi)路的端口,需接上拉電阻到VCC。WP:寫(xiě)保護(hù)端,該引腳提供了硬件數(shù)據(jù)保護(hù),當(dāng)WP接地時(shí),允許對(duì)芯片執(zhí)行寫(xiě)操作;當(dāng)WP接VCC時(shí),則對(duì)芯片實(shí)施寫(xiě)保護(hù)。A0、A1、A2:器件地址輸入端,用于多個(gè)器件級(jí)聯(lián)時(shí)設(shè)置器件地址,當(dāng)這些腳懸空時(shí)默認(rèn)值為0,對(duì)于24C02可級(jí)聯(lián)8個(gè)器件,如果線(xiàn)路上只有一片24C02,這三個(gè)地址輸入腳A0、A1、A2可懸空或連接到GND。例:如果A2、A1、A0所接的電平為101,由于24C02的器件標(biāo)識(shí)為1010,那么,該芯片的讀地址為0xab,寫(xiě)地址為0xaa?!救蝿?wù)實(shí)施】單片機(jī)向24C02發(fā)送一字節(jié)數(shù)據(jù)對(duì)應(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()//測(cè)試忙函數(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液晶寫(xiě)入一字節(jié)命令,cmd-待寫(xiě)入命令值*/voidLcdWriteCmd(unsignedcharcmd){while(Lcd_bz());//判斷LCD是否忙碌
LCD1602_RS=0;LCD1602_RW=0;LCD1602_DB=cmd;LCD1602_E=1;LCD1602_E=0;}/*向LCD1602液晶寫(xiě)入一字節(jié)數(shù)據(jù),dat-待寫(xiě)入數(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起始地址,亦即光標(biāo)位置,(x,y)-對(duì)應(yīng)屏幕上的字符坐標(biāo)*/voidLcdSetCursor(unsignedcharx,unsignedchary){unsignedcharaddr;
if(y==0)//由輸入的屏幕坐標(biāo)計(jì)算顯示RAM的地址
addr=0x00+x;//第一行字符地址從0x00起始
elseaddr=0x40+x;//第二行字符地址從0x40起始
LcdWriteCmd(addr|0x80);//設(shè)置RAM地址}/*在液晶上顯示字符串,(x,y)-對(duì)應(yīng)屏幕上的起始坐標(biāo),str-字符串指針*/voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str){LcdSetCursor(x,y);//設(shè)置起始地址
while(*str!='\0')//連續(xù)寫(xiě)入字符串?dāng)?shù)據(jù),直到檢測(cè)到結(jié)束符
{LcdWriteDat(*str++);}}/*初始化1602液晶*/voidInitLcd1602(){LcdWriteCmd(0x38);//16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
LcdWriteCmd(0x0C);//顯示器開(kāi),光標(biāo)關(guān)閉
LcdWriteCmd(0x06);//文字不動(dòng),地址自動(dòng)+1LcdWriteCmd(0x01);//清屏}main.c代碼:#include<reg51.h>//包含51單片機(jī)寄存器定義的頭文件#include<intrins.h>//包含_nop_()函數(shù)定義的頭文件#defineucharunsignedchar#defineuintunsignedint#definedelay5us(){_nop_();_nop_();_nop_();_nop_();}sbitSDA=P3^4;//將串行數(shù)據(jù)總線(xiàn)SDA位定義在為P3.4引腳sbitSCL=P3^3;//將串行時(shí)鐘總線(xiàn)SDA位定義在為P3.3引腳bitack=0;//此應(yīng)答信號(hào)為單片機(jī)發(fā)送數(shù)據(jù)時(shí),24C02作出的應(yīng)到信號(hào)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);}//開(kāi)始位voidstart(){SDA=1;//SDA初始化為高電平"1"SCL=1;//開(kāi)始數(shù)據(jù)傳送時(shí),要求SCL為高電平"1"delay5us();//延時(shí)5usSDA=0;//SDA的下降沿被認(rèn)為是開(kāi)始信號(hào)delay5us();//延時(shí)5usSCL=0;//SCL為低電平時(shí),SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)}//停止位voidstop(){SDA=0;//SDA初始化為低電平"0"_nSCL=1;//結(jié)束數(shù)據(jù)傳送時(shí),要求SCL為高電平"1"delay5us();//延時(shí)5usSDA=1;//SDA的上升沿被認(rèn)為是結(jié)束信號(hào)delay5us();//延時(shí)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ù)線(xiàn)SDA置1或清0 SDA=1; else SDA=0; SCL=1;//SCL為高,通知從機(jī)開(kāi)始接收數(shù)據(jù)
delay5us(); SCL=0;//SCL變低,準(zhǔn)備發(fā)送下一位數(shù)據(jù)準(zhǔn)備下一位要發(fā)送的數(shù)據(jù)
c=c<<1;//準(zhǔn)備下一位要發(fā)送的數(shù)據(jù)} SDA=1; delay5us(); SCL=1;//SCL變低,準(zhǔn)備發(fā)送下一位數(shù)據(jù)準(zhǔn)備下一位要發(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標(biāo)志信號(hào)置為1 SCL=0; returnack; }/**************************************************函數(shù)功能:?jiǎn)?dòng)一次地址發(fā)送操作***************************************************/bitI2CAddresing(unsignedcharaddr){ack=0;start();ack=~SendByte(addr);//取反表示恢復(fù)at24c02實(shí)際有應(yīng)答就為0,不取反實(shí)際有應(yīng)答就為1stop();returnack;}【進(jìn)階提高】向AT24C02指定地址地址"0x36"中寫(xiě)入數(shù)據(jù)"0x0f",然后從指定地址"0x36中讀取數(shù)據(jù)并送P1口顯示。AT24C02發(fā)送與接收單字節(jié)數(shù)據(jù)對(duì)應(yīng)的程序代碼如下:#include<reg51.h>//包含51單片機(jī)寄存器定義的頭文件#include<intrins.h>//包含_nop_()函數(shù)定義的頭文件#defineucharunsignedchar#defineuintunsignedint#defineOP_READ0xa1//器件地址以及讀取操作,0xa1即為10100001B#defineOP_WRITE0xa0//器件地址以及寫(xiě)入操作,0xa1即為10100000BsbitSDA=P3^4;//將串行數(shù)據(jù)總線(xiàn)SDA位定義在為P3.4引腳sbitSCL=P3^3;//將串行時(shí)鐘總線(xiàn)SDA位定義在為P3.3引腳bitack_mk;//應(yīng)答標(biāo)志位,有應(yīng)答為1,無(wú)應(yīng)答為0/*****************************************************函數(shù)功能:延時(shí)5us***************************************************/voidDelay5us(){_nop_();_nop_();_nop_();_nop_();}voiddelay1ms(){unsignedchari,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/***************************************************函數(shù)功能:開(kāi)始數(shù)據(jù)傳送***************************************************/voidStart()//開(kāi)始位{SDA=1;//SDA初始化為高電平"1"SCL=1;//開(kāi)始數(shù)據(jù)傳送時(shí),要求SCL為高電平"1"Delay5us();//延時(shí)5usSDA=0;//SDA的下降沿被認(rèn)為是開(kāi)始信號(hào)Delay5us();//延時(shí)5usSCL=0;//SCL為低電平時(shí),SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)}/***************************************************函數(shù)功能:結(jié)束數(shù)據(jù)傳送***************************************************/voidStop()//停止位{SDA=0;//SDA初始化為低電平"0"_nSCL=1;//結(jié)束數(shù)據(jù)傳送時(shí),要求SCL為高電平"1"Delay5us();//延時(shí)5usSDA=1;//SDA的上升沿被認(rèn)為是結(jié)束信號(hào)
Delay5us();//延時(shí)5usSDA=0;SCL=0;}//單片機(jī)非應(yīng)答信號(hào)voidI2C_nAck(void){SCL=0; //為產(chǎn)生脈沖準(zhǔn)備
SDA=1; //產(chǎn)生應(yīng)答信號(hào)
Delay5us(); //延時(shí)你懂得
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ù)線(xiàn)SDA置1或清0 SDA=1; else SDA=0; SCL=1;//SCL為高,通知從機(jī)開(kāi)始接收數(shù)據(jù)
Delay5us(); SCL=0;//SCL變低,準(zhǔn)備發(fā)送下一位數(shù)據(jù)準(zhǔn)備下一位要發(fā)送的數(shù)據(jù)
c=c<<1;//準(zhǔn)備下一位要發(fā)送的數(shù)據(jù)} SDA=1;//一字節(jié)發(fā)送完后釋放數(shù)據(jù)線(xiàn)
Delay5us(); SCL=1;//SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘
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ù)線(xiàn)SDA為高,進(jìn)入接收方式
SCL=1;//SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘
if(SDA==0)//根據(jù)數(shù)據(jù)線(xiàn)SDA的狀態(tài),將c的最高位清0或置1 c=c&0x7f; else c=c|0x80; c=_crol_(c,1);//將c循環(huán)左移一位,為接收下一位準(zhǔn)備
SCL=0;//時(shí)鐘線(xiàn)SCL清0 } return(c); }}/***************************************************函數(shù)功能:向AT24Cxx中的指定地址寫(xiě)入數(shù)據(jù)入口參數(shù):add(儲(chǔ)存指定的地址);dat(儲(chǔ)存待寫(xiě)入的數(shù)據(jù))***************************************************/voidWriteSet(unsignedcharadd,unsignedchardat)//在指定地址addr處寫(xiě)入數(shù)據(jù)WriteCurrent{Start();//開(kāi)始數(shù)據(jù)傳遞
SendByte(OP_WRITE);//選擇要操作的AT24Cxx芯片,并告知要對(duì)其寫(xiě)入數(shù)據(jù)
SendByte(add);//寫(xiě)入指定地址
SendByte(dat);//向當(dāng)前地址(上面指定的地址)寫(xiě)入數(shù)據(jù)
Stop();//停止數(shù)據(jù)傳遞
delay1ms();//1個(gè)字節(jié)的寫(xiě)入周期為1ms,最好延時(shí)1ms以上}/***************************************************函數(shù)功能:從AT24Cxx中的指定地址讀取數(shù)據(jù)入口參數(shù):set_addr出口參數(shù):x***************************************************/ucharReadSet(unsignedcharset_addr)//在指定地址讀取{ucharData;Start();//開(kāi)始數(shù)據(jù)傳遞
SendByte(OP_WRITE);//選擇要操作的AT24Cxx芯片,并告知要對(duì)其寫(xiě)入數(shù)據(jù)
if(ack_mk==0)return(0);//如果沒(méi)能應(yīng)答,操作失敗
SendByte(set_addr);//寫(xiě)入指定地址
if(ack_mk==0)return(0);//如果沒(méi)能應(yīng)答,操作失敗
Start();
SendByte(OP_READ); //表示進(jìn)行讀操作
if(ack_mk==0)return(0);//如果沒(méi)能應(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"中寫(xiě)入數(shù)據(jù)"0x0f"P1=ReadSet(0x36);//從指定地址"0x36中讀取數(shù)據(jù)并送P1口顯示
while(1);}任務(wù)二電子密碼鎖設(shè)計(jì)實(shí)現(xiàn)【任務(wù)描述】在日常的生活和工作中,住宅與部門(mén)的安全防范、單位的文件檔案、財(cái)務(wù)報(bào)表以及一些個(gè)人資料的保存多以加鎖的辦法來(lái)解決。若使用傳統(tǒng)的機(jī)械式鑰匙開(kāi)鎖,人們常需攜帶多把鑰匙,使用極不方便,且鑰匙丟失后安全性即大打折扣。在安全技術(shù)防范領(lǐng)域,具有防盜報(bào)警功能的電子密碼鎖逐漸代替了傳統(tǒng)的機(jī)械式密碼鎖,電子密碼鎖具有安全性高、成本低、功耗低、易操作等優(yōu)點(diǎn)。電子密碼鎖是一種通過(guò)密碼輸入來(lái)控制電路或是芯片工作,從而控制機(jī)械開(kāi)關(guān)的閉合,完成開(kāi)鎖、閉鎖任務(wù)的電子產(chǎn)品。它的種類(lèi)很多,有簡(jiǎn)易的電路產(chǎn)品,也有基于芯片的性?xún)r(jià)比較高的產(chǎn)品。現(xiàn)在應(yīng)用較廣的電子密碼鎖是以芯片為核心,通過(guò)編程來(lái)實(shí)現(xiàn)的。其性能和安全性已大大超過(guò)了機(jī)械鎖。【任務(wù)分析】學(xué)習(xí)I2C總線(xiàn)技術(shù),并模擬I2C總線(xiàn),以及液晶驅(qū)動(dòng)技術(shù),前面所學(xué)知識(shí),比較綜合的運(yùn)用。本任務(wù)先實(shí)現(xiàn)單片機(jī)向AT24C02發(fā)送4組數(shù)據(jù),再將這4組數(shù)據(jù)從AT24C02取出送液晶顯示,最后實(shí)現(xiàn)電子門(mén)密碼鎖系統(tǒng)?!鞠嚓P(guān)知識(shí)】本任務(wù)要用到十六進(jìn)數(shù)組用液晶的顯示的問(wèn)題,下面通過(guò)實(shí)例加以說(shuō)明:用8-14所示電路,把數(shù)組InputData[4]={0x55,0x34,0x56,0xab};中的4個(gè)值用液晶1602給顯示出來(lái)。Lcd1602.c代碼請(qǐng)參閱任務(wù)1。main.c代碼:#include<reg51.h>//包含51單片機(jī)寄存器定義的頭文件#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ù)實(shí)施】對(duì)應(yīng)的代碼部分是實(shí)現(xiàn)單片機(jī)向AT24C02發(fā)送4組數(shù)據(jù),再將這4組數(shù)據(jù)從AT24C02取出送液晶顯示。在KeilC51中調(diào)試下面代碼:lcd1602.c參閱任務(wù)1.main.c對(duì)應(yīng)的代碼:#include<reg51.h>//包含51單片機(jī)寄存器定義的頭文件#include<intrins.h>//包含_nop_()函數(shù)定義的頭文件#defineucharunsignedchar#defineuintunsignedintsbitSDA=P3^4;//將串行數(shù)據(jù)總線(xiàn)SDA位定義在為P3.4引腳sbitSCL=P3^3;//將串行時(shí)鐘總線(xiàn)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)答標(biāo)志位,有應(yīng)答為1,無(wú)應(yīng)答為0/*****************************************************函數(shù)功能:延時(shí)5us***************************************************/voidDelay5us(){_nop_();_nop_();_nop_();_nop_();}voidDelayMS(uintValMS){ uintuiVal,ujVal; for(uiVal=0;uiVal<ValMS;uiVal++) for(ujVal=0;ujVal<120;ujVal++);}/***************************************************函數(shù)功能:開(kāi)始數(shù)據(jù)傳送***************************************************/voidStart()//開(kāi)始位{SDA=1;//SDA初始化為高電平"1"SCL=1;//開(kāi)始數(shù)據(jù)傳送時(shí),要求SCL為高電平"1"Delay5us();//延時(shí)5usSDA=0;//SDA的下降沿被認(rèn)為是開(kāi)始信號(hào)Delay5us();//延時(shí)5usSCL=0;//SCL為低電平時(shí),SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)}/***************************************************函數(shù)功能:結(jié)束數(shù)據(jù)傳送***************************************************/voidStop()//停止位{SDA=0;//SDA初始化為低電平"0"_nSCL=1;//結(jié)束數(shù)據(jù)傳送時(shí),要求SCL為高電平"1"Delay5us();//延時(shí)5usSDA=1;//SDA的上升沿被認(rèn)為是結(jié)束信號(hào)
Delay5us();//延時(shí)5usSDA=0;SCL=0;}//單片機(jī)接收時(shí)單片機(jī)產(chǎn)生應(yīng)答信號(hào)voidI2C_Ack(void){SCL=0; //為產(chǎn)生脈沖準(zhǔn)備
SDA=0; //產(chǎn)生應(yīng)答信號(hào)
Delay5us(); //延時(shí)你懂得
SCL=1;Delay5us(); SCL=0;Delay5us(); //產(chǎn)生高脈沖
SDA=1; //釋放總線(xiàn)}//單片機(jī)非應(yīng)答信號(hào)voidI2C_nAck(void){SCL=0; //為產(chǎn)生脈沖準(zhǔn)備
SDA=1; //產(chǎn)生應(yīng)答信號(hào)
Delay5us(); //延時(shí)你懂得
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ù)線(xiàn)SDA置1或清0 SDA=1; else SDA=0; SCL=1;//SCL為高,通知從機(jī)開(kāi)始接收數(shù)據(jù)
Delay5us();
SCL=0;//SCL變低,準(zhǔn)備發(fā)送下一位數(shù)據(jù)準(zhǔn)備下一位要發(fā)送的數(shù)據(jù)
c=c<<1;//準(zhǔn)備下一位要發(fā)送的數(shù)據(jù)
} SDA=1;//一字節(jié)發(fā)送完后釋放數(shù)據(jù)線(xiàn)
Delay5us(); SCL=1;//SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘
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ù)線(xiàn)SDA為高,進(jìn)入接收方式
SCL=1;//SCL由低變高,產(chǎn)生一個(gè)時(shí)鐘
if(SDA==0)//根據(jù)數(shù)據(jù)線(xiàn)SDA的狀態(tài),將c的最高位清0或置1 c=c&0x7f; else c=c|0x80; c=_crol_(c,1);//將c循環(huán)左移一位,為接收下一位準(zhǔn)備
SCL=0;//時(shí)鐘線(xiàn)SCL清0
} return(c); }}/**************************************************函數(shù)功能:發(fā)送多字節(jié)***************************************************/bitSendStr(ucharsla,ucharsuba,uchar*s,ucharn){uchari;Start(); //發(fā)起始信號(hào),啟動(dòng)總線(xiàn)
SendByte(sla);//發(fā)送器件地址
if(ack_mk==0)return(0);//沒(méi)能應(yīng)答,操作失敗
SendByte(suba);//發(fā)送器件子地址
if(ack_mk==0)return(0);//沒(méi)能應(yīng)答,操作失敗
for(i=0;i<n;i++)//循環(huán)n次
{SendByte(*s); if(ack_mk==0)return(0);//沒(méi)能應(yīng)答,操作失敗
s++;//指向下一個(gè)字節(jié)
} Stop();//發(fā)結(jié)束信號(hào),結(jié)束本次數(shù)據(jù)傳送
return(1);}/**************************************************函數(shù)功能:接收多字節(jié)***************************************************/bitRcvStr(ucharsla,ucharsuba,uchar*s,ucharn){ uchari;Start();//發(fā)起始信號(hào),啟動(dòng)總線(xiàn)
SendByte(sla);//發(fā)送器件地址if(ack_mk==0)return(0);//如果沒(méi)能應(yīng)答,操作失敗
SendByte(suba);//發(fā)送器件子地址if(ack_mk==0)return(0);//如果沒(méi)能應(yīng)答,操作失敗
Start();//再次發(fā)起始信號(hào)
SendByte(sla+1); //sla+1表示進(jìn)行讀操作if(ack_mk==
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 圍堰施工課題申報(bào)書(shū)
- 軟件測(cè)試申報(bào)書(shū)課題
- 課題申報(bào)書(shū)方案構(gòu)建模板
- 合伙企業(yè)人合同范本
- 單位買(mǎi)電合同范本
- 合同范本分包合同
- 課題申報(bào)書(shū)課題類(lèi)型
- 特殊學(xué)生教育課題申報(bào)書(shū)
- 和單位購(gòu)銷(xiāo)采購(gòu)合同范本
- 品牌門(mén)窗店銷(xiāo)售合同范本
- S水電站引水建筑物設(shè)計(jì)
- 110kV軟母線(xiàn)及引連線(xiàn)施工方案
- 鼓譜——海闊天空
- CT報(bào)告單模板
- 足球比賽計(jì)分表(共6頁(yè))
- 軟件概要設(shè)計(jì)說(shuō)明書(shū)范例(共21頁(yè))
- 干式變壓器和低壓配電柜日常巡檢書(shū)
- 研究性學(xué)習(xí)成果一覽表
- 生產(chǎn)一致性控制計(jì)劃
- 鐵路勞動(dòng)安全培訓(xùn)鐵路安全培訓(xùn)知識(shí)專(zhuān)題PPT課件(帶內(nèi)容)
- 境外公共安全管理.ppt
評(píng)論
0/150
提交評(píng)論