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