时间过的真快转眼天气冷了,这让懒惰的我都来不及适应,最近是东一下西一下的 把 IIC总线接口的EEPROM 勉强学会点,留下点痕迹留着以后品味当时的心情吧!

- # include <reg52.h>
- # define uchar unsigned char //宏定义
- # define uint unsigned int
- uchar shi,ge,dd,ff,write; //定义局变量
- sbit sda=P2^1; //声明P2口
- sbit scl=P2^0; //声明P2口
- sbit duan=P2^6;
- sbit wei=P2^7;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
- 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} ; //LED数组显示
- void delay() //微秒级延时
- { ; ;}
- void delayms(uchar a) //毫秒延时
- {
- uchar x,y;
- for(x=a;x>0;x--)
- for(y=0;y<110;y++);
- }
- void init() //AT24C02初始化
- {
- sda=1;
- delay();
- scl=1;
- delay();
- }
- void start() //AT24C02启动信号
- {
- sda=1;
- delay();
- scl=1;
- delay();
- sda=0;
- delay();
- }
- void stop() //AT24C02停止信号
- {
- sda=0;
- delay();
- scl=1;
- delay();
- sda=1;
- delay();
- }
- void respons() //AT24C02应答
- {
- uchar i;
- scl=1;
- delay();
- while((sda==1)&&(i<255))i++;
- scl=0;
- delay();
- }
- void write_byte(uchar a) //AT24C02写一个字节
- {
- uchar i,j;
- j=a;
- for(i=0;i<8;i++)
- {
- scl=0;
- delay();
- j=j<<1;
- sda=CY;
- scl=1;
- delay();
- }
- scl=0;
- delay();
- sda=1;
- delay();
- }
- uchar read_byte() //AT24C02读一个字节
- {
- uchar i,j;
- for(i=0;i<8;i++)
- {
- scl=0;
- delay();
- sda=1;
- delay();
- scl=1;
- j=(j<<1)|sda;
- delay();
- }
- return j;
- }
- void add_write(uchar address,uchar date) //AT240C2任意地址写一个字节数据
- {
- start();
- write_byte(0xae);
- respons();
- write_byte(address);
- respons();
- write_byte(date);
- respons();
- stop();
- }
- uchar add_read_byte(uchar address) //AT24C02任意地址读
- {
- uchar w;
- start();
- // respons();
- write_byte(0xae);
- // delayms(100);
- respons();
- write_byte(address);
- respons();
- start();
- write_byte(0xaf);
- respons();
- w=read_byte();
- stop();
- return w;
- }
- void display(uchar shi,uchar ge) //LED数码管显示
- {
- //shi=dd/10;
- //ge=dd%10;
- wei=0;
- duan=1;
- P0=table[shi];
- duan=0;
- P0=0xff;
- wei=1;
- P0=0xfe;
- wei=0;
- delayms(10);
- P0=0xff;
- duan=1;
- P0=table[ge];
- duan=0;
- P0=0xff;
- wei=1;
- P0=0xfd;
- delayms(5);
- wei=0;
- }
- void stime() //初始化定时器0并启动
- {
- TMOD=0X01;
- TH1=(65535-5000)/256;
- TH0=(65535-5000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void t0()interrupt 1 //定时器0中断函数并重新装初值
- {
- uchar i;
- TH1=(65535-5000)/256;
- TH0=(65535-5000)%256;
- i++;
- if(i==20)
- { write++;
- ff=1;
- i=0;
- if(write==100)
- write=0;
- }
- }
- void main() //主程序
- {
- init();
- write=add_read_byte(5);
- if(write>100)
- write=0;
- stime();
- while(1)
- {
- // dd=write;
-
- if(ff==1)
- {
- add_write(5,write);
- ff=0;
- }
- display(write/10,write%10);
- }
- }
复制代码
|