2021-09-23

1.文章概述

1.1设计目的

伴随着社会的发展和科技的进步,人们对生活品质要求越来越高,隐私防范意识也越来越强,为了进一步加强自身对单片机相关知识的理解,同时也为了进一步便捷人们的生活。
在项目整体的设计过程中熟悉“STC 学习板”的相关知识,学习数码管、按键、蜂鸣器、非易失存储器 24C02 以及导航按键的工作原理,依据具体需求进行详细设计,并了解通信协议,在这个过程中学习串口通信的相关知识。

1.2设计任务

我的目的是设计两个模块,第一个是简易的计算器,它可以满足日常生活中的各种基本的运算,进而方便人们的出行;第二个是一个密码锁定系统,通过它我们可以将自己的私人物品进行上锁,做到真正的隐私,让人们的隐私得到足够的保护。

1.3设计要求

第一个模块的简易计算器,对其的预期功能实现就是能实现正常的加减乘除运算,像日常计算器一样有复位,连加等功能,我在这里设计的是 0~9999 范围内的运算,对于超
出范围的运算,蜂鸣器会进行报警;
第二个模块的密码锁定系统,对其的预期功能实现是实现密码的验证和更改,在密码的更改部分,利用串口通信向学习板发送密码进行更改,同时利用非遗失储存来保证断电
之后密码会被记住。

2.总体概述

载入后,首先进入密码锁定系统,即输入正确的密码后才能解锁学习板,进入下一部分,同时可以通过串口进行密码的更改,正确后则进入计算器功能模拟,通过输入我们所想
实现的运算步骤,最后可以得到结果,该计算器支持连续的运算。具体的按键安排如下图:
在这里插入图片描述

3.硬件原理

3.1数码管与发光二极管

数码管与发光二极管电路
P0 口的 8 位输出分别连接了 8 个发光二极管 L0~L
7 的阳极, P2.3 经过一个反相器连接到 8 个发光二极管 L0~L7 的阴极(共阴极);
在这里插入图片描述
1.2 数码管与发光二极管的显示方法根据二极管的单向导通性(当阳极为高(对应 P0 口位为 1)、阴极为低时,二极管导通,否则不导通),若 P2.3 输出信号为低电平“0”,则二极管的阴极都为高电平,二极管都不会导通,也就不会发光。先设置 P2.3 输出信号为“1”,再通过设置 P0,点亮发光二极管。而 P2.3 经反相器 U4C 控制 74HC138 的使能信号 E3,结合段选控制信号确定 8个 LED 数码管中的哪个被点亮;

3.2非遗失储存

非易失性存储器(nonvolatile memory)是掉电后数据能够保存的存储器,它不用定期地刷新存储器内容。这包括所有形式的只读存储器(ROM),像是可编程只读存(PROM)、可擦可编程只读存储器(EPROM)、电可擦除只读存储器(EEPROM)和闪存。

24C02工作原理
在这里插入图片描述24C02通过IIC_SCL和IIC_SDA与单片机相连,单片机以IIC总线的方式对24C02进行读写。24C02是一个2K位串行E2PROM,内部含有256个8位字节。

管脚描述
在这里插入图片描述寻址方式
在这里插入图片描述
寻址信号由一个字节构成,高7位为地址位,最低位为方向位,用以表明主机与从器件的数据传送方向。方向位位0,表明主机接下来对从器件进行写操作;方向位位1,表明主机接下来对从器件进行读操作。A0,A1和A2对应器件的管脚1,2和3,因为仅有唯一的一个24C02芯片,因此A0-A2的设置无关紧要,经验证都是对唯一的那个24C02进行读写操作。

I2C总线
I2C(Inter-Integrated Circuit)总线是两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。

在这里插入图片描述
SCL是时钟线,SDA是数据线;I2C总线信号包括有,启始信号,停止信号和应答信号。

I2C位传输
在这里插入图片描述
数据传输:对应SDA_Input,SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;若SDA发生跳变,则用来表示一个会话的开始或结束;数据改变:对应SDA Change,SCL为低电平时,SDA线才能改变传输的bit。

I2C开始、结束信号与应答信号
开始信号:对应START Condition,SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:对应STOP Condition,SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:
主设备每发送完8bit数据后等待从设备的ACK。
即在第9个clock,从IC发ACK,SDA会被拉低,若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程。

3.3导航键与按键

在这里插入图片描述导航按键的每一个方向被按下,都会引起实际电压的改变,从而可以根据这个原理,与A/D转换器配合,可以判断哪个方位被按下,获取按下后A/D转换的结果。当按键被按下的时候,电路导通接地,I/O口为低电平;当按键未被按下时,电路断开,I/O口保持高电平。

AD数据采集电路及采集步骤
在这里插入图片描述
STC15系列单片机ADC由多路选择开关、比较器、逐次比较寄存器、10位DAC、转换结果寄存器(ADC_RES和ADC_RESL)以及ADC_CONTR构成。STC15系列单片机的ADC是逐次比较型ADC。逐次比较型ADC由一个比较器和D/A转换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序的对每一个输入电压与内置D/A转换器输出进行比较,经过多次比较,使转换所得的数字量逐次逼近输入模拟量对应值。逐次比较器具有速度高,低功耗等优点。
① 将ADC0~7的模拟量送到比较器中,用DAC(数/模转换器)转换的模拟量与输入的模 拟量通过比较器进行比较。
② 转换结束后,将比较结果放入转换结果寄存器(ADC_RES和ADC_RESL)。
③ 将ADC_FLAG软件清零
硬件会自动将ADC_START清零,如果需要进行下一次转换,则需要将ADC_START 置位。

3.4 蜂鸣器

蜂鸣器分为有源蜂鸣器和无源蜂鸣器,这里的源特指振荡源;有源蜂鸣器直接加电就可以响起,无源蜂鸣器需要我们给提供振荡源。理想的振荡源为一定频率的方波。实验板采用的是无源蜂鸣器,相比与有源蜂鸣器,无源蜂鸣器的优点在于价格便宜,可以通过控制其振动频率来改变发出的声音。
蜂鸣器工作电路
在这里插入图片描述实验板使用的无源蜂鸣器是电磁式蜂鸣器,电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,接收到的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
无源蜂鸣器只需改变Beep端口的电平,产生一个周期性的方波即可使蜂鸣器发生声音,不同的频率发出的声音不同。其中,ULN2003是一个功放,用于放大电流。电阻R14和电容C21是用来保护电路的。若人为将Beep端口的电平一直置为高电平,在没有保护电路的情况下,容易烧毁电路,但即使有保护电路也应该注意不要将Beep端口长时间置于高电平,这对器件也是有一定损害的。

3.5串口通信

STC15F2K60S2系列单片机有2个高速异步串行通信端口;
每个串行口由2个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由2个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码。串行口1的两个缓冲器共用的地址码是99H,串行口2的两个缓冲器共用的地址码为9BH;
串行口1的两个缓冲器统称串行通信特殊功能寄存器SBUF;串行口2的两个缓冲器统称串行通信特殊功能寄存器S2BUF。

串口相关电路图
在这里插入图片描述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以并行方式送往内部数据总线。

4.软件设计与实现

  1. 变量定义及对应功能
    在这里插入图片描述cstAdcPower:ADC 电源开关
    cstAdcFlag:A/D 转换结束标志
    cstAdcstart:ADC 转换开始标志,结束后会自动清零,下一次转换需要置位;
    cstAdcSpeed90:ADC 转换速度;

变量定义
在这里插入图片描述在这里插入图片描述btBeepFlag:蜂鸣器蜂鸣标志,但该标志为 1,则蜂鸣器开始发声
arrDigSelect,arrSegSelect:段选信号与位选信号;
btKey3Flag:因为 P1.7 用于模拟 AD 口,因此不能将 KEY3 作为普通的按键使用,用该标记来 标记KEY3 是否被按下,在导航按键处理函数中进行置位

定时器
函数:
在这里插入图片描述计时器开启总中断并开启定时器 0 中断,设置定时器 TH0、TL0 的初值,最后打开定时器使其开始计数。前面提到过蜂鸣器的发生模块是在定时器函数中,根据标志位判断是否发生,同时在将串口发来的信息写入特定的地址时,也是在这个模块实现。
数码管
在这里插入图片描述
导航按键
在这里插入图片描述在这里插入图片描述获取 AD 值后根据值判断是否有键被按下,若有则进行一次按键延时消抖,后再次获得 AD 值,如果此时依然有键被按下那么获取 AD 值的最高三位,其它位直接清零,并且返回这三位即可,若没有按键按下则返回 0x07;导航按键的上键返回 0x05、下键返回 0x2、左键返回 0x4、右键返回 0x1、确认键返回 0x3、开关按键 3 返回 0x0,没按下返回 0x07;当接受的值是 0x00 时,表明 KEY3 被按下,因此将 btKey3Flag 标志置为 1;
当接受的值为 0x05 时,表明是导航键上键,因此修改相应的数据;
当接受的值为 0x04 时,表明是导航键左键,因此修改相应的数据;
当接受的值为 0x01 时,表明是导航键右键,因此修改相应的数据;
当接受的值为 0x02 时,表明是导航键下键,因此修改相应的数据;

串口通信
在这里插入图片描述在这里插入图片描述在这里插入图片描述将 AUXR 辅助寄存器置为 0x80|0x40,1T 模式,且定时器 1 的速度是传统的 12 倍,不分频,T0x12为 1。将 SCON 设置为允许接受模式,设置好 TL1、TH1 两个定时器 1 的寄存器的初值,打开定时器 1,打开总中断,令串口 1 中断高优先级,先不打开 ES 串口中断,仅在需要时打开,初始化 RI、TI 接受和发送中断标志位。SCL 为 1 时,SDA 从高电平变为低电平表示开始信号,反之表示停止信号;若在一段时间内没有收到从期间的应答则主器件默认从器件已经收到数据而不再等待应答信号。即 SDA 若为 1,延时一段时间后 SCL 从高电平转为低电平。

对密码的判断
在这里插入图片描述由于一次只能读一个字节,而 0x00 存的是 2 个字节,所以一个四位的密码需要两个地址来存,再进行判断的时候,我是通过 ps 一次读取一个字节的四位,如果是低四位,就直接和 0x0f 与起来再与输入的密码比较,如果是高四位,就直接右移四位再进行比较,如果都相等,则输入密码正确。

5.软件过程与测试

根据流程一步步来:
加载后出现的是密码登录系统,在这里我设置的是四位密码,首先进行密码的输入
在这里插入图片描述即用导航键控制数码管上显示输入的密码,初始的时候密码为 1234,我们先输入 1243,这时候按下key1 键,密码错误,这时候数码管不会有任何反应,蜂鸣器会有短暂的报警声,可以在此基础上继续输入。
在这里插入图片描述然后我们再次通过导航键输入 1234,此时密码正确,顺马关就会显示 open
在这里插入图片描述然后我们可以通过串口对密码进行更改,在这里我改成了 1111,发现只有当密码为 1111 时,才会open
在这里插入图片描述接下来进入第二个模块计算器的功能实现,由于篇幅原因,就只在次展示加法计算;首先出现输入界面,做的也是四位的加法。首先验证连加,即 0011+1000+0010,通过导航键控制输入,key1 键控制运算符号,连加以后按 key2 键得到结果 1021,如下图
在这里插入图片描述然后得到这个结果再按 key1 键就又会进行加法,比如再加 0001
在这里插入图片描述如 果 想 重 新 计 算 则 在 等 于 结 果 算 出 来 后 再 按 下 key2 键 , 实 现 重 置 功 能 。

在这里插入图片描述

6.设计心得

整个过程从最开始的选题,再接着自己摸索,调试,到后面的验证,一步一步自己慢慢来,从开始
的对单片机一窍不通,到后面慢慢了解了上位机的工作原理,蜂鸣器的发声,定时器的作用等等,下面就总结一下我所遇到的几个比较典型的问题:
1 因为要使用导航按键进行数值的变化,那么最好是使用 Key3 的 P1.7 口作为虚拟 AD 口,但是
我还是需要 Key3 的按键功能(按键实在太少而功能太多),那么该如何解决?2 如何通过导航按键来修改密码以及信息(精确到数码管上每一位数字所代表的四位 bite 的自由修改而不是一个字节的修改 3 如何将密码和信息同时存入非易失存储器 24C02,如何判断自己输入的密码是否与存储的密码正确匹配这几个问题有些我是直接解决,有些我选择了避开,用其他的方法去实现。总体来说,我对我这次的设计还比较满意,虽然有些功能并没有达到我预想的效果,但总体来说,还是可以的。
我的整个创新设计过程历时两个星期,准确来说还不止,因为暑假在家里自己也有琢磨过相应的代码,由于事先不知道有 bsp,只能自己根据老师的案例慢慢摸索,打的特别慢,暑假过后来才发现有bsp,这种封装好的能大大降低代码量,减轻负担,但是我由于暑假做了一部分,所以就只能继续不
用 bsp,整个过程其实感慨挺多,因为我的设计是自己设计实现的,所以在编程与调试上的时间不短。遇到过很多的 bug 也解决了很多的难题,现在回想起来还挺艰辛的其实我也可以选择在网上查点代码,然后学习一下,模仿着写一下就提交上去,但我总觉得这不是自己的,所以我选择自己写、自己设计页面的显示、自己设计整个功能流程,虽然这很耗费时间,最后敲了将近六百多行代码却让我觉得值得。整个小学期我觉得我过的十分充实,就连暑假期间我也在保持一种学习状态,让我明白了实践是检验学习成果的一种重要方式,真的受益匪浅

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值