第9章8051扩展资源的C编程_第1页
第9章8051扩展资源的C编程_第2页
第9章8051扩展资源的C编程_第3页
第9章8051扩展资源的C编程_第4页
第9章8051扩展资源的C编程_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第9章8051扩展资源的C编程主要内容:

9.1可编程外围定时器82539.2可编程外围并行接口82559.3可编程接口芯片81559.4I2C总线扩展存储器1在很多应用场合8051自身的资源不能满足要求。这时就要扩展。扩展的外围芯片有:8253、8155、8255以及I2C口。9.1可编程外围定时器8253Intel公司的8253是可编定时器/计数器,片内包含有3个独立的通道,每个通道均为16位的计数器。其计数速率均达2.6MHz。28253123456789101112242322212019181716151413VCCWRRDCSA1A0CLK2OUT2GATE2CLK1GATE1OUT1D7D6D5D4D3D2D1D0CLK0OUT0GATE0GNDWR计数器0计数器1计数器2数据总线缓冲器读/写逻辑控制字寄存器RDA0A1CSD7~D0CLK0GATE0OUT0CLK1GATE1OUT1CLK2GATE2OUT2控制寄存器11计数器301计数器110计数器000选择A0A1表9-1A1,A0地址组合含义9.1.18253的结构和引脚CLK0计数器GATE0UOT039.1.28253的工作方式和控制字8253计数器工作方式是由编程设定的,将控制字写入控制寄存器,用它来选择每一个计数器的工作方式。控制字的格式如下:BCDM0M1M2RL0RL1SC0SC1D0D1D2D3D4D5D6D7非法11计数器201计数器110计数器000选择SC0SC1表9-2SC1,SC0组合含义表9-3RL1,RL0组合含义先读/写低位字节,后读/写高位字节11只读/低字节01只读/写高字节10计数器闩锁操作00操作类型RL0RL1表9-4M2,M1,M0组合含义510140013110201011000000工作方式M0M1M24-----从初值开始计数-----方式5允许计数-----禁止计数方式4允许计数从初值开始计数禁止计数,使OUT变高方式3允许计数从初值开始计数禁止计数,使OUT变高方式2-----从初值开始计数,下一个时钟OUT变低-----方式1允许计数-----禁止计数方式0GATE为高电平GATE为上降沿GATE为低电平或下降沿工作方式表9-门控信号GATE的控制功能方式0—计数结束中断;方式1—可重复触发的单稳态触发器;方式2—频率发生器;方式3—方波发生器;方式4—软件触发选通;方式5—硬件触发选通。59.1.38253与8051的接口8253与8051的接口如图9-3所示。图中8253计数器0、1、2的地址为:8000H,8001H,8002H;控制口地址为8003H。(地址怎么获得?)例测3个通道脉冲信号的计数率。采用8253可同时测3个通道脉冲信号。程序如下:8051ALECLK0P0P1.7373154888D0~D7A0A1P2.7P2.6P2.5P2.4RDRDCSWRWRGATE0,1,28253CLK1CLK2T0计数器0计数器1计数器2CLK0GATE0CLK1GATE1CLK2GATE2P1.767#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint#defineCOM8253XBYTE[0x8003]#defineC1XBYTE[0x8000]#defineC2XBYTE[0x8001]#defineC3XBYTE[0x8002]#defineSNUM1sbitP1_7=P1^7;/*门控端*/ucharit=20;ucharsn=SNUM;uintidataBUF8253[3];/*计数率缓冲区*/8voidust0(void){/*使用定时器0函数*/TMOD=TMOD&0xf0+0x01;/*定时器为方式1*/TH0=0x4c;TL0=0x81;/*50ms定时初值*/TR0=1;ET0=1;EA=1;/*启动定时器开中断*/P1_7=1;}voidt0i(void)interrupt1{/*定时器0中断服务程序*/TH0=0x4c;TL0=0x81;if((--it)==0){it=20;/*1s需20次中断*/sn--;/*秒单元减1*/}}9voidcbfp(ucharxdata*po,ucharx){/*计数器取值函数,参数为地址和通道*/ucharh,i;i=*po;po++;po--;h=*po;BUF8253[x]=65536-(h*256+i);/*因8253减计数,应取补*/}10voidfcbf(void){/*三个通道的取值函数*/P1_7=0;COM8253=0x0a/*方式5,计数器0*/COM8253=0x4a/*方式5,计数器1*/COM8253=0x8a/*方式5,计数器2*/COM8253=0x0acbfp(&C1,0);/*取计数器0的计算值*/COM8253=0x4acbfp(&C2,1);/*取计数器1的计算值*/COM8253=0x8acbfp(&C3,2);/*取计数器2的计算值*/}BCDM0M1M2RL0RL1SC0SC1D0D1D2D3D4D5D6D711voidinit8253(void){/*初始化8253函数*/COM8253=0x3a/*选方式5*/C1=0;C1=0;/*设计数器初值*/COM8253=0x7aC2=0;C2=0;COM8253=0xbaC3=0;C3=0;}voidmain(void){init8253();ust0();while(sn);/*取1s定时到*/fcbf();}BCDM0M1M2RL0RL1SC0SC1D0D1D2D3D4D5D6D7129.2可编程外围并行接口8255PA3PA2PA1PA0RDCSGNDA1A0PC7PC6PC5PC4PC0PC1PC2PC3PB0PB1PB2825512345678910111213141516171819204039383736353433323130292827262524232221PA4PA5PA6PA7WRRESETD0D1D2D3D4D5D6D7VCCPB7PB6PB5PB4PB3D7~D0A组(8)端口AA组(4)端口CB组(4)端口CB组(8)端口BA组控制B组控制数据总线缓冲器读写控制逻辑PA7~PA0PC7~PC4PC3~PC0PB7~PB0RESETA0A1CSRDWR9.2.18255的结构和引脚13命令字口11口C01口B10口A00选通的端口A0A1表9-5端口选择②.C口置/复位控制字D0D1D2D3D4D5D600=复位,1=置位置位D3D2D1位选择不用时置000控制方式选择9.2.28255的命令字和工作方式000001010011100101110111C口BIT0BIT1BIT2BIT3BIT4BIT5BIT6BIT714(4).8255的控制字D0D1D2D3D4D5D61①.方式选择控制字B口方式选择1=方式1,0=方式0B口1=输入,0=输出C口(下半部)1=输入,0=输出B组A口方式选择00=方式0,01=方式1,1×=方式2A口1=输入,0=输出C口(上半部)1=输入,0=输出A组工作方式字特征位15OBFAOBFAI/OOUTINPC7ACKAACKAI/OOUTINPC6IBFAI/OIBFAOUTINPC5STBAI/OSTBAOUTINPC4INTRAINTRAINTRAOUTINPC3I/OACKBSTBBOUTINPC2I/OOBFBIBFBOUTINPC1I/OINTRBINTRBOUTINPC0C口方式0或1OUTINOUTINPBB口←→OUTINOUTINPAA口输入/输出输出输入输出输入方式2方式1方式0端口表9-68255在不同工作方式下的口线功能1680C51P0.7P0.6..P0.0ALE8255ARESETEAD7...D0A1A0874LS373D7D6..D0Q7..Q1Q0EGRDRDWRWRCSPA7...PA0微型打印机DB7...DB0BUSYSTBPB7...PB0PC7PC089.2.38255与8051的接口例:用8255控制打印机。8255采用方式0,由模拟参数STB信号。按照接口电路,口A地址=7CH,口B地址=7DH,口C=7EH,命令口地址=7FH。PC7~PC4为输入,PC3~PC0为输出;方式选择命令字=8EH。程序如下:D0D1D2D3D4D5D61①.方式选择控制字(见P212)17#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineCOM8255XBYTE[0x007f]/*命令口地址*/#definePA8255XBYTE[0x007c]/*口A地址*/#definePC8255XBYTE[0x007e]/*口C地址*/voidtoptrn(uchar*p){/*打印字符串函数*/while(*p!=‘\0’;{while((0x80&PC8255)!=0);/*查询等待打印机的BUSY状态*/PA8255=*p;/*输出字符*/COM8255=0x00;COM8255=0x01;/*模拟STB脉冲*/p++;}18voidmain(void){ucharidataprn[]=“WELCOME”;COM8255=0x8e;/*输出方式选择命令字*/COM8255=0x01;toprn(prn);/*打印字符串*/}199.3可编程接口芯片8155

8155具有3个可编程并行I/O端口,A口和B口是8位,C口是6位。1个14位可编程的定时/计数器和256字节的静态RAM。9.3.18155的结构和引脚功能PC3PC4

PC5CERDWRALEAD0AD1AD2AD3AD4AD5AD6AD7VSS815512345678910111213141516171819204039383736353433323130292827262524232221VCCPC2PC1PC0PB7PB6PB5PB4PB3PB2PB1PB0PA7PA6PA5PA4PA3PA2PA1PA0TIMERINRESETIO/MTIMEROUT256字节静态RAM14位定时计数器ABCTIMERINRESETAD0-7PA0-7PB0-7PC0-5ALETIMEROUTVCCVSSIO/MWRCERD20定时/计数器输入端PA1PA2PA3PA4PA5PA6PA7PA0PB1PB2PB3PB4PB5PB6PB7PB0PC1PC2PC3PC4PC5PC0AD1AD2AD3AD4AD5AD6AD7AD0TIMEINTIMEOUTALEIO/MRESETRDWRCE芯片引脚功能:RAM及I/O选择地址锁存线三态地址/数据复用线端口A,I/O线端口B,I/O线端口C,I/O线读选通信号线写选通信号线片选线定时/计数器输出端复位端1I/O0MCPU外设218155各引脚的功能为:地址/数据线AD0~AD7(8条): 是低8位地址线和数据线的共用输入总线,常和单片机的P0口相连,用于分时传送地址和数据;PA0~PA7、PB0~PB7: 为A、B口线,用于和外设之间传递数据;PC0~PC5

为C端口线,既可与外设传送数据,也可以作为A、B口的控制联络线;CS:片选线,低电平有效。8155的各引脚的功能228155的各引脚的功能RESET:复位线,通常与单片机的复位端相连。ALE:地址锁存线,高电平有效。IO/M:

RAM或I/O口的选择线。当为0时,选中8155 的256BRAM;当为1时,选中8155片内3个I/O端口 以及命令/状态寄存器和定时/计数器。RD和WR:读/写线,控制8155的读、写操作。TMRIN(TI):定时/计数器的脉冲输入端。TMROUT(TO):定时/计数器的输出信号端。VCC:电源端。GND:接地端。238155当IO/M为0时,单片机对8155的RAM进行操作,共256B,低八位的地址为:00H—0FFH。8155当IO/M为1时,单片机对8155的I/O口进行操作。低八位地址I/O口xxxxx000B命令/状态口xxxxx001BPA口xxxxx010BPB口xxxxx011BPC口xxxxx100B定时器/计数器低字节寄存器xxxxx101B定时器/计数器高字节寄存器8155的RAM和I/O口地址编码24芯片8155的I/O口和定时器/计数器的工作方式可以通过对8155的命令寄存器写入控制字来实现。

8155的命令寄存器和状态寄存器使用同一个地址。

8155的命令字

命令字主要规定了8155的I/O口和定时器的工作方式。

8155的状态字

状态字的内容包含8155的I/O口的工作状态标志。

9.3.28155的命令字、状态字及工作方式25TM1TM2IEBIEAPC2PC1PAPAPBA口方式B口方式B口A口计数器方式00:空操作01:停止计数10:计满后停止11:开始计数0:输入1:输出0:禁止中断1:允许中断00110110

方式1:A、B口基本I/O;C口输入方式2:A、B口基本I/O;C口输出方式3:A口选通I/O;B口基本I/O方式4:A、B口选通I/O8155的命令字格式26C口在四种工作方式下的各位定义C口通用I/O方式选通I/O方式ALT1ALT2ALT3ALT4PC0输入输出AINTR(A口中断)AINTR(A口中断)PC1输入输出ABF(A口缓冲器满)ABF(A口缓冲器满)PC2输入输出ASTB(A口选通)ASTB(A口选通)PC3输入输出输出BINTR(B口中断)PC4输入输出输出BBF(B口缓冲器满)PC5输入输出输出BSTB(B口选通)27选通I/O数据输入操作外设主动发送,8155和单片机被动接收外设向8155提出数据发送请求;8155接收数据后,通知外设“已收到”;8155通知单片机,取走数据;单片机通知8155:转告外设,可以再次发送数据了28选通I/O数据输入操作当外设准备好数据并送PA口时,发出低电平的选通信号ASTB到PC2;8155接收到ASTB后:将PA上的数据读入A口寄存器使A口数据满ABF置位(PC1)以通知外设数据已收到。8155使PC0的AINTR标志置位,以通知单片机数据已收到。CPU响应中断执行服务程序,当执行到从A口读取输入的数据(MOVX)时,/RD的上升沿将PC0的INTEA清零并使PC1的ABF变低,通知外设输入下一个数据。

P0INT0

PAPD0-7/RDPC1PC2PC0D7-0

C口为ALT3模式PC0:A口中断AINTR标志输出,送单片机;PC1:A口缓冲器满ABF标志输出,送外设。PC2:A口选通输入ASTB,ASTBABFMCS-518155外设AINTR29选通I/O数据输出操作单片机和8155主动发送,外设被动接收单片机向8155提出数据输出请求;8155接收单片机传给的数据后,通知外设“来取数据”;外设取走数据后,告知8155“取数完成”;8155通知单片机:数据转发完成,可以再次发送数据了30选通I/O数据输出操作CPU执行MOVX指令将数据送PA口,8155收到数据后PC1(ABF)变高,通知外设数据已到达PA口。外设接收到PC1(ABF)的高电平后:从D7-0上接收数据;使ASTB变低,通知8155外设已接收到数据。当8155监测到ASTB回到高电平时,使PC0的AINTR变为高电平,向单片机申请中断。单片机在中断服务程序中巴下一个数据送到A口,进行下一个数据的输出。

P0INT0

PAPD0-7PC1PC2PC0D7-0

ASTBABFMCS-518155外设C口为ALT3模式,控制字:00011001BPC0:A口中断AINTR标志输出,送单片机;PC1:A口缓冲器满ABF标志输出,送外设。PC2:A口选通输入ASTB,AINTR31例:用8155控制打印机。8051P08155RESETP3.3/INT18AD0~AD7RDWRPA0PA1PA2PA3PA4PA5PA6PA7TPμp-TFBUSYSTBPC0VCCALEP2.7P2.0DB0DB1DB2DB3DB4DB5DB6DB7ALECEIO/MRDWRRESETGNDVCCVSS右图是接口硬件连接图。8155地址:P2.7=0,P2.0=1命令口地址:7FF0H;口A地址:7FF1H;口C地址:7FF3H;8155的初始化命令字:0FH(口A、口基本I/O输出,口C输出)。32例:用8155控制打印机。8051P08155RESETP3.3/INT18AD0~AD7RDWRPA0PA1PA2PA3PA4PA5PA6PA7TPμp-TFBUSYSTBPC0VCCALEP2.7P2.0DB0DB1DB2DB3DB4DB5DB6DB7ALECEIO/MRDWRRESETGNDVCCVSS工作过程:单片机向8155的口A写命令;单片机向8155的口C依次写00H、01H,在PC0上产生脉冲上升沿,通知打印机取走数据;打印机取走数据后,通过BUSY引脚下降沿触发单片机外部中断;在单片机外部中断程序中,将待打印数组连续输出到8155的口A。下面是打印“北京SPRING1999”的程序,其中汉字“北京”在硬汉字库中的标准机内代码为B1B1H和BEA9H,打印机与8051采用中断方式联络。33#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineCOM8155XBYTE[0x7ff0]/*命令口地址*/#definePA8155XBYTE[0x7ff1]/*口A地址*/#definePC8155XBYTE[0x7ff3]/*口C地址*/sbitBUSY=P3^3;ucharcodetab[17]={0xb1,0xb1,0xbe,0xa9,0x20,0x53,0x50,0x52,0x49,0x4e,0x47,0x20,0x31,0x39,0x39,0x39,0x0a}/*北京SPTING1999*/uchart1=17;

voidprt(uchard){/*打印一字符函数*/PA8155=d;/*送打印字符代码*/PC8155=0x00;PC8155=0x01;/*产生STB脉冲*/while(BUSY);//等待P3.3引脚上的电平由高变低}34voidmain(void){COM8155=0x0f;/*置命令字*/prt(0x1c);/*送入中文打印方式命令字高字节*/prt(0x26);/*送入中文打印方式命令字低字节*/EA=1;/*开CPU中断*/EX1=1;/*开外部中断1*/while(1){};}voidint1(void)interrupt2using1{/*打印中断服务函数*/uchari;EA=0;for(i=0;i<t1;i++)/*打印一串字符*/prt(tab[i]);EA=1;EX1=0;/*关打印机中断*/}问题:打印数组的每个元素时都触发中断程序执行吗?35RDALE8155CE7407+5VP2.7P2.6RDALEWRP0.0…P0.78051PB0PB1PB2PB3PB4PB5PB6PB7330Ω×8D0…D7IO/MWRPA5PA4PA3PA2PA1PA0abcdefgdp740613.1.2七段数码显示与8051的接口8155地址:P2.7=1,P2.6=1命令口地址:FFF0H;口A地址:FFF1H;口C地址:FFF3H;B口用来输出段选码;A口用来输出位选码;8155与6位LED显示器接口。36例18155控制的动态LED显示。RDALE8155CE7407+5VP2.7P2.6RDALEWRP0.0…P0.78051PB0PB1PB2PB3PB4PB5PB6PB7330Ω×8D0…D7IO/MWRPA5PA4PA3PA2PA1PA0abcdefgdp74068155与6位LED显示器接口。初始化命令字:07HA口选通I/O;B口基本I/O输出;C口:初始化命令字:0FH、03H更合适37#include<absacc.h>#include<reg51.h>#defineucharunsingnedchar#defineCOM8155XBYTE[0xfff0]#definePA8155XBYTE[0xfff1]#definePB8155XBYTE[0xfff2]#definePC8155XBYTE[0xfff3]ucharidatadis_buf[6]={2,4,6,8,10,12};ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x7f,0x6f,0x77,0x70,0x39,0x5e,0x79,0x71,0x40,0x00};voiddl_ms(uchard);voiddisplay(ucharidata*p){ucharsel,i;COM8155=0x07;/*送命令字*/sel=0x01;/*选最右边的LED*/for(i=0;i<6;i++){PB8155=table[*p];/*送段码*/PA8155=sel;/*送位选码*/dl_ms(1);p--;/*缓冲区下移1位*/sel=sel<<1;/*左移1位*/}}voidmain(void){display(dis_buf+5);}389.4I2C总线扩展存储器目前单片机应用系统中使用的串行扩展方式主要有:Philips公司的I2C(InterIC)总线;Freescale公司的SPI(serialPeripheralInterface)串行外设接口;Dallas公司的单总线(1-wire);NS公司的串行接口Microwire/Plus。由于IC卡多采用I2C总线接口的存储器卡,下面只介绍采用I2C总线的存储器扩展。9.4.1I2C总线简介(自己看)399.4.2I2C总线通信规约

I2C总线是一种用于IC器件之间连接的二线制串行通信总线,它通过两根线(SDA,串行数据线;SCL,串行时钟线)在连到总线上的器件之间传送信息,根据地址识别每个器件,可方便地构成多机系统和外围器件扩展系统。SDASCLAT24C04A1A2RXDTXD总线主机SDASCLAT24C04A1A2SDASCL其他总线从机+5V+5VR×2

主要特点:*二线传输,I2C总线上所有主器件、外围器件等都连到同名端的SDA和SCL线上。40SDASCLAT24C04A1A2RXDTXD总线主机SDASCLAT24C04A1A2SDASCL其他总线从机+5V+5VR×2

*系统中有多个主器件时,任何一个器件在I2C总线上工作时都可以成为主控制器。

*I2C总线传输时,采用状态码管理方法,数据传输时任何一种状态都会产生响应的状态码,并进行自动处理。

*所有外围器件都可以采用器件地址和引脚地址的硬件编址方法避免了片选线的连线方法。(见上图)

*所有带I2C的器件都具有应答功能,当片内多个单元地址时,数据读写都有自动加1功能。41

按照二线制串行通信总线传输规定:将数据传输到总线上的器件称为发送器,而从总线上接收数据的器件称为接收器。可以控制数据传送的器件称为主机(通常为单片机)。主机作用;需要启动数据的发送和接收,并提供传送时钟。该系统上的其他芯片即为从器件或从机。

数据传输方式:若A机(主器件)→B机(从器件)。

①首先A机寻址B机,②然后A机(主发送)把数据送至B机(从接收),③最后由A机终止传送。若A机(主器件)←B机(从器件)。①首先A机寻址B机,②然后A机(主接收)接收B机(从发送)的数据,③最后由A机终止传送。介绍一些概念和规定42*SDA和SCL都是双向I/O线,通过上拉电阻接到正电源。

*当总线空闲时,两根线都是高电平。

*数据传输速率为100kb/s。

*连到总线上的数量仅受总线电容400pF的限制。送到SDA线上的每个字节必须为8位,每次传送的字节数不限,每个字节后面必须跟1个响应位,数据传送时,先传最高位。通常被寻址的接收器件必须在收到每个字节后作出响应。I2C总线发信号的第一个字节用来确定主器件所选择的(从器件。该字节的高7位组成器件的地址,最低位确定信息的方向。439.4.3串行I2C总线E2PROM24XXAT24CXX系列E2PROM是典型的I2C总线接口器件。特点是:①单电源供电;②采用低功耗COMS技术;③工作电压范围宽(1.8~5.5V);④自定时写周期(包括自动擦除)、页面写周期的典型值为2ms;⑤具有硬件保护。AT24CXX系列的器件内部结构和引脚如图9-11所示。I/O控制逻辑存储器控制逻辑E2PROM存储阵列页缓冲器电压提升Y译码R/W控制X译码VCCSDASCLWPVSSA0A1A2AT24C××12348765VCCA0A1A2GNDWPSCLSDA44读/写控制位片选或块选I2C从器件地址R/WA2A1A010101.控制字节要求开始位以后,主器件送出一个8位控制字节,以选择从器件扩展总线传送的方向。控制字节的结构如下所示:位7~位4为从器件地址位,确定器件类型。此4位码由Plilips公司的I2C规约所决定。1010吗即从器件为串行E2PROM。串行E2PROM将一直处于等待状态,直接1010码发送到总线上为止。当其他非串行E2PROM从器件将不会响应。45读/写控制位片选或块选I2C从器件地址R/WA2A1A01010位3~位1为1~8片的片选或存储器内的块地址选择位。标准的I2C规约允许选择16KB的存储器。通过对几片或一个器件内的几个块的存取,可完成对16KB存储器的选择。位0为读/写操作控制码。如果此位为1,则下一个字节进行读操作(R);若此位为0,则下一个字节进行写操作(W)。当串行E2PROM产生控制字节并检测到应答信号以后,主器件总线上将传送相应的字地址或数据信息。462.起始信号、停止信号和应答信号起始信号:起始信号应该在读/写操作命令之前发出。停止信号:表示一种操作的结束。数据和地址都是以8位的串行信号传送。在接收一个字节后,接收器件必须产生一个应答信号ACK,主器件必须产生一个与此应答信号相应的额外时钟脉冲。SDASCL≥4.7μs≥4.7μs(a)起始信号SSDASCL≥4.0μs≥4.0μs(b)停止信号P47SCLSDA≥4.0μs(c)发送ACKSCLSDA≥4.0μs(d)发送ACK3.写操作AT24CXX系列E2PROM的写操作有字节写和页面写2种。(1)字节写SDA线启动芯片地址写字地址数据停止R/WACKMSBLSBACKACK48SDA线启动芯片地址写字地址数据n停止R/WACKMSBLSBACKACK数据n+1数据n+xACKACK(2)页面写4.读操作当从器件地址的R/W位被置为1时,启动读操作。AT24CXX系列的读操作有3种类型:读当前地址内容、读指定地址内容、读顺序地址内容。(1)读当前地址内容SDA线启动芯片地址读数据停止R/WACKNOACKS49SDA线启动芯片地址写字地址nACKACK启动芯片地址读数据n停止R/WACKNOACKS芯片地址ACKACK读数据n停止R/WACKSDA线ACK数据n+1数据n+x数据(2)读指定地址内容(3)读顺序地址内容505.1k×28051P1.6P1.7+5VAT24C02A0A1A2WPSCLSDAVCCVCC9.4.4I2C总线的编程的实现假设用P1.7和P1.6分别作为SDA和SCL信号,如图9-18所示。单片机所用晶体振荡器的频率为6MHz。机器周期2μs,可分别写出产生时钟SCL和SDA的起始和停止信号程序。用软件模拟I2C总线产生起始信号、停止信号和进行数据传送的程序。51#include<reg51.h>#include<intrins.h>#defineucharunsingnedchar#defineuintusingnedintsbitSDA=P1^7;SbitSCL=P1^6;voidstart_iic(){/*产生I2C总线起始信号*/SDA=1;/*发送起始条件数据信号*/SCL=1;_nop_();/*起始信号建立时间大于4.7μs*/_nop_();SDA=0;/*发送起始信号*/_nop_();_nop_();SCL=0;/*箝位*/}52voidstop_iic(){/*产生I2C总线停止信号*/SDA=0;/*发送停止条件数据信号*/SCL=1;_nop_();/*停止信号建立时间大于4μs*/_nop_();SDA=1;/*发送停止信号*/_nop_();_nop_();SCL=0;}voidack_iic(){/*产生I2C总线应答信号*/SDA=0;SCL=1;_nop_();_nop_();SDA=0;SCL=1;}53voidnack_iic(){/*产生I2C总线非应答信号*/SDA=1;SCL=1;_nop_();_nop_();SDA=0;SCL=0;}54write_byte(ucharc){/*向虚拟I2C总线上发送1字节数据*/uchari;for(i=0;i<8;i++){if(c&0x80)SDA=1;/*判断发送位*/elesSDA=0;SCL=1;/*时钟线为高,通知从器件开始接收数据*/_nop_();_nop_();SCL=0;c=c<<1;/*准备下一位*/}SDA=1;SCL=1;/*释放数据线,准备接收应答信号*/_nop_();_nop_();if(SDA==1)F0=0;/*判断是否收到应答信号*/elseF0=1;SCL=0;}55ucharread_byte(){/*从虚拟I2C总线上读取1字节数据*/uchari;ucharr=0;SDA=1;/*置数据线为输入方式*/for(i=0;i<8;i++){r=r<<1/*左移补0*/SCL=1;/*置时钟线为高,数据有效*/_nop_();_nop_();if(SDA==1)r++;/*当数据线为高时,加1*/SCL=0;}return;}56/*向虚拟I2C总线上发送n字节数据*/bitwrite_nbyte(ucharslave,ucharaddr,uchar*s,ucharnumb){uchari;start_iic();/*发送起始信号*/write_byte(slave);/*发送从器件地址*/if(F0==0)return0;write_byte(addr);/*发送器件内部地址*/if(F0==0)return0;for(i=0;i<numb;i++){write_byte(*s);/*发送数据*/if(F0==0)return0;s++;}stop_iic();/*发送停止信号*/return(1);}57/*从虚拟I2C总线上读取n字节数据*/bitread_nbyte(ucharslave,ucharaddr,uchar*s,ucharnumb){uchari;start_iic();/*发送起始信号*/write_byte(slave);/*发送从器件地址*/if(F0==0)return0;

温馨提示

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

评论

0/150

提交评论