/****************************************************/
/*杭州电子&计算机工作室 */
/*http://www.hificat.com */
/*EEPROM读写演示程序 */
/*目标器件:AT89S51 */
/*晶振:11.0592MHZ */
/*编译环境:Keil 7.50A */
/****************************************************/
/*********************************包含头文件********************************/
#include <reg51.h>
#include <intrins.h>
/*********************************数据定义**********************************/
#define OP_READ 0xa1 // 器件地址以及读取操作
#define OP_WRITE 0xa0 // 器件地址以及写入操作
/*******************************共阳LED段码表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/********************************定义全局变量*******************************/
int eepromdata; //从EEPROM里读出来的数据
unsigned char add=0;
unsigned char date;
unsigned char i=0;
/*********************************端口定义**********************************/
sbit SDA = P2^4;
sbit SCL = P2^3;
sbit LED = P1^1;
sbit LED1 = P1^2;
sbit KEY = P3^2;
sbit KEY1 = P3^3;
bit fa;
/****************************************************************************
函数功能:延时子程序
入口参数:ms
出口参数:
****************************************************************************/
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
//串行口初始化程序
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xA0; //波特率为300
TL1 = 0xA0;
TR1 = 1;
}
/****************************************************************************
函数功能:延时子程序
入口参数:
出口参数:
****************************************************************************/
void delay(void)
{
int k;
for(k=0;k<200;k++)
{if(!KEY){delayms(250);LED=~LED; EA=~EA; }
if(!KEY1){delayms(250);fa=~fa;LED1=~LED1;}
}
}
/****************************************************************************
函数功能:开始信号
入口参数:
出口参数:
****************************************************************************/
void start()
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
/****************************************************************************
函数功能:停止信号
入口参数:
出口参数:
****************************************************************************/
void stop()
{
SDA = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
/****************************************************************************
函数功能:读取数据
入口参数:
出口参数:read_data
****************************************************************************/
unsigned char shin()
{
unsigned char i,read_data;
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1;
read_data |= (unsigned char)SDA;
SCL = 0;
}
return(read_data);
}
/****************************************************************************
函数功能:向EEPROM写数据
入口参数:write_data
出口参数:ack_bit
****************************************************************************/
shout(unsigned char write_data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SDA = (bit)(write_data & 0x80);
_nop_();
SCL = 1;
_nop_();
_nop_();
SCL = 0;
write_data <<= 1;
}
SDA = 1;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
/****************************************************************************
函数功能:向指定地址写数据
入口参数:addr,write_data
出口参数:
****************************************************************************/
void write_byte(unsigned char addr, unsigned char write_data)
{
start();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delayms(10);
}
/****************************************************************************
函数功能:读取当前地址数据
入口参数:
出口参数:read_data
****************************************************************************/
unsigned char read_current()
{
unsigned char read_data;
start();
shout(OP_READ);
read_data = shin();
stop();
return read_data;
}
/****************************************************************************
函数功能:向指定地址读数据
入口参数:random_addr
出口参数:read_data
****************************************************************************/
unsigned char read_random(unsigned char random_addr)
{
start();
shout(OP_WRITE);
shout(random_addr);
return(read_current());
}
/****************************************************************************
函数功能:显示子程序
入口参数:k
出口参数:
****************************************************************************/
void display(int k)
{
P2=0xfe; //最高位数码管1234
P0=tab[k/1000];
delay();
P2=0xfd;
P0=tab[k%1000/100];
delay();
P2=0xfb;
P0=tab[k%100/10];
delay();
P2=0xf7;
P0=tab[k%10];
delay();
P2=0xff;
}
//串行中断服务程序
serial()interrupt 4 using 1
{
if(RI)
RI=0;
date=SBUF;
write_byte(add, date);
add++;
}
/****************************************************************************
函数功能:主程序
入口参数:
出口参数:
****************************************************************************/
void main(void)
{ int addre=0;
int i;
fa=0;
Init_Com();
EA=0;
ES=1;
LED=1;
LED1=0;
SDA = 1;
SCL = 1;
HE: while(!fa){delay();}
eepromdata=0;
while(fa)
{ eepromdata=read_random(addre);
for(i=0;i<1000;i++)
display(eepromdata);
addre++;if(addre==50){ addre=0; }
} goto HE;
}