ATmega128(EEPROM)

发布者:psi33最新更新时间:2016-09-29 来源: eefocus关键字:ATmega128  EEPROM 手机看文章 扫描二维码
随时随地手机看文章
//atmega128的读写EEPROM示例程序,记录CPU启动的次数到EEPROM中

//在LED数码管上显示读出的数据,可用复位键刷新显示
//编译环境 AVR Studio 4.17/AVR GCC
//系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms
 
//***********************************************************************
//   包含文件
//***********************************************************************

#include
#include
#define  F_CPU 7372800       // 单片机主频为7.3728MHz,用于延时子程序
#include
#include
#include
#include           //中断信号头文件

//***********************************************************************
//   定义变量区
//***********************************************************************

#define Data_IO         PORTA                 //数码管数据口
#define Data_DDR        DDRA                  //数码管数据口方向寄存器
#define D_LE0         PORTD &= ~(1 << PD4)  //数码管段控制位为0,锁存端口数据
#define D_LE1           PORTD |= (1 << PD4)   //数码管段控制位为1,锁存器输出与端口一致
#define W_LE0         PORTD &= ~(1 << PD5)  //数码管位控制位为0
#define W_LE1           PORTD |= (1 << PD5)   //数码管位控制位为1


#define delay_us(x)     _delay_us(x)      //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)      //AVR GCC延时函数 x(ms)

#define uchar           unsigned char
#define uint            unsigned int

//***********************************************************************
//   共阴数码管显示的断码表0~F
//***********************************************************************

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint A1,A2,A3;                        //定义的变量,显示数据处理

 

//***********************************************************************
//   IO端口初始化
//***********************************************************************

void system_init()
{
    Data_IO=0xFF;                   //数据口为输出
    Data_DDR=0xFF;

    PORTD=0xFF;                     //74HC573的控制口,设置为输出
    DDRD=0xFF;
 PORTB=0XFF;
 DDRB=0XFF;
}

//*************************************************************************
//   74HC573控制数码管动态扫描显示函数,显示采集到的温度
//*************************************************************************

void Display_EEPROM(void)
{
  uchar i,j;
  system_init();
     j=0x01;                       //此数据用来控制位选
 for(i=0;i<5;i++)                  //用后3位数码管来显示
  {
     D_LE1;                     
     W_LE1;                     
     Data_IO=~j;                
     W_LE0;                      
  j=(j<<1);
     Data_IO=0x00;           
     D_LE0;                      
     delay_ms(1);                
  }
     D_LE1;                    
     W_LE1;                    
     Data_IO=~j;               
     W_LE0;                    
  j=(j<<1);
     Data_IO=table[A1];         
     D_LE0;                    
     delay_ms(1);             

     D_LE1;                     
     W_LE1;                     
     Data_IO=~j;                
     W_LE0;                      
  j=(j<<1);
     Data_IO=table[A2];             
     D_LE0;                      
     delay_ms(1);               

  D_LE1;                     
     W_LE1;                     
     Data_IO=~j;                
     W_LE0;                      
  j=(j<<1);
     Data_IO=table[A3];           
     D_LE0;                      
     delay_ms(1);               

  D_LE1;                     
     W_LE1;                     
     Data_IO=0xff;                
     W_LE0;                     

}


//*************************************************************************
//  数据处理函数
//*************************************************************************
 void data_do(uchar temp_d)
 {
     uint A2t;
     A1=temp_d/100;                       //分出百,十,和个位
     A2t=temp_d%100;
     A2=A2t/10;
     A3=A2t%10;
}


//***********************************************************************
//                EEPROM读取函数*/
//            addr:地址;number:长度;p_buff:读出数据存放指针
//***********************************************************************
void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {

 while(EECR & (1 << EEWE));               //等待前面的写完成

 EEARH = 0x00;                           //写高字节地址
 
 while(number --) {
  EEARL = addr ++;                  //写地址低字节
  EECR |= (1 << EERE);             //读允许位置1
  *p_buff++ = EEDR;                //读出EEDR中的数据
  }
}
//***********************************************************************
//              EEPROM写入函数
//          addr:地址;number:长度;p_buff:写入数据存放指针
//***********************************************************************
void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {

 EEARH = 0x00;
 
 while(number --) {
  while(EECR & (1 << EEWE));       //等待前面的写完成
  EEARL = addr ++;                 //写地址
  EEDR = *p_buff ++;               //写数据到EEDR
  EECR |= (1 << EEMWE);            //主机写入允许位
  EECR&=~(1<   EECR |= (1 << EEWE);             //EEWE为1,执行写操作
  }
}


//***********************************************************************
//                       主函数
//***********************************************************************
int main(void) 
{

 unsigned char temp;
    system_init();                      //系统初始化
    eprom_read(0x10, 0x01, &temp);  //读出记录
    delay_ms(10);
 temp ++;                            //计数值加1
    eprom_write(0x10, 0x01, &temp);  //写入记录 
    delay_ms(10);              
                  
 while (1)
  {
 data_do(temp);                      //每启动一次temp加1,记录到EEPROM中
 Display_EEPROM();     //显示计数值
  }
}

关键字:ATmega128  EEPROM 引用地址:ATmega128(EEPROM)

上一篇:ATmega128(DS18B20)
下一篇:ATmega128(DS1302)

推荐阅读最新更新时间:2024-03-16 15:12

AVR单片机EEPROM的读写
一 AVR存储类型 不要外挂方便使用 1.FLASH 存储程序代码 2.EEPROM 运行的数据掉电不丢失的 数据存储 分页的数据 3.SRAM 运行的临时数据 EEPROM:读写以字节为单位 通过专用指令或SPI、JTAG直接读写 使用RC震荡作为时钟,典型值为8.5ms 有时数据丢失的原因:刚上电电压不稳就操作、读写时被中断打断、程序跑飞了 怎样预防: 熔丝位的电压检测设置:低于电压就停止 熔丝位系统时钟的设置:设置上电暂停时间长一点 双字节存储,或加校验位 操作时尽量关中断 二 相关寄存器 存储器 需要数据和地址来操作
[单片机]
I2C总线EEPROM实现
开发板是fl2440板子。。跑的Linux3.0内核 这里的EEPROM只是初步的实现。。并没有具体的分析函数。。以后会具体的分析。。 1.修改内核 改make menuconfig Device Drivers --- * I2C support --- --- I2C support Enable compatibility bits for old user-space
[单片机]
PIC18Fxx单片机内部EEPROM存取程序
#include p18cxxx.h #include p18f6680.h #include usart.h #pragma config OSC=HS #pragma config WDT = OFF void eebf_d( void); void eebf( void); unsigned char out_bz ; unsigned char *buf_d ,*buf ; int j=0 ; //创建接受数组 #pragma idata bigsata unsigned char out ; #pragma idata void eebf( void) //将数据存EEPR
[单片机]
C8051F单片机读写串行EEPROM程序
//C8051F单片机读写串行EEPROM程序,查询方式 //------------------------------------------------------------------------------ // Keil Software, Inc. // // Project: Cygnal 8051F000 I2C Example Program // // Filename: Cygnal_I2C_Example_Program.c // Version: 1.0.0 // Description: This file contains example code that will communicate
[单片机]
stm8s开发(九) EEPROM的使用:使用EEPROM存储数据!
EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。在以前的单片机系统中,通常都是在单片机外面再扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使用,降低了成本,提高了可靠性。 STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。 为了管理方便,定义EEPROM的地址 #define EP_H
[单片机]
s3c2440 iic eeprom
1、使用2440 iic 模块控制 #include 2440addr.h #include uart.h volatile int ackFlag = 0; void delay() { int i,j; for(i = 0; i 500;i++) for(j = 0; j 500; j++) ; } /*********************************************** Function name : Iic_ISR Description : iic 中断处理函数 Input parameter : none Return : none
[单片机]
STM8的EEPROM解锁是可以重复进行的
STM8的EEPROM在复位后,要想要写入数据,必须先解锁,必然无法写入数据。解锁就是向 FLASH_DUKR 中先后写入: 第一个硬件秘钥:0xAE 第二个硬件秘钥:0x56 两个字节的数据。 此时 FLASH_IAPSR 中的 DUL 位将会变为1,表示 EEPROM 已经成功解锁,可以进行写入操作了。如果发现 DUL 位不为 1 ,是可以按顺序重复写入秘钥的,直到 DUL 位为 1 为止。 但手册上是这么说的: 中文手册: 2. 如果密钥输入错误,应用程序可以尝试重新输入这两个MASS密钥来对DATA区域进行解 锁。 4. 如果密钥输入错误,DATA EEPROM区域在下一次系统复位之前将一直保持写保护状态。 在下一次复位
[单片机]
华虹NEC在0.18微米EEPROM平台上推出超低功耗IP
纯晶圆代工厂上海华虹NEC电子有限公司(以下简称“华虹NEC”)日前宣布,公司的0.18微米嵌入式EEPROM(电可擦除只读存储器)工艺平台上推出超低功耗EEPROM IP。 针对RFID、电子护照以及各种非接触式智能卡的需求,华虹NEC在0.18微米嵌入式EEPROM工艺平台上进一步推出超低功耗IP。该IP具有单元面积小,功耗低,速度快,可靠性强的优点,能满足产品在信息安全、低功耗、高速运作的要求。
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved