标签归档:51

51单片机模拟I2C总线的C语言实现

I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。

一、I2C总线特点

I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

二、I2C总线工作原理

2.1、总线的构成及信号类型

I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。

2.2、位的传输

SDA 线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变。

2.3、开始信号

SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

2.4、结束信号

SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

2.5、应答信号

接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

2.6、总线基本操作

I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件(本文为AT24C01)都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器CPU)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。

三、单片机模拟I2C总线C语言代码

/*************************************
 单片机模拟I2C总线C语言代码
*************************************/
#include<string.h>
#include<reg52.h>
#include<intrins.h>
#define DELAY_TIME 60 /*只有不小于50!才不会造成时序混乱*/
#define TRUE 1
#define FALSE 0
sbit SCL=P1^7; /*串行时钟*/
sbit SDA=P1^6; /*串行数据*/
/********** Function Definition 函数定义 ************/
void DELAY(unsigned int t) /*延时函数*/
{
while(t!=0)
t--;
}
/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
void I2C_Start(void)
{
 SDA=1;
 SCL=1;
 DELAY(DELAY_TIME);
 SDA=0;
 DELAY(DELAY_TIME);
 SCL=0;
 DELAY(DELAY_TIME);
}
/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
void
read more

MCS-51单片机指令表

助 记 符 操  作  功  能 机  器  码 字节数 机器周期数
MOV  A,Ri 寄存器内容送累加器 E8~EF 1 1
MOV  Ri,A 累加器内容送寄存器 F8~FF 1 1
MOV  A,@Rj 片内RAM内容送累加器 E6,E7 1 1
MOV  @Rj,A 累加器内容送片内RAM F6,F7 1 1
MOV  A,direct 直接寻址字节内容送累加器 E5 nn地 2 1
MOV  direct,A 累加器内容送直接寻址字节 F5 nn地 2 1
MOV  direct,  Ri .寄存器内容送直接寻址字节 88~8Fnn地 2 2
MOV  Ri, direct 直接寻址字节内容送寄存器 A8~Afnn地 2 2
MOV  direct,@Rj 片内RAM内容送直接寻址字节 86, 87nn地 2 2
MOV  @Rj, direct 直接寻址字节内容送片内RAM A6, A7nn地 2 2
MOV  direct,direct 直接寻址字节内容送另一直接寻址字节 85 nn地源nn地目的 3 2
MOV  A,#data 立即数送累加器 74nn 2 1
MOV  Ri, #data 立即数送寄存器 78~7Fnn 2 1
MOV  @Rj, #data 立即数送片内RAMA 76.77nn 2 1
MOV  direct, #data 立即数送直接寻址字节 75nn地nn 3 2
MOV  DPTR,#data 16位立即数送数据指针寄存器 90nn高nn低 3 2
MOVX  A, @Rj 片外RAM内容送累加器(8位地址) E2,E3 1 2
MOVX  @Rj,  A 累加器内容送片外RAM(8位地址) F2,E3 1 2
MOVX  A, @DPTR 片外RAM内容送累加器(16位地址) E0 1 2
MOVX  @DPTR,  A 累加器内容送片外RAM(16位地址) F0 1 2
MOVC  A, @A+DPTR 相对数据指针内容送累加器 93 1 2
MOVC  A,  @A+PC 相对程序计数器内容送累加器 83 1 2
XCH  A, Ri 累加器与寄存器交换内容 C8~CF 1 1
XCH  A, @Rj 累加器与片内RAM交换内容 C6,C7 1 1
XCH  A,  direct 累加器与直接寻址字节交换内容 C5nn地 2 1
XCHD  A,  @Rj 累加器与片内RAM交换低直接内容 D6,D7 1 1
SWAP  A 累加器交换高半字节与低半字节内容 C4 1 1
PUSH  direct 直接寻址字节内容压入堆栈栈顶 C0nn地 2 2
POP   direct 堆栈栈顶内容弹出到直接寻址字节 D0nn地 2 2
ADD  A,  Ri 寄存器与累加器内容相加 28~2F 1 1
ADD  A,  @Rj 片内RAM与累加器内容相加 26,27 1 1
ADD  A,  direct 直接寻址字节与累加器内容相加 25nn地 2 1
ADD  A,  #data 立即数与累加器内容相加 24nn地 2 1
ADDC  A, Ri 寄存器与累加器与进位位内容相加 38~3F 1 1
ADDC  A, @Rj 片内RAM与累加器与进位位内容相加 36,37 1 1
ADDC  A,  direct 直接寻址字节与累加器与进位位内容相加 35nn地 2 1
ADDC  A,  #data 立即数与累加器与进位位内容相加 34nn地 2 1
SUBB  A,  Ri 累加器内容减寄存器与进位位内容 98~9F 1 1
SUBB  A,@Rj 累加器减片内RAM与进位位内容 96,97 1 1
SUBB  A, direct 累加器内容减直接寻址字节与进位位内容 95nn地 2 1
SUBB  A, #data 累加器内容减立即数与进位位内容 94nn地 2 1
INC  A 累加器内容加1 4 1 1
INC  Ri 寄存器内容加1 08~0F 1 1
INC  @Rj 片内RAM内容加1 06,07 1 1
INC  direct 直接寻址字节内容加1 05nn地 2 1
INC  DPTR 数据指针寄存器内容加1 A3 1 2
DEC  A 累加器内容减1 14 1 1
DEC  Ri 寄存器内容减1 18~1F 1 1
DEC  @Ri 片内RAM内容减1 16,17 1 1
DEC  direct 直接寻址字节内容减1 15nn地 2 1
DA  A 累加器内容十进制调整 D4 1 1
MUL  AB 累加器内容乘寄存器B内容 A4 1 4
DIV  AB 累加器内容除寄存器B内容 84 1 4
ANL  A,Ri 寄存器内容与累加器内容 58~5F 1 1
ANL  A,@Rj 片内RAM与累加器内容 56,57 1 1
ANL  A, direct 直接寻址字节内容与累加器内容 55nn地 2 1
ANL  direct,  A 累加器内容与直接寻址字节内容 52nn地 2 1
ANL  A, #data 立即数与累加器内容 54nn地 2 1
ANL  direct, #data 立即数与直接寻址字节内容 53nn地nn 3 2
ORL  A, Ri 寄存器内容或累加器内容 48~4F 1 1
ORL  A, @Rj 片内RAM内容或累加器内容 46,47 1 1
ORL  A, direct 直接寻址字节内容或累加器内容 45nn地 2 1
ORL  direct, A 累加器内容或直接寻址字节内容 42nn地 2 1
ORL  A, #data 立即数或累加器内容 44nn地 2 1
ORL  direct, #data 立即数内容或直接寻址字节内容 43nn地nn 3 2
XRL  A,  Ri 寄存器内容异或累加器内容 68~6F 1 1
XRL  A,  @Rj 片内RAM内容异或累加器内容 66,67 1 1
XRL  A,  direct 直接寻址字节内容异或累加器内容 65nn地 2 1
XRL  direct, A 累加器内容异或直接寻址字节内容 62nn地 2 1
XRL  A, #data 立即数异或累加器内容 64nn地 2 1
XRL  direct, #data 立即数异或直接寻址字节内容 63nn地nn 3 2
CPL  A 累加器内容取反 F4 1 1
CLR  A 累加器内容清零 E4 1 1
RL  A 累加器内容向左环移一位 23 1 1
RR  A 累加器内容向右环移一位 3 1 1
RLC  A 累加器内容带进位位向左环移一位 33 1 1
RRC  A 累加器内容带进位位向右环移一位 13 1 1
AJMP  addr  11 绝对转移(2KB地址内) 01~E1nn地 2 2
LJMP  addr  16 长转移(64KB地址内) 02nn高nn低 3 2
SJMP  rel 相对短转移(-128~+127B地址内) 80nn相对 2 2
JMP  @A+DPTR 相对长转移(64KB地址内) 73 1 2
JZ  rel 累加器内容为零转移 60nn相对 2 2
JNZ  rel 累加器内容不为零转移 70nn相对 2 2
CJNE  A, direct, rel 累加器内容与直接寻址字节内容不等转移 B5nn地 nn相对 3 2
CJNE  A, #data, rel 累加器内容与立即数不等转移 B4nn nn相对 3 2
CJNE  Ri, #data, rel 寄存器内容与立即数不等转移 B8~BFnn nn相对 3 2
CJNE  @Rj, #data, rel 片内RAM内容与立即数不等转移 B6,B7nn nn相对 3 2
DJNZ  Ri, rel 寄存器内容减1不为零转移 D8~DFnn相对 2 2
DJNZ  direct, rel 直接寻址字节内容减1不为零转移 D5nn地nn相对 3 2
ACALL  addr  11 绝对调子(2KB地址内) 11~F1nn地 2 2
LACALL  addr  16 长调子(64KB地址内) 12nn高nn低 3 2
RET 返主 22 1 2
RETI 中断返主 32 1 2
NOP 空操作 00 1 1
MOV  C,bit 直接寻址位内容送进位位 A2nn位 2 1
MOV  bit, C 进位位内容送直接寻址位 92nn位 2 1
CPL  C 进位位取反 B3 1 1
CLR  C 进位位清零 C3 1 1
SETB  C 进位位置位 D3 1 1
CPL  bit 直接寻址位去反 B2nn位 2 1
CLR  bit 直接寻址位清零 C2nn位 2 1
SETB  bit 直接寻址位置位 D2nn位 2 1
ANL  C, bit 直接寻址位内容与进位位内容 82nn位 2 2
ORL  C, bit 直接寻址位内容或进位位内容 72nn位 2 2
ANL  C, /bit 直接寻址位内容的反与进位位内容 B0nn位 2 2
ORL  C, /bit 直接寻址为内容的反或进位位内容 A0nn位 2 2
JC   rel 进位位为转移1 40nn相对 2 2
JNC  rel 进位位不为1转移 50nn相对 2 2
JB  bit, rel 直接寻址位为转移 20nn位nn相对 3 2
JNB  bit, rel 直接寻址位不为1转移 30nn位nn相对 3 2
JBC  bit, rel 直接寻址位为1转移且该位清零 10nn位nn相对 3 2