📄 test eeprom.lst
字号:
C51 COMPILER V6.12 TEST_EEPROM 02/26/2009 14:34:10 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE TEST_EEPROM
OBJECT MODULE PLACED IN .\test eeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\test eeprom.c DEBUG OBJECTEXTEND
stmt level source
1
2 //试验AT24C02EEPROM芯片程序 [实验要求]
3
4 //在数码管的前两位显示0-99数字,当实验板断电后,再重新加电可继续
5 //从断电处保存的数据开始上加,这正是体现了AT24C02有断电可保存数据能力.
6
7 //[实验目的]
8
9 // 掌握AT24C02程序驱动代码,掌握IIC驱动方式.
10
11
12 #include<reg51.h>
13 #include <intrins.h>
14 #define uint unsigned int
15 #define uchar unsigned char
16 unsigned char sec; //定义计数值,每过1秒,sec加1
17 unsigned int tcnt; //定时中断次数
18 bit write=0; //写24C08的标志;
19 sbit sda=P2^0; //IO口定义
20 sbit scl=P2^1;
21 sbit dula=P2^6;
22 sbit wela=P2^7;
23 unsigned char j,k;
24 void delay(unsigned char i) //延时程序
25 {
26 1 for(j=i;j>0;j--)
27 1 for(k=125;k>0;k--);
28 1 }
29 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码
30 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
31 void display(uchar bai_c,uchar sh_c) //显示程序
32 {
33 1 dula=0;
34 1 P0=table[bai_c]; //显示百位
35 1 dula=1;
36 1 dula=0;
37 1 wela=0;
38 1 P0=0x7e;
39 1 wela=1;
40 1 wela=0;
41 1 delay(5);
42 1 dula=0;
43 1 P0=table[sh_c]; //显示十位
44 1 dula=1;
45 1 dula=0;
46 1 wela=0;
47 1 P0=0x7d;
48 1 wela=1;
49 1 wela=0;
50 1 delay(5);
51 1 }
52 /////////24C08读写驱动程序////////////////////
53 void delay1(unsigned char x)
54 { unsigned int i;
55 1 for(i=0;i<x;i++);
C51 COMPILER V6.12 TEST_EEPROM 02/26/2009 14:34:10 PAGE 2
56 1 ;}
57 void flash()
58 { ; ; }
59 void x24c08_init() //24c08初始化子程序
60 {scl=1; flash(); sda=1; flash();}
61 void start() //启动I2C总线
62 {sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();}
63 void stop() //停止I2C总线
64 {sda=0; flash(); scl=1; flash(); sda=1; flash();}
65 void writex(unsigned char j) //写一个字节
66 { unsigned char i,temp;
67 1 temp=j;
68 1 for (i=0;i<8;i++)
69 1 {temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();}
70 1 scl=0; flash(); sda=1; flash();
71 1 }
72 unsigned char readx() //读一个字节
73 {
74 1 unsigned char i,j,k=0;
75 1 scl=0; flash(); sda=1;
76 1 for (i=0;i<8;i++)
77 1 { flash(); scl=1; flash();
78 2 if (sda==1) j=1;
79 2 else j=0;
80 2 k=(k<<1)|j;
81 2 scl=0;}
82 1 flash(); return(k);
83 1 }
84 void clock() //I2C总线时钟
85 {
86 1 unsigned char i=0;
87 1 scl=1; flash();
88 1 while ((sda==1)&&(i<255))i++;
89 1 scl=0; flash();
90 1 }
91 ////////从24c02的地址address中读取一个字节数据/////
92 unsigned char x24c08_read(unsigned char address)
93 {
94 1 unsigned char i;
95 1 start(); writex(0xa0);
96 1 clock(); writex(address);
97 1 clock(); start();
98 1 writex(0xa1); clock();
99 1 i=readx(); stop();
100 1 delay1(10);
101 1 return(i);
102 1 }
103 //////向24c02的address地址中写入一字节数据info/////
104 void x24c08_write(unsigned char address,unsigned char info)
105 {
106 1 EA=0;
107 1 start(); writex(0xa0);
108 1 clock(); writex(address);
109 1 clock(); writex(info);
110 1 clock(); stop();
111 1 EA=1;
112 1 delay1(50);
113 1 }
114 void t0(void) interrupt 1 using 0 //定时中断服务函数
115 {
116 1 TH0=(65536-50000)/256; //对TH0 TL0赋值
117 1 TL0=(65536-50000)%256; //重装计数初值
C51 COMPILER V6.12 TEST_EEPROM 02/26/2009 14:34:10 PAGE 3
118 1 tcnt++; //每过250ust tcnt加一
119 1 if(tcnt==20) //计满20次(1秒)时
120 1 {
121 2 tcnt=0; //重新再计
122 2 sec++;
123 2 write=1; //1秒写一次24C08
124 2 if(sec==100) //定时100秒,在从零开始计时
125 2 {sec=0;}
126 2 }
127 1 }
128 void main()
129 {
130 1 unsigned char i;
131 1 TMOD=0x01; //定时器工作在方式1
132 1 ET0=1; EA=1;
133 1 x24c08_init(); //初始化24C08
134 1 sec=x24c08_read(2);//读出保存的数据赋于sec
135 1 TH0=(65536-50000)/256; //对TH0 TL0赋值
136 1 TL0=(65536-50000)%256; //使定时器0.05秒中断一次
137 1 TR0=1; //开始计时
138 1 while(1)
139 1 {
140 2 i=10;
141 2 while(i--)
142 2 {
143 3 display(sec/10,sec%10);
144 3 }
145 2 if(write==1) //判断计时器是否计时一秒
146 2 {
147 3 write=0; //清零
148 3 x24c08_write(2,sec); //在24c08的地址2中写入数据sec
149 3 }
150 2 }
151 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 410 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
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 + -