电子产业一站式赋能平台

PCB联盟网

搜索
查看: 3085|回复: 5
收起左侧

eeprom实验

[复制链接]

587

主题

981

帖子

5126

积分

四级会员

Rank: 4

积分
5126
发表于 2022-8-6 07:35:04 | 显示全部楼层 |阅读模式
最近看普中的51eeprom教程,要求按下k1保存,k2读取保存值,k3数据加一,k4数据清零。现在程序写出来k2的功能不对,按下k2读取的不是保存的值,而是初始值0,都和k4功能相同了。请问下大佬们这种情况一般是哪里出问题了吗。
程序我对着给的程序一行行对,对了一个下午没看出来哪里有问题。大佬们给点建议吧!
回复

使用道具 举报

579

主题

911

帖子

5007

积分

四级会员

Rank: 4

积分
5007
发表于 2022-8-6 07:35:45 | 显示全部楼层
用他给的函数单片机可以实现要求的功能。
回复 支持 反对

使用道具 举报

616

主题

968

帖子

5301

积分

四级会员

Rank: 4

积分
5301
发表于 2022-8-6 07:36:02 | 显示全部楼层
这是主程序:
/******************************************************************** ******************
实验名称:I2C-EEPROM 实验
接线说明: 实验现象:下载程序后,数码管右3位显示0,按 K1 键将数据写入到 EEPROM 内保存, 按 K2 键读取 EEPROM 内保存的数据,
按 K3 键显示数据加1,按 K4 键显示数据清零, 最大能写入的数据是255。
注意事项: ********************************************************************* ******************/
#include "public.h"
#include "smg.h"
#include "key.h"
#include "at24c02.h"
#define EEPROM_ADDRESS 0


void main()
{
char key_temp=0;
char save_dat=0;
char save_buf[3];

while(1)
{
key_temp=key_scan(0);
if(key_temp==K1_PRESS)
{
at24c02_write_byte(EEPROM_ADDRESS,save_dat);
}//k1按下,数据写入EEPROM内
else if(key_temp==K2_PRESS)
{
save_dat=at24c02_read_byte(EEPROM_ADDRESS);
}
else if(key_temp==K3_PRESS)
{
save_dat++;
if(save_dat==255)
save_dat=255;
}
else if(key_temp==K4_PRESS)
save_dat=0;


save_buf[0]=save_dat/100;//得到百位
save_buf[1]=save_dat%100/10;//十位
save_buf[2]=save_dat%100%10;
smg_display(save_buf,6);
}
}
回复 支持 反对

使用道具 举报

571

主题

910

帖子

4781

积分

四级会员

Rank: 4

积分
4781
发表于 2022-8-6 07:37:00 | 显示全部楼层
iic程序:
#include "iic.h"


void iic_start(void)
{

IIC_SDA=1;//如果把该条语句放在SCL后面,第二次读写会出现问题
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SDA=0;
delay_10us(1);
IIC_SCL=0;//代表总线处于占用状态
delay_10us(1);
}


void iic_stop(void)//停止信号
{

IIC_SDA=0;//如果把该条语句放在SCL后面,第二次读写会出现问题
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SDA=1;
delay_10us(1);
}


void iic_ack(void)//应答信号
{
IIC_SCL=0;
IIC_SDA=0;
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SCL=0;
}


void iic_nack(void)//非应答信号
{
IIC_SCL=0;
IIC_SDA=1;
delay_10us(1);
IIC_SCL=1;
delay_10us(1);
IIC_SCL=0;
}


char iic_wait_ack(void)//等待应答,主机接收应答信号,返回值为应答值
{
char count=0;
IIC_SCL=1;
delay_10us(1);
while(IIC_SDA)
{
count++;
if(count>100)//SDA一直为高认为为非应答
{
iic_stop(); //给到停止信号
return 1;
}
}
IIC_SCL=0;
return 0;
}


void iic_write_byte(char dat)
{
  char i=0;
  IIC_SCL=0;//先允许数据变化
  for(;i<8;i++)//开始写入
  {
  if((dat&0x80)>0)//循环8次将一个字节传出,先传高再传低位
IIC_SDA=1;
else
IIC_SDA=0;
dat<<=1;
delay_10us(1);
IIC_SCL=1;//数据保持稳定
delay_10us(1);
IIC_SCL=0;
delay_10us(1);
  }
}


char iic_read_byte(char ack)//读取从机值返回,主机给到应答信号是否继续读取
{
char i=0,receive=0;//rec保存中间读取得到的值
for(i=0;i<8;i++)
{
IIC_SCL=0;
delay_10us(1);
IIC_SCL=1;//开始读取

receive<<=1;//保存得到的位值,如果rec不移位的后果?
if(IIC_SDA)
receive++;
delay_10us(1);
//IIC_SCL=0;不需要
//delay_10us(1);
}
if(ack==0)
iic_ack();
else if(ack==1)
iic_nack();
return receive;
}
回复 支持 反对

使用道具 举报

578

主题

858

帖子

4821

积分

四级会员

Rank: 4

积分
4821
发表于 2022-8-6 07:37:24 | 显示全部楼层
//at24c02芯片读写程序
#include "at24c02.h"
#include "iic.h"
void at24c02_write_byte(char add,char dat)//输入写入的数据和写的地址
{
iic_start();//发送起始信号
iic_write_byte(0XA0);//高四位固定,最后一位确定功能为写.给从机地址
iic_wait_ack();//等待应答
iic_write_byte(add);//数据写入地址
iic_wait_ack();
iic_write_byte(dat);//写入数据
iic_wait_ack();
iic_stop();//发送完毕,停止
delay_ms(10);
}
//写一个字节


char at24c02_read_byte(char add)//返回值为读取的数据,参数为读地址
{
char temp=0;
iic_start();
iic_write_byte(0XA0);
iic_wait_ack();//等待应答
iic_write_byte(add);//写入要读取的数据地址
iic_wait_ack();
iic_start();//第一次写这里缺了起始信号
iic_write_byte(0XA1);//功能转为读
iic_wait_ack();
temp=iic_read_byte(0);
iic_stop();//读取完毕,停止
return temp;
}
//读一个字节
回复 支持 反对

使用道具 举报

568

主题

922

帖子

4783

积分

四级会员

Rank: 4

积分
4783
发表于 2022-8-6 07:38:09 | 显示全部楼层
你没有保存数据,当然是零,先按k3,然后k1保存,然后k2读取数据
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表