📄 iic.lst
字号:
C51 COMPILER V7.06 IIC 11/15/2007 11:32:38 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN iic.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE iic.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************
2 I2C总线程序,版权2007,沈佳华所有
3 MCU:AT89S52
4 时钟:12MHZ
5 *******************************************/
6
7 #include<intrins.h>
8 #include<reg52.h>
9 #include"userdefine.h"
10
11 #define uchar unsigned char
12 #define uint unsigned int
13
14 void iic_start(); //1--启动iic总线
15 void iic_stop(); //2--停止iic总线数据传送
16 void send_ack(); //3--发送应答位
17 void nsend_ack(); //4--发送非应答位
18 void check_ack(); //5--应答位检查
19 void write_byte(uchar shu); //6--发送一个字节
20 void write_byte0();
21 void write_byte1();
22 uchar read_byte(); //7--读取一个字节
23 void delay_nop(unsigned char step); //单步延时子程序
24 void write_N_byte(uchar CS_I2C,uchar ic_addr,uchar number,uchar send_data[]); //8--发送N个字节 CS_I2
-C为24C02 IC地址
25 //***********************************************************************************
26 //功能:发送N个数据字节子程序
27 //描述:CS_I2C,ic_addr,number,send_data,用户只需调用本子程序即可
28 //参数:发送N个字节 CS_I2C为24C02 IC地址,ic_addr为单元地址,number为连续寻址字节数,
29 // 但不能超过各种IC的每页字节数. send_data[]为发送数据来源,CS_I2C选中哪个芯片及
30 // 读写命令
31 //返回:无
32 //***********************************************************************************/
33 void read_N_byte(uchar CS_I2C,uchar ic_addr,uchar number,uchar incept_data[]); //9--接收N个字节 CS_I2
-C为读寻址字节
34 //***********************************************************************************
35 //功能:接收N个字数据节子程序
36 //描述:CS_I2C,ic_addr,number,send_data,用户只需调用本子程序即可
37 //参数:发送N个字节 CS_I2C为24C02 IC地址,ic_addr为单元地址,number为连续寻址字节数,
38 // 但不能超过各种IC的每页字节数. send_data[]为发送数据来源,CS_I2C选中哪个芯片及
39 // 读写命令
40 //返回:无
41 //***********************************************************************************/
42 void write_bytea(uchar CS_I2C,uchar temp[],uchar n); //10-写第N个字节
43
44 //***********************************************************************************
45 //功能:启动I2C总线子程序
46 //描述:SCL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
47 //参数:无
48 //返回:无
49 //***********************************************************************************/
50 void iic_start()
51 {
52 1 SDA=1; //初始SDA高电平
53 1 delay_nop(1);
C51 COMPILER V7.06 IIC 11/15/2007 11:32:38 PAGE 2
54 1 SCL=1; //初始SCL为高电平才能使SDA开始信号有效 SCL f=100-400KHZ
55 1 while(SCL==0){} //检测SCL是否为高电平,若为低电平就不能作为I2C开始等其为高方可
56 1 delay_nop(2); //根椐晶振时钟来修订延时时间 SDA=4.7us
57 1 SDA=0; //SDA电平从高变低产生一个下降沿来启动I2C总线
58 1 delay_nop(4); //根椐晶振时钟来修订延时时间 SDA=4.7us
59 1 SCL=0; //SCL为低电平
60 1 }
61 //***********************************************************************************
62 //功能:关闭I2C总线,停止数据传送子程序
63 //描述:SCL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
64 //参数:无
65 //返回:无
66 //***********************************************************************************/
67 void iic_stop()
68 {
69 1 SDA=0; //初始SDA为低电平为呆会产生上升沿作准备
70 1 delay_nop(1); //根椐晶振时钟来修订延时时间 SDA=4.7us
71 1 SCL=1; //初始SCL为高电平才能使SDA停止信号有效 SCL f=100-400KHZ
72 1 while(SCL==0){;} //确保SCL是高电平才能发出停止命令
73 1 delay_nop(2); //根椐晶振时钟来修订延时时间 SDA=4.7us
74 1 SDA=1; //在SCL为高电平的前提条件下,SDA电平从低变高产生一个上升沿作为I2C的停止信号
75 1 delay_nop(4); //根椐晶振时钟来修订延时时间 SDA=4.7us
76 1 SCL=0; //将SCL置低,安全不影响下一次的数据传输
77 1 }
78 //***********************************************************************************
79 //功能:发送应答信号子程序
80 //描述?CL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
81 //参数:无
82 //返回:无
83 //***********************************************************************************/
84 void send_ack()
85 {
86 1 SDA=0; //发送完数据或接收完数据主机都会发出0应答信号ACK
87 1 SCL=1;
88 1 delay_nop(4); //根椐晶振时钟来修订延时时间 SDA=4.7us
89 1 SCL=0;
90 1 SDA=1;
91 1 }
92 //***********************************************************************************
93 //功能:发送非应答信号子程序
94 //描述:SCL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
95 //参数:无
96 //返回:无
97 //***********************************************************************************/
98 void nsend_ack()
99 {
100 1 SDA=1;
101 1 SCL=1;
102 1 delay_nop(4); //根椐晶振时钟来修订延时时间 SDA=4.7us
103 1 SCL=0;
104 1 SDA=0;
105 1 }
106 //***********************************************************************************
107 //功能:检查应答信号子程序
108 //描述:SCL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
109 //参数:无
110 //返回:无
111 //***********************************************************************************/
112 void check_ack()
113 {
114 1 SDA=1;
115 1 SCL=1;
C51 COMPILER V7.06 IIC 11/15/2007 11:32:38 PAGE 3
116 1 F0=0;
117 1 if(SDA==0)
118 1 {
119 2 SCL=0;
120 2 delay_nop(4); //根椐晶振时钟来修订延时时间 SDA=4.7us
121 2 }
122 1 else
123 1 {
124 2 F0=1;
125 2 SCL=0;
126 2 delay_nop(4); //根椐晶振时钟来修订延时时间 SDA=4.7us
127 2 }
128 1 }
129 //***********************************************************************************
130 //功能:发送一个数据字节子程序
131 //描述:SCL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
132 //参数:无
133 //返回:无
134 //***********************************************************************************/
135 void write_byte(uchar shu) //发送一个数据字节
136 {
137 1 uchar i;
138 1 if((shu&0x80)>0)
139 1 {SDA=1;}
140 1 else
141 1 {SDA=0;}
142 1 SCL=1;
143 1 while(SCL==0){;}
144 1 delay_nop(2); //根椐晶振时钟来修订延时时间 SDA=4.7us
145 1 SCL=0;
146 1 SDA=0;
147 1 shu=_crol_(shu,1);
148 1 for(i=1;i<8;i++)
149 1 {
150 2 if((shu&0x80)>0)
151 2 {write_byte1();}
152 2 else
153 2 {write_byte0();}
154 2 shu=_crol_(shu,1);
155 2 }
156 1 }
157 //***********************************************************************************
158 //功能:XX子程序
159 //描述:SCL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
160 //参数:无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -