ATMega16内部EEPROM存储器的应用
数字化方向的发展在给我们的生活带来巨大便利的同时,也带给我们一些小小的麻烦:我们需要记忆的密码越来越多,银行卡,信用卡,EMAIL,甚至家中的门锁。由于这些密码的重要性,即便把它们存储在电脑的某个角落之中,我们仍然担心由于种种原因而造成的密码泄露或遗失。
ATMega16作为一款嵌入式单片机,用来存储密码是非常合适的。首先相对于家用PC,它是工业级的产品,可以更有效地保证存储的密码不会因为外部的温湿度等环境条件的变化而被破坏。其次,ATMega16不需要操作系统,直接运行用户自行编写的程序,具有很好的个体性。再次,其内部可加密的EEPROM存储器相对于外部EEPROM存储器增加了通过非法手段直接读取EEPROM中内容的难度,从而提高了安全性。
本文中,笔者用ATMega16设计的密码保管箱将会是这样:它有一个4×4小键盘供我们操作,并通过串口调试工具将密码保管箱对操作的反应显示在电脑上,电路见今年第5期杂志第39页文章,在硬件上我们不用添加任何器件。它的工作过程是:将各种各样的密码存入ATMega16的EEPROM中,然后设置一个密码保管箱的密码,当输入正确的密码保管箱密码,则把所有存储的密码通过串口送到电脑上显示。
要完成该设计,我们需要首先了解如何操作ATMega16的内部EEPROM存储器。ATMega16内部有512个字节的EEPROM存储器,可以单独对每一个字节进行读取或写入,并且具有至少10万次写入/擦除周期的寿命。EEPROM通过相应的寄存器进行操作,其中有:
EEPROM的高位地址寄存器EEARH中只有EEAR8位有效,与低地址寄存器EEARL组成9位的地址空间可以寻址到整个512字节,用于指定EEPROM地址。
如果是写EEPROM操作,则EEDR中包含了将要写入EEPROM中的数据。如果是读EEPROM操作,读出的内容在EEDR中。
位3-EERIE:EEPROM准备完成中断允许。如果全局中断I使能,且置位EERIE,则如果EEPROM准备完成,将引起中断请求。清零EERIE将屏蔽该中断。
位2-EEMWE:EEPROM主机写入允许。该位决定是否允许对EEPROM进行写入操作。当EEMWE被置位时,在EEWE为1的4个时钟周期内,将写数据到指定的地址;当EEMWE为0,设置EEWE为1不能触发写EEPROM操作。
位1-EEWE:EEPROM写允许。 该位作为EEPROM的写入触发。当地址和数据被正确设置以后,且EEMWE为1,则置位EEWE,将触发数据写入EEPROM。如果EEMWE不为1,EEWE不能触发写EEPROM的操作。写EEPROM应该遵循以下步骤:
(1)等待EEWE为0,即EEPROM为空闲状态;
(2)等待SPMCR寄存器中的SPMEN位为0;
(3)写新的EEPROM地址到寄存器EEAR(视具体情况可选);
(4)写新的EEPROM数据到寄存器EEDR(视具体情况可选);
(5)写1到EEMWE,并同时写0到EEWE;
(6)在写1到EEMWE后的4个时钟周期内,写1到EEWE位。
步骤(2)一般情况下可以省略,还需要注意的是,在步骤(5)和步骤(6)之间发生中断将使写入过程失败,因此建议在对EEPROM进行写操作时清零全局中断允许标志位以屏蔽所有中断。
位0-EERE:EEPROM读允许。该标志作为读取EEPROM操作的触发。当EEAR寄存器被设置了正确的地址后,向EERE位写入1,将触发EEPROM的读取操作。
简单的读写EEPROM的C代码见本期配刊光盘的本文目录。
有了上述内容,实现“密码保管箱”实例的程序流程就比较简单了。先完成ATMega16单片机的初始化,其初始化代码可以通过ICC AVR软件自动生成。之后,程序开始检测4×4小键盘上的输入,如果小键盘的输入与程序中设定的密码管理箱密码相同,则将存储在EEPROM中的密码送到串口中通过电脑或液晶显示模块进行显示。当然,我们还需要考虑一些编程细节,比如如何比较设定的密码与用户输入的密码等。关于小键盘的操作我们在今年第5期第39页的文章中已经用汇编语言实现过,本期配刊光盘中给出了采用C语言编写的程序,代码看起来更清晰易懂。
设计好程序后,我们可以用上期介绍的ICC AVR软件进行程序的编译。打开ICC AVR,建立一个工程psmanager,并在工程选项里设定芯片为ATMega16,然后选择Tools→Application Builder,或者点击菜单栏上的快捷图标,进入应用程序生成器,可以帮助用户快速生成初始化等相关代码。
如次啊图所示,Target CPU选择M16,Xtal speed根据实际使用情况选择。在Ports项里面是端口初始状态的设置。Timer0、Timer1、Timer2中分别是ATMega16的3个定时器的设置。UART中是串口的设置。根据实际需要选择合适的设置,然后点击OK,ICC AVR会按照所设置的选项产生初始化代码,用户也可以自行编写初始化代码。
将Application Builder。产生的代码保存为main.c,并且加入工程。接下来
- 基于MMS的即时报警系统设计(01-23)
- 基于ATmega162的智能仪器设计(08-18)
- AVR汇编初探之二《AVR的指令与汇编系统》(01-10)
- Atmega16与DS1302数码管显示程序(12-02)
- ATMEGA16与DS18B20数码管显示(12-02)
- ATmega16利用TWI模块读写24C02程序(12-02)