柚子快報(bào)激活碼778899分享:藍(lán)橋杯--單片機(jī)
柚子快報(bào)激活碼778899分享:藍(lán)橋杯--單片機(jī)
學(xué)習(xí)筆記(觀看小蜜蜂【DS18B20以前】與西風(fēng)課程講解)+自己以前對(duì)普中款51單片機(jī)學(xué)習(xí)理解
38譯碼器與74HC573鎖存器的配合使用(邏輯門起重要作用)
38譯碼器:(節(jié)約IO口)????????通過(guò)25-273位引腳去控制8位,被選中的位號(hào)被置為高電平1;只好使用到Y(jié)4-Y7這4位,選中Y4時(shí),P27=1,P26=0,P25=0;選中Y5時(shí),P27=1,P26=0,P25=1;以此類推。
74HC573鎖存器:(增添鎖存器【廉價(jià)】,使引腳復(fù)用,節(jié)約IO口)? ? ? ? ? ? ? ? ? ? ? ? ????????當(dāng)LE所處引腳為低電平0時(shí)鎖存器打開(kāi),可以修改內(nèi)容,為高電平1時(shí)鎖存器關(guān)閉,無(wú)法修改內(nèi)容。(而譯碼器選中的位號(hào)被置為高電平,于是需要用到邏輯門(或非門))
SN74HC02DRG4 (或非門):
????????將Yx轉(zhuǎn)換為YxC,即將原本的高電平轉(zhuǎn)換為了低電平。即相當(dāng)于實(shí)現(xiàn)了通過(guò)38譯碼器選中了實(shí)現(xiàn)某個(gè)功能的鎖存器。
Y4:LED燈;Y5:蜂鳴器、繼電器、電機(jī);Y6:數(shù)碼管位選實(shí)現(xiàn);Y7:數(shù)碼管段選實(shí)現(xiàn)。
LED模塊
先通過(guò)38譯碼器選擇Y4位,再給P0引腳賦值
????????共陽(yáng)極的LED燈,給相應(yīng)位號(hào)提供低電平即可點(diǎn)亮該位號(hào)的LED燈,閃爍使用延時(shí),流水燈使用延時(shí)+移位
蜂鳴器與繼電器模塊
注意調(diào)節(jié)跳線帽使其處于蜂鳴器、繼電器板塊
蜂鳴器:(引腳為低電平時(shí)蜂鳴器發(fā)聲)
繼電器:(引腳為低電平時(shí)繼電器吸合,繼電器亮燈)
????????ULN2003(達(dá)林頓管)是7路反向器電路,即當(dāng)輸入端為高電平時(shí),ULN2003輸出端為低電平;當(dāng)輸入端為低電平時(shí),ULN2003輸出端為高電平。
? ? ? ? 所以要選中蜂鳴器、繼電器使其工作,即需使相應(yīng)位號(hào)置高電平即可
? ? ? ?P0賦值:繼電器工作: 0x10;蜂鳴器工作:0x40。
數(shù)碼管模塊???????
?????????先用38譯碼器選中Y6對(duì)應(yīng)的鎖存器,為P0引腳賦值選中想要使用的第幾位數(shù)碼管,再將譯碼器選中Y7對(duì)應(yīng)的鎖存器,為P0引腳賦值點(diǎn)亮想要使用的幾段LED。
? ? ? ? 位選時(shí),P0賦值為高電平即為選中;段選時(shí),P0賦值為低電平即為點(diǎn)亮對(duì)應(yīng)LED(共陽(yáng)極)
????????使用數(shù)碼管時(shí)很重要的步驟是消影和防閃爍;延時(shí)過(guò)短可能造成一個(gè)數(shù)碼管內(nèi)重影,分辨不清;延時(shí)過(guò)長(zhǎng)則會(huì)導(dǎo)致數(shù)碼管內(nèi)數(shù)字閃爍。由于是共用P0引腳,則需要在段選或位選前清空P0引腳的值,將其全賦值為高電平(消影效果最好)。
? ? ? ? 靜態(tài)數(shù)碼管是選用一管、一個(gè)字符;動(dòng)態(tài)數(shù)碼管是選用多管、多個(gè)字符。
按鍵模塊
注意跳線帽接的是獨(dú)立按鍵還是矩陣按鍵。
獨(dú)立按鍵
????????將J5上的跳線帽接在23位號(hào)上,P30至P33默認(rèn)為高電平,當(dāng)其為低電平時(shí)則為對(duì)應(yīng)按鍵被按下。
? ? ? ?判斷按鍵被按下,需要注意按鍵需要防誤觸(添加一小段延時(shí)再進(jìn)行判斷),最后還需要將按鍵鎖定到被按下的情況(直到松手)。每個(gè)按鍵判斷被按下的語(yǔ)句如下:
?
矩陣按鍵
????????將J5上的跳線帽接在12位號(hào)上,使用行掃描與列掃描判斷被按下按鍵的行與列,從而得知被按下按鍵的具體位號(hào)。
? ? ? ? 先定義位號(hào):(頭文件reg52.h內(nèi)沒(méi)有P4引腳的地址,則使用下面方法定義P4引腳時(shí),需要先使P4指向其引腳地址【sfr P4 = 0xc0】)
列掃描
先將行置0,列置1:
當(dāng)某一列被按下時(shí),則該列為0,即可確認(rèn)第幾列按鍵被按下。如下:(仍需要進(jìn)行防誤觸檢測(cè))
為按鍵變量賦值,第一列為0,第二列為1……第四列為3。
行掃描
將列置0,行置1:
當(dāng)某一行被按下時(shí),則該行為0,即可確認(rèn)第幾行按鍵被按下。如下:(仍需要進(jìn)行防誤觸檢測(cè))
為按鍵變量賦值,第一行值+0,第二行值+4……第四行值+12。
完成行列掃描后的按鍵變量即為最終被按下的按鍵值(0-15)
中斷系統(tǒng)
外部中斷
? ? ? ? 注意在使用外部中斷用到按鍵的過(guò)程中,一定先要將跳線帽接到獨(dú)立按鍵上。
????????分為外部中斷0與外部中斷1,當(dāng)滿足中斷條件(下降沿或低電平)時(shí)觸發(fā)中斷,程序從原來(lái)執(zhí)行的程序轉(zhuǎn)去執(zhí)行終端服務(wù)函數(shù)。中斷需寫中斷初始化函數(shù)以及中斷服務(wù)函數(shù)。
中斷初始化函數(shù):
? ? ? ? ? ? ? ? ?
? ? ? ? 外部中斷0的初始化函數(shù)意思:
? ? ? ? 1、打開(kāi)總中斷
? ? ? ? 2、打開(kāi)外部中斷0
? ? ? ? 3、確定中斷觸發(fā)方式(1為下降沿觸發(fā),0為低電平觸發(fā))
? ? ? ? 外部中斷1的初始話函數(shù)同理
? ? ? ? 大致與(普中款)51單片機(jī)的中斷系統(tǒng)相同
中斷服務(wù)函數(shù):
????????中斷服務(wù)函數(shù)一定要在()后加上中斷入口號(hào),才能在觸發(fā)中斷時(shí)進(jìn)入到中斷服務(wù)函數(shù)進(jìn)行中斷處理。(外部中斷0的中斷入口號(hào)為0,外部中斷1的中斷入口號(hào)為2)同普中款51單片機(jī):
定時(shí)(計(jì)數(shù))器中斷
? ? ? ? 單片機(jī)的外部晶振為12MHz,定時(shí)計(jì)數(shù)器有16位,分為高8位與低8位,工作模式最大的定時(shí)時(shí)間為65535us。當(dāng)定時(shí)計(jì)數(shù)器出現(xiàn)溢出(滿了)則會(huì)觸發(fā)中斷,進(jìn)行服務(wù)函數(shù),定時(shí)計(jì)數(shù)器的初始化函數(shù)以及服務(wù)函數(shù)都需要對(duì)高低8位賦值。
? ? ? ? 高低8位賦值原則:THx = (65535 - 想要的定時(shí)時(shí)間)/256;TLx =?(65535 - 想要的定時(shí)時(shí)間)%256。
TMOD定時(shí)計(jì)數(shù)器模式控制寄存器
? ? ? ? 該寄存器不能進(jìn)行位尋址,只能字節(jié)尋址,所以需要一次性給其賦值十六進(jìn)制。
? ? ? ? TMOD寄存器:GATE,C/T,M1,M0,GATE,C/T,M1,M0。高4位定義定時(shí)/計(jì)數(shù)器1的模式;低4位定義/定時(shí)計(jì)數(shù)器0的模式。
GATE:為0時(shí),由TR0和TR1來(lái)啟動(dòng)定時(shí)器;為1時(shí),由外部中斷引腳INT0和INT1來(lái)啟動(dòng)定時(shí)器。
C/T:為0時(shí),是定時(shí)功能;為1時(shí),是計(jì)數(shù)功能。
M1,M0:工作方式設(shè)置:
? ? ? ? 00:13位定時(shí)/計(jì)數(shù)器
? ? ? ? 01:16位定時(shí)/計(jì)數(shù)器,最大計(jì)數(shù)值為65535
? ? ? ? 10:自動(dòng)重裝8位定時(shí)/計(jì)數(shù)器,最大計(jì)數(shù)值為255
? ? ? ? 11:T0分為兩個(gè)獨(dú)立的8位定時(shí)/計(jì)數(shù)器;T1停止計(jì)數(shù)
使用
初始化函數(shù):
1、開(kāi)總中斷
2、開(kāi)定時(shí)計(jì)數(shù)器中斷
3、開(kāi)啟定時(shí)計(jì)數(shù)器
4、設(shè)置定時(shí)計(jì)數(shù)器工作功能與模式
5、定時(shí)或計(jì)數(shù)
中斷服務(wù)函數(shù):
開(kāi)始就重置定時(shí)或計(jì)數(shù),設(shè)置變量選取時(shí)間,注意寫上中斷入口號(hào)。
PWM脈寬調(diào)制信號(hào)的發(fā)生
調(diào)整一個(gè)脈沖周期內(nèi)的高低電平的占空比,從而調(diào)整PWM。
????????PWM脈沖為100Hz,一個(gè)周期有10ms,將其分為100份,則1份時(shí)間為100us,則可將100份分為高低電平,利用占空比則可以控制脈寬。
? ? ? ? 脈寬調(diào)制常與定時(shí)計(jì)數(shù)器定配合使用從而達(dá)到調(diào)制脈寬的目的。
如上為利用脈寬調(diào)制LED光強(qiáng)的定時(shí)計(jì)數(shù)器部分函數(shù),pwm_dute為占空比檔次(0-4檔),通過(guò)按鍵控制檔次增減(未寫),由于一個(gè)pwm周期被分為了100份,則count的最大值為100,當(dāng)檔次越高,光強(qiáng)越大,則LED點(diǎn)亮的占空比更大。
串行通信
? ? ? ? 數(shù)據(jù)一位接著一位地順序發(fā)送或接收。常見(jiàn)有SPI、I2C、UART……大多數(shù)情況下,串口通信指的就是UART(最常用)。串行通信有單工(只能發(fā)或只能收數(shù)據(jù))、半雙工(既可以收數(shù)據(jù),也可以發(fā)數(shù)據(jù),但不能同時(shí)收發(fā))、全雙工(可以同時(shí)完成數(shù)據(jù)的收發(fā))三種。
? ? ? ? 串行通信分為同步和異步兩種方式。同步:使用同一個(gè)時(shí)鐘,以數(shù)據(jù)塊為單位傳送數(shù)據(jù);異步:每個(gè)設(shè)備有各自的時(shí)鐘信號(hào),通信中雙方的波特率要保持一致,以字符為單位進(jìn)行數(shù)據(jù)幀傳送,一次傳送一幀。
波特率
? ? ? ? 串口每秒傳輸?shù)奈粩?shù)就是波特率,51單片機(jī)中常用定時(shí)器1的工作模式2(8位自動(dòng)重裝)來(lái)產(chǎn)生波特率,TL1為脈沖計(jì)數(shù)寄存器,TH1為自動(dòng)重裝寄存器,當(dāng)計(jì)數(shù)到最大值溢出時(shí),TH1的值自動(dòng)裝到TL1中。
? ? ? ? 波特率計(jì)算公式:波特率 = (2^SMOD /32)x T1的溢出率
? ? ? ?12M或11.0952M晶振要產(chǎn)生9600BPS的波特率:
????????SMOD = 0時(shí),參數(shù)為0xfd。
? ? ? ? SMOD = 1時(shí),參數(shù)為0xfa。
SBUF寄存器
? ? ? ? 串行發(fā)送時(shí),CPU向SBUF寫入數(shù)據(jù),此時(shí)99H表示發(fā)送緩存SBUF。
? ? ? ? 串行接收時(shí),CPU從SBUF讀出數(shù)據(jù),此時(shí)99H表示接收緩存SBUF。
發(fā)送數(shù)據(jù):
? ? ? ? 將要發(fā)送的數(shù)據(jù)/變量賦值給SBUF,內(nèi)核自動(dòng)將數(shù)據(jù)發(fā)送出去,內(nèi)容發(fā)生完成后,會(huì)將TI標(biāo)志位置1。
接收數(shù)據(jù):
????????內(nèi)核從串口接收到一個(gè)完整數(shù)據(jù)后,會(huì)將RI標(biāo)志位置1,此時(shí)直接讀取SBUF的值即完成數(shù)據(jù)的接收。
????????數(shù)據(jù)發(fā)送完畢或接收完畢都會(huì)進(jìn)入串口中斷,此時(shí)要注意是完整發(fā)送數(shù)據(jù)后產(chǎn)生的中斷還是完整接收到數(shù)據(jù)后產(chǎn)生的中斷。
串口控制寄存器
SCON串口控制寄存器:SM0、SM1、SM2、REN、TB8、RB8、TI、RI
TI:發(fā)送完成中斷標(biāo)志位(需手動(dòng)軟件清除)
RI:接收完成中斷標(biāo)志位(需手動(dòng)軟件清除)
RB8:發(fā)送數(shù)據(jù)的第8位。(奇偶校驗(yàn))(用不到為0)
TB8:接收數(shù)據(jù)的第8位。(奇偶校驗(yàn))(用不到為0)
REN:為1時(shí)允許接受;為0時(shí)禁止接收
SM2:模式二與模式三時(shí)才使用到,主要使用模式一。
SM0、SM1工作模式:
? ? ? ? 00:同步移位寄存器(波特率:fosc/12)
? ? ? ? 01:8位的UART(波特率:可變)【大部分情況】
? ? ? ? 10:9位的UART(波特率:fosc/32或fosc/64)
? ? ? ? 11:9位的UART(波特率:可變)
使用
串口通信初始化函數(shù):
1、打開(kāi)總中斷
2、打開(kāi)串口中斷
3、開(kāi)啟定時(shí)計(jì)數(shù)器1
4、設(shè)置定時(shí)器1工作在自動(dòng)重裝8位定時(shí)/計(jì)數(shù)器模式(10)
5、設(shè)置SCON串口控制寄存器
6、使輔助寄存器置0(藍(lán)橋杯單片機(jī)加)
7、
發(fā)送字節(jié)函數(shù):
????????將要發(fā)送的數(shù)據(jù)傳給SBUF寄存器,然后在數(shù)據(jù)發(fā)送完后對(duì)發(fā)送標(biāo)志位進(jìn)行手動(dòng)清零。
通信中斷服務(wù)函數(shù):
? ? ? ? 通信中斷入口號(hào)為4,判斷接受標(biāo)志位,是否完全接收,并進(jìn)行手動(dòng)清零。
發(fā)送字符串
使用指針做形參指向想要發(fā)送字符串,一次一次的發(fā)送單個(gè)字符,在串口助手中選擇文本模式。
DS18B20
簡(jiǎn)介
? ? ? ? 一種單總線的外設(shè)(傳感器),有嚴(yán)格的時(shí)序要求。
使用流程
1、復(fù)位DS18B20。
2、寫入字節(jié)0xcc,跳過(guò)ROM指令(ROM空間有64位,保存64個(gè)id,單片機(jī)上只有一個(gè)DS18B20,一個(gè)id,則可以直接跳過(guò)ROM指令檢測(cè),直接開(kāi)始溫度轉(zhuǎn)換)。
3、寫入字節(jié)0x44,開(kāi)始溫度轉(zhuǎn)換。
4、寫入轉(zhuǎn)換延時(shí)(溫度轉(zhuǎn)化是需要時(shí)間的,一般是700~900ms)【要完成溫度轉(zhuǎn)換再讀取結(jié)果】
5、再次復(fù)位DS18B20。
6、寫入字節(jié)0xcc,跳過(guò)ROM指令。
7、寫入字節(jié)0xbe,讀取高速暫存器(溫度轉(zhuǎn)換完后將值存入高速暫存器【9個(gè)字節(jié)】的第0字節(jié)(低8位)與第1字節(jié)(高8位))。
8、復(fù)位DS18B20,結(jié)束轉(zhuǎn)換讀取。
9、整合高八位與第八位(整合成16位)。
10、溫度數(shù)據(jù)的正負(fù)處理。
步驟如下:(所調(diào)用函數(shù)均為賽點(diǎn)資源包內(nèi)的單總線程序內(nèi)的代碼)
DS18B20的數(shù)據(jù)處理
????????DS18B20以16位帶符號(hào)位擴(kuò)展的二進(jìn)制補(bǔ)碼形式讀出,其中低4位為小數(shù)部分,中間7位為整數(shù)部分,高5位為符號(hào)位。
? ? ? ? DS18B20的分辨率為0.0625,當(dāng)讀出的數(shù)據(jù)為正時(shí),將整合的16位直接乘以0.0625;當(dāng)讀出的數(shù)據(jù)為負(fù)時(shí),則需將整合的16位進(jìn)行取反加一,再乘以0.0625。
大致判斷讀取溫度是否成功
????????DS18B20在上電復(fù)位時(shí),溫度寄存器中的值為0x0550,即85℃,若讀出數(shù)據(jù)在80多℃時(shí)則表明可能讀取溫度失敗,因?yàn)樽x取的是一個(gè)默認(rèn)值。
注意
? ? ? ? 第一次寫時(shí)失敗,數(shù)碼管顯示0,未讀出溫度,原因是板載芯片的周期是1T,而賽點(diǎn)的代碼的周期是12T。解決方案:可以將單總線底層代碼里面用到的延時(shí)乘以10倍,即可正確讀出。
DS1302
簡(jiǎn)介
? ? ? ? 一款時(shí)鐘芯片,簡(jiǎn)單的串行接口與單片機(jī)進(jìn)行通信,電路提供年、月、日、日期、時(shí)、分、秒的信息,每月天數(shù)與閏年天數(shù)可自動(dòng)調(diào)整(2100年以前的)。對(duì)時(shí)序要求較高
? ? ? ? 有三個(gè)接口:RES(復(fù)位),I/O(數(shù)據(jù)線),SCLK(串行時(shí)鐘)。
使用
? ? ? ? 可以在賽點(diǎn)資源包內(nèi)找到DS1302相應(yīng)的代碼;自己需要寫初始化代碼(起始時(shí)間自己設(shè)定)跟讀取當(dāng)前時(shí)間的代碼
起始代碼:
????????先調(diào)用寫入字節(jié)函數(shù),去向地址(寫)0x8e;將寫保護(hù)位置0,打開(kāi)寄存器可以進(jìn)行寫入操作。再根據(jù)需求去向地址(上圖時(shí)、分、秒),寫入起始值。再關(guān)閉寫保護(hù)位。
讀取數(shù)值:
去到相應(yīng)的地址,用數(shù)組去承載其值(時(shí)、分、秒)。
顯示數(shù)值:
將讀取的值顯示到數(shù)碼管上。讀到的值如0x58,則對(duì)應(yīng)分為58分,對(duì)應(yīng)秒為58秒。
AD/DA轉(zhuǎn)化
PCF8591:
地址:????????前四位固定,一條I2C總線上可以掛多個(gè)PCF8591,所以有選擇地址位。但藍(lán)橋杯單片機(jī)上僅有一個(gè)PCF8591,故而3位地址位全為0即可。最后一位確定是對(duì)其讀消息還是寫消息。
控制字節(jié):控制字節(jié)存放在控制寄存器中,總線操作時(shí)為主控制器發(fā)送的第二字節(jié)。
D1、D0:A/D通道編號(hào),00-11表示通道0-3
D2:自動(dòng)增益選擇(有效位為1)
D3:固定不變(0)
D5、D4:模擬量輸入選擇,00為四路單輸入,01為三路差分輸入,10為單端與差分配合輸入,11為模擬輸出允許有效
D6:A/D轉(zhuǎn)換允許位,為0時(shí)允許模擬輸出
D7:固定不變(0)
讀光敏電阻:0x41,讀滑動(dòng)變阻器:0x43
I2C總線:
????????在傳輸數(shù)據(jù)過(guò)程中存在三種類型信號(hào)(開(kāi)始、結(jié)束、應(yīng)答)
開(kāi)始信號(hào):SCL為高,SDA由高向低跳變
結(jié)束信號(hào):SCL為高,SDA由低向高跳變
時(shí)序圖:
應(yīng)答信號(hào):SCL為高,讀取SDA,為低電平表示產(chǎn)生應(yīng)答(ACK),高電平表示非應(yīng)答(NACK)
官方有給I2C底層代碼。
A/D轉(zhuǎn)化:
? ? ? ? 將模擬量轉(zhuǎn)化為數(shù)字量
? ? ? ? A/D轉(zhuǎn)換周期總是在發(fā)送一個(gè)有效的讀模式地址到PCF8591設(shè)備后開(kāi)始的;即本次讀取的數(shù)據(jù)是上一次轉(zhuǎn)化完成的數(shù)據(jù)。
流程:(讀取模擬量的過(guò)程)
1、I2C開(kāi)始信號(hào)
2、寫PCF8591地址(0x90)【寫數(shù)據(jù)】
3、等待PCF8591回應(yīng)
4、輸入控制字節(jié)(通過(guò)通道)選擇讀取的模擬量
5、等待主機(jī)響應(yīng)
6、I2C開(kāi)始信號(hào)(開(kāi)始兩次原因是一次是寫,一次是讀)
7、寫PCF8591地址(0x91)【讀取】
8、等待PCF8591回應(yīng)
9、接收模擬量
10、主機(jī)發(fā)送非應(yīng)答
11、I2C結(jié)束信號(hào)
D/A轉(zhuǎn)化:
? ? ? ? 將數(shù)字量轉(zhuǎn)化為模擬量
流程:(轉(zhuǎn)化數(shù)字量的過(guò)程)
1、I2C開(kāi)始信號(hào)
2、寫PCF8591地址(0x90)【寫數(shù)據(jù)】
3、等待PCF8591回應(yīng)
4、輸入控制字節(jié)(0x4x)【使能夠模擬輸出】
5、等待PCF8591回應(yīng)
6、寫DAC的值
7、等待PCF8591回應(yīng)
8、I2C結(jié)束信號(hào)
注意
????????若要同時(shí)將光敏電阻與滑動(dòng)變阻器的模擬信號(hào)轉(zhuǎn)化成數(shù)字信號(hào),直接將讀取值互換即可(光敏電阻的讀取值是滑動(dòng)變阻器的地址,滑動(dòng)變阻器讀取的值是光敏電阻的地址)。因?yàn)锳/D轉(zhuǎn)化的周期問(wèn)題,本次讀取的數(shù)據(jù)是上一次轉(zhuǎn)化完成的數(shù)據(jù)。
AT24C02
原理圖:
建議地址:
0xa0(寫),0xa1(讀)
寫入:(一頁(yè)內(nèi)最多寫8個(gè)字節(jié))
往固定的地址里面寫入固定的數(shù)據(jù):
1、I2C開(kāi)始信號(hào)
2、選擇EEPROM芯片,確定寫模式(0xa0)
3、等待EEPROM回應(yīng)
4、寫入要存儲(chǔ)的數(shù)據(jù)地址(8的倍數(shù),保證每頁(yè)存儲(chǔ)數(shù)據(jù)最大【8個(gè)字節(jié)】)
5、等待EEPROM回應(yīng)
6、利用循環(huán)將信息寫入(每次寫入的數(shù)據(jù)最好8個(gè))
7、I2C結(jié)束信號(hào)
void EEPROM_Write(unsigned char *EEPROM_String,unsigned char addr,unsigned char num) { ?? ?IIC_Start(); ?? ?IIC_SendByte(0xa0); ?? ?IIC_WaitAck(); ?? ?IIC_SendByte(addr); ?? ?IIC_WaitAck(); ?? ?while(num--) ?? ?{ ?? ??? ?IIC_SendByte(*EEPROM_String++); ?? ??? ?if(num) ?? ??? ??? ?IIC_SendAck(0); ?? ??? ?else ?? ??? ??? ?IIC_SendAck(1); ?? ?} ?? ?IIC_Stop(); }
讀?。?/p>
1、I2C開(kāi)始信號(hào)
2、選擇EEPROM芯片,確定寫模式(0xa0)
3、等待EEPROM回應(yīng)
4、寫入要存儲(chǔ)的數(shù)據(jù)地址(8的倍數(shù),保證每頁(yè)存儲(chǔ)數(shù)據(jù)最大【8個(gè)字節(jié)】)
5、等待EEPROM回應(yīng)
【以上為選擇地址從哪一頁(yè)開(kāi)始讀】
6、I2C開(kāi)始信號(hào)
7、選擇EEPROM芯片,確定讀模式(0xa1)
8、等待EEPROM回應(yīng)
9、接收讀取的信息
10、I2C結(jié)束信號(hào)
void EEPROM_Read(unsigned char *EEPROM_String,unsigned char addr,unsigned char num) { ?? ?IIC_Start(); ?? ?IIC_SendByte(0xa0); ?? ?IIC_WaitAck(); ?? ?IIC_SendByte(addr); ?? ?IIC_WaitAck(); ?? ?IIC_Start(); ?? ?IIC_SendByte(0xa1); ?? ?IIC_WaitAck(); ?? ?while(num--) ?? ?{ ?? ??? ?*EEPROM_String++ = IIC_RecByte(); ?? ??? ?if(num) ?? ??? ??? ?IIC_SendAck(0); ?? ??? ?else ?? ??? ??? ?IIC_SendAck(1); ?? ?} ?? ?IIC_Stop(); }
一個(gè)保存鍵用于寫入。
超聲波模塊
跳線帽接13、24。
原理
????????發(fā)射端發(fā)射信號(hào)(8個(gè)40MHz的方波信號(hào))出去,遇見(jiàn)障礙物后信號(hào)返回回來(lái),被接收端收到,中途時(shí)間*340/2=距障礙物距離。
使用
發(fā)射端發(fā)送信號(hào):(8次40MHz方波)
讀取接收端:(讀取接收時(shí)間,換算為長(zhǎng)度)
1、打開(kāi)定時(shí)計(jì)數(shù)器1,配置計(jì)時(shí)模式,并不影響定時(shí)計(jì)數(shù)器0(0x0f)
2、復(fù)位計(jì)數(shù)值
3、發(fā)送超聲波信號(hào)
4、開(kāi)啟定時(shí)計(jì)數(shù)器1
5、等待接受返回信號(hào)和定時(shí)器溢出
6、定時(shí)器是否溢出判斷并返回值
NE555
? ? ? ? 需要連接上NET_SIG引腳與P34引腳以測(cè)頻率。(頻率:一秒鐘內(nèi)P34引腳產(chǎn)生了多少次上升沿或下降沿)【需要計(jì)數(shù)】
? ? ? ? 計(jì)數(shù)模式,令TMOD寄存器內(nèi)的C/T位為1。
柚子快報(bào)激活碼778899分享:藍(lán)橋杯--單片機(jī)
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。