📄 24c02.lst
字号:
C51 COMPILER V8.02 24C02 07/09/2010 09:24:45 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 24C02
OBJECT MODULE PLACED IN 24c02.OBJ
COMPILER INVOKED BY: D:\处理软件\keil\C51\BIN\C51.EXE 24c02.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***************************************************************
2 “天祥电子” 倾情奉献
3 www.txmcu.com
4 www.txmcu.cn
5 *****************************************************************
6 程序功能: 向IIC总线器件24c02EEPROM中地址为3的存储单元中写入数据34
7 并将其读出,显示于数码管上。
8 主要为了练习IIC总线的驱动程序以及24C02的操作方法。
9 ***************************************************************/
10 //试验AT24C02EEPROM芯片程序
11 #include<reg51.h>
12 #include <intrins.h>
13 #define uint unsigned int
14 #define uchar unsigned char
15 unsigned char num; //定义计数值,每过1秒,sec加1
16 sbit sda=P2^0; //IO口定义
17 sbit scl=P2^1;
18 sbit dula=P2^6;
19 sbit wela=P2^7;
20 unsigned char j,k;
21 char a,b;
22
23 void delay(unsigned char i) //延时程序
24 {
25 1 for(j=i;j>0;j--)
26 1 for(k=125;k>0;k--);
27 1 }
28
29 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码
30 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
31
32 void nop()
33 {
34 1 _nop_();
35 1 _nop_();
36 1 }
37 void display(uchar a,uchar b) //显示程序
38 {
39 1 dula=0;
40 1 P0=table[a]; //显示百位
41 1 dula=1;
42 1 dula=0;
43 1
44 1 wela=0;
45 1 P0=0x7e;
46 1 wela=1;
47 1 wela=0;
48 1 delay(5);
49 1
50 1 dula=0;
51 1 P0=table[b]; //显示十位
52 1 dula=1;
53 1 dula=0;
54 1
55 1 wela=0;
C51 COMPILER V8.02 24C02 07/09/2010 09:24:45 PAGE 2
56 1 P0=0x7d;
57 1 wela=1;
58 1 wela=0;
59 1 delay(5);
60 1
61 1 }
62
63 /////////24C02读写驱动程序////////////////////
64 void delay1(unsigned int m)
65 { unsigned int n;
66 1 for(n=0;n<m;n++);
67 1 }
68
69 void init() //24c02初始化子程序
70 {
71 1 scl=1;
72 1 nop();
73 1 sda=1;
74 1 nop();
75 1 }
76
77 void start() //启动I2C总线
78 {
79 1 sda=1;
80 1 nop();
81 1 scl=1;
82 1 nop();
83 1 sda=0;
84 1 nop();
85 1 scl=0;
86 1 nop();
87 1 }
88
89 void stop() //停止I2C总线
90 {
91 1 sda=0;
92 1 nop();
93 1 scl=1;
94 1 nop();
95 1 sda=1;
96 1 nop();
97 1 }
98
99 void writebyte(unsigned char j) //写一个字节
100 {
101 1 unsigned char i,temp;
102 1 temp=j;
103 1 for (i=0;i<8;i++)
104 1 {
105 2 temp=temp<<1;
106 2 scl=0;
107 2 nop();
108 2 sda=CY; //temp左移时,移出的值放入了CY中
109 2 nop();
110 2 scl=1; //待sda线上的数据稳定后,将scl拉高
111 2 nop();
112 2 }
113 1 scl=0;
114 1 nop();
115 1 sda=1;
116 1 nop();
117 1 }
C51 COMPILER V8.02 24C02 07/09/2010 09:24:45 PAGE 3
118
119 unsigned char readbyte() //读一个字节
120 {
121 1 unsigned char i,j,k=0;
122 1 scl=0; nop(); sda=1;
123 1 for (i=0;i<8;i++)
124 1 {
125 2 nop(); scl=1; nop();
126 2 if(sda==1)
127 2 j=1;
128 2 else
129 2 j=0;
130 2 k=(k<<1)|j;
131 2 scl=0;
132 2 }
133 1 nop();
134 1 return(k);
135 1 }
136
137 void clock() //I2C总线时钟
138 {
139 1 unsigned char i=0;
140 1 scl=1;
141 1 nop();
142 1 while((sda==1)&&(i<255))
143 1 i++;
144 1 scl=0;
145 1 nop();
146 1 }
147
148 ////////从24c02的地址address中读取一个字节数据/////
149 unsigned char read24c02(unsigned char address)
150 {
151 1 unsigned char i;
152 1 start();
153 1 writebyte(0xa0);
154 1 clock();
155 1 writebyte(address);
156 1 clock();
157 1 start();
158 1 writebyte(0xa1);
159 1 clock();
160 1 i=readbyte();
161 1 stop();
162 1 delay1(100);
163 1 return(i);
164 1 }
165
166 //////向24c02的address地址中写入一字节数据info/////
167 void write24c02(unsigned char address,unsigned char info)
168 {
169 1 start();
170 1 writebyte(0xa0);
171 1 clock();
172 1 writebyte(address);
173 1 clock();
174 1 writebyte(info);
175 1 clock();
176 1 stop();
177 1 delay1(5000); //这个延时一定要足够长,否则会出错。因为24c02在从sda上取得数据后,还需要一定时间的烧录过
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -