📄 www.ourhc.cn.lst
字号:
C51 COMPILER V8.05a WWW_OURHC_CN 06/03/2012 18:38:14 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE WWW_OURHC_CN
OBJECT MODULE PLACED IN www.ourhc.cn.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE www.ourhc.cn.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 汇诚科技
3
4 实现功能:STC12C5A60S2单片机之AT24C04测试程序1T
5 使用芯片:STC12C5A60S2
6 晶振:11.0592MHZ
7 波特率:115200
8 编译环境:Keil
9 作者:zhangxinchun
10 网站:www.ourhc.cn
11 淘宝店:
12 汇诚科技 http://ourhc.taobao.com
13 郑兴电子直销部 http://shop68451856.taobao.com
14 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
15
16
17 *********************************************************************/
18 #include "REG52.H"
19 #include "INTRINS.H"
20
21 typedef unsigned char BYTE;
22 typedef unsigned short WORD;
23
24 sbit SCL = P3^4; //AT24C04的时钟
25 sbit SDA = P3^5; //AT24C04的数据
26
27 BYTE BUF[16]; //数据缓存区
28
29 BYTE code TESTDATA[] =
30 {
31 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,
32 0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF
33 };
34
35 void Delay5us();
36 void Delay5ms();
37 void AT24C04_Start();
38 void AT24C04_Stop();
39 void AT24C04_SendACK(bit ack);
40 bit AT24C04_RecvACK();
41 void AT24C04_SendByte(BYTE dat);
42 BYTE AT24C04_RecvByte();
43 void AT24C04_ReadPage();
44 void AT24C04_WritePage();
45
46 void main()
47 {
48 1 AT24C04_WritePage();
49 1 Delay5ms();
50 1 AT24C04_ReadPage();
51 1
52 1 while (1);
53 1
54 1 }
55
C51 COMPILER V8.05a WWW_OURHC_CN 06/03/2012 18:38:14 PAGE 2
56 /**************************************
57 向AT24C04写1页(16字节)数据
58 将TESTDATA开始的16个测试数据写如设备的00~0F地址中
59 **************************************/
60 void AT24C04_WritePage()
61 {
62 1 BYTE i;
63 1
64 1 AT24C04_Start(); //起始信号
65 1 AT24C04_SendByte(0xa0); //发送设备地址+写信号
66 1 AT24C04_SendByte(0x00); //发送存储单元地址
67 1 for (i=0; i<16; i++)
68 1 {
69 2 AT24C04_SendByte(TESTDATA[i]);
70 2 }
71 1 AT24C04_Stop(); //停止信号
72 1 }
73
74 /**************************************
75 从AT24C04读取1页(16字节)数据
76 将设备的00~0F地址中的数据读出存放在DATA区的BUF中
77 **************************************/
78 void AT24C04_ReadPage()
79 {
80 1 BYTE i;
81 1
82 1 AT24C04_Start(); //起始信号
83 1 AT24C04_SendByte(0xa0); //发送设备地址+写信号
84 1 AT24C04_SendByte(0x00); //发送存储单元地址
85 1 AT24C04_Start(); //起始信号
86 1 AT24C04_SendByte(0xa1); //发送设备地址+读信号
87 1 for (i=0; i<16; i++)
88 1 {
89 2 BUF[i] = AT24C04_RecvByte();
90 2 if (i == 15)
91 2 {
92 3 AT24C04_SendACK(1); //最后一个数据需要会NAK
93 3 }
94 2 else
95 2 {
96 3 AT24C04_SendACK(0); //回应ACK
97 3 }
98 2 }
99 1 AT24C04_Stop(); //停止信号
100 1 }
101
102 /**************************************
103 延时5微秒(STC12C5A60S2@12M)
104 不同的工作环境,需要调整此函数
105 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
106 **************************************/
107 void Delay5us()
108 {
109 1 BYTE n = 4;
110 1
111 1 while (n--)
112 1 {
113 2 _nop_();
114 2 _nop_();
115 2 }
116 1 }
117
C51 COMPILER V8.05a WWW_OURHC_CN 06/03/2012 18:38:14 PAGE 3
118 /**************************************
119 延时5毫秒(STC12C5A60S2@12M)
120 不同的工作环境,需要调整此函数
121 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
122 **************************************/
123 void Delay5ms()
124 {
125 1 WORD n = 2500;
126 1
127 1 while (n--)
128 1 {
129 2 _nop_();
130 2 _nop_();
131 2 _nop_();
132 2 _nop_();
133 2 _nop_();
134 2 }
135 1 }
136
137 /**************************************
138 起始信号
139 **************************************/
140 void AT24C04_Start()
141 {
142 1 SDA = 1; //拉高数据线
143 1 SCL = 1; //拉高时钟线
144 1 Delay5us(); //延时
145 1 SDA = 0; //产生下降沿
146 1 Delay5us(); //延时
147 1 SCL = 0; //拉低时钟线
148 1 }
149
150 /**************************************
151 停止信号
152 **************************************/
153 void AT24C04_Stop()
154 {
155 1 SDA = 0; //拉低数据线
156 1 SCL = 1; //拉高时钟线
157 1 Delay5us(); //延时
158 1 SDA = 1; //产生上升沿
159 1 Delay5us(); //延时
160 1 }
161
162 /**************************************
163 发送应答信号
164 入口参数:ack (0:ACK 1:NAK)
165 **************************************/
166 void AT24C04_SendACK(bit ack)
167 {
168 1 SDA = ack; //写应答信号
169 1 SCL = 1; //拉高时钟线
170 1 Delay5us(); //延时
171 1 SCL = 0; //拉低时钟线
172 1 Delay5us(); //延时
173 1 }
174
175 /**************************************
176 接收应答信号
177 **************************************/
178 bit AT24C04_RecvACK()
179 {
C51 COMPILER V8.05a WWW_OURHC_CN 06/03/2012 18:38:14 PAGE 4
180 1 SCL = 1; //拉高时钟线
181 1 Delay5us(); //延时
182 1 CY = SDA; //读应答信号
183 1 SCL = 0; //拉低时钟线
184 1 Delay5us(); //延时
185 1
186 1 return CY;
187 1 }
188
189 /**************************************
190 向IIC总线发送一个字节数据
191 **************************************/
192 void AT24C04_SendByte(BYTE dat)
193 {
194 1 BYTE i;
195 1
196 1 for (i=0; i<8; i++) //8位计数器
197 1 {
198 2 dat <<= 1; //移出数据的最高位
199 2 SDA = CY; //送数据口
200 2 SCL = 1; //拉高时钟线
201 2 Delay5us(); //延时
202 2 SCL = 0; //拉低时钟线
203 2 Delay5us(); //延时
204 2 }
205 1 AT24C04_RecvACK();
206 1 }
207
208 /**************************************
209 从IIC总线接收一个字节数据
210 **************************************/
211 BYTE AT24C04_RecvByte()
212 {
213 1 BYTE i;
214 1 BYTE dat = 0;
215 1
216 1 SDA = 1; //使能内部上拉,准备读取数据
217 1 for (i=0; i<8; i++) //8位计数器
218 1 {
219 2 dat <<= 1;
220 2 SCL = 1; //拉高时钟线
221 2 Delay5us(); //延时
222 2 dat |= SDA; //读数据
223 2 SCL = 0; //拉低时钟线
224 2 Delay5us(); //延时
225 2 }
226 1
227 1 return dat;
228 1 }
229
230 /********************************************************************
231 结束
232 *********************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 257 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 2
IDATA SIZE = ---- ----
C51 COMPILER V8.05a WWW_OURHC_CN 06/03/2012 18:38:14 PAGE 5
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -