数字化方向的发展在给我们的生活带来巨大便利的同时,也带给我们一些小小的麻烦:我们需要记忆的密码越来越多,银行卡,信用卡,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将屏蔽该中断。[page]
位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,并且加入工程。接下来将需要写入EEPROM的密码生成*.eep文件,假设有两组密码需要存储,分别是建设银行卡密码(为123456)和EMAIL ABC@163.COM密码(为ABCDEFG),并设定密码保管箱的密码为“567890”。
ICC AVR用以下方法产生用于写入EEPROM的eep文件:
#pragma data:eeprom
//设置数据区到EEPROM
char key[]={‘5’,‘6’,‘7’,
‘8’,‘9’,‘O’}
char password[]={“CBC:
123456%ABC@163.COM:
ABCDEFG$")
//假设我们用“%”作为密码之
间的分割;“$”为密码结束标志
#pragma data:data
//设置数据区回到数据存储器
将以上代码添加在main.c中,注意必须紧跟着头文件之后。这样ICC AVR编译完成后,除了生成单片机执行文件}.hex,同时还将产生一个eep文件,可以通过Ponyprog软件写入ATMega16的EEPROM存储器中。由于某种原因,在ATMega16的O~511共512个字节的EEPROM中,在地址O处的字节是不能使用的,所以上面的密码将从EEPROM的地址1处依次存储,即ATMega16可用的EEPROM为511个字节。
本例程中将功能相关的函数放在一起构成一个C文件,因此在一个工程中会有多个C源文件,这样做的好处是使得结构清晰,修改和扩充都很方便。但是要注意文件包含问题,可以查阅相关的C语言书籍。
在完成所有的代码后进行编译,将编译后生成的hex文件和eep文件一起写入ATMega16。步骤如下:打开Ponyprog软件,选择File→OpenProgram(FLASH)File,选中生成的hex文件;再选择File→Open Data(EEPROM)File,将文件类型更改为*.eep,然后选中eep文件。连接好硬件后,点击Command→Write All,即可写入。
工作中的系统如上图所示。 因为本文介绍的“密码保管箱”要借助于电脑进行显示,还不够独立,笔者将在下期介绍如何使用ATMega16控制液晶显示屏,让密码保管箱可以独立使用。
上一篇:单片机的异步串行通信功能和基本使用方法
下一篇:基于ATmega16的数字光功率计系统实现方案
推荐阅读最新更新时间:2024-03-16 13:09
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况