版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言基礎c語言中常用的語句if-else語句例如:if(a>b)(c=0;)else(c=1;)while語句例如:while(i<10)(i=i+1;)do-while語句doa=a+1;)while(a<10);這個循環(huán)與while循環(huán)的不同在于:它先執(zhí)行循環(huán)中的語句,然后再判斷表達式是否為真,如果為真則繼續(xù)循環(huán);如果為假,則終止循環(huán)。因此,do?while循環(huán)至少要執(zhí)行一次循環(huán)語句。for語句for(a=0;a<10;a++)〃a++相當于a=a+1;(b=0;)Switch語句例如:switch(a)(case(O):b=0;break;case(1):b=1;break;default:b=3;)〃被break語句的含義是跳出這個switch語句,如果沒有這條語句那么則會從〃滿足條件的地方(即與switch(表達式)括號中表達式匹配的case)開始執(zhí)〃行,直到switch結構結束。當break語句用于do-while、for,while循環(huán)語句中〃時,可使程序終止循環(huán)。函數(shù)的定義返回變量類型函數(shù)名(輸入變量類型)(函數(shù)體;)如:unsignedcharread(unsignedcharaddr)(unsignedchardat;〃定義一個變量存放返回值(doanythingyouwant);〃函數(shù)中的程序。returndat;〃返回函數(shù)的返回值}函數(shù)的調用在函數(shù)調用之前要在主函數(shù)前面加入上該函數(shù)的聲明。(或者你可以放在頭文件里面,包含該頭文件時,就可以聲明了。)C-51的數(shù)據(jù)類型擴充定義sfr:特殊功能寄存器聲明sfr變量名=地址值;特殊功能寄存器在reg51.H這個頭文件里面都幫我們定義好了,所以平時我們就不要自己去定義寄存器的名字。sbit:特殊功能位聲明sbit變量名=地址值;在給某個引腳取名的時候經(jīng)常會用到。Nt:位變量聲明用來定義位數(shù)據(jù)變量例:sfrSCON=0X98;sbitLED=P0A2;C51中常用到的ー些預處理命令#definedefineAP0(注意后面不用加分號)#typedeftypedefunsignedcharuint;(后面要加分號)重新定義ー些常用的關鍵詞,可以增強程序的可移植性,因為在不同的編譯軟件上面,(:語言的數(shù)據(jù)類型的關鍵詞的位寬是不ー樣的。#ifndef...#endif條件編譯,常用于頭文件的定義還有一些程序條件編譯C言語常用的運算符+ - * /(加減乘除)> >=<<=(大于大于等于小于小于等于)==!= (測試等于測試不等于)(它是邏輯運算符)比如說:if(a==1)或者if(a!=1)(b=2;)&&||! (邏輯與 邏輯或邏輯非)比如說:if((a>0)&&(b>0)){dosomething}單片機最小系統(tǒng).電源電路.復位電路3?時鐘電路4.下載電路點亮第一個LED.看懂原理圖.編寫驅動程序C語言知識點:sbit變量名=地址值;在給某個引腳取名的時候經(jīng)常會用到。LED閃爍.C語言常用的預處理命令.while()循環(huán)函數(shù).delay()延時函數(shù)延時函數(shù)voiddelay(u16i)〃大約延時10uswhile(i-);LED流水燈.C語言常用的預處理命令.循環(huán)左移右移函數(shù)循環(huán)左移右移函數(shù)一crol_(a,b);循環(huán)左移函數(shù),a是左移的值,b是左移的位數(shù)。包含在instrins.h庫函數(shù)里面。.cror_(a,b);循環(huán)右移函數(shù),a是右移的值,b是右移的位數(shù)。包含在instrins.h庫函數(shù)里面?!纠縡or(i=0;i〈7;i++) 〃將led左移一位(led=_crol(led,1);delay(50000);〃大約延時450ms}蜂鳴器實驗.蜂鳴器介紹.ULN2003介紹有源蜂鳴器改變單片機引腳輸出波形的頻率,就可以調整控制蜂鳴器音調,產(chǎn)生各種不同音色、音調的聲音。改變輸出電平的高低電平占空比,則可以控制蜂鳴器的聲音大小。靜態(tài)數(shù)碼管.數(shù)碼管是如何顯示出字符.數(shù)碼管靜態(tài)顯示原理.74HC573芯片的使用LED數(shù)碼管根據(jù)LED的不同接法可以分為2類:共陰和共陽。使用LED顯示器時,要注意區(qū)分這兩種不同的接法。為了顯示數(shù)字或字符,必須對數(shù)字或字符進行編碼。七段數(shù)碼管加上一個小數(shù)點,共計8段。因此為LED顯示器提供的編碼正好是ー個字節(jié)。0x3f,0x06,0x5b,0x4f, 0x66,0x6d0 1 2 3 4 50x7d,0x07,0x7f,0x6f,0x77,0x7c6 7 8 9AB0x39,0x5e,0x79,0x71, 0x00CDEF 無顯示LED顯示器工作方式有兩種:靜態(tài)顯示方式和動態(tài)顯示方式。靜態(tài)顯示的特點是每個數(shù)碼管的段選必須接ー個8位數(shù)據(jù)線來保持顯示的字形碼。當送入一次字形碼后,顯示字形可一直保持,直到送入新字形碼為止。這種方法的優(yōu)點是占用CPU時間少,顯示便于監(jiān)測和控制。缺點是硬件電路比較復雜,成本較高。【例】sbitLSA=P2'2;sbitLSB=P2*3;sbitLSC=P2*4;u8codesmgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,Ox7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};〃顯示〇?F的值voidmain()(LSA=O;LSB=O;LSC=O; 〃控制38譯碼器的YO輸出低電平P0=smgduan[0];while(l);動態(tài)數(shù)碼管顯示1.數(shù)碼管動態(tài)顯示原理2.74HC138芯片的使用3.編寫動態(tài)數(shù)碼管程序數(shù)碼管動態(tài)顯示原理動態(tài)顯示的特點是將所有數(shù)碼管的段選線并聯(lián)在一起,由位選線控制是哪一位數(shù)碼管有效。選亮數(shù)碼管采用動態(tài)掃描顯示。所謂動態(tài)掃描顯示即輪流向各位數(shù)碼管送出字形碼和相應的位選,利用發(fā)光管的余輝和人眼視覺暫留作用,使人的感覺好像各位數(shù)碼管同時都在顯示。動態(tài)顯示的亮度比靜態(tài)顯示要差ー些,所以在選擇限流電阻時應略小于靜態(tài)顯示電路中的74HC138譯碼器的使用typedefunsignedintul6; 〃對數(shù)據(jù)類型進行聲明定義typedefunsignedcharu8;sbitLSA=P2c2;sbitLSB=P203;sbitLSC=P24;u8codesmgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};〃顯示〇?F的值函數(shù)名 :delay函數(shù)功能 :延時函數(shù),i=1時,大約延時10usvoiddelay(ul6i)(while(i-);)函數(shù)名 :DigDisplay函數(shù)功能 :數(shù)碼管動態(tài)掃描函數(shù),循環(huán)掃描8個數(shù)碼管顯示voidDigDisplay()(u8i;for(i=0;i<8;i++){switch(i) 〃位選,選擇點亮的數(shù)碼管,{case(0):LSA=O;LSB二〇;LSC=O;break;〃顯示第〇位case(l):LSA=1;LSBニ〇ルSC二。;break;〃顯示第1位case(2):LSA二〇;LSB=1;LSC二〇:break;〃顯示第2位case(3):LSA=1;LSB=1ルSC二〇:break;〃顯示第3位case(4):LSA二〇;LSB二〇;LSO1;break;〃顯示第4位case(5):LSA=1;LSB二〇;LSL1;break;〃顯示第5位case(6):LSA=O;LSB=1;LSC=1;break;〃顯示第6位case(7):LSA=1;LSB=1;LSC=1;break;〃顯示第7位}PO=smgduan[i];〃發(fā)送段碼delay(lOO);〃間隔一段時間掃描PO=OxOO;〃消隱}}函數(shù)名:main函數(shù)功能 :主函數(shù)輸入:無輸出 :無voidmain()(while(l)(DigDisplayO:〃數(shù)碼管顯示函數(shù)獨立按鍵.按鍵介紹.獨立按鍵原理.編寫獨立按鍵控制程序獨立按鍵原理按鍵在閉合和斷開時,觸點會存在抖動現(xiàn)象。?函數(shù)名 :keypros?函數(shù)功能 :按鍵處理函數(shù),判斷按鍵K1是否按下voidkeypros()(if(kl==0) 〃檢測按鍵K1是否按下(delay(1000)! 〃消除抖動一般大約10msif(kl==0) 〃再次判斷按鍵是否按下(led二?led; 〃led狀態(tài)取反}while(!kl)J 〃檢測按鍵是否松開)矩陣按鍵實驗.矩陣按鍵的由來.矩陣按鍵掃描原理.矩陣按鍵怎么變成獨立按鍵.編寫矩陣按鍵控制程序矩陣按鍵掃描原理行列掃描:我們可以通過高四位全部輸出低電平,低四位輸出高電平。當接收到的數(shù)據(jù),低四位不全為高電平時,說明有按鍵按下然后通過接收的數(shù)據(jù)值,判斷是哪一列有按鍵按下,然后再反過來,高四位輸出高電平,低四位輸出低電平,然后根據(jù)接收到的高四位的值判斷是那一行有按鍵按下,這樣就能夠確定是哪一個按鍵按下了?!纠縯ypedefunsigned int u16i〃對數(shù)據(jù)類型進行聲明定義TOC\o"1-5"\h\ztypedefunsigned char u8;^defineGPIO_DIG PO^defineGP1O_KEY PlsbitLSA=P2A2;sbitLSB=P2-3;sbitLSC=P2,4;u8KeyValue:〃用來存放讀取到的鍵值u8codesmgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};〃顯示〇】:的值函數(shù)名 :delay函數(shù)功能 :延時函數(shù),i=l時,大約延時10usvoiddelay(ul6i)(whi1e(i-);)函數(shù)名 :KeyDown函數(shù)功能 :檢測有按鍵按下并讀取鍵值輸 入 :無輸 出 :無voidKeyDown(void)(charaニ〇;GPIO_KEY=OxOf;if(GPIO_KEY!=OxOf)〃讀取按鍵是否按下(dclay(100〇);〃延時10ms進行消抖if(GPIO_KEY!二OxOf)〃再次檢測鍵盤是否按下{〃測試列GPIO_KEY=OXOF;switch(GP10.KEY){case(0X07):KeyValue=0;break;case(OXOb):KeyValue=l;break;case(OXOd):KeyValue=2;break;case(OXOe):KeyValue=3;break;)〃測試行GPIO_KEY=OXFO;switch(GPIO_KEY)(case(0X70):KeyValue=KeyValue;break;case(OXbO):KeyValue=KeyValue+4;break;case(OXdO):KeyVaiue=KeyVa1ue+8;break;case(OXeO):KeyValue=KeyValue+12;break;}while((a<50)&&(GP10_KEY!=OxfO)) 〃檢測按鍵松手檢測{delay(1000);a++;}})函數(shù)名:main函數(shù)功能 :主函數(shù)輸入:無輸出 :無voidmain()(LSA=O;〃給ー個數(shù)碼管提供位選LSBニ〇;LSC=O;while(l)KeyDownO; 〃按鍵判斷函數(shù)GPIO_DIG=smgduan[KeyValue];8*8LED點陣實驗1.8x8LED點陣的原理8x8LED點陣的動態(tài)顯示74HC595芯片介紹74HC595介紹74595的控制端說明:/SCLR(10腳):低點平時將移位寄存器的數(shù)據(jù)清零。通常我將它接Vcc。SCK(11腳):上升沿時數(shù)據(jù)寄存器的數(shù)據(jù)移位。QA->QB->QC->...->QH:下降沿移位寄存器數(shù)據(jù)不變。(脈沖寬度:5V時,大于幾十納秒就行了。)RCK(12腳):上升沿時移位寄存器的數(shù)據(jù)進入數(shù)據(jù)存儲寄存器,下降沿時存儲寄存器數(shù)據(jù)不變。通常我將RCK置為低點平,當移位結束后,在RCK端產(chǎn)生一個正脈沖(5V時,大于幾十納秒就行了。我通常都選微秒級),更新顯示數(shù)據(jù)。/G(13腳):高電平時禁止輸出(高阻態(tài)\如果單片機的引腳不緊張,用ー個引腳控制它,可以方便地產(chǎn)生閃爍和熄滅效果。比通過數(shù)據(jù)端移位控制要省時省力。程序說明:每當spi_shcp上升沿到來時,spi_ds引腳當前電平值在移位寄存器中左移一位,在下ー個上升沿到來時移位寄存器中的所有位都會向左移一位,同時Q7,也會串行輸出移位寄存器中高位的值,這樣連續(xù)進行8次,就可以把數(shù)組中每一個數(shù)(8位的數(shù))送到移位寄存器:然后當spi_stcp上升沿到來時,移位寄存器的值將會被鎖存到鎖存器里,并從Q1-7引腳輸出【例】^include"reg5Lh” 〃此文件中定義了單片機的ー些特殊功能寄存器#include<intrins.h>typedefunsignedintul6J 〃對數(shù)據(jù)類型進行聲明定義typedefunsignedcharu8;sbitSRCLK=P3^6;sbitRCLK=P3-5;sbitSER=P34;u8ledduan[]={OxOO,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};u8ledwei[]={0x7f,Oxbf,Oxdf,Oxef,Oxf7,Oxfb,Oxfd,Oxfe};函數(shù)名 :delay函數(shù)功能 :延時函數(shù),i=l時,大約延時10usvoiddelay(ul6i)(whi1e(i-);)函數(shù)名 :Hc595SendByte(u8dat)函數(shù)功能 :向74HC595發(fā)送ー個字節(jié)的數(shù)據(jù)輸入 :無輸出 :無voidHc595SendByte(u8dat)(u8a;SRCLK=O;RCLKニ〇;for(a=0;a<8;a++){SER=dat?7;dat?=l;SRCLK=1;_nop.()_nop_()SRCLKニ〇)RCLK=1;_nop_();_nop_();RCLK=O;)函數(shù)名:main函數(shù)功能 :主函數(shù)輸入:無輸出 :無voidmain()(u8i;while(l){P0=0x7f;for(i=0;i<8;i++)(P0=ledwei[i]J〃位選Hc595SendByte(ledduan[i]);〃發(fā)送段選數(shù)據(jù)delay(100): 〃延時Hc595SendByte(0x00);〃消隱)}}51單片機的中斷系統(tǒng)中斷的概念CPU在處理某ー事件A時,發(fā)生了另一事件B請求CPU迅速去處理(中斷發(fā)生);CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);待CPU將事件B處
理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返回).這ー過程稱為中斷。TCON1EIPTCON1EIP1、(P3.2)可由ITO(TCON.O)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.2引腳上出現(xiàn)有效的中斷信號時,中斷標志IEO(TCON.1)置1,向CPU申請中斷。2、(P3.3)可由IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.3引腳上出現(xiàn)有效的中斷信號時,中斷標志IE1(TCON.3)置1,向CPU申請中斷。3、TFO(TCON.5),片內定時/計數(shù)器TO溢出中斷請求標志。當定時/計數(shù)器TO發(fā)生溢出時,置位TFO,并向CPU申請中斷。4、TF1(TCON.7),片內定時/計數(shù)器T1溢出中斷請求標志。當定時/計數(shù)器T1發(fā)生溢出時,置位TF1,并向CPU申請中斷。5、RI(SCON.O)或Tl(SCON.1),串行口中斷請求標志。當串行口接收完一幀串行數(shù)據(jù)時置位RI或當串行口發(fā)送完一幀串行數(shù)據(jù)時置位TI,向CPU申請中斷。中斷允許控制CPU對中斷系統(tǒng)所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的。EXO(IE.O),外部中斷。允許位;ETO(IE.1),定時/計數(shù)器TO中斷允許位;EX1(IE.2),外部中斷。允許位;ET1(IE.3),定時/計數(shù)器T1中斷允許位;ES(IE.4),串行口中斷允許位;EA(IE.7),CPU中斷允許(總允許)位。位。 7。|6, シ 4,シ[2。11/0*5字節(jié)地址:A8HJEA, p ES ET1EXI ETOEXO E中斷請求標志1、TCON的中斷標志ITO(TCON.O),外部中斷〇觸發(fā)方式控制位。當!TO=O時,為電平觸發(fā)方式。當ITO=1時,為邊沿觸發(fā)方式(下降沿有效bIEO(TCON.1),外部中斷〇中斷請求標志位。IT1(TCON.2),外部中斷1觸發(fā)方式控制位。IE1(TCON.3),外部中斷1中斷請求標志位。TFO(TCON.5),定時/計數(shù)器TO溢出中斷請求標志位。TF1(TCON.7),定時/計數(shù)器T1溢出中斷請求標志位。I 位.'川6,4〉シ2。レ〇^ J字節(jié)地址:88H.TF1TR1TFOTR0IE1IT1IE0IT0TCON.、各輔源軸優(yōu)先級及中斷服務程停入口表中斷源中斷標志嘀服務簡入口優(yōu)先級順庫外部中斷0(麗),叫0003ル高,定時/計數(shù)器〇⑺),TFO,OOOBHpレ外部中斷1(麗),IE1.'0013兩1。定時/計數(shù)器1(TD,TFbOOIBHoレ串行口“RI或U0023電低,由斷源符號名稱中斷引起原因中斷號/INTO外部中斷〇P3.2引腳低電平或下降沿信號0TO定時器〇中斷定時ノ計數(shù)器〇計數(shù)回。溢出1/INT1外部中斷1P3.3引腳低電平或下降沿信號2T1定時器1中斷定時/計數(shù)器1計數(shù)回。溢出3TI/RI串行口中斷串行通信完成一幀數(shù)據(jù)發(fā)送或接收引起中斷451單片機中斷處理過程中斷響應條件1中斷源有中斷請求;2此中斷源的中斷允許位為1;3CPU開中斷(即EA=1}以上三條同時滿足時,CPUオ有可能響應中斷。以外部中斷〇為例,主程序中需要有以下代碼:EA=1;〃打開總中斷開關EX0=1;〃開外部中斷〇ITO=O/1;〃設置外部中斷的觸發(fā)方式中斷服務函數(shù):voidinto()interrupt0using1doanythingthatyouwant)【例】include"reg52.h" 〃此文件中定義了單片機的一些特殊功能寄存器typedefunsignedintu16; 〃對數(shù)據(jù)類型進行聲明定義typedefunsignedcharu8;sbitk3=P3A2J〃定義按鍵K3sbitled=P2A0; 〃定義P20口是led/*mm****mm**************************************************函數(shù)名 :delay函數(shù)功能 :延時函數(shù),i=1時,大約延時10usvoiddelay(u16i)while(i-);函數(shù)名 :Int1lnit()函數(shù)功能 :設置外部中斷1輸 入 :無輸 出 :無上******************************************************************************/voidlntOlnit()(〃設置INTOIT0=1;〃跳變沿出發(fā)方式(下降沿)EX0=1;〃打開INTO的中斷允許。EA=1;〃打開總中斷)函數(shù)名 :main函數(shù)功能 :主函數(shù)輸 入 :無輸 出 :無*****************************************************************************,voidmain()lntOlnit();〃設置外部中斷〇while(1);)^*******************************************************************************函數(shù)名 :lntO()interrupt0函數(shù)功能 :外部中斷〇的中斷函數(shù)輸 入 :無輸 出 :無******************************************************************************/voidlntO()interrupt0〃外部中斷〇的中斷函數(shù)(delay(WOO);〃延時消抖if(k3==0)(led=~led;定時器和計數(shù)器.定時器的原理.定時器的使用振蕩周期:為單片機提供定時信號的振蕩源的周期(晶振周期或外加振蕩周期)狀態(tài)周期:2個振蕩周期為1個狀態(tài)周期,用S表示。振蕩周期又稱S周期或時鐘周期。機器周期:1個機器周期含6個狀態(tài)周期,12個振蕩周期。指令周期:完成1條指令所占用的全部時間,它以機器周期為單位。由溢出時計數(shù)器的值減去計數(shù)初值オ是加1計數(shù)器的計數(shù)值。51單片機定時器結構定時/計數(shù)器的實質是加1計數(shù)謁16位),由高8位和低8位兩個寄存器THx和TLx組成。TMOD是定時/計數(shù)器的工作方式寄存器,確定工作方式和功能;TCON是控制寄存器,控制TO、T1的啟動和停止及設置溢出標志。T1引腳。TO引腳T1引腳。nJTHCTLO外部中斷相大位內部總線〇〇Jヱ一一nJTHCTLO外部中斷相大位內部總線〇〇Jヱ一一TMODT1方式TO方式定時/計數(shù)器的控制51單片機定時/計數(shù)器的工作由兩個特殊功能寄存器控制。TMOD用于設置其工作方式JTCON用于控制其啟動和中斷申請。1、工作方式寄存器TMOD工作方式寄存器TMOD工作方式寄存器TMOD用于設置定時/計數(shù)器的工作方式,低四位用于TO,高四位時,要用軟件使TR0或TR1為1,同時外部中斷引腳INT0/1也為高電平時,才能啟動定時/計數(shù)器工作。即此時定時器的啟動條件加上了!NT0/1引腳為高電平這ー條件。C/T:定時/計數(shù)模式選擇位。C/T=0為定時模式;C/T=1為計數(shù)模式。M1M0:工作方式設置位。定時/計數(shù)器有四種工作方式。定時/計數(shù)器工作方式設置表“?I1M0工作方式,說 明,00。方式?!?3位定時/ナ數(shù)器?0K方式P16位定時/計數(shù)器「10。方式2,8位自睚銃時/計裝梨11?方式3。TO分成兩個獨立的8雖時/計數(shù)器;T!此方式停止計釦2、控制寄存開TCONTCON的低4位用于控制外部中斷,已在前面介紹。TCON的高4位用于控制定時/計數(shù)器的啟動和中斷申請。其格式如下:位“小ゆシ今シ2“ 1“〇^2字節(jié)地址:88H.TF1TRIIFOTRO. , , ,TCON.?TF1(TC0N.7):T1溢出中斷請求標志位。T1計數(shù)溢出時由硬件自動置TF1為1。CPU響應中斷后TF1由硬件自動清〇。T1工作時,CPU可隨時查詢TF1的狀態(tài)。所以,TF1可用作查詢測試的標志。TF1也可以用軟件置1或清〇,同硬件置1或清。的效果一樣。TR1(TC0N.6):T1運行控制位。TR1置1時,T1開始工作;TR1置〇時,T1停止工作。TR1由軟件置1或清。。所以,用軟件可控制定時/計數(shù)器的啟動與停止TFO(TC0N.5):TO溢出中斷請求標志位,其功能與TF1類同。TRO(TCON.4):TO運行控制位,其功能與TR1類同。初始化程序應完成如下工作:1對TMOD賦值,以確定TO和T1的工作方式。2計算初值,并將其寫入THO、TLO或TH1、TL103中斷方式時,則對EA賦值,開放定時器中斷。4使TR0或TR1置位,啟動定時/計數(shù)器定時或計數(shù)【例】^include”reg52.h” 〃此文件中定義了單片機的一些特殊功能寄存器typedefunsignedintul6J 〃對數(shù)據(jù)類型進行聲明定義typedefunsignedcharu8;sbitled=P2'O! 〃定義P20r)是led函數(shù)名 :TimerOInit函數(shù)功能 :定時器〇初始化輸 入 :無輸 出 :無voidTimerOInit()(TM0D|=0X01;〃選擇為定時器〇模式,工作方式1,僅用TRO打開啟動。THO=OXFC: 〃給定時器賦初值,定時1msTL0=0X18;ETO=1;〃打開定時器。中斷允許EA=l;〃打開總中斷TRO=1:〃打開定時器函數(shù)名:main函數(shù)功能 :主函數(shù)輸入:無輸出 :無voidmain()(TimerOInitOJ〃定時器〇初始化while(l);函數(shù)名 :voidTimerO()interrupt1函數(shù)功能 :定時器。中斷函數(shù)輸入 :無輸出 :無voidTimerO()interrupt1(staticul6i;THO=OXFCI 〃給定時器賦初值,定時1msTL0=0X18;i++;if(i==1000)(i二〇;led二?led;))串口通信.串口通信的原理.串口通信編程有兩個物理上獨立的接收、發(fā)送緩沖器SBUF,它們占用同一地址99H:接收器是雙緩沖結構;發(fā)送緩沖器,因為發(fā)送時CPU是主動的,不會產(chǎn)生重疊錯誤。80C51串行口的控制寄存器位.、川齢3もシ2ザレ2字節(jié)地址:98H-SMOSM1SM2REN1B8RB8TIRISCON.SMO和SM1為工作方式選擇位,可選擇四種工作方式:產(chǎn) 串行口的工作方式.SMOSMI方式,說明,波特率0.〇〇0.移位寄存器./osc/12*0.レ10位異步收發(fā)器(8也數(shù)據(jù)),可變,レ〇,ムH位異步收發(fā)器(9位數(shù)據(jù)),/csc/64或ル§c/32.3,11位異步收發(fā)器(9位數(shù)據(jù)),可變,SM2,多機通信控制位,主要用于方式2和方式3〇當接收機的SM2=1時可以利用收到的RB8來控制是否激活RI(RB8=0時不激活RI,收到的信息丟棄;RB8=1時收到的數(shù)據(jù)進入SBUF,并激活RI,進而在中斷服務中將數(shù)據(jù)從SBUF讀走卜當SM2=0時,不論收到的RB8為〇和1,均可以使收到的數(shù)據(jù)進入SBUF,并激活RI(即此時RB8不具有控制RI激活的功能b通過控制SM2I可以實現(xiàn)多機通信。在方式〇時,SM2必須是〇〇在方式1時,如果SM2=1,則只有接收到有效停止位時,R!才置1〇REN,允許串行接收位。由軟件置REN=1.則啟動串行口接收數(shù)據(jù);若軟件置REN=O,則禁止接收TB8,在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,可以用軟件規(guī)定其作用。可以用作數(shù)據(jù)的奇偶校驗位,或在多機通信中,作為地址幀/數(shù)據(jù)幀的標志位。在方式〇和方式1中,該位未用。RB8,在方式2或方式3中,是接收到數(shù)據(jù)的第九位,作為奇偶校驗位或地址幀/數(shù)據(jù)幀的標志位。在方式1時,若SM2=0,則RB8是接收到的停止位。TI,發(fā)送中斷標志位。在方式〇時,當串行發(fā)送第8位數(shù)據(jù)結束時,或在其它方式,串行發(fā)送停止位的開始時,由內部硬件使TI置1,向CPU發(fā)中斷申請。在中斷服務程序中,必須用軟件將其清〇,取消此中斷申請。RI,接收中斷標志位。在方式〇時,當串行接收第8位數(shù)據(jù)結束時,或在其它方式,串行接收停止位的中間時,由內部硬件使RI置1,向CPU發(fā)中斷申請。也必須在中斷服務程序中,用軟件將其清。,取消此中斷申請。PCON中只有一位SMOD與串行口工作有關:便,フ。6U)4。ル2?l的, ,字節(jié)地址:冊。SMOD,,,レ,,JPCON。SMOD(PCON.7)波特率倍増位。在串行口方式1、方式2、方式3時,波特率與SMOD有關,當SMOD=1時,波特率提高一倍。復位時,SMOD=0o串口如何使用串行口工作之前,應對其進行初始化,主要是設置產(chǎn)生波特率的定時器1、串行口控制和中斷控制。具體步驟如下:1確定T1的工作方式(編程TMOD寄存器);2計算T1的初值,裝載TH1、TL1;3啟動T1(編程TCON中的TR1位);4確定串行口控制(編程SCON寄存器);5串行口在中斷方式工作時,要進行中斷設置(編程に、IP寄存器卜【例】^include"reg52.h” 〃此文件中定義了單片機的ー些特殊功能寄存器typedefunsignedintul6J 〃對數(shù)據(jù)類型進行聲明定義typedefunsignedcharu8;函數(shù)名 :UsartInit()函數(shù)功能 :設置串口輸入 :無輸出 :無voidUsartlnit()(SCON=0X50i 〃設置為工作方式1TM0D=0X20! 〃設置計數(shù)器工作方式2PC0N=0X80! 〃波特率加倍TH1=OXF3J 〃計數(shù)器初始值設置,注意波特率是4800的TL1=OXF3;ES=1I 〃打開接收中斷EA=1i 〃打開總中斷TR1=1: 〃打開計數(shù)器)函數(shù)名:main函數(shù)功能 :主函數(shù)輸入:無輸出 :無voidmain()Usartlnit();//串口初始化while(l);函數(shù)名 :Usart0interrupt4函數(shù)功能 :串口通信中斷函數(shù)輸入 :無輸出 :無voidUsart()interrupt4(u8receiveData;receiveData=SBUF;〃出去接收到的數(shù)據(jù)RI二〇;〃清除接收中斷標忐位SBUF二receiveData;〃將接收到的數(shù)據(jù)放入到發(fā)送寄存器while(!TI): 〃等待發(fā)送數(shù)據(jù)完成TI=0i 〃清除發(fā)送完成標志位EEPROM(IIC總線)1IIC串行總線的組成及工作原理2AT24C02驅動程序編寫12c總線只有兩根雙向信號線。一根是數(shù)據(jù)線SDA,另一根是時鐘線SCL。12c總線的數(shù)據(jù)傳送ー、數(shù)據(jù)位的有效性規(guī)定12c總線進行數(shù)據(jù)傳送時,時鐘信號為髙電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時鐘線上的信號為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)オ允許變化。
據(jù)穩(wěn)定 據(jù)變化 據(jù)穩(wěn)定二、起始和終止信號SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號;SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號間,SDA線由低電平向高電平的變化表示終止信號SDA起始信號S終止信號起始信號S起始和終止信號都是由主機發(fā)出的,在起始信號產(chǎn)生后,總線就處于被占用的狀態(tài);在終止信號產(chǎn)生后,總線就處于空閑狀態(tài)。三、數(shù)據(jù)傳送格式每ー個字節(jié)必須保證是8位長度。數(shù)據(jù)傳送時,先傳送最高位(MSB),每一個被傳送的字節(jié)后面都必須跟隨一位應答位(即ー幀共有9位)〇在起始信號后必須傳送ー個從機的地址(7位),第8位是數(shù)據(jù)的傳送方向位(R/T),用“0"表示主機發(fā)送數(shù)據(jù)(T):1”表示主機接收數(shù)據(jù)(Rb每次數(shù)據(jù)傳送總是由主機產(chǎn)生的終止信號結束。但是,若主機希望繼續(xù)占用總線進行新的數(shù)據(jù)傳送則可以不產(chǎn)生終止信號,馬上再次發(fā)出起始信號對另一從機進行尋址。在總線的ー次數(shù)據(jù)傳送過程中,可以有以下幾種組合方式:注:有陰影部分表示數(shù)據(jù)由主機向從機傳送,無陰影部分則表示數(shù)據(jù)由從機向主機傳送。ん表示應答,カ非表示非應答(高電平bS表示起始信號,P表示終止信號。〇a、主機向從機發(fā)送數(shù)據(jù),數(shù)據(jù)傳送方向在整個傳送過程中不變:S從機地址,0A?、數(shù)據(jù)A3數(shù)據(jù)A/A.Pb、主機在第一個字節(jié)后,立即從從機讀數(shù)據(jù)S從機地址1.數(shù)據(jù).A數(shù)據(jù).、APb、在傳送過程中,當需要改變傳送方向時,起始信號和從機地址都被重復產(chǎn)生一次,但兩次讀/寫方向位正好反相S從機地址0ん數(shù)據(jù),A/A.S從機地址1A*數(shù)揶AP
四、總線的尋址采用7位的尋址字節(jié)(尋址字節(jié)是起始信號后的第一個字節(jié)b位:7/6~位:7/6~5い4レ3レ2。〇“從機地址ーRWD7-D1位組成從機的地址。DO位是數(shù)據(jù)傳送方向位,為“〇”時表示主機向從機寫數(shù)據(jù),為“1”時表示主機由從機讀數(shù)據(jù)。80C51單片機|2C串行總線器件的接口主機可以采用不帶I2C總線接口的單片機,如80c51、AT89C2051等單片機,利用軟件實現(xiàn)I2C總線的數(shù)據(jù)傳送,即軟件與硬件結合的信號模擬。典型信號模擬:為了保證數(shù)據(jù)傳送的可靠性,標準的12c總線的數(shù)據(jù)傳送有嚴格的時序要求。I2C總線的起始信號、終止信號、發(fā)送“0”及發(fā)送"1”的模擬時序:典型信號模擬子程序(1)起始信號Voidl2CStart(void)(SDA=1;SomeNop();SCL=1;SomeNop();SDA=0;SomeNop();)(2)終止信號voidI2cStop(void)SDA=0;SomeNop();SCL=1;SomeNop();SDA=1;SomeNop();}串行E2PROM的擴展寫入過程AT24c系列E2PR0M芯片地址的固定部分為1010,A2、A1、A0引腳接高、低電平后得到確定的3位編碼。形成的7位編碼即為該器件的地址碼。單片機進行寫操作時,首先發(fā)送該器件的7位地址碼和寫方向位“?!?共8位,即ー個字節(jié)),發(fā)送完后釋放SDA線并在SCし線上產(chǎn)生第9個時鐘信號。被選中的存儲器器件在確認是自己的地址后,在SDA線上產(chǎn)生一個應答信號作為相應,單片機收到應答后就可以傳送數(shù)據(jù)了。傳送數(shù)據(jù)時,單片機首先發(fā)送ー個字節(jié)的被寫入器件的存儲區(qū)的首地址,收到存儲器器件的應答后,單片機就逐個發(fā)送各數(shù)據(jù)字節(jié),但每發(fā)送ー個字節(jié)后都要等待應答。S器件地址+0A寫入首地址AData1A DatanAP讀出過程單片機先發(fā)送該器件的7位地址碼和寫方向位“。”(“偽寫”),發(fā)送完后釋放SDA線并在SCL線上產(chǎn)生第9個時鐘信號。被選中的存儲器器件在確認是自己的地址后,在SDA線上產(chǎn)生一個應答信號作為回應。然后,再發(fā)ー個字節(jié)的要讀出器件的存儲區(qū)的首地址,收到應答后,單片機要重復一次起始信號并發(fā)出器件地址和讀方向位(“1”),收到器件應答后就可以讀出數(shù)據(jù)字節(jié),每讀出ー個字節(jié),單片機都要回復應答信號。當最后ー個字節(jié)數(shù)據(jù)讀完后,單片機應返回以“非應答”(高電平)?并發(fā)出終止信號以結束讀出操作。s器件地址+0A讀出首地址A罌件地址+1AData1A DatanTp【例】[i2.h]#ifndef_l2C_H_#define_I2C_H_#include<reg52.h>sbitSCL=P2A1;sbitSDA=P2A0;voidl2cStart();voidl2cStop();unsignedcharl2cSendByte(unsignedchardat);unsignedcharl2cReadByte();voidAt24cO2Write(unsignedcharaddr,unsignedchardat);unsignedcharAt24cO2Read(unsignedcharaddr);#endifI2c.c#include,,i2c.hM?函數(shù)名:Delay10us()?函數(shù)功能:延時10us?輸入:無?輸出:無voidDelay10us()(unsignedchara,b;for(b=1;b>0;b-)for(a=2;a>0;a-);}?函數(shù)名:l2cStart()?函數(shù)功能:起始信號:在SCL時鐘信號在高電平期間SDA信號產(chǎn)生一個下降沿?輸入:無
?輸出備注 :起始之后SDA和SCL都為〇*ッ*****************************************************************************void!2cStart()*ッSDA=1;Delay10us();SCL=1;Delay10us();〃建立時間是SDA保持時間>4.7usSDA=0;DelaylOus();〃保持時間是>4usSCL=O; 〃拉低scl以便第一位數(shù)據(jù)傳輸DelaylOus();)/*mm****mm**************************************************函數(shù)名 :l2cStop()函數(shù)功能:終止信號:在SCL時鐘信號高電平期間SDA信號產(chǎn)生一個上升沿輸入 :無輸出 :無備注 :結束之后保持SDA和SCL都為1;表示總線空閑*****************************************************************************,void12cStop()SDA=0;Delay10us();SCL=1;Delay10us();〃建立時間大于4.7usSDA=1;Delay10us();}/*******m*****m*m*******m***********************************函數(shù)名 :l2cSendByte(unsignedchardat)函數(shù)功能:通過I2C發(fā)送ー個字節(jié)。在SCL時鐘信號高電平期間,保持發(fā)送信號SDA保持穩(wěn)定輸入 :num輸出 :〇或1。發(fā)送成功返回1,發(fā)送失敗返回〇備注 :發(fā)送完一個字節(jié)SCL=O,SDA=1unsignedchar!2cSendByte(unsignedchardat)unsignedchara=O,b=O;//最大255,ー個機器周期為1us,最大延時25511s。for(a=0;a〈8;a++)〃要發(fā)送8位,從最高位開始SDA=dat?7; 〃起始信號之后SCL=O,所以可以直接改變SDA信號dat=dat?1;Delay10us();SCL=1;Delay10us();〃建立時間>4.7usSCL=O;Delay10us();〃時間大于4us}SDA=1;Delay10us();SCL=1;while(SDA)//等待應答,也就是等待從設備把SDA拉低(b++;if(b>200)〃如果超過2000us沒有應答發(fā)送失敗,或者為非應答,表示接收結束(SCL=0;Delay10us();return0;}SCL=O;Delay10us();return1;)/**m*mmmm***mm*******************************函數(shù)名 :l2cReadByte()函數(shù)功能 :使用12c讀取ー個字節(jié)輸入 :無輸出 :dat備注 :接收完一個字節(jié)SCL=0,SDA=1.*******************************************************************************/unsignedcharl2cReadByte()(unsignedchara=O,dat=O;SDA=1; 〃起始和發(fā)送ー個字節(jié)之后SCL都是〇Delay10us();for(a=0;a〈8;a++)〃接收8個字節(jié)(SCL=1;Delay10us();dat?=1;dat|=SDA;Delay10us();SCL=O;Delay10us();)returndat;)/*******m****mm**************************************************函數(shù)名 :voidAt24cO2Write(unsignedcharaddr,unsignedchar dat)函數(shù)功能 :往24co2的ー個地址寫入一個數(shù)據(jù)輸入 :無輸出 :無m**I*********************************************************************/voidAt24cO2Write(unsignedcharaddr,unsignedchardat)(l2cStart();l2cSendByte(0xa0);〃發(fā)送寫器件地址l2cSendByte(addr);〃發(fā)送要寫入內存地址12cSendByte(dat); 〃發(fā)送數(shù)據(jù)l2cStop();}函數(shù)名 :unsigned charAt24cO2Read(unsignedcharaddr)函數(shù)功能 :讀取24co2的ー個地址的ー個數(shù)據(jù)輸入 :無輸出 :無unsignedcharAt24cO2Read(unsignedcharaddr)(unsignedcharnum;l2cStart();l2cSendByte(0xa0);〃發(fā)送寫器件地址12csendByte(addr);//發(fā)送要讀取的地址l2cStart();l2cSendByte(0xa1);〃發(fā)送讀器件地址num=l2cReadByte();〃讀取數(shù)據(jù)12cStop();returnnum;DS18B20溫度傳感器原理64位(激)光刻只讀存儲器光刻ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列號。64位光刻ROM的排列是:開始8位(28H)是產(chǎn)品類型標號,接著的48位是該DS18B20自身的序列號,最后8位是前面56位的循環(huán)冗余校驗碼。光刻ROM的作用是使每ー個DS18B20都各不相同,這樣就可以實現(xiàn)ー根總線上掛接多個DS18B20的目的。64位(激)光刻只讀存儲器圖68位CRC48位序列號8位系列碼DS18B20溫度轉換規(guī)則DS18B20的核心功能是它可以直接讀出數(shù)字的溫度數(shù)值。溫度傳感器的精度為用戶可編程的9,10,11或12位,分別以0.5℃,0.25℃,0.125℃和0.0625℃增量遞増。在上電狀態(tài)下默認的精度為12位。DS18B20啟動后保持低功耗等待狀態(tài),當需要執(zhí)行溫度測量和AD轉換時,總線控制器必須發(fā)出[44h]命令。轉換完以后,產(chǎn)生的溫度數(shù)據(jù)以兩個字節(jié)的形式被存儲到高速暫存器的溫度寄存器中,DS18B20繼續(xù)保持等待狀態(tài)。這是12位轉化后得到的12位數(shù)據(jù),存儲在DS18B20的兩個8位的RAM中,高字節(jié)的前5位是符號位,如果測得的溫度大于〇,這5位為‘〇’,只要將測到的數(shù)值乘以0.0625即可得到實際溫度;如果溫度小于〇,這5位為‘1',測到的數(shù)值需要先減1再取反再乘以0.0625即可得到實際溫度。溫受寄存器格式圖2bit7 bit6bit5brt4bit3bit2billbitOISByteゼ222。2こブbit15bit14bit13bn12bit11bit10bi:9bit8MSByteSSSSS一ゴ配置寄存器存儲器的第4位為配置寄存器,其組織見圖8I用戶可按表3所示設置R0和R1位來設定DS18B20的精度。上電默認設置:R0=1、R1=1(12位精度)。注意:精度和轉換時間之間有直接的關系。暫存器的位7和位0-4被器件保留,禁止寫入。配置寄存器圖8bit7bit6bit5bit4bit3bit2bit1bit00RIRO11111溫度計精確度配置表3RIRO精度最大轉換時間009-bit93.75ms08NV/8)011O-bit187.5ms?conv/4)1011-bit375nis(koxv/2)1112-bit750nis0CONV)DS18B2O的ROM指令表SkipROM[OCCH]這條命令允許總線控制器不用提供64位ROM編碼就使用存儲器操作命令,在單點總線情況下,可以節(jié)省時間。ConvertT[44H]這條命令啟動一次溫度轉換而無需其他數(shù)據(jù)。溫度轉換命令被執(zhí)行ReadScratchpad[OBEH]這個命令讀取暫存器的內容。讀取將從第1個字節(jié)開始,直到第9(CRC)字節(jié)讀完?!纠?includeMtemp.hM函數(shù)名 :Delaylms函數(shù)功能 :延時函數(shù)輸 入 :無輸 出 :無voidDelay1ms(uinty)(uintx;for(;y>0;y-)(for(x=110;x>0;x-);))/*mmmmm*****mm*******************************函數(shù)名 :Ds18b20lnit函數(shù)功能輸出 :初始化成功返回1,失敗返回〇ucharDs18b20lnit()(uchari;DSPORT=0J 〃將總線拉低480us~960usi=70;while。ー);//延時642usDSPORT=1I 〃然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低i=0;while(DSPORT)〃等待DS18B20拉低總線(Delay1ms(1);i++;if(i>5)〃等待>5MSreturn〇;//初始化失敗)return1;〃初始化成功}上函數(shù)名 :Ds18b20WriteByte函數(shù)功能 :向18B20寫入一個字節(jié)輸入 :無輸出 :無voidDs18b20WriteByte(uchardat)(uinti,j;for(j=0;j<8;j++)(DSPORT=0; 〃每寫入一位數(shù)據(jù)之前先把總線拉低1usi++;DSPORT=dat&0x01J〃然后寫入一個數(shù)據(jù),從最低位開始i=6;while(i-);〃延時68us,持續(xù)時間最少60usDSPORT=1J〃然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數(shù)值dat?=1;))/**m*mmmm***mm*******************************函數(shù)名 :Ds18b20ReadByte函數(shù)功能 :讀取ー個字節(jié)輸 入 :無輸 出 :無ucharDs18b20ReadByte()(ucharbyte,bi;uinti,j;for(j=8;j>0;j-)(DSPORT=〇;〃先將總線拉低1usi++;DSPORT=1;〃然后釋放總線i++;i++;〃延時6us等待數(shù)據(jù)穩(wěn)定bi=DSPORT; 〃讀取數(shù)據(jù),從最低位開始讀取/?將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補〇〇?/byte=(byte?1)|(bi?7);i=4; 〃讀取完之后等待48us再接著讀取下ー個數(shù)while(i—);}returnbyte;)/*mm**m*m***************************************************?函數(shù)名:Ds18b20ChangTemp?函數(shù)功能:讓18b20開始轉換溫度?輸入:無?輸出:無******************************************************************************voidDs18b20ChangTemp()(Ds18b20lnit();Delay1ms(1);Ds18b20WriteByte(0xcc); 〃跳過ROM操作命令
Ds18b20WriteByte(0x44); 〃溫度轉換命令〃Delay1ms(100);//等待轉換成功,而如果你是一直刷著的話,就不用這個延時了)函數(shù)名 :Ds18b20ReadTempCom函數(shù)功能 :發(fā)送讀取溫度命令輸入 :無輸出 :無voidDs18b20ReadTempCom()Ds18b20lnit();Delay1ms(1);Ds18b20WriteByte(0xcc);〃跳過ROM操作命令Ds18b20WriteByte(0xbe);〃發(fā)送讀取溫度命令)/*mmmmm*****mm*******************************函數(shù)名 :Ds18b20ReadTemp函數(shù)功能:讀取溫度函數(shù)功能:讀取溫度輸出 :無intDs18b20ReadTemp()(inttemp=0;uchartmh,tml;Ds18b20ChangTemp(); 〃先寫入轉換命令Ds18b20ReadTempCom(); 〃然后等待轉換完后發(fā)送讀取溫度命令tml=Ds18b20ReadByte(); 〃讀取溫度值共16位,先讀低字節(jié)tmh=Ds18b20ReadByte(); //再讀高字節(jié)temp=tmh;temp?=8;temp|=tml;returntemp;)DS1302時鐘spi接口是以主從方式工作的,這種模式通常有一個主器件和一個或多個從器件,其接口包括以下四種信號:(1)MOSI-主器件數(shù)據(jù)輸出,從器件數(shù)據(jù)輸入(2)MISO-主器件數(shù)據(jù)輸入,從器件數(shù)據(jù)輸出(3)SCLK?時鐘信號,由主器件產(chǎn)生X1、X2:32.768KHZ晶振接入弓I腳。GND:地。RST:復位引腳,低電平有效,操作時高電平。I/O:數(shù)據(jù)輸入/輸出引腳,具有三態(tài)功能。SCLK:串行時鐘輸入引腳。Vcc1:工作電源引腳。Vcc2:備用電源引腳。接入電池斷電時提供1302電源DS1302的寄存器及片內RAMDS1302有一個控制寄存器、12個日歷、時鐘寄存器和31個RAM??勺x寫
控制寄存器用于存放DS1302的控制命令字,DS1302的RST引腳回到高電平后寫入的第ー個字就為控制命令。它用于對DS1302讀寫過程進行控制,它的格式如下:其中:D7D6D5D4D3D2D1D01RAM/CKA4A3A2A1A0RD/WD7:固定為1D6:RAM/CK位,=1片內RAM,=0日歷、時鐘寄存器選擇位。D5-D1:地址位,用于選擇進行讀寫的日歷、時鐘寄存器或片內RAMo對日歷、時鐘寄存器或片內RAM的選擇見表。D0:讀寫選擇,=0寫,=1讀寄存器名稱D7D6D5D4D3D2D1DO1RAM/CKA4A3A2A1A0R/W秒寄存器1000000〇或1分寄存器1000001〇或1小時寄存器1000010〇成1日寄存器1000011〇成1月寄存器1000100〇成1星期寄存器1000101〇成1
年寄存器1000110。成1寄存器名稱D7D6D5D4D3D2D1DO1RAM/CKA4A3A2A1A0R/W寫保護寄存関1000111?;?慢充電寄存器1001000〇或1時鐘突發(fā)橫式1011111〇或1RAMO1100000?;?…11???…………。成1RAM301111110〇或1RAM突發(fā)模式1111111。成12.日歷、時鐘寄存器DS1302共有12個寄存器,其中有7個與日歷、時鐘相關,存放的數(shù)據(jù)為BCD碼形式。日歷、時鐘寄存器的格式如表。寄存器名稱取值范圍D7D6D5D4D3D2D1DO秒寄存器00-59CH秒的十位秒的個位分寄存器00-590分的十位分的個位小時寄存覇01-12或00-2312/240A/PHR小時的個位
日寄存器01-3100日的十位日的個位寄存覇名稱取值D7D6D5D4D3D2D1DO月寄存器01-120001或〇月的個位星期寄存器01?070000星期幾年寄存器01-99年的十位年的個位寫保護寄存翳WP0000000慢充電寄存器TCSTCSTCSTCSDSDSRSRS時鐘突發(fā)寄存器說明:(1)數(shù)據(jù)都以BCD碼形式。(2)小時寄存器的D7位為12小時制/24小時制的選擇位,當為1時選12小時制,當為〇時選24小時制。當12小時制時,D5位為1是上午,D5位為〇是下午,D4為小時的十位。當24小時制時,D5、D4位為小時的十位。(3)秒寄存器中的CH位為時鐘暫停位,當為1時鐘暫停,為0時鐘開始啟動。(4)寫保護寄存器中的WP為寫保護位,當WP=1,寫保護,當WP=O未寫保護,當對日歷、時鐘寄存器或片內RAM進行寫時WP應清零,當對日歷、時鐘寄存器或片內RAM進行讀時WP一般置1〇BCD碼是通過4位二進制碼來表示1位十進制中的0?9這!0個數(shù)碼。二進制碼轉換為BCD碼的方式為:4位二進制碼大于1001時,加6〇如:BCD碼00001100的二進制碼為:00001100+6=00010010數(shù)據(jù)輸入輸出(I/O)在控制指令字輸入后的下ー個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位〇開始。同樣,在緊跟8位的控制指令字后的下ー個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位〇位到高位7。單字節(jié)讀寫DS1302是通過SPI串行總線跟單片機通信的,當進行ー次讀寫操作時最少得讀寫兩個字節(jié).第一個字節(jié)是控制字節(jié),就是ー個命令,告訴DS1302是讀還是寫操作,是對RAM還是對CLOK寄存器操作。第二個字節(jié)就是要讀或寫的數(shù)據(jù)了。單字節(jié)讀寫:只有在SCLK為低電平時,才能將CE置為高電平。所以在進行操作之前先將SCLK置低電平,然后將CE置為高電平,接著開始在I0上面放入要傳送的電平信號,然后跳變SCLKo數(shù)據(jù)在SCLK上升沿時,DS1302讀寫數(shù)據(jù),在SCLK下降沿時,DS1302放置數(shù)據(jù)到IO上【例】 ds1302.h#ifndef_DS1302_H-#define_DS1302_H_〃ー包含頭文件ー〃#include<reg52.h>#include<intrins.h>〃ー重定義關鍵詞ー〃#ifndefuchar#defineucharunsignedchar#endif#ifndefuint#defineuintunsignedint#endif〃一定義ds1302使用的IOロー〃sbitDSIO=P3A4;sbitRST=P3A5;sbitSCLK=P3A6;II一定義全局函數(shù)ー〃voidDs1302Write(ucharaddr,uchardat);ucharDs1302Read(ucharaddr);voidDs1302lnit();voidDs1302ReadTime();〃ー一加入全局變量ーー〃externucharTIME[7];//加入全局變量#endifds1302.c#include',ds1302.h,,//—DS1302寫入和讀取時分秒的地址命令ー〃〃一秒分時日月周年最低位讀寫位;——//ucharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};ucharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//—DS1302時鐘初始化2016年5月7日星期六12點00分00秒。ー〃〃一存儲順序是秒分時日月周年,存儲格式是用BCD碼ー〃ucharTIME[7]={0,0,0x12,0x07,0x05,0x06,0x16};函數(shù)名 :Ds1302Write函數(shù)功能 :向DS1302命令(地址+數(shù)據(jù))輸 入 :addr.dat輸 出 :無voidDs1302Write(ucharaddr,uchardat)ucharn;RST=0;_nop_();SCLK=0;//先將SCLK置低電平。_nop_();RST=1;//然后將RST(CE)置高電平。_nop_();for(n=0;n<8;n++)〃開始傳送ハ位地址命令(DSIO=addr&0x01;//數(shù)據(jù)從低位開始傳送addr?=1;SCLK=1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)一nop_();SCLK=0;一nop_();for(n=0;n<8;n++)〃寫入8位數(shù)據(jù)DSIO=dat&0x01;dat?=1;SCLK=1;〃數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)_nop_();SCLK=0;_nop_();)RST=〇;//傳送數(shù)據(jù)結束_nop_();)/*******************************************************************************?函數(shù)名:Ds1302Read?函數(shù)功能:讀取ー個地址的數(shù)據(jù)?輸入:addr?輸出:datucharn,dat,dat1;RST=0;_nop_();SCLK=〇;//先將SCLK置低電平。_nop_();RST=1;//然后將RST(CE)置高電平。_nop_();for(n=0;n<8;n++)〃開始傳送ハ位地址命令(DSIO=addr&0x01;//數(shù)據(jù)從低位開始傳送addr?=1;SCLK=1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)_nop_();SCLK=0;//DS1302下降沿時,放置數(shù)據(jù)_nop_();)_nop_();for(n=0;n<8;n++)〃讀取8位數(shù)據(jù)dat1=DSIO;//從最低位開始接收dat=(dat?1)|(dat1?7);SCLK=1;_nop_();SCLK=0;//DS1302下降沿時,放置數(shù)據(jù)_nop_();)RST=0;_nop_()!〃以下為DS1302復位的穩(wěn)定時間,必須的。SCLK=1;_nop_();DSIO=0;_nop_();DSIO=1;_nop_();returndat;)/*******m*****m*m*******m***********************************函數(shù)名 :Ds1302lnit函數(shù)功能 :初始化DS1302.輸入 :無輸出 :無voidDs1302lnit()(ucharn;Ds1302Write(0x8E,0X00); //禁止寫保護,就是關閉寫保護功能for(n=0;n<7;n++)〃寫入7個字節(jié)的時鐘信號:分秒時日月周年(Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);)Ds1302Write(0x8E,0x80); 〃打開寫保護功能)^*******************************************************************************函數(shù)名 :Ds1302ReadTime函數(shù)功能 :讀取時鐘信息輸入 :無輸出 :無★★★★★★★★★★★★★★★★★A*************************************************************/voidDs1302ReadTime()ucharn;for(n=0;n<7;n++)〃讀取7個字節(jié)的時鐘信號:分秒時日月周年(TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);))紅外通信紅外線系統(tǒng)的組成紅外線系統(tǒng)一般由紅外發(fā)射裝置和紅外接收設備兩大部分組成。紅外發(fā)射裝置又可由鍵盤電路、紅外編碼芯片、電源和紅外發(fā)射電路組成。紅外接收設備可由紅外接收電路、紅外解碼芯片、電源和應用電路組成。通常為了使信號更好的被發(fā)射端發(fā)送出去,經(jīng)常會將二進制數(shù)據(jù)信號調制成為脈沖信號,通過紅外發(fā)射管發(fā)射。常用的有通過脈沖寛度來實現(xiàn)信號調制的脈寛調制(PWM)和通過脈沖串之間的時間間隔來實現(xiàn)信號調制的脈時調制(PPM)兩種方法。紅外遙控器常用載波的方式傳送二進制編碼,常用的載波頻率為38kHz,這是由發(fā)射端所使用的455kHz晶振來決定的。在發(fā)射端要對晶振進行整數(shù)分頻,分頻系數(shù)一般取12I所以455kHz-12=37.9kHz=38kHz
數(shù)據(jù)格式數(shù)據(jù)格式包括了引導碼、用戶碼、數(shù)據(jù)碼和數(shù)據(jù)碼反碼,編碼總占32位。數(shù)據(jù)反碼是數(shù)據(jù)碼反相后的編碼,編碼時可用于對數(shù)據(jù)的糾錯。注意:第二段的用戶碼也可以在遙控應用電【例】#include"reg52.h"〃此文件中定義了單片機的ー些特殊功能寄存器【例】#include"reg52.h"〃此文件中定義了單片機的ー些特殊功能寄存器用戶碼或數(shù)據(jù)碼中的每ー個位可以是位‘1’,也可以是位,0L區(qū)分。和T是利用脈沖的時間間隔來區(qū)分,這種編碼方式稱為脈沖位置調制方式,英文簡寫PPM2.25mstypedefunsignedintu16; 〃對數(shù)據(jù)類型進行聲明定義typedefunsignedcharu8;sbitLSA=P2A2;sbitLSB=P2A3;sbitLSC=P2A4;sbitIRIN=P3A2;u8lrValue[6];u8Time;u8DisplayData[8];u8codesmgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};〃〇、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的顯示碼/*mm****mm**************************************************函數(shù)名 :delay函數(shù)功能 :延時函數(shù),i=1時,大約延時10usvoiddelay(u16i)while(i-);y*******************************************************************************函數(shù)名 :DigDisplay()函數(shù)功能 :數(shù)碼管顯示函數(shù)輸入 :無輸出 :無*******************************************************************************/voidDigDisplay()(u8i;for(i=0;i<3;i++)(switch(i)〃位選,選擇點亮的數(shù)碼管,(case(O):LSA=O;LSB=O;LSC=O;break;〃顯示第0位case(1):LSA=1;LSB=O;LSC=O;break;//顯示第1位case(2):LSA=O;LSB=1;LSC=O;break;〃顯示第2位}P0=DisplayData[2-i];〃發(fā)送數(shù)據(jù)delay(100);〃間隔一段時間掃描P0=0x00;〃消隱函數(shù)名 :lrlnit()函數(shù)功能 :初始化紅外線接收輸入 :無輸出 :無voidlrlnit()(IT0=1;〃下降沿觸發(fā)EX0=1;〃打開中斷。允許EA=1; 〃打開總中斷IRIN=1;〃初始化端口y*******************************************************************************函數(shù)名 :main函數(shù)功能 :主函數(shù)輸 入 :無?輸 出 :無*******************************************************************************/voidmain()(lrlnit();while(1)(DisplayData[O]=smgduan[lrValue[2]/16];DisplayData[1]=smgduan[lrValue[2]%16];DisplayData[2]=smgduan[16];DigDisplay();):*****************************************************************************
?函數(shù)名?函數(shù)名:Readlr()函數(shù)功能 :讀取紅外數(shù)值的中斷函數(shù)輸入 :無輸出 :無voidReadlr()interrupt0(u8j,k;u16err;Time=0;delay(700);//7msif(IRIN==O) 〃確認是否真的接收到正確的信號(err=1OOO; 〃1000*10us=10ms,超過說明接收到錯誤的信號/?當兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時侯,程序死在這里?/while((IRIN==0)&&(err>0))〃等待前面9ms的低電平過去delay(1);err-;}if(IRIN==1) 〃如果正確等到9ms低電平(err=500;while((IRIN==1)&&(err>0)) 〃等待4.5ms的起始髙電平過去(delay(1);err-;)for(k=0;k<4;k++)〃共有4組數(shù)據(jù)(for(j=0;j<8;j++) 〃接收ー組數(shù)據(jù){err=60;while((IRIN==0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版文化場館租賃合同規(guī)范4篇
- 2025年度綠色節(jié)能型門面房裝修工程合同范本4篇
- 2025年度出國打工人員勞動合同模板及注意事項4篇
- 2025年度礦產(chǎn)資源勘查成果轉化與知識產(chǎn)權保護協(xié)議
- 二零二五年度鋼棚安裝施工監(jiān)理合同4篇
- 二零二五年度粉煤灰運輸環(huán)保評估及整改合同3篇
- 2024版消防工程終止合同協(xié)議書
- 2025年工業(yè)地產(chǎn)租賃合同及科技創(chuàng)新獎勵協(xié)議3篇
- 二零二五版礦山安全生產(chǎn)責任承包協(xié)議范本3篇
- 2025年度航空航天器打磨設備維護保養(yǎng)合同3篇
- 微信小程序運營方案課件
- 抖音品牌視覺識別手冊
- 陳皮水溶性總生物堿的升血壓作用量-效關系及藥動學研究
- 安全施工專項方案報審表
- 學習解讀2022年新制定的《市場主體登記管理條例實施細則》PPT匯報演示
- 好氧廢水系統(tǒng)調試、驗收、運行、維護手冊
- 中石化ERP系統(tǒng)操作手冊
- 五年級上冊口算+脫式計算+豎式計算+方程
- 氣體管道安全管理規(guī)程
- 《眼科學》題庫
- 交通燈控制系統(tǒng)設計論文
評論
0/150
提交評論