📄 shiyan4.lst
字号:
C51 COMPILER V8.01 SHIYAN4 10/26/2008 19:39:37 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE SHIYAN4
OBJECT MODULE PLACED IN shiyan4.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE shiyan4.c BROWSE DEBUG OBJECTEXTEND TABS(6)
line level source
1 //**程序设计**作者hyg214**网名**展凌**
2 //程序功能:利用I2C总线写或读E2PROM
3 //向E2PROM写n个数据,再按头尾地址读出
4 //当然你也可以设置n=1;那就只写读一个数据
5 //************************************
6 //********************************************
7 #include<reg52.h>
8 #include<intrins.h>//空操作需要的头文件
9 #define uchar unsigned char
10 sbit sda=P2^0;//声明控制信号
11 sbit scl=P2^1;
12
13 uchar idata tab[]={
14 //数码显示从0-9数字,读ROM时
15 0x3f,0x06,0x5b,0x4f,0x66,
16 0x6d,0x7d,0x07,0x7f,0x6f};
17
18 uchar idata sdate[50];//接收数据的数组变量
19 uchar tn=0;//从那个地址开始读
20 uchar m=10;//读出时要读几个数据
21 //你可以只读一个(m=1),但这个程序让它循环显示
22 uchar n=10;//写入数据的个数
23 uchar idata mdate[10]={53,28,37,45,69,74,56,82,30,99};//要写入的数据
24 //*********************************************
25
26 //----------------------------------
27 void delay()//延时函数
28 {//约等于5us用于控制信号SDA,SCL的延时
29 1 uchar i;i++;
30 1 }
31 //----------------------------------
32 void delay_ms(uchar z)//延时函数
33 {//约等于z*0.5ms
34 1 //用于写、读间时;数码动态显示间时
35 1 uchar i,j;
36 1 for(i=z;i>0;i--)
37 1 for(j=222;j>0;j--);
38 1 }
39 //----------------------------------
40 void intc()//初始化函数
41 {
42 1 sda=1;//控制信号拉高
43 1 scl=1;
44 1 P0=0x00;//数码管不显示
45 1 }
46 //----------------------------------
47 void start()//起始信号函数
48 {//向ROM发送一个开始的信号
49 1 sda=1;
50 1 scl=1;
51 1 delay();
52 1 sda=0;
53 1 delay();
54 1 scl=0;
55 1 }
C51 COMPILER V8.01 SHIYAN4 10/26/2008 19:39:37 PAGE 2
56 //----------------------------------
57 void stop()//停止信号函数
58 {//向ROM发送一个停止的信号
59 1 sda=0;
60 1 scl=1;
61 1 delay();
62 1 sda=1;
63 1 delay();
64 1 scl=0;
65 1 }
66 //----------------------------------
67 void respons()//产生应答信号函数
68 {//接收一数据后应答
69 1 sda=0;
70 1 scl=1;
71 1 delay();
72 1 scl=0;
73 1 sda=1;
74 1 }
75 //----------------------------------
76 void no_respons()//产生非应答信号函数
77 {//接收一数据没应答,则强制
78 1 sda=0;
79 1 scl=1;
80 1 delay();
81 1 scl=0;
82 1 sda=1;
83 1 }
84 //----------------------------------
85 void write_date(uchar date)//向E2PEOM写数据函数
86 {//向E2PROM写一字节数据
87 1 uchar i,temp;
88 1 temp=date;
89 1 for(i=0;i<8;i++)//总共写入8次位=1字节=1个数据
90 1 {
91 2 temp=temp<<1;//要存的数据左移1位,最高位给CY了
92 2 scl=0; //数据可以改变
93 2 delay();
94 2 sda=CY; //写入一位
95 2 delay();
96 2 scl=1; //数据稳定,不能写了
97 2 delay();
98 2 }
99 1 scl=0;
100 1 delay();
101 1 sda=1;//稳定数据
102 1 delay();
103 1 }
104 //----------------------------------
105 uchar read_date()//从E2PROM读出数据函数
106 {//根据
107 1 uchar i,k;
108 1 scl=0;//数据改变
109 1 delay();
110 1 sda=1;//可读信号
111 1 for(i=0;i<8;i++)//读出8次位=1字节=1个数据
112 1 {
113 2 scl=1;//数据稳定,可从sda读出一位
114 2 delay();
115 2 k=(k<<1)|sda;//写入时是从高位写,读出时也一行
116 2 scl=0;//数据改变(准备下一位)
117 2 delay();
C51 COMPILER V8.01 SHIYAN4 10/26/2008 19:39:37 PAGE 3
118 2 }
119 1 delay();
120 1 return k;//返回读出的一个数据
121 1 }
122 //----------------------------------
123 void write_sword(uchar sta,uchar n,uchar *date)//写入串数据函数
124 {//根据起始地址、数据个数及数据写入E2PEOM中
125 1 uchar i;//计数变量
126 1 start();//起始
127 1 write_date(0xa0);//E2PROM地址(ATC02为oxa0)
128 1 respons();//应答
129 1 write_date(sta);//写入数据要存放的地址
130 1 respons();//应答
131 1 for(i=0;i<n;i++)
132 1 {
133 2 write_date(date[i]);//写入数据
134 2 respons();//应答
135 2 }
136 1 stop();//停止
137 1 }
138 //-----------------------------------
139 uchar read_sword(uchar sta,uchar n)//读出串数据函数
140 {//根据起始地址和读出个数,从E2PROM读出一串数据
141 1 uchar i;//计数个数
142 1 start();//起始
143 1 write_date(0xa0);//AO表示主机向从机写数据
144 1 respons();//应答
145 1 write_date(sta);//数据地址
146 1 respons();//应答
147 1
148 1 start();//起始
149 1 write_date(0xa1);//A1表示从机从主机读取数据
150 1 for(i=0;i<n;i++)
151 1 {
152 2 respons();//应答
153 2 *(sdate+i)=read_date();//读出数据存入数组
154 2 }
155 1 no_respons();//非应答
156 1 stop();//停止
157 1 return 1;//返回读出的数组数据
158 1 }
159 //----------------------------------
160 void display(uchar *dat)//数码管显示函数
161 {//从E2PROM读出的数据在数码管显示出来
162 1 uchar i,j,k,tem1,tem0,temp;
163 1 //计数变量,2个延时用,十位和个位,传值变量
164 1 for(i=0;i<m;i++)
165 1 {
166 2 temp=*(dat+tn++);
167 2 if(tn==n){tn=0;}//这里让它循环显示
168 2 tem1=temp/10;//十位
169 2 tem0=temp%10;//个位
170 2 for(j=8;j>0;j--)
171 2 for(k=8;k>0;k--)//大约1s一个数据
172 2 {
173 3 P2=0x10;//选通二个数码管
174 3 P0=tab[tem1];//显示十位
175 3 delay_ms(20);//延时10ms,动态显示时暂停时间
176 3 //太快,不够亮,太慢,不稳定(闪烁),一般10ms
177 3 P2=0x20;
178 3 P0=tab[tem0];
179 3 delay_ms(20);
C51 COMPILER V8.01 SHIYAN4 10/26/2008 19:39:37 PAGE 4
180 3 }
181 2 }
182 1 }
183 //----------------------------------
184 void main()//主函数
185 {//功能:初始化,写数据,读数据,显示数据
186 1 uchar i=0,temp;//i表示开始读的地址
187 1 intc();//初始化
188 1 write_sword(i,n,mdate);//根据起始地址和个数,串数据写入E2PROM
189 1 delay_ms(100);//延时,写入和读出要有个时间的
190 1 temp=read_sword(i,n);//根据地址读出一串数据
191 1 while(temp)
192 1 {
193 2 display(sdate);//读出的数据用数码管显示出来
194 2 }
195 1 }
196 //-----------------------------------
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 408 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 10
IDATA SIZE = 70 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -