📄 z_i2c.lst
字号:
C51 COMPILER V8.02 Z_I2C 08/07/2008 09:21:33 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE Z_I2C
OBJECT MODULE PLACED IN z_i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE z_i2c.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<at89x52.h>
2 #include<intrins.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5 #define _Nop() _nop_() //定义空指令
6 //#define ADDRWR 0xa0
7 //#define ADDRRD 0xa1
8 /*定义变量*/
9 uchar ADDRWR=0xa0,ADDRRD=0xa1;
10 uchar bdata Rshu;
11 sbit Rshu_3=Rshu^3;
12 sbit SDA=P1^2;
13 sbit SCL=P1^1;
14 sbit WP=P1^0;
15 bit ack;
16 uchar code Wshujiu[]={0xff};
17 uchar code Rshujiu[]={0x00};
18 /******************************************
19 功能:读写存储卡需要一定的延时,此函数用来延时
20 参数:wtime
21 返回值:无
22 ********************************************/
23 void delay (uchar wtime)
24 {
25 1 uchar i,j;
26 1 for(i=wtime;i>0;i--)
27 1 for(j=0;j<200;j++);
28 1 }
29 /******************************************
30 功能:固定时间延时
31 参数:无
32 返回值:无
33 ********************************************/
34 void wait(void)
35 {_Nop();
36 1 _Nop();
37 1 _Nop();
38 1 _Nop();
39 1 _Nop();
40 1
41 1 }
42 /**************************************************
43 启动总线函数
44 函数原形:
45 void start_I2C();
46 功能:
47 启动I2C总线,即发送I2C起始条件
48 参数:无
49 返回值:无
50 *****************************************************/
51 void start_I2C()
52 { SCL=0;
53 1 wait();
54 1 SDA=1; //发送起始条件的数据信号
55 1 _Nop();
C51 COMPILER V8.02 Z_I2C 08/07/2008 09:21:33 PAGE 2
56 1 _Nop();
57 1 SCL=1; //起始条件建立时间大于4uS
58 1 wait();
59 1 SDA=0; //发送起始信号
60 1 wait(); //起始条件锁定时间大于4us
61 1 SCL=0; //准备发送或接受数据
62 1 _Nop();
63 1 _Nop();
64 1 _Nop();
65 1 _Nop();
66 1 }
67 /**************************************************
68 结束总线函数
69 函数原形:
70 void stop_I2C();
71 功能:
72 结束I2C总线,即发送I2C结束条件
73 参数:无
74 返回值:无
75 *****************************************************/
76 void stop_I2C()
77 { SDA=0; //发送结束条件的数据信号
78 1 _Nop();
79 1 _Nop();
80 1 SCL=1; //发送结束条件的时钟信号
81 1 wait(); //结束条件建立时间大于4uS
82 1 SDA=1; //发送结束信号
83 1 _Nop(); //结束条件锁定时间大于4us
84 1 _Nop();
85 1 _Nop();
86 1 _Nop();
87 1 }
88 /*******************************************************
89 字节数据传送函数
90 函数原形:
91 void sendbyte(uchar data);
92 功能:
93 发送数据,可以是地址,发送后等待回应,并对此状态位进行操作.
94 应答或非应答都使ack=0,发送正常,ack=1;ack=0,表示接收器无应答或损坏
95 参数:
96 data:需要发送的数据
97 返回值:无
98 ********************************************************/
99 void sendbyte(uchar Data)
100 {
101 1 uchar bitcount;
102 1 for(bitcount=0;bitcount<8;bitcount++) //要传送的数据长度为8位
103 1 {
104 2 if((Data<<bitcount)&0x80) //判断发送位
105 2 SDA=1;
106 2 else SDA=0;
107 2
108 2 _Nop();
109 2 _Nop();
110 2 SCL=1; //置时钟线为高,通知被控器开始接收数据位
111 2 wait(); //保证时钟高电平周期大于4um
112 2 SCL=0;
113 2 }
114 1 SDA=1;
115 1 _Nop();
116 1 _Nop();
117 1 // _Nop();
C51 COMPILER V8.02 Z_I2C 08/07/2008 09:21:33 PAGE 3
118 1 //8位发送后释放数据线,准备接收应答位
119 1 // _Nop();
120 1 // _Nop();
121 1
122 1 SCL=1;
123 1 _Nop();
124 1 _Nop();
125 1 // _Nop();
126 1 // _Nop();
127 1 // _Nop();
128 1 // _Nop();
129 1 // _Nop();
130 1 if(SDA==1)
131 1 ack=0;
132 1 else ack=1; //判断是否接收到应答信号
133 1 SCL=0;
134 1 _Nop();
135 1 _Nop();
136 1 _Nop();
137 1 _Nop();
138 1
139 1 }
140 /************************************************************
141 字节数据接收函数
142 函数原形:
143 uchar recbyte();
144 功能:用来接收从器件传来的数据,并判断总线错误(不发生应答信号),发送后请用应答函数
145 参数:无
146 返回值:读到的数据
147 ***uchar*****************************************************/
148 uchar recbyte()
149 { uchar recdata;
150 1 uchar bitcount;
151 1 recdata=0;
152 1 SDA=1; //置数据线为输入方式
153 1 for(bitcount=0;bitcount<8;bitcount++)
154 1 { _Nop();
155 2 _Nop();
156 2 SCL=0; //置时钟线为低,准备接收数据位
157 2 wait(); //保证时钟低电平周期大于4um
158 2 SCL=1; //置时钟为高使数据线上数据有效
159 2 _Nop();
160 2 _Nop();
161 2 _Nop();
162 2 recdata=recdata<<1;
163 2 if(SDA==1)
164 2 recdata=recdata+1; //读数据位,接收的数据位放入recdata中
165 2 _Nop();
166 2 _Nop();
167 2 _Nop();
168 2 }
169 1 SCL=0;
170 1 _Nop();
171 1 _Nop();
172 1 _Nop();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -