加密信息存储与游戏操作系统
日常生活中有很多需要记住的信息,比如银行卡密码、手机号、各种各样的密码,如果遗忘会变得很麻烦,因此做一个信息加密存储器来存储这些东西会非常方便,再加上密码可防止泄露信息。
此外,基于上位机与下位机之间的通信和数据交互,利用下位机完成对上位机游戏——推箱子的导航按键操作控制,并在此基础上,可对多种上位机软件进行拓展操作。
在项目整体的设计过程中熟悉“STC学习板”的相关知识,学习数码管、按键、蜂鸣器、非易失存储器24C02以及导航按键的工作原理,依据具体需求进行详细设计,并了解通信协议,在上位机的设计过程中学习串口通信的相关知识。
① 信息存储方面,分为对各条信息(多信息)的加密功能、密码的更改功能、信息的 修改功能以及基于串口通信的信息发送接收功能。
② 游戏操作方面,基于串口通信模块,使用导航按键来控制上位机的推箱子游戏的移 动操作。
① 显示模块,利用定时器0实现数码管的定时显示功能,共有初始界面、信息选择、 输入密码、密码错误提示、密码正确提示、信息显示、修改密码、修改信息8个页 面需要显示,游戏操作模块使用初始页面。在定时器的响应函数内以判断语句进行 界面的输出选择;
② 蜂鸣器发声模块,设置一个变量标志是否需要蜂鸣器发声,这里仅在输入错误密码 时使其发声600ms即可,因此在输入密码错误时进入密码错误提示界面并令蜂鸣 标志置1,延时600ms后再次返回输入密码页面。蜂鸣器的发生模块同样位于定时 器0响应函数中,根据标志来进行发声。
③ 非易失存储模块,因为需要将密码同时也加入到24C02当中且我的密码是2字节、 信息为4字节,因此一条信息一共占6字节,密码在前,信息在后。因此第k条信 息的存储位置实际在首地址+k*6处。
④ 导航按键模块,数据的修改均由导航按键来实现,而一个字节的数据占用数码管的 两位分为高4位与低4位,实现了高低4位的自由修改,即数码管上的每一位都是 可以修改的,而不是一个字节一个字节的改动。
P0口的8位输出分别连接了8个发光二极管L0~L7的阳极, P2.3经过一个反相器连接到8个发光二极管L0~L7的阴极(共阴极);
P0口的8位输出分别控制1个LED数码管的7段和一个小数点。
根据二极管的单向导通性(当阳极为高(对应P0口位为1)、阴极为低时,二极管导通,否则不导通),若P2.3输出信号为低电平“0”,则二极管的阴极都为高电平,二极管都不会导通,也就不会发光。因此想要发光二极管导通,必须先设置P2.3输出信号为“1”,再通过设置P0,点亮想要点亮的发光二极管。
而P2.3经反相器U4C控制74HC138的使能信号E3,结合P2.0、P2.1、P2.2这3个位选控制信号确定8个LED数码管中的哪个被点亮;电阻R15~R22为限流电阻。当段选为高、使能信号有效时,对应的LED管将会发光。通过以一定频率扫描位选信号,修改段选信号进行数码管点亮一段时间,从而给人视觉上几个数码管几乎同时显示的效果。
如果去掉DP小数点位就是七段。A在8位中的最低位,DP位为最高位。组合成的八位对应P0口的八位。数码管又分为共阴极和共阳极两种类型;其中共阴极就是将八个LED阴极连在一起,让其接地,这样给任何一个LED发光管另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。一个发光二极管的引脚图如上图所示。
非易失性存储器(nonvolatile memory)是掉电后数据能够保存的存储器,它不用定期地刷新存储器内容。这包括所有形式的只读存储器(ROM),像是可编程只读存储器(PROM)、可擦可编程只读存储器(EPROM)、电可擦除只读存储器(EEPROM)和闪存。
24C02通过IIC_SCL和IIC_SDA与单片机相连,单片机以IIC总线的方式对24C02进行读写。24C02是一个2K位串行E2PROM,内部含有256个8位字节。
2.1.1 管脚描述
2.1.2 寻址方式
寻址信号由一个字节构成,高7位为地址位,最低位为方向位,用以表明主机与从器件的数据传送方向。方向位位0,表明主机接下来对从器件进行写操作;方向位位1,表明主机接下来对从器件进行读操作。
A0,A1和A2对应器件的管脚1,2和3,因为仅有唯一的一个24C02芯片,因此A0-A2的设置无关紧要,经验证都是对唯一的那个24C02进行读写操作。
2.1.3 读/写时序
① 读字节时序
② 写字节时序
写一个字节时序,第一个DEV SEL是器件选择信号,器件选择的范围为(000~111),总共可以选择8个24C02芯片器件。但是本实验只用到了1个24C02芯片,所以对应的器件管脚地址A2A1A0为000。第二个信号BYTEADDR是地址信号,表示要对哪一个地址进行操作,第三个DATA IN则是写入的数据。而读操作则是多了一步,DEV SEL和BYTE ADDR后,还有一个DEV SEL,但此信号的最后一位为高,表示是读操作,随后从机会把相应地址的数据发送给主机。
I2C(Inter-Integrated Circuit)总线是两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。
SCL是时钟线,SDA是数据线;I2C总线信号包括有,启始信号,停止信号和应答信号。
2.2.2 I2C位传输
数据传输:对应SDA_Input,SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;若SDA发生跳变,则用来表示一个会话的开始或结束;
数据改变:对应SDA Change,SCL为低电平时,SDA线才能改变传输的bit。
2.2.3 I2C开始、结束信号与应答信号
开始信号:对应START Condition,SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:对应STOP Condition,SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:
主设备每发送完8bit数据后等待从设备的ACK。
即在第9个clock,从IC发ACK,SDA会被拉低,若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程。
导航按键的每一个方向被按下,都会引起实际电压的改变,从而可以根据这个原理,与A/D转换器配合,可以判断哪个方位被按下,获取按下后A/D转换的结果。
当按键被按下的时候,电路导通接地,I/O口为低电平;当按键未被按下时,电路断开,I/O口保持高电平。
STC15系列单片机ADC由多路选择开关、比较器、逐次比较寄存器、10位DAC、转换结果寄存器(ADC_RES和ADC_RESL)以及ADC_CONTR构成。
STC15系列单片机的ADC是逐次比较型ADC。逐次比较型ADC由一个比较器和D/A转换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序的对每一个输入电压与内置D/A转换器输出进行比较,经过多次比较,使转换所得的数字量逐次逼近输入模拟量对应值。逐次比较器具有速度高,低功耗等优点。
从上图可以看出,通过模拟多路开关,将通过ADC07的模拟量输入送给比较器。用数/模转换器DAC转换的模拟量与输入的模拟量通过比较器进行比较,将比较的结果保存到逐次比较寄存器,并通过逐次比较寄存器输出转换结果。A/D转换结束后,最终的转换结果保存到ADC转换结果寄存器ADC_RES和ADC_RESL,同时,置位ADC控制寄存器ADC_CONTR中的A/D转换结束标志位ADC_FLAG,以供程序查询或发出中断申请。模拟通道的选择控制由ADC控制寄存器ADC_CONTR中的CHS2CHS0确定。ADC的转换速度由ADC控制寄存器中的SPEED1和SPEED0确定。在使用ADC之前,应该先给ADC上电,也就是置位ADC控制寄存器中的ADC_POWER位。
3.2.2 ADC采集步骤
① 将ADC0~7的模拟量送到比较器中,用DAC(数/模转换器)转换的模拟量与输入的模 拟量通过比较器进行比较。
② 转换结束后,将比较结果放入转换结果寄存器(ADC_RES和ADC_RESL)。
③ 将ADC_FLAG软件清零
硬件会自动将ADC_START清零,如果需要进行下一次转换,则需要将ADC_START 置位。
特别说明:
① 数码管所显示的ADC转换结果并不是电压值,而是电压进行转换后所得的一个值。
② ADC转换结果是一个10位数据,若ADRJ=0,则ADC_RES存放高八位,ADC_RESL 存放低两位。若ADRJ=1,则ADC_RESL存放高八位,ADC_RES存放低两位。
③ 实际电压计算方式:
3.3.1 相关寄存器表
① FLASF寄存器:
STC15系列单片机的A/D转换口在P1口,有8路10位告诉A/D转换器,速度可达300KHz。上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任意一路设置为A/D转换,不需要作为A/D使用的P1口可继续作为I/O口使用。需作为A/D使用的口需先将PLASF特殊寄存器的相应位置置为‘1’,将相应的口设置为模拟功能。
② ADC控制寄存器ADC_CONTR
ADC_POWER:ADC电源控制位
SPEED1、SPEED0:转换器转换速度控制位
ADC_FLAG:模数转换器转换结束标志位
ADC_START:模数转换器转换启动控制位
CHS2~CHS0:模拟输入通道选择
蜂鸣器分为有源蜂鸣器和无源蜂鸣器,这里的源特指振荡源;有源蜂鸣器直接加电就可以响起,无源蜂鸣器需要我们给提供振荡源。理想的振荡源为一定频率的方波。实验板采用的是无源蜂鸣器,相比与有源蜂鸣器,无源蜂鸣器的优点在于价格便宜,可以通过控制其振动频率来改变发出的声音。
实验板使用的无源蜂鸣器是电磁式蜂鸣器,电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,接收到的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
无源蜂鸣器只需改变Beep端口的电平,产生一个周期性的方波即可使蜂鸣器发生声音,不同的频率发出的声音不同。其中,ULN2003是一个功放,用于放大电流。电阻R14和电容C21是用来保护电路的。若人为将Beep端口的电平一直置为高电平,在没有保护电路的情况下,容易烧毁电路,但即使有保护电路也应该注意不要将Beep端口长时间置于高电平,这对器件也是有一定损害的。
STC15F2K60S2系列单片机有2个高速异步串行通信端口;
每个串行口由2个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由2个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码。串行口1的两个缓冲器共用的地址码是99H,串行口2的两个缓冲器共用的地址码为9BH;
串行口1的两个缓冲器统称串行通信特殊功能寄存器SBUF;串行口2的两个缓冲器统称串行通信特殊功能寄存器S2BUF。
STC15系列单片机的串行口1设有两个控制寄存器:串行控制寄存器SCON和波特率选择特
殊功能寄存器PCON。
串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。
5.2.1 SCON : 串行控制寄存器 (可位寻址)
TI: 发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,
即TI=1,向主机请求中断,响应中断后TI必须用软件清零,即TI=0。在其他方式中,
则在停止位开始发送时由内部硬件置位,即TI=1,响应中断后TI必须用软件清零。
RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,
向主机请求中断,响应中断后RI必须用软件清零,即RI=0。在其他方式中,串行接收
到停止位的中间时刻由内部硬件置位,即RI=1,向CPU发中断申请,响应中断后RI必须
由软件清零。
注意:串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;
当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以“或逻辑”关系向主机请求中断,所以主机响应中断时事先并不
知道是TI还是RI请求的中断,必须在中断服务程序中查询TI和RI进行判别,然后分别处理。因此,两个中断请求标志位均不能由硬件自动置位,必须通过软件清0。
5.2.2 PCON : 电源控制寄存器 (不可位寻址)
SMOD:波特率选择位。当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波特率加倍;SMOD=0,则各工作方式的波特率加倍。复位时SMOD=0。
SMOD0:帧错误检测有效控制位。当SMOD0=1,SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能;当SMOD0=0,SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指
定串行口的工作方式。复位时SMOD0=0
STC15系列单片机的串行口1缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF
的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个
不同的寄存器,1个是只写寄存器,1个是只读寄存器。
串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号(MOV SBUF,A)
的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的
输出位。根据不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位,并进行发送。
串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入 SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变。
由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位
寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中
将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。
下一部分将讲述具体实现方法及代码链接