📄 at24c02.lst
字号:
C51 COMPILER V7.05 AT24C02 02/14/2006 09:04:33 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE AT24C02
OBJECT MODULE PLACED IN AT24C02.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe AT24C02.C DB OE
stmt level source
1 //参考程序A:AT24C02.C SMBUS 24C02 读/写 2005.12.25
2 //程序功能:在AT24C02的地址00---3FH中依次存入连续的数据10H--4FH
3 //再依次从地址00---3FH中读出数据并通过SAA1064驱动四位数码管显示出来.
4 //第一,二位数码管显示地址,第三,四位数码管显示存入该地址内的数据.
5 //显示格式:
6 //存储器的地址 存储器单元的内容
7 //00H---3FH 40H---4FH
8 #include <c8051f020.h> // SFR declarations
9 #include <intrins.h>
10 #define WRITE 0x00 // SMBUS寻址字节的写标志位
11 #define READ 0x01 // SMBUS寻址字节的读标志位
12 // Device addresses
13 #define CHIP_A 0xA0 //AT24C02器件自身的寻址字节
14 #define CHIP_B 0x70 //AT24C02器件自身的寻址字节
15 #define SMB_BUS_ERROR 0x0 //总线错误
16 //MT为主发送器,MR为主接收器
17 #define SMB_START 0x08 // (MT & MR) 发送起始位
18 #define SMB_RP_START 0x10 // (MT & MR) 重复起始位
19 #define SMB_MTADDACK 0x18 // (MT) 发送从地址 + W 后收到ACK
20 #define SMB_MTADDNACK 0x20 // (MT) 发送从地址 + W 后收到NACK
21 #define SMB_MTDBACK 0x28 // (MT) 发送数据后收到ACK
22 #define SMB_MTDBNACK 0x30 // (MT) 发送数据后收到NACK
23 #define SMB_MTARBLOST 0x38 //(MT)竞争失败
24 #define SMB_MRADDACK 0x40 // (MR) 发送从地址 + R 后收到 ACK
25 #define SMB_MRADDNACK 0x48 // (MR) 发送从地址 + R 后收到 NACK
26 #define SMB_MRDACK 0x50 // (MR) 收到数据字节 后已发送ACK
-
27 #define SMB_MRDBNACK 0x58 // (MR) 收到数据字节 后已发送NACK
28 char DATA0[6]={0x17,0x3f,0x06,0x5b,0x4f};
29 char xdata DATA2[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
30 char SLAW,DATA1[64]; // 保存从地址+ WRITE 位
31 char SLAR; // 保存从地址+ WRITE 位
32 char WORD,WORDADR; // 保存被收/发的数据字节
33 char xdata sendnumber; // 保存被收/发的数据字节的数目
34 //unsigned char xdata WORDADR; //保存被传送的数据在24C02中的首地址.
35 unsigned char xdata SENDMODE; //SENDMODE作读/写控制字
36 unsigned char xdata i,j,k,sla,n,m,p;
37 bit SM_BUSY; //忙碌标志位 void sleep_ms( unsigned int cou
-nt); //延时
38 void SYSCLK_Init (void); //系统时钟初始化
39 void DISPLAY(void); //通过SAA1064驱动四位数码管显示
40 void SMBUS_ISR (void); //中断服务程序
41 char SLA_READ(char chip,char wordadr,char number);
42 void SLA_SEND(char chip,char wordadr, char word,char number);
43 void sleep_ms(unsigned int count);
44
45 void MAIN (void)
46 {
47 1 unsigned char check; // 测试用的工作变量
48 1 WDTCN = 0xde; // 关闭看们狗
49 1 WDTCN = 0xad;
50 1 SYSCLK_Init(); // 时钟初始化
51 1 XBR0 = 0x01; // 选交叉开关 :P0.0-->SDA,P0.1-->CLK
52 1 XBR2 = 0x40; // 交叉开关使能
53 1 SMB0CN = 0x44; // 允许SMBUS, 应答返回AA(低电平
C51 COMPILER V7.05 AT24C02 02/14/2006 09:04:33 PAGE 2
54 1 SMB0CR = 0xc9; // SMBus 速率= 100 kHz,系统时钟为11.0592MHZ
55 1 EIE1 |= 2; // SMBus 中断使能
56 1 EA = 1; // 开中断
57 1 SM_BUSY = 0; // SM_BUSY是忙碌标志位
58 1 SI = 0; //SM_BUSY中断标志位
59 1 //写64个连续的数据到AT24C02中去并依次存放.
60 1 //64个连续的数据的存放地址:00H--3fH.第一个数为10H,最后一个数为4FH.
61 1 i=0x10;
62 1 sla=CHIP_A;
63 1 for (j=0;j<0x40;j++) //向24C02的000地址依次写入64个数据,
64 1 { //64个数据的数值从10H---4FH
65 2 SLA_SEND(sla, j, i,0x01); // 写入AT24C02
66 2 i++;
67 2 }
68 1 for (j=0;j<0x40;j++) //从24C02的00地址依次连续读出64个数据,
69 1 { //64个数据的数值应该是从10H---3FH(连续存放)
70 2 check=SLA_READ(sla, j,0x01);
71 2 DATA1[j]=check; //读出来的数据依次连续存入数组DATA[]中
72 2 }
73 1 for (j=0;j<0x40;j++) //把要显示的两位地址和两位数据存入DATA2[]中
74 1 { i=DATA1[j];
75 2 k=i&0x0f;
76 2 m=DATA2[k]; //j为地址,i=DATA1[j]=check,i地址j中存放的数据
77 2 DATA0[4]=m;
78 2 k=i&0xf0;
79 2 k=k>>4;
80 2 n=DATA2[k];
81 2 DATA0[3]=n;
82 2 k=j&0x0f;
83 2 m=DATA2[k];
84 2 DATA0[2]=m;
85 2 k=j&0xf0;
86 2 k=k>>4;
87 2 n=DATA2[k];
88 2 DATA0[1]=n;
89 2 DISPLAY();
90 2 sleep_ms(1000);
91 2 }
92 1 while(1);
93 1 }
94 void DISPLAY (void)
95 {
96 1 sla=CHIP_B;
97 1 DATA0[0]=0x17; //0x17是SAA1064的控制字.
98 1 for (p=0;p<0x5;p++)
99 1 {i=DATA0[p]; //向SAA1064写入五个数:SAA1064的控制字一字节,
100 2 SLA_SEND(sla, p, i,0x01); // 地址2字节,数据2字节.共五字节
101 2 }
102 1 }
103 void SYSCLK_Init (void)
104 {
105 1 int i; // i 用于延时计数
106 1 OSCXCN = 0x67; // 先选择外捕振荡器,频率位11.0592MHZ
107 1 for (i=0; i < 256; i++) ; // 再延时(>1ms),
108 1 while (!(OSCXCN & 0x80)) ; // 等待外部晶振稳定
109 1 OSCICN = 0x88; // 选择外部晶振,允许时钟丢失检测
110 1 }
111 void SLA_SEND(char chip, char wordadr, char word,char number)
112 {
113 1 SENDMODE=0x01;
114 1 sendnumber=number+1;
115 1 while(SM_BUSY); // 若SMBUS忙碌就等待
C51 COMPILER V7.05 AT24C02 02/14/2006 09:04:33 PAGE 3
116 1 SM_BUSY = 1; // 置SM_BUSY位(忙碌标志位)为1
117 1 SLAW = (chip| WRITE); // COMMAND = 7 个地址位 + 一位WRITE.
118 1 WORD = word; // WORD中存放要送到24C02中去的数据(8位)
119 1 WORDADR = wordadr; // OP_CODE 中存放被传送数据送入24C02的首地址.
120 1 STO = 0;
121 1 STA = 1; // 启动数据传输
122 1 while(SM_BUSY); // 等待传输完成
123 1 }
124 char SLA_READ(char chip, char wordadr,char number){
125 1 sendnumber=number;
126 1 SENDMODE=0;
127 1 while(SM_BUSY); // 若SMBUS忙碌就等待
128 1 SM_BUSY = 1; // 置SM_BUSY位(忙碌标志位)为1
129 1 SLAR = (chip| READ); // COMMAND = 7 个地址位 + 一位READ
130 1 WORDADR = wordadr; // OP_CODE 中存放从24C02读出数据的的首地址.
131 1 STO = 0;
132 1 STA = 1; // 启动传输
133 1 while(SM_BUSY); // 等待传输完成
134 1 return WORD; //返回读出来的数据(一个字节)
135 1 }
136 void SMBUS_ISR (void) interrupt 7 //中断服务程序
137 {
138 1 switch (SMB0STA){ // 根据中断状态码跳转
139 2 //(SMB0STA 是中断状态寄存器)
140 2 case SMB_START: //0x08, (MT & MR) 发送起始位
141 2 SMB0DAT = SLAW ; // 装入被访问的从芯片的写地址
142 2 STA = 0; // 人工清除 STA 位
143 2 SI = 0; // 清除中断标志位
144 2 break;
145 2 case SMB_RP_START: //0x10,(MT & MR) 重复发送起始位
146 2 SMB0DAT = SLAR; // 装入被访问的从芯片的读地址
147 2 STA = 0; // 人工清除 STA 位
148 2 SI = 0; // 清除中断标志位
149 2 break;
150 2 case SMB_MTADDACK: //0x18 ,(MT) 发送从地址 + W 后收到ACK
151 2 SMB0DAT = WORDADR;
152 2 SI = 0; // 清除中断标志位
153 2 break;
154 2 case SMB_MTADDNACK: //0x20,(MT) 发送从地址 + W 后收到NACK
155 2 STO = 1;
156 2 STA = 1;
157 2 SI = 0; // 清除中断标志位
158 2 break;
159 2 case SMB_MTDBACK: //0x28,(MT) 发送数据后收到ACK
160 2 switch (SENDMODE){ // 检查低1位
161 3 case 1:
162 3 sendnumber--;
163 3 if(sendnumber)
164 3 SMB0DAT = WORD;
165 3 else{
166 4 STO=1;
167 4 SM_BUSY=0;
168 4 }
169 3 break;
170 3 case 0:
171 3 STO = 0;
172 3 STA = 1;
173 3 break;
174 3 default:
175 3 STO = 1;
176 3 SM_BUSY = 0;
177 3 break;
C51 COMPILER V7.05 AT24C02 02/14/2006 09:04:33 PAGE 4
178 3 }
179 2 SI = 0;
180 2 break;
181 2 case SMB_MTDBNACK: //0x30
182 2 STO = 1;
183 2 STA = 1;
184 2 SI = 0; // 清除中断标志
185 2 break;
186 2 case SMB_MRADDACK: //0x40
187 2 AA = 0;
188 2 SI = 0;
189 2 break;
190 2 case SMB_MRADDNACK: //0x48
191 2 STO = 0;
192 2 STA = 1;
193 2 SI = 0;
194 2 break;
195 2 case SMB_MRDBNACK: //0x58
196 2 WORD = SMB0DAT;
197 2 STO = 1;
198 2 SM_BUSY = 0;
199 2 AA = 1;
200 2 SI = 0;
201 2 break;
202 2 default:
203 2 STO = 1;
204 2 SM_BUSY = 0;
205 2 break;
206 2 }
207 1 }
208 /*延时子程序*/
209 void sleep_ms(unsigned int count)
210 {
211 1 unsigned int ii,jj;
212 1 for(ii=0;ii<count;ii++)
213 1 {
214 2 for(jj=0;jj<250;jj++)
215 2 _nop_();
216 2 _nop_();
217 2 _nop_();
218 2 _nop_();
219 2 }
220 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 620 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 25 ----
PDATA SIZE = ---- ----
DATA SIZE = 74 4
IDATA SIZE = ---- ----
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 + -