找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8099|回复: 1
打印 上一主题 下一主题
收起左侧

AVR单片机的内部EEPROM读写程序-先写入数据,然后读出来,看是否一致

[复制链接]
跳转到指定楼层
楼主
ID:26188 发表于 2015-6-23 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*本程序是对AVR的内部EEPROM进行的读写操作实验,以测试EEPROM,主要是首先向*/
/*内部EEPROM写入数据,然后读出来,看是否一致,最后证明是正确的,此程序可用*/
/*20110414  天津第四项目部宿舍    王均伟*/
#include <iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define set_bit(a,b) a|=(1<<b)
#define clr_bit(a,b) a&=~(1<<b)
#define get_bit(a,b) a&(1<<b)


void write_eeprom (uchar add,uchar date)//写EEPROM
{
      
  
        while(get_bit(EECR,1));//检测EEWE是否=0有写操作?如果=1那么等待,如果=0那么证明现在是空闲的可以向下
         EEARH=0;//不用
   EEARL=add;//地址准备
   EEDR=date;//数据准备
   clr_bit(EECR,3);//关闭EEPROM中断
   SREG=0;//关闭总中断     防止此时突发中断而打断CPU的写EEPROM的操作
   set_bit(EECR,2);//开启主写使能位
   set_bit(EECR,1);//开启写使能位
   
   ;;;;;//写入片内EEPROM
        
}
uchar read_eeprom(uchar add)//读EEPROM
{

while(get_bit(EECR,1));//检测EEWE是否=0有写操作?如果=1那么等待,如果=0那么证明现在是空闲的可以向下
EEARH=0;//不用
EEARL=add;//地址准备
SREG=0;//关闭总中断     防止此时突发中断而打断CPU的读EEPROM的操作
set_bit(EECR,0);//开启读操作
;;;;//等待
return (EEDR);
}
void main ()//主函数
{
DDRA=0xff;
PORTA=0x00;//端口A初始化
write_eeprom(0x00,0x88);//写入前八位地址0x00;和数据0x33;这里注意了我没用EEARH,只用了EERHL所以只能寻找256个字节
PORTA=read_eeprom(0x00);//括号内饰地址


}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:114509 发表于 2018-9-3 14:02 | 只看该作者
/**********************************************************************
头文件                                                         
**********************************************************************/
#include <iom8v.h>   //包含型号头文件
#include <macros.h>  //包含"位"操作头文件
#include <delay8.h>  //包含"延时"操作头文件
/********************************************************************
数据类型定义
*********************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define PC0_set  PORTC |= BIT(0)//PC0置位
#define PC0_clt  PORTC &=~BIT(0)//PC0清零
#define PC1_set  PORTC |= BIT(1)//PC1置位
#define PC1_clt  PORTC &=~BIT(1)//PC1清零
/********************************************************************
数码管段码定义
*********************************************************************/
uchar duan[16]=
{       
        0xC0,0xF9,0xA4,0xB0,
        0x99,0x92,0x82,0xF8,
        0x80,0x90,0x88,0x83,
        0xC6,0xA1,0x86,0x8E
};//所需的段码
uchar wei[8]=             
{                                                                                       
        0X10,0X20,0X40,0X80,
        0X01,0X02,0X04,0X08                                         
}; //位的控制端
uchar time[8]={0,0,0,0,0,0,0,0};//暂存数据
/********************************************************************
I/O端口初始化
*********************************************************************/
void init_IO(void)
{
// PB端口
DDRB=0XFF;
PORTB=0;
// PC端口
DDRC=0XFF;
PORTC=0X03;//0000 0011
// PD端口
DDRD=0XFF;
PORTD=0;
}
/********************************************************************
显示函数
*********************************************************************/
void display(uchar *p)
{
uchar i;
for(i=0;i<8;i++)
{
  PORTB=duan[*p];
  p++;
  PORTD=wei[i];
  delay1ms(1);
}
}
/********************************************************************
EEPROM写操作函数
*********************************************************************/
void EEPROM_write(uint addr,uint adata)
{
SREG&=~BIT(7);//关总中断
while(EECR&BIT(EEWE));//检测EEWE为0
EEAR=addr;//配置写入地址
EEDR=adata;//配置写入数据
EECR|=BIT(EEMWE);//主写入使能置一
EECR|=BIT(EEWE);//使能位置一
SREG|=BIT(7);//开总中断
}
/********************************************************************
EEPROM读操作函数
*********************************************************************/
uchar EEPROM_read(uint addr)
{
uchar edata;//读变量
SREG&=~BIT(7);//关总中断
while(EECR&BIT(EEWE));//等待EEWE操作结束
EEAR=addr;//写入地址
EECR|=BIT(EERE);//EERE置1后,进行读操作
edata=EEDR;//读数据
SREG|=BIT(7);//开总中断
return edata;//返回
}
/********************************************************************
主函数
*********************************************************************/
void main(void)  
{
uchar i;
init_IO();//IO口初始化
i=EEPROM_read(2);//单片机第一次开机从EEPROM的第二位读取一个数据
i++;//读取完成后进行一次加1操作
EEPROM_write(2,i);//加1操作后存入EEPROM的第二位
while(1)
{
          display(time);//显示
}
}




我写的单片机启动 数码管不会加 1 ,可否帮忙看看哪里出了问题。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表