第九章串行總線接口技術_第1頁
第九章串行總線接口技術_第2頁
第九章串行總線接口技術_第3頁
第九章串行總線接口技術_第4頁
第九章串行總線接口技術_第5頁
已閱讀5頁,還剩132頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、12022-3-272022-3-2722022-3-273 2022-3-2742022-3-2752022-3-2762022-3-277 2022-3-2782022-3-2792022-3-27102022-3-27112022-3-2712sbit DO = P12sbit CLK = P11sbit CS = P10bdata Unsigned char addata;sbit adin0 = addata 0; unsigned char TLC549 _ad(void) /*A/D轉換程序*/ unsigned char i; Clk=0; CS=0; /*令CS為低選中TLC

2、549*/ _nop_(); 2022-3-2713for(i=0;i8;i+) /*循環讀取8位A/D轉換結果*/ CLK =1; /*令CLK引腳為高,產生時鐘*/ delay( ); /*延時*/ adin0 =DO; /*讀取A/D轉換后數據線的一位數據*/ addata = addata 1; /*左移一位,先讀取為高位,后讀為低位*/ CLK=0; /*令CLK恢復為0*/ _nop_( ); _nop_( ); return addata; /*返回A/D轉換值*/void delay ( ) unsigned char i; for(i=0;i20;i+) 2022-3-271

3、4 2022-3-27152022-3-27162022-3-2717 2022-3-27182022-3-2719 2022-3-27202022-3-2721 2022-3-2722設要轉換的數據放在R7R6中,R7為高8位,R6低8位 DIN BIT P1.2 ;引腳定義 CS BIT P1.1 SCLK BIT P1.0 TLC5615_DA:CLR C;將R7R6中數據左移2位(16位數據的最低2位添00) RLC R6 RLC R7 CLR C RLC R6 RLC R7 SETB CS ;初始化片選信號為高 CLR SCLK ;初始化時鐘為低 CLR DIN;D/A數據線置低 C

4、LR CS;選中TLC5615,開始啟動D/A MOV R5,#16 ;將16位數據從DIN端移進內部的16位移位寄存器2022-3-2723 LOOP: RLC R6;R7R6中數據左移一位,最高位進入CY RLC R7 MOV DIN,C;將數據送到DIN引腳 SETB SCLK ; 送時鐘 NOPNOPNOPCLR SCLK;NOPNOPNOP DJNZ R5,LOOPSETB CS ;D/A片選拉高,10 位有效數據鎖存到DAC寄存器,開始轉換 RET 2022-3-2724D/A轉換C語言程序:sbit DA_clk=P10; /*引腳定義*/sbit DA_ cs=P11; sbi

5、t DA_in=P12; void delay_s(unsigned char n) /*延時*/ unsigned char i; for(i=0;in;i+); void TLC5615_DA_conver(unsigned int DA_data) /* D/A轉換程序*/ unsigned char i; DA_data = DA_data 2; /*將數據左移2位(最低2位添00) */ DA_cs=1; /*初始化片選信號為高*/ DA_clk=0; /*初始化時鐘為低*/ DA_in=0; /*D/A數據線置低*/ DA_cs=0; /*選中TLC5615,開始啟動D/A*/ f

6、or(i=0;i16;i+) /*將16位數據從DIN端移進內部的16位移位寄存器*/2022-3-2725 DA_data = DA_data 1; /*左移一位,最高位進入CY*/ DA_in=CY;/*將數據送到DIN引腳*/ DA_clk=1;delay_s(0 x02); /*送時鐘*/ DA_clk=0;delay_s(0 x02); DA_cs=1; / *片選拉高,10 位數據鎖存到DAC寄存器,開始轉換*/ delay_s(0 x20); 2022-3-2726 2022-3-27272022-3-2728 2022-3-27292022-3-27302022-3-27312

7、022-3-2732 2022-3-27332022-3-2734 ( 2022-3-2735 。 2022-3-2736SCL BIT P1.1;匯編語言定義端口;匯編語言定義端口SDA BIT P1.0sbit SDA=P10; /C語言定義端口語言定義端口sbit SCL=P11; bit ack; /應答標志位,有應答為應答標志位,有應答為1,無應答為,無應答為0#define DELAY5US _nop_();_nop_();_nop_();_nop_();_nop_(); 2022-3-2737匯編語言程序: START:SETB SDA;發送起始條件數據信號SETBSCL;發送起

8、始條件的時鐘信號NOPNOPNOPNOPCLR SDA;發送起始信號(SCL為高,SDA發生由高到低)NOPNOPNOPNOPNOPCLRSCLRET 2022-3-2738C語言程序:void start( ) SDA=1; /*將SDA、SCL置為1 */ SCL=1; DELAY5US; /*延時5us*/ SDA=0; /*SCL為高時,SDA由高變低*/ DELAY5US; SCL=0; /*SCL變低,準備發送或接收數據 */2022-3-2739 匯編語言程序:STOP: CLR SDA ;發送停止條件的數據信號SETB SCL ;發送停止條件的時鐘信號NOPNOPNOPNOPN

9、OP SETB SDA ;發送I2C總線停止信號(SCL為高,SDA發生由低到高) NOP NOP NOP NOPCLR SCLCLR SDARET2022-3-2740C語言程序:void stop( ) SDA=0; /*將SDA清0, SCL置1 */ SCL=1; DELAY5US; SDA=1; /*當SCL為高電平時,SDA由低變高 */ DELAY5US; SCL=0; 2022-3-2741匯編語言程序: MACK: CLR SDA ;發送應答信號MACKSETB SCLNOPNOPNOPNOPNOPCLR SCLSETB SDARET2022-3-2742C語言程序:void

10、 ack(void) /*產生應答信號*/ SDA=0; /*SDA先清0,發應答信號 */ SCL=1; /*SCL由低變高,產生一個時鐘*/ DELAY5US; /*延時5us */ SCL=0; /*SCL變低,以便繼續接收*/ SDA=1;2022-3-2743匯編語言程序: NACK: SETB SDA ;發送應答信號NACKSETB SCLNOPNOPNOP NOPNOPCLR SCLCLR SDARET2022-3-2744C語言程序:void nack(void) SDA=1; /*DA先置1,發非應答信號 */ SCL=1; /*SCL由低變高,產生一個時鐘*/ DELAY5

11、US; SCL=0; /*時鐘線SCL恢復到低電平*/ SDA=0; 2022-3-2745匯編語言程序(F0=1通信失敗): CACK: SETB SDA ;發送應答信號CACKSETB SCLCLR F0MOV C,SDAJNC CENDSETB F0 CEND: CLR SCLRET2022-3-2746C語言程序:void cack(void) SDA=1; /*SDA先置1,發非應答信號 */ SCL=1; /*SCL由低變高,產生一個時鐘* DELAY5US; ack=0; if(SDA=1) ack=1; SCL=0; /*時鐘線SCL恢復到低電平*/2022-3-2747 匯編

12、語言程序:;從A中取一個字節數據寫向I2C總線WRITE_BYTE: MOV R7,#8;寫8位WRITE_LOOP: RLC A ;發送A中數據 MOV SDA,C SETB SCL NOP NOP NOP NOP NOP CLR SCL DJNZ R7,WRITE_LOOP RET2022-3-2748C語言程序:/*將指針P指向的一個字節數據發送*/void SendByte(uchar *p) uchar n ,temp; temp =*p; for(n=0;n8;n+) /*一字節為8位,循環8次*/ if(temp &0 x80) SDA=1; /*將數據線SDA置1或清0*/ e

13、lse SDA=0; NOP SCL=1; /*置SCL為高,通知從機開始接收數據*/ DELAY5US; SCL=0; /*SCL變低,準備發送下一位數據*/ temp = temp 1; /*準備下一位要發送的數據*/ 2022-3-2749;從I2C總線接收一個字節 數據放在A中RDBYTE : MOV R7,#8;寫8位RD_LOOP: SETB SDA SETB SCL NOP;延時5s NOP NOP NOP NOP NOP MOV C,SDA ;采樣SDA線上的數據到cy MOV A,R2 ;R2為接收數據的緩沖寄存器RLC A ;將cy中的數據左移進A中MOV R2,A ;數據

14、送回緩沖寄存器R2CLR SCLDJNZ R7,RD_LOOPRET2022-3-2750C語言程序:/*接收一個字節數據放在P指向單元*/uchar RcvByte (uchar *P ) uchar n,temp; for(n=0;n8;n+) /*一字節為8位,循環8次*/ SDA=1; /*置數據線SDA為高,進入接收方式*/ SCL=1; /*SCL由低變高,產生一個時鐘*/ DELAY5US; temp= temp1; if(SDA=1) temp= temp0X01 ELSE temp= temp&0 xfe; SCL=0; /*時鐘線SCL清0*/ *p= temp;2022-

15、3-27512022-3-2752WNBYTE:MOV A,R3; LCALL START LCALL WRITE_BYTE LCALL CACK JB F0,WRBYTE MOV A,R2LCALL WRITE_BYTE LCALL CACKJB F0,WRBYTEWRDA: MOV A,R0LCALL WRITE_BYTE LCALL CACKJB F0,WRBYTEINC R0DJNZ R7,WRDALCALL STOPRET 2022-3-27532022-3-27542022-3-2755匯編語言程序:;多字節讀操作子程序RNBYTE;入口參數:R7寫入的字節數,R0寫入數據的首地址

16、, R2從器件地址內部地址,R3從器件寫地址,R4從器件讀地址RNBYTE:LCALL STARTMOV A,R3 ;取從器件寫地址LCALL WRITE_BYTE;寫從器件地址LCALL CACK ;檢測應答信號JB F0,RNBYTE;無應答重新開始MOV A,R2 ;取從器件地址內部地址LCALL WRITE_BYTELCALL CACKJB F0,RNBYTELCALL START2022-3-2756MOV A,R4 ;取從器件讀地址LCALL WRITE_BYTELCALL CACKJB F0,RNBYTERDN:LCALL RDBYTE ;接收一個字節數據MOV R0,ADJNZ

17、 R7,ACKLCALL MNACK ;接收完發非應答信號LCALL STOPACK:LCALL MACK ;沒接收完發應答信號INC R0SJMP RDN2022-3-2757C語言程序:/*多字節讀操作子程序RNBYTE/*入口參數:n寫入的字節數,s0讀數據存放的首地址,s2從器件地址內部地址,s3從器件寫地址,s4從器件讀地址*/viod Rcvnbyte(uchar *s3,uchar *s4, uchar *s2, uchar *s0, uchar n) loop:start( ); /*發起始信號,啟動總線*/ SendByte(s3); /*發送從器件地址*/ Cack( );

18、 /*應答檢測*/ if(ack) /*如果沒能應答,重新開始 */ goto loop SendByte(s2); /*發送器件子地址*/ Cack( ); /*應答檢測*/ if(ack) /*如果沒能應答,重新開始 */ goto loop2022-3-2758 start( ); /*再次發起始信號*/ SendByte(s4); /*sla+1表示進行讀操作*/ cack( ); /*應答檢測*/ if(ack) /*如果沒能應答,重新開始 */ goto loop for(i=0;in-1;i+) /*對前n-1個字節發應答信號*/ RcvByte(s0); /*接收數據*/ ac

19、k( ); /*發送應答信號*/ s+; RcvByte(s0); /*接收最后一個字節*/ nack( ); /*發送非應答信號*/ stop( ); /*發結束信號,結束本次數據傳送*/ 2022-3-2759 2022-3-27602022-3-2761 2022-3-27622022-3-2763 2022-3-27642022-3-27652022-3-27662022-3-2767) 2022-3-2768引腳序號引腳名稱功能描述1SC/KR2數碼管c段/鍵盤行信號22SD/KR3數碼管d段/鍵盤行信號33DIG3/KC3數碼管位選信號3/鍵盤列信號34DIG2/KC2數碼管位選信

20、號2/鍵盤列信號25DIG1/KC1數碼管位選信號1/鍵盤列信號16DIG0/KC0數碼管位選信號0/鍵盤列信號07SE/KR4數碼管e段/鍵盤行信號48SF/KR5數碼管f段/鍵盤行信號59SG/KR6數碼管g段/鍵盤行信號62022-3-2769引腳序號引腳名稱功能描述13DIG7/KC7數碼管位選信號7/鍵盤列信號714/INT鍵盤中斷請求信號,低電平(下降沿)有效15/RST復位信號,低電平有效16Vcc電源,+3.35.5V17OSC1晶振輸入信號18OSC2晶振輸出信號19SCLI2C總線時鐘信號20SDAI2C總線數據信號21DIG5/KC5數碼管位選信號5/鍵盤列信號522DI

21、G4/KC4數碼管位選信號4/鍵盤列信號423SA/KR0數碼管a段/鍵盤行信號024SB/KR1數碼管b段/鍵盤行信號12022-3-27702022-3-27712022-3-27722022-3-27732022-3-27742022-3-27752022-3-27762022-3-27772022-3-2778 2022-3-2779 2022-3-27802022-3-2781d4d3d2d1d0(二進制)d4d3d2d1d0(十進制)顯示結果0100109H9010100AHA010110BHb011000CHC01101ODHd01110OEHE01111OFHF1000010H

22、G1000111HH2022-3-27821100119Ht2022-3-2783d4d3d2d1d0(二進制)d4d3d2d1d0(十進制)顯示結果110101AHU110111BHy111001CHc111011DHh111101EHT111111FH(無顯示)2022-3-2784 2022-3-2785在8個數碼管上從左到右顯示”20100725”,參考程序清單如下:SDABIT P1.0SCL BIT P1.1WSLA EQU 070H;ZLG7290器件的寫地址RSLA EQU 071H;ZLG7290器件的讀地址 ORG0000H LJMP 0100H ORG0100H ;主程序

23、START: MOV30H,#02H;變量緩沖區定義顯示“20100725”MOV31H,#00H;MOV32H,#01H;MOV33H,#00HMOV34H,#00H2022-3-2786MOV35H,#07HMOV36H,#02HMOV37H,#05HMOVDPTR,#LEDSEG ;數據指針指向字型碼表首地址CLRAMOVR7,#08HMOVR0,#40HMOVR1,#30HLOOP1: MOVA,R1 ;從變量緩沖區取出要形式的數字MOVCA,A+DPTR ;查表得字型碼MOVR0,A ;將字型碼存儲到40H開始的單元中INCR1INCR0DJNZ R7,LOOP12022-3-278

24、7LOOP:MOVR7,#08HMOVR0,#40H ;字型碼首地址送R0MOVR2,#10H ;ZLG7290內部顯示緩沖區首地址送R2MOVR3,#WSLA ;ZLG7290器件的寫地址送R3LCALL WRNBYT ;調用顯示子程序LCALL DELAYSJMP LOOP LEDSEG: DB 0FCH,60H,0DAH,0F2H,66H,0B8H,0BEH,0E4H ;0-F共陰字型碼表 DB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH DELAY: MOV R5,#00H ;延時子程序 DELAY1: MOV R6,#00H DJNZ R6,$ DJNZ R

25、5,DELAY1 RET END2022-3-2788上述調用的相關的I2C子程序(WRNBYT,WRBYT,STOP,CACK,START)參見9.2.2節的內容。采用C語言編寫的參考程序#include “reg51.h”#include “intrins.h”#define DEPLAY5US _nop_( ); _nop_( ); _nop_( ); _nop_( ); _nop_( ); sbit SDA=P10;sbit SCL=P11;#define WSLA0 0 x70#define RSLA0 0 x71#define uchar unsigned charvoid STA

26、(void);void STOP(void);void CACK(void);2022-3-2789void Sendbyte (unsigned char *p);void Sendnbyte(uchar *s3,uchar *s2,uchar *s0,uchar n);void DELAY();void main() uchar n,i,m,*c,*y,*x,wsubsla=0 x10,WSLA=WSLA0; uchar a8=2,0,1,0,0,7,2,5; /*顯示字符*/ uchar b8 ; /*存放顯示字符對應的字型碼*/ uchar zxm16=0 xfc,0 x60,0 xd

27、a,0 xf2,0 x60,0 xda,0 xf2,0 x66,0 xbe,0 xe4, 0 xfe,0 xf6,0 xee,0 x3e,0 x9c,0 x7a, 0 x9e,0 x8e; /*0-F的字型碼 */ for(i=0;i8;i+) m=ai; /*取當前顯示字符*/ bi=zxmm /*查得顯示字符的字型碼 */2022-3-2790while(1) x=&WSLA; /* 取ZLG7290器件的寫地址*/ c=&wsubsla; /* 取ZLG7290器件的內部顯示緩沖寄存器的地址*/ y=b; /*獲得顯示字符的字型碼地址 */ n=8; Sendnbyte (x,c,y,n

28、); /*調用寫多字節的顯示子程序*/ DELAY( ); void DELAY( ) unsigned char i,j; for(i=0;i100;i+) for(j=0;j100;j+); 2022-3-2791上述程序調用的相關的I2C子程序(Sendbyte ( )、Sendnbyte( )、Stare( )、stop( )、ack( )、nack( )、cack( )參見9.2.2的內容。SDA BITP1.0SCLBITP1.1WSLAEQU070H ; ZLG7290器件的寫地址RSLAEQU071H ; ZLG7290器件的讀地址ORG 0000HLJMP0100HORG00

29、03H ;中斷入口LJMP INT_7290 ;鍵盤中斷服務ORG 0100H2022-3-2792START:MOV SP,#60HSETB EA ;開INT0中斷SETB EX0SETB IT0 ;觸發極性為下降沿MOV30H,#0DH ; 變量緩沖區(存放顯示字符在字型碼表中的偏移地址)MOV31H,#10HMOV32H,#11HMOV 33H,#10HMOV34H,#02H MOV 35H,#13H; MOV36H,#13H;MOV37H,#13H; ;通過查表建立顯示緩沖區(40H-47H)2022-3-2793MOV DPTR,#LEDSEG ;開始對變量查表MOVR7,#8 ;寫

30、入數據個數MOVR0,#30H;源數據塊首地址MOVR1,#40H ;當前字符字形碼表顯示緩沖區LOOP1:MOVA,R0MOVC A,A+DPTR ;查表得對應的字形碼MOV R1,A ;送顯示緩沖區INCR1INCR0DJNZ R7,LOOP1;向7290B寫入數據,以顯示“data= XX ”,最后兩位為鍵值的十進制顯示2022-3-2794LOOP: MOVR7,#8 MOV R2,#10H ;ZLG7290器件的內部顯示緩沖寄存器的地址 MOV R3,#WSLA ; ZLG7290器件的寫地址送R2 MOV R0,#40H ;當前字符字形碼表顯示緩沖區地址送R0 LCALL WRNB

31、YT ;調顯示子程序 LCALL DELAY ;使顯示穩定 SJMP LOOPLEDSEG:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H ;0-7的字形碼 DB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH ;8-F的字形碼 DB 0FAH,1EH,12H,00H;a,t,=和熄滅碼CF:PUSH 02H ;將A中的數據拆分為兩個四位16進制數并查表2022-3-2795 PUSH DPH;PUSH DPLMOVDPTR,#LEDSEGMOVR2,AANLA,#0FHMOVCA,A+DPTRMOVR3,AMOVA,R2SWAPAANL

32、A,#0FHMOVCA,A+DPTRMOV R4,APOPDPLPOPDPHPOP02HRET2022-3-2796;中斷服務程序INT_7290:(讀取健值、拆分并轉換成字型碼更新46H和47H單元內容,以便刷新顯示)INT_7290:NOP PUSH 00HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWMOVR0,#20H;狀態數據區首址MOVR7,#04H;取狀態數據個數MOVR2,#00H;內部數據首地址2022-3-2797 MOVR3,#WSLA ;取器件地址(寫) MOVR4,#RSLA ;取器件地址(讀) LCALL RNBYT

33、E ;讀出7290的4個寄存器(地址為00H03H)數據存于20H-23H NOP MOVA,21H ;取21H單元的鍵值 LCALL CF;拆分、查表 MOV47H,R3 ;送顯示緩沖區(最低兩位數碼管的字型碼在46H、47H中) MOV46H,R4 POP PSW POPACC POP07H POP04H 2022-3-2798 POP 03H POP 02H POP 00H RETI DELAY: MOV R6,#00H DELAY 1:MOV R5,#00H DJNZ R5,$ DJNZ R6,DELAY1 RET END相關的I2C子程序(WRNBYT、RNBYTE、WRBYT、ST

34、OP、CACK、STA),參見9.2.2的內容。2022-3-2799采用C語言編寫的參考程序#include “reg51.h”#include “intrins.h”#define DELAY5US _nop_();_nop()_;_nop_();_nop()_;_nop_();sbit SDA=P10;sbit SCL=P11;#define unsigned char uchar#define WSLA1 0 x70; /*7290器件地址*/#define RSLA1 0 x71;void start(void); /*函數聲明*/void stop(void);void mack(

35、void);2022-3-27100void nmack(void);void cack(void);void Sendbyte (unsigned char *p);void Rcvbyte (unsigned char *p);void Sendnbyte (unsigned char *s3, unsigned char *s2, unsigned char *s0, unsigned char n);void Rcvnbyte (unsigned char *s3, unsigned char *s4, unsigned char *s2, unsigned char *s0,unsi

36、gned char n);uchar zxm8;uchar code b20=0 xfc,0 x60,0 xda,0 xf2,0 x66,0 xb6,0 xde,0 xe4,0 xfe,0 xf6,0 xee,0 x3e,0 x9c,0 x7a,0 x9e,0 x8e,0 xfa,0 x1e,0 x12,0 x00;/*0-F字型碼,最后4個依次為a,t,=和熄滅的字型碼*/2022-3-27101void DELAY();void main() uchar n,i,*c,*y,*x,wsubsa=0 x10,WSLA=WSLA1; uchar a8= 0 x0d,0 x10, 0 x11, 0 x10,0 x12,0 x13,0 x13,0 x13;/*變量緩沖區(存放顯示字符在字型碼表中的偏移地址)*/ for(i=0;i4; i=i&0 x0f; zxm6=bi;2022-3-27103void DELAY() unsigned char i,j; for

溫馨提示

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

評論

0/150

提交評論