/******************************************************************** * 文件名 : EEPROM_24C02.c * 描述 : 该文件实现对24C02的操作。 这个代码会记录开机的次数,大家可以开关机。每次开机后,数码管上的值会进行加1. ***********************************************************************/ #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit scl=P1^5; //24c08 SCL sbit sda=P3^6; //24c08 SDA uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar sec; //定义计数值,每过1秒,sec加1 uint write; //写标志位 /******************************************************************** * 名称 : flash() * 功能 : 延时,时间为2个NOP,大概为2US * 输入 : 无 * 输出 : 无 ***********************************************************************/ void flash(void) { _nop_(); _nop_(); } /******************************************************************** * 名称 : x24c02_init() * 功能 : 24c02初始化子程序 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void x24c02_init(void) { scl = 1; flash(); sda = 1; flash(); } /******************************************************************** * 名称 : start(void) * 功能 : 启动I2C总线 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void start(void) { scl = 1; flash(); sda = 1; flash(); sda = 0; flash(); scl = 0; flash(); } /******************************************************************** * 名称 : stop() * 功能 : 停止I2C总线 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void stop() { scl = 0; flash(); sda = 0; flash(); scl = 1; flash(); sda = 1; flash(); } /******************************************************************** * 名称 : writex() * 功能 : 写一个字节 * 输入 : j(需要写入的值) * 输出 : 无 ***********************************************************************/ void writex(uchar j) { uchar i,temp; temp = j; for(i=0; i<8; i++) { scl = 0; flash(); sda = (bit)(temp & 0x80); flash(); scl = 1; flash(); temp = temp << 1; } scl = 0; flash(); } /******************************************************************** * 名称 : readx() * 功能 : 读一个字节 * 输入 : 无 * 输出 : 读出的值 ***********************************************************************/ uchar readx(void) { uchar i, j, k = 0; for(i=0; i<8; i++) { scl = 0; flash(); if(sda == 1) { j = 1; } else j = 0; k = (k << 1) | j; scl = 1; flash(); } return(k); } /******************************************************************** * 名称 : ack() * 功能 : I2C总线时钟 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void ack(void) { uchar i = 0; scl = 1; flash(); while((sda == 1) && (i < 255)) { i++; } scl = 0; flash(); } /******************************************************************** * 名称 : x24c02_read() * 功能 : 从24c02中读出值 * 输入 : address(要在这个地址读取值) * 输出 : 从24c02中读出的值 ***********************************************************************/ uchar x24c02_read(uchar address) { uchar i; start(); writex(0xa0); ack(); writex(address); ack(); start(); writex(0xa1); ack(); i = readx(); stop(); return(i); } /******************************************************************** * 名称 : x24c02_write() * 功能 : 想24c02中写入数据 * 输入 : address(地址) , info(值) * 输出 : 无 ***********************************************************************/ void x24c02_write(uchar address, uchar info) { start(); writex(0xa0); ack(); writex(address); ack(); writex(info); ack(); stop(); } /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时,延时时间为 1ms * i * 输入 : i(延时1ms的个数) * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i) { uchar x, j; for(j=0; j<i; j++) for(x=0; x<=148; x++) ; } /******************************************************************** * 名称 : LED() * 功能 : 显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void LED() //LED显示函数 { P2 = 6; P0 = table[sec / 10 % 10]; Delay_1ms(5); P2 = 7; P0 = table[sec % 10]; Delay_1ms(5); } /******************************************************************** * 名称 : Main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Main(void) { x24c02_init(); //初始化24C02 sec = x24c02_read(0); //读出保存的数据赋于sec sec++; //开机次数加1 x24c02_write(0,sec); //写入开机次数到地址0 while(1) { LED(); //在开发板上显示次数 } }