这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » STC51单片机实例之26读出写入EEPROM的数据并通过串口发送

共2条 1/1 1 跳转至

STC51单片机实例之26读出写入EEPROM的数据并通过串口发送

高工
2014-08-19 01:34:31     打赏
/********************************************************************
* 文件名  : EEPROM_24C02.c
* 描述    :  该文件实现对24C02的操作。
    一次写入128个数据,写入的地址是128--255.
然后通过串口显示出来。
***********************************************************************/
#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)
{
uint x, j;
for(j=0; j<i; j++)
for(x=0; x<=148; x++)
;
}


/********************************************************************
* 名称 : LED()
* 功能 : 显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LED()                  //LED显示函数
{
P2 = 0xfd; 
P0 = table[sec / 10]; 
Delay_1ms(5);
P2 = 0xfe;
P0 = table[sec % 10];
Delay_1ms(5);
}
void Com_Init(void)
{
     TMOD = 0x20;
     PCON = 0x00;
     SCON = 0x50;
     TH1 = 0xFd;
     TL1 = 0xFd;
     TR1 = 1;
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void) 
{
uchar i;
Com_Init();
x24c02_init();         //初始化24C02
//第一次烧录数据的时候,下面的4行需要,第二次烧录代码时,下面4行就不需要了,因为数据已经存到相应地址了
for(i=0;i<128;i++)
{
x24c02_write(128+i,i);
Delay_1ms(1);
}
while(1)
{
for(i=0;i<128;i++)
{
  sec = x24c02_read(i+128);
SBUF = sec+48;
while(!TI)                   //如果发送完毕,硬件会置位TI
{
}
TI = 0;
Delay_1ms(100);
}
Delay_1ms(5000);
}
}


专家
2018-01-09 08:48:06     打赏
2楼

谢谢分享源码。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]