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

下載本文檔

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

文檔簡介

1、12022-7-22022-7-222022-7-23 2022-7-242022-7-252022-7-262022-7-27 2022-7-282022-7-292022-7-2102022-7-2112022-7-212sbit 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為低選中TLC549*/ _nop_(

2、); 2022-7-213for(i=0;i8;i+) /*循環(huán)讀取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-7-214 2022-7-21520

3、22-7-2162022-7-217 2022-7-2182022-7-219 2022-7-2202022-7-221 2022-7-222設要轉換的數據放在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數據線置低 CLR CS;選中TLC5615,開始啟動D/

4、A MOV R5,#16 ;將16位數據從DIN端移進內部的16位移位寄存器2022-7-223 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-7-224D/A轉換C語言程序:sbit DA_clk=P10; /*引腳定義*/sbit DA_ cs=P11; sbit DA_in=P12; void delay_

5、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*/ for(i=0;i16;i+) /*將16位數據從

6、DIN端移進內部的16位移位寄存器*/2022-7-225 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-7-226 2022-7-2272022-7-228 2022-7-2292022-7-2302022-7-2312022-7-232 2022-7-2332022-7-234

7、( 2022-7-235 。 2022-7-236SCL 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-7-237匯編語言程序: START:SETB SDA;發(fā)送起始條件數據信號SETBSCL;發(fā)送起始條件的時鐘信號NOPNOPNOPNOPCLR SDA;發(fā)送起始信號(SC

8、L為高,SDA發(fā)生由高到低)NOPNOPNOPNOPNOPCLRSCLRET 2022-7-238C語言程序:void start( ) SDA=1; /*將SDA、SCL置為1 */ SCL=1; DELAY5US; /*延時5us*/ SDA=0; /*SCL為高時,SDA由高變低*/ DELAY5US; SCL=0; /*SCL變低,準備發(fā)送或接收數據 */2022-7-239 匯編語言程序:STOP: CLR SDA ;發(fā)送停止條件的數據信號SETB SCL ;發(fā)送停止條件的時鐘信號NOPNOPNOPNOPNOP SETB SDA ;發(fā)送I2C總線停止信號(SCL為高,SDA發(fā)生由低到

9、高) NOP NOP NOP NOPCLR SCLCLR SDARET2022-7-240C語言程序:void stop( ) SDA=0; /*將SDA清0, SCL置1 */ SCL=1; DELAY5US; SDA=1; /*當SCL為高電平時,SDA由低變高 */ DELAY5US; SCL=0; 2022-7-241匯編語言程序: MACK: CLR SDA ;發(fā)送應答信號MACKSETB SCLNOPNOPNOPNOPNOPCLR SCLSETB SDARET2022-7-242C語言程序:void ack(void) /*產生應答信號*/ SDA=0; /*SDA先清0,發(fā)應答信

10、號 */ SCL=1; /*SCL由低變高,產生一個時鐘*/ DELAY5US; /*延時5us */ SCL=0; /*SCL變低,以便繼續(xù)接收*/ SDA=1;2022-7-243匯編語言程序: NACK: SETB SDA ;發(fā)送應答信號NACKSETB SCLNOPNOPNOP NOPNOPCLR SCLCLR SDARET2022-7-244C語言程序:void nack(void) SDA=1; /*DA先置1,發(fā)非應答信號 */ SCL=1; /*SCL由低變高,產生一個時鐘*/ DELAY5US; SCL=0; /*時鐘線SCL恢復到低電平*/ SDA=0; 2022-7-24

11、5匯編語言程序(F0=1通信失敗): CACK: SETB SDA ;發(fā)送應答信號CACKSETB SCLCLR F0MOV C,SDAJNC CENDSETB F0 CEND: CLR SCLRET2022-7-246C語言程序:void cack(void) SDA=1; /*SDA先置1,發(fā)非應答信號 */ SCL=1; /*SCL由低變高,產生一個時鐘* DELAY5US; ack=0; if(SDA=1) ack=1; SCL=0; /*時鐘線SCL恢復到低電平*/2022-7-247 匯編語言程序:;從A中取一個字節(jié)數據寫向I2C總線WRITE_BYTE: MOV R7,#8;寫8

12、位WRITE_LOOP: RLC A ;發(fā)送A中數據 MOV SDA,C SETB SCL NOP NOP NOP NOP NOP CLR SCL DJNZ R7,WRITE_LOOP RET2022-7-248C語言程序:/*將指針P指向的一個字節(jié)數據發(fā)送*/void SendByte(uchar *p) uchar n ,temp; temp =*p; for(n=0;n8;n+) /*一字節(jié)為8位,循環(huán)8次*/ if(temp &0 x80) SDA=1; /*將數據線SDA置1或清0*/ else SDA=0; NOP SCL=1; /*置SCL為高,通知從機開始接收數據*/ DELA

13、Y5US; SCL=0; /*SCL變低,準備發(fā)送下一位數據*/ temp = temp 1; /*準備下一位要發(fā)送的數據*/ 2022-7-249;從I2C總線接收一個字節(jié) 數據放在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 ;數據送回緩沖寄存器R2CLR SCLDJNZ R7,RD_LOOPRET2022-7-250C語言程序

14、:/*接收一個字節(jié)數據放在P指向單元*/uchar RcvByte (uchar *P ) uchar n,temp; for(n=0;n8;n+) /*一字節(jié)為8位,循環(huán)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-7-2512022-7-252WNBYTE:MOV A,R3; LCALL START LCALL

15、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-7-2532022-7-2542022-7-255匯編語言程序:;多字節(jié)讀操作子程序RNBYTE;入口參數:R7寫入的字節(jié)數,R0寫入數據的首地址, R2從器件地址內部地址,R3從器件寫地址,R4從器件讀地址RNBYTE:LCALL STARTMOV A,

16、R3 ;取從器件寫地址LCALL WRITE_BYTE;寫從器件地址LCALL CACK ;檢測應答信號JB F0,RNBYTE;無應答重新開始MOV A,R2 ;取從器件地址內部地址LCALL WRITE_BYTELCALL CACKJB F0,RNBYTELCALL START2022-7-256MOV A,R4 ;取從器件讀地址LCALL WRITE_BYTELCALL CACKJB F0,RNBYTERDN:LCALL RDBYTE ;接收一個字節(jié)數據MOV R0,ADJNZ R7,ACKLCALL MNACK ;接收完發(fā)非應答信號LCALL STOPACK:LCALL MACK ;沒

17、接收完發(fā)應答信號INC R0SJMP RDN2022-7-257C語言程序:/*多字節(jié)讀操作子程序RNBYTE/*入口參數:n寫入的字節(jié)數,s0讀數據存放的首地址,s2從器件地址內部地址,s3從器件寫地址,s4從器件讀地址*/viod Rcvnbyte(uchar *s3,uchar *s4, uchar *s2, uchar *s0, uchar n) loop:start( ); /*發(fā)起始信號,啟動總線*/ SendByte(s3); /*發(fā)送從器件地址*/ Cack( ); /*應答檢測*/ if(ack) /*如果沒能應答,重新開始 */ goto loop SendByte(s2)

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

19、發(fā)送非應答信號*/ stop( ); /*發(fā)結束信號,結束本次數據傳送*/ 2022-7-259 2022-7-2602022-7-261 2022-7-2622022-7-263 2022-7-2642022-7-2652022-7-2662022-7-267) 2022-7-268引腳序號引腳名稱功能描述1SC/KR2數碼管c段/鍵盤行信號22SD/KR3數碼管d段/鍵盤行信號33DIG3/KC3數碼管位選信號3/鍵盤列信號34DIG2/KC2數碼管位選信號2/鍵盤列信號25DIG1/KC1數碼管位選信號1/鍵盤列信號16DIG0/KC0數碼管位選信號0/鍵盤列信號07SE/KR4數碼管e

20、段/鍵盤行信號48SF/KR5數碼管f段/鍵盤行信號59SG/KR6數碼管g段/鍵盤行信號610DP/KR7數碼管dp段/鍵盤行信號711GND接地12DIG6/KC6數碼管位選信號6/鍵盤列信號62022-7-269引腳序號引腳名稱功能描述13DIG7/KC7數碼管位選信號7/鍵盤列信號714/INT鍵盤中斷請求信號,低電平(下降沿)有效15/RST復位信號,低電平有效16Vcc電源,+3.35.5V17OSC1晶振輸入信號18OSC2晶振輸出信號19SCLI2C總線時鐘信號20SDAI2C總線數據信號21DIG5/KC5數碼管位選信號5/鍵盤列信號522DIG4/KC4數碼管位選信號4/鍵

21、盤列信號423SA/KR0數碼管a段/鍵盤行信號024SB/KR1數碼管b段/鍵盤行信號12022-7-2702022-7-2712022-7-2722022-7-2732022-7-2742022-7-2752022-7-2762022-7-2772022-7-278 2022-7-279 2022-7-2802022-7-281d4d3d2d1d0(二進制)d4d3d2d1d0(十進制)顯示結果0100109H9010100AHA010110BHb011000CHC01101ODHd01110OEHE01111OFHF1000010HG1000111HH2022-7-2821100119H

22、t2022-7-283d4d3d2d1d0(二進制)d4d3d2d1d0(十進制)顯示結果110101AHU110111BHy111001CHc111011DHh111101EHT111111FH(無顯示)2022-7-284 2022-7-285在8個數碼管上從左到右顯示”20100725”,參考程序清單如下:SDABIT P1.0SCL BIT P1.1WSLA EQU 070H;ZLG7290器件的寫地址RSLA EQU 071H;ZLG7290器件的讀地址 ORG0000H LJMP 0100H ORG0100H ;主程序START: MOV30H,#02H;變量緩沖區(qū)定義顯示“201

23、00725”MOV31H,#00H;MOV32H,#01H;MOV33H,#00HMOV34H,#00H2022-7-286MOV35H,#07HMOV36H,#02HMOV37H,#05HMOVDPTR,#LEDSEG ;數據指針指向字型碼表首地址CLRAMOVR7,#08HMOVR0,#40HMOVR1,#30HLOOP1: MOVA,R1 ;從變量緩沖區(qū)取出要形式的數字MOVCA,A+DPTR ;查表得字型碼MOVR0,A ;將字型碼存儲到40H開始的單元中INCR1INCR0DJNZ R7,LOOP12022-7-287LOOP:MOVR7,#08HMOVR0,#40H ;字型碼首地址

24、送R0MOVR2,#10H ;ZLG7290內部顯示緩沖區(qū)首地址送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 R5,DELAY1 RET END2022-7-288上述調用的相關的

25、I2C子程序(WRNBYT,WRBYT,STOP,CACK,START)參見9.2.2節(jié)的內容。采用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(void);void STOP(void);void CACK(vo

26、id);2022-7-289void 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 xda,0 xf2,0 x60,0 xda,0 xf2,0 x66,0 xb

27、e,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-7-290while(1) x=&WSLA; /* 取ZLG7290器件的寫地址*/ c=&wsubsla; /* 取ZLG7290器件的內部顯示緩沖寄存器的地址*/ y=b; /*獲得顯示字符的字型碼地址 */ n=8; Sendnbyte (x,c,y,n); /*調用寫多字節(jié)的顯示子程序*/ DELAY( ); void DE

28、LAY( ) unsigned char i,j; for(i=0;i100;i+) for(j=0;j100;j+); 2022-7-291上述程序調用的相關的I2C子程序(Sendbyte ( )、Sendnbyte( )、Stare( )、stop( )、ack( )、nack( )、cack( )參見9.2.2的內容。SDA BITP1.0SCLBITP1.1WSLAEQU070H ; ZLG7290器件的寫地址RSLAEQU071H ; ZLG7290器件的讀地址ORG 0000HLJMP0100HORG0003H ;中斷入口LJMP INT_7290 ;鍵盤中斷服務ORG 0100

29、H2022-7-292START:MOV SP,#60HSETB EA ;開INT0中斷SETB EX0SETB IT0 ;觸發(fā)極性為下降沿MOV30H,#0DH ; 變量緩沖區(qū)(存放顯示字符在字型碼表中的偏移地址)MOV31H,#10HMOV32H,#11HMOV 33H,#10HMOV34H,#02H MOV 35H,#13H; MOV36H,#13H;MOV37H,#13H; ;通過查表建立顯示緩沖區(qū)(40H-47H)2022-7-293MOV DPTR,#LEDSEG ;開始對變量查表MOVR7,#8 ;寫入數據個數MOVR0,#30H;源數據塊首地址MOVR1,#40H ;當前字符字

30、形碼表顯示緩沖區(qū)LOOP1:MOVA,R0MOVC A,A+DPTR ;查表得對應的字形碼MOV R1,A ;送顯示緩沖區(qū)INCR1INCR0DJNZ R7,LOOP1;向7290B寫入數據,以顯示“data= XX ”,最后兩位為鍵值的十進制顯示2022-7-294LOOP: MOVR7,#8 MOV R2,#10H ;ZLG7290器件的內部顯示緩沖寄存器的地址 MOV R3,#WSLA ; ZLG7290器件的寫地址送R2 MOV R0,#40H ;當前字符字形碼表顯示緩沖區(qū)地址送R0 LCALL WRNBYT ;調顯示子程序 LCALL DELAY ;使顯示穩(wěn)定 SJMP LOOPLE

31、DSEG: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-7-295 PUSH DPH;PUSH DPLMOVDPTR,#LEDSEGMOVR2,AANLA,#0FHMOVCA,A+DPTRMOVR3,AMOVA,R2SWAPAANLA,#0FHMOVCA,A+DPTRMOV R4,APOPDPLPOPDPHPOP0

32、2HRET2022-7-296;中斷服務程序INT_7290:(讀取健值、拆分并轉換成字型碼更新46H和47H單元內容,以便刷新顯示)INT_7290:NOP PUSH 00HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWMOVR0,#20H;狀態(tài)數據區(qū)首址MOVR7,#04H;取狀態(tài)數據個數MOVR2,#00H;內部數據首地址2022-7-297 MOVR3,#WSLA ;取器件地址(寫) MOVR4,#RSLA ;取器件地址(讀) LCALL RNBYTE ;讀出7290的4個寄存器(地址為00H03H)數據存于20H-23H NOP MO

33、VA,21H ;取21H單元的鍵值 LCALL CF;拆分、查表 MOV47H,R3 ;送顯示緩沖區(qū)(最低兩位數碼管的字型碼在46H、47H中) MOV46H,R4 POP PSW POPACC POP07H POP04H 2022-7-298 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、STOP、CACK、STA),參見9.2.2的內容。2022-7-299采用C語言編寫的參考程

34、序#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(void);2022-7-2100void nmack(void);void cack(vo

35、id);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,unsigned char n);uchar zxm8;uchar code b20=0 xfc,0

36、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-7-2101void 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;/*變量緩沖區(qū)(存放顯示字符在字型碼表中的偏移地址)*/ for(i=0;i4; i=i&0 x0f; zxm6=bi;2022-7-2103void DELAY() unsigned char

溫馨提示

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

評論

0/150

提交評論