第9章串行总线接口技术_第1页
第9章串行总线接口技术_第2页
第9章串行总线接口技术_第3页
第9章串行总线接口技术_第4页
第9章串行总线接口技术_第5页
已阅读5页,还剩132页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、12022-6-262022-6-2622022-6-263 2022-6-2642022-6-2652022-6-2662022-6-267 2022-6-2682022-6-2692022-6-26102022-6-26112022-6-2612sbit 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-6-2613for(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-6-261

3、4 2022-6-26152022-6-26162022-6-2617 2022-6-26182022-6-2619 2022-6-26202022-6-2621 2022-6-2622设要转换的数据放在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-6-2623 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-6-2624D/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-6-2625 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-6-2626 2022-6-26272022-6-2628 2022-6-26292022-6-26302022-6-26312

7、022-6-2632 2022-6-26332022-6-2634 ( 2022-6-2635 。 2022-6-2636SCL 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-6-2637汇编语言程序: START:SETB SDA;发送起始条件数据信号SETBSCL;发送起

8、始条件的时钟信号NOPNOPNOPNOPCLR SDA;发送起始信号(SCL为高,SDA发生由高到低)NOPNOPNOPNOPNOPCLRSCLRET 2022-6-2638C语言程序:void start( ) SDA=1; /*将SDA、SCL置为1 */ SCL=1; DELAY5US; /*延时5us*/ SDA=0; /*SCL为高时,SDA由高变低*/ DELAY5US; SCL=0; /*SCL变低,准备发送或接收数据 */2022-6-2639 汇编语言程序:STOP: CLR SDA ;发送停止条件的数据信号SETB SCL ;发送停止条件的时钟信号NOPNOPNOPNOPN

9、OP SETB SDA ;发送I2C总线停止信号(SCL为高,SDA发生由低到高) NOP NOP NOP NOPCLR SCLCLR SDARET2022-6-2640C语言程序:void stop( ) SDA=0; /*将SDA清0, SCL置1 */ SCL=1; DELAY5US; SDA=1; /*当SCL为高电平时,SDA由低变高 */ DELAY5US; SCL=0; 2022-6-2641汇编语言程序: MACK: CLR SDA ;发送应答信号MACKSETB SCLNOPNOPNOPNOPNOPCLR SCLSETB SDARET2022-6-2642C语言程序:void

10、 ack(void) /*产生应答信号*/ SDA=0; /*SDA先清0,发应答信号 */ SCL=1; /*SCL由低变高,产生一个时钟*/ DELAY5US; /*延时5us */ SCL=0; /*SCL变低,以便继续接收*/ SDA=1;2022-6-2643汇编语言程序: NACK: SETB SDA ;发送应答信号NACKSETB SCLNOPNOPNOP NOPNOPCLR SCLCLR SDARET2022-6-2644C语言程序:void nack(void) SDA=1; /*DA先置1,发非应答信号 */ SCL=1; /*SCL由低变高,产生一个时钟*/ DELAY5

11、US; SCL=0; /*时钟线SCL恢复到低电平*/ SDA=0; 2022-6-2645汇编语言程序(F0=1通信失败): CACK: SETB SDA ;发送应答信号CACKSETB SCLCLR F0MOV C,SDAJNC CENDSETB F0 CEND: CLR SCLRET2022-6-2646C语言程序:void cack(void) SDA=1; /*SDA先置1,发非应答信号 */ SCL=1; /*SCL由低变高,产生一个时钟* DELAY5US; ack=0; if(SDA=1) ack=1; SCL=0; /*时钟线SCL恢复到低电平*/2022-6-2647 汇编

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-6-2648C语言程序:/*将指针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-6-2649;从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-6-2650C语言程序:/*接收一个字节数据放在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、6-26512022-6-2652WNBYTE: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-6-26532022-6-26542022-6-2655汇编语言程序:;多字节读操作子程序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-6-2656MOV A,R4 ;取从器件读地址LCALL WRITE_BYTELCALL CACKJB F0,RNBYTERDN:LCALL RDBYTE ;接收一个字节数据MOV R0,ADJNZ

17、 R7,ACKLCALL MNACK ;接收完发非应答信号LCALL STOPACK:LCALL MACK ;没接收完发应答信号INC R0SJMP RDN2022-6-2657C语言程序:/*多字节读操作子程序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-6-2658 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-6-2659 2022-6-26602022-6-2661 2022-6-26622022-6-2663 2022-6-26642022-6-26652022-6-26662022-6-2667) 2022-6-2668引脚序号引脚名称功能描述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-6-2669引脚序号引脚名称功能描述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-6-26702022-6-26712022-6-26722022-6-26732022-6-26742022-6-26752022-6-26762022-6-26772022-6-2678 2022-6-2679 2022-6-26802022-6-2681d4d3d2d1d0(二进制)d4d3d2d1d0(十进制)显示结果0100109H9010100AHA010110BHb011000CHC01101ODHd01110OEHE01111OFHF1000010H

22、G1000111HH2022-6-26821100119Ht2022-6-2683d4d3d2d1d0(二进制)d4d3d2d1d0(十进制)显示结果110101AHU110111BHy111001CHc111011DHh111101EHT111111FH(无显示)2022-6-2684 2022-6-2685在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-6-2686MOV35H,#07HMOV36H,#02HMOV37H,#05HMOVDPTR,#LEDSEG ;数据指针指向字型码表首地址CLRAMOVR7,#08HMOVR0,#40HMOVR1,#30HLOOP1: MOVA,R1 ;从变量缓冲区取出要形式的数字MOVCA,A+DPTR ;查表得字型码MOVR0,A ;将字型码存储到40H开始的单元中INCR1INCR0DJNZ R7,LOOP12022-6-268

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-6-2688上述调用的相关的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-6-2689void 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-6-2690while(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-6-2691上述程序调用的相关的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-6-2692START: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-6-2693MOV 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-6-2694LOOP: 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-6-2695 PUSH DPH;PUSH DPLMOVDPTR,#LEDSEGMOVR2,AANLA,#0FHMOVCA,A+DPTRMOVR3,AMOVA,R2SWAPAANL

32、A,#0FHMOVCA,A+DPTRMOV R4,APOPDPLPOPDPHPOP02HRET2022-6-2696;中断服务程序INT_7290:(读取健值、拆分并转换成字型码更新46H和47H单元内容,以便刷新显示)INT_7290:NOP PUSH 00HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWMOVR0,#20H;状态数据区首址MOVR7,#04H;取状态数据个数MOVR2,#00H;内部数据首地址2022-6-2697 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-6-2698 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-6-2699采用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-6-26100void 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-6-26101void 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-6-26103void DELAY() unsigned char i,j; for

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论