📄 zlg_i2c.lst
字号:
C51 COMPILER V8.02 ZLG_I2C 11/30/2007 14:28:45 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE ZLG_I2C
OBJECT MODULE PLACED IN ZLG_I2C.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SRC\ZLG_I2C.c BROWSE DEBUG OBJECTEXTEND PRINT(.\ZLG_I2C.lst) OBJECT(ZLG_I2C
-.obj)
line level source
1 /********************************************************************
2 ZLG_I2C.C
3 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
4 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的
5 与用户程序连接并扩展.....
6
7 注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作
8 一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)
9
10 ********************************************************************/
11
12 #include "..\inc\main.h"
13
14 sbit SDA=P3^5; /*模拟I2C数据传送位*/
15 sbit SCL=P3^4; /*模拟I2C时钟控制位*/
16
17 //bit ack; /*应答标志位*/
18 uchar ack; //应答位标志位可设置成这样.
19
20 /*******************************************************************
21 起动总线函数
22 函数原型: void start_i2c(void);
23 功能: 启动I2C总线,即发送I2C起始条件.
24
25 ********************************************************************/
26 void start_i2c(void)
27 {
28 1 SDA=1; /*发送起始条件的数据信号*/
29 1 _Nop();
30 1 SCL=1;
31 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
32 1 _Nop();
33 1 _Nop();
34 1 _Nop();
35 1 _Nop();
36 1 SDA=0; /*发送起始信号*/
37 1 _Nop(); /* 起始条件锁定时间大于4μs*/
38 1 _Nop();
39 1 _Nop();
40 1 _Nop();
41 1 _Nop();
42 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
43 1 _Nop();
44 1 _Nop();
45 1 }
46
47
48
49
50 /*******************************************************************
51 结束总线函数
52 函数原型: void stop_i2c(void);
53 功能: 结束I2C总线,即发送I2C结束条件.
54
C51 COMPILER V8.02 ZLG_I2C 11/30/2007 14:28:45 PAGE 2
55 ********************************************************************/
56 void stop_i2c(void)
57 {
58 1 SDA=0; /*发送结束条件的数据信号*/
59 1 _Nop(); /*发送结束条件的时钟信号*/
60 1 SCL=1; /*结束条件建立时间大于4μs*/
61 1 _Nop();
62 1 _Nop();
63 1 _Nop();
64 1 _Nop();
65 1 _Nop();
66 1 SDA=1; /*发送I2C总线结束信号*/
67 1 _Nop();
68 1 _Nop();
69 1 _Nop();
70 1 _Nop();
71 1 }
72
73
74
75
76 /*******************************************************************
77 字节数据传送函数
78 函数原型: void send_byte(uchar c);
79 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
80 此状态位进行操作.(不应答或非应答都使ack=0 假)
81 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
82 ********************************************************************/
83 void send_byte(uchar c)
84 {
85 1 uchar BitCnt;
86 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
87 1 {
88 2 if((c<<BitCnt)&0x80) SDA=1; /*判断发送位*/
89 2 else SDA=0;
90 2 _Nop();
91 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
92 2 _Nop();
93 2 _Nop(); /*保证时钟高电平周期大于4μs*/
94 2 _Nop();
95 2 _Nop();
96 2 _Nop();
97 2 SCL=0;
98 2 }
99 1 _Nop();
100 1 _Nop();
101 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
102 1 _Nop();
103 1 _Nop();
104 1 SCL=1;
105 1 _Nop();
106 1 _Nop();
107 1 _Nop();
108 1 if(SDA==1) ack=0;
109 1 else ack=1; /*判断是否接收到应答信号*/
110 1 SCL=0;
111 1 _Nop();
112 1 _Nop();
113 1 }
114
115
116
C51 COMPILER V8.02 ZLG_I2C 11/30/2007 14:28:45 PAGE 3
117
118
119
120 /*******************************************************************
121 字节数据传送函数
122 函数原型: uchar receive_byte(void);
123 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
124 发完后请用应答函数。
125 ********************************************************************/
126 uchar receive_byte(void)
127 {
128 1 uchar retc;
129 1 uchar BitCnt;
130 1 retc=0;
131 1 SDA=1; /*置数据线为输入方式*/
132 1 for(BitCnt=0;BitCnt<8;BitCnt++)
133 1 {
134 2 _Nop();
135 2 SCL=0; /*置时钟线为低,准备接收数据位*/
136 2 _Nop();
137 2 _Nop(); /*时钟低电平周期大于4.7μs*/
138 2 _Nop();
139 2 _Nop();
140 2 _Nop();
141 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
142 2 _Nop();
143 2 _Nop();
144 2 retc=retc<<1;
145 2 if(SDA==1)
146 2 retc=retc+1; /*读数据位,接收的数据位放入retc中 */
147 2 _Nop();
148 2 _Nop();
149 2 }
150 1 SCL=0;
151 1 _Nop();
152 1 _Nop();
153 1 return (retc);
154 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -