【51单片机】STC_B开发板项目《猜猜我是几》

这是《电子系统设计与创新基础训练》的课程设计,做了一个互动小游戏,学名“数字炸弹”。在这里记录一下实现的过程。

Github链接:https://github.com/Red-Pitaya/Guess-Please/

一、 实现要求

  • STC_B学习板×2
  • 杜邦线×2
  • Keil软件

二、 总体方案设计

利用现有的STC_B学习板设备,结合数码管滚动显示功能,非易失存储器功能,导航按键功能和蜂鸣器功能,电子音乐功能,485通信功能,将猜测数字大小并给出反馈结果与猜测次数显示在数码管上,实现双人猜测数字小游戏功能。发送方负责给出正确数字(0~99),并存入非易失存储器中,并在收到猜测的数字后发送反馈结果。猜测方负责猜测数字并发给发送方。通过导航键上下左右可以调整数字每一位的大小。

三、 实验过程

利用杜邦线连接好两块板子,两人通过485通信进行数据交互,实现实时猜测游戏。游戏最多猜测次数为7次,当已猜过七次未猜中或猜中,会自动结束游戏,分类显示滚动字样“SUCCESS”或“FAIL”。

  • 数码管布局:
    发送方:第一二位数码管显示正确数字的大小(0~99),按下K3按键后(进行正确数字存储)第五位数码管显示当前猜测次数,第八位数码管显示大小(0为小,1为大,2为相等)。’
    在这里插入图片描述
    猜测方:第一二位数码管显示猜测数字的大小(0~99),第八位数码管显示收到的大小(0为小,1为大,2为相等)。
    在这里插入图片描述

  • 游戏初始化:
    复位后显示滚动字样“GUESS PLEASE”,向里按下导航按键后数码管显示数字,开始游戏。(发送方猜测方一致)
    在这里插入图片描述

  • 游戏中:
    发送方:通过控制导航键上下左右调整正确数字的大小,确认后按下K3进行存储,同时第五,八位数码管都显示0。游戏中可通过按下K2对正确数字进行查询。当收到猜测方猜测的数字后,一两位数码管显示猜测的数字,可通过向里按导航按键进行第八位的调整,0为小,1为大,2为正确。调整完毕后按下K1发送(同时蜂鸣器发声)。每次发送接收一轮回后猜测次数加一(即第五位数码管)
    在这里插入图片描述

猜测方:通过控制导航键上下左右调整猜测数字的大小,确认后按下K1发送(同时蜂鸣器发声)。当收到发送方的大小反馈时(第八位显示)为0或1则可继续调整发送(为0会发出降调的音乐,为1发出升调的音乐)。
在这里插入图片描述

  • 游戏结束:
    当发送方发送数字为2(猜测方接收到2)后,数码管滚动显示“SUCCESS”,并于七秒后自动显示“SCORE <7-猜测次数>”。游戏胜利,结束。
    在这里插入图片描述
    在这里插入图片描述

当猜测次数大于七次后,数码管持续滚动显示“FAIL”。游戏失败,结束。
在这里插入图片描述

四、 硬件原理

硬件原理基本上都是在《STC_B学习板原理图》与《STC15F2K60S2数据手册》里学习的。

数码管显示:由于全程没有用LED灯,所以P0口设为推挽模式,P2.3设为0。利用定时器0中断进行显示。将初始值TH0=(65535-1000)/256,TL0=(65535-1000)%256,即每隔1ms就会溢出,进而进入中断函数,所以每隔1ms会运行中断函数里的程序。
在这里插入图片描述

普通按键:主要设计硬件的功能为消抖。由于按下按键后电平的转换大致为:
在这里插入图片描述

因此用延时将按下后至稳定之间的抖动与抬起时的抖动用5ms的延时消除。
非易失性存储器:利用时钟线SDA与数据线SCL的高低电平转换,编写I2C开始和结束信号,应答信号,位传输信号。编写逻辑大致如下图:
在这里插入图片描述

(此为写一个字节时序,其余皆可从《非易失存储器24C01、24C02、24C04、24C08、24C16数据手册》中查询)

RS485通信:使用RXD线接收数据,用TXD发送数据。对应发送、接收数据完成(S2RI、S2TI硬件置1)触发串口中断Uart2_Routine(设置的串口2),并把管脚切换为P4.6,P4.7。所有数据通过S2BUF传输。串口初始化为S2CON = 0x10即串口2接收,AUXR |= 0x14即1T模式并启动定时器2。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

普通按键:主要为按键1引脚对应触发外部中断0,通过设定寄存器设置按键1上升沿触发外部中断,当按键1被按下时启动数据发送。由于是使用按键中断实现数据发送的,因此串口中断的优先级高于按键中断。即IP2 |= 0x01。

导航按键:ADC口对来自导航按键不同方向的电压值进行采集,导航按键的每一个方向被按下,都会引起实际电压的改变,与A/D转换器配合,可以获得按下后A/D转换的值。将ADRJ设为0,则ADC_RES存放高八位,ADC_RESL存放低两位。ADC_CONTR = 0x8F,CLK_DIV = 0X00。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

蜂鸣器:无源蜂鸣器只需改变Beep端口的电平,产生一个周期性的方波即可使蜂鸣器发生声音,不同的频率发出的声音不同。
电子音乐:每一个音符的发声频率是不同的,可以用计时器来精确计时,用以产生方波,这样就能发出不用的音符声音。利用定时器1中断即可以使蜂鸣器端口翻转,即发声。
在这里插入图片描述

五、 软件设计与实现

数码管显示:借鉴八位数码管滚动显示案例,在定时器T0中断函数中,将位选每隔1ms加一,从而形成循环显示的数字。
在这里插入图片描述
分别分为displayScore()(显示分数),displayStart()(显示开始界面),displayEnd()(显示结束界面),displayFail()(显示失败界面)

非易失性存储器:利用写成的I2C开始和结束信号,应答信号,位传输信号,直接调用编写发送字节与接收字节函数。并在导航按键的K3中调用发送字节函数,即存储;K2的延时消抖程序中调用接收字节函数,即读取。
在这里插入图片描述
比如对于开始函数来说,就是SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。即为:
在这里插入图片描述
其余函数同理。

RS485通信:在串口中断中将S2RI与S2TI软件置0,由于S2CON不可位寻址,所以S2RI与S2TI不能像SI与RI一样直接软件置0,需要用位与或来置0。外部中断0中利用S2BUF将数据进行存储使用。
在这里插入图片描述
在这里插入图片描述
导航按键:分别判断转换后的电压值,用if-else函数区分各个方向,实现加、减、位选的移位,并把更改的数据直接赋给数码管显示参数。
在这里插入图片描述

蜂鸣器与电子音乐:在K1的按键消抖中添加蜂鸣器发声函数,即可以减少按键电平的不稳定带来的多次发声。
在这里插入图片描述
另外,所有程序的进行状态判断,都新建了标志参数来判断。比如isSend用于判断是否在发送数据;GetFlag用来判断是否已经开始接收猜测数字;guessflag用于判断是否开始猜测,进而显示完整面板;Start用于判断游戏是否开始,显示初始化滚动界面;End用于判断游戏是否结束,显示结束滚动界面并进一步判断是否胜利;ScoreFlag用于胜利时的分数显示界面。

六、 设计总结与心得

  1. 设计总结
    基本实现所有所想功能。
    完成后有点遗憾的就是这个设计没有比较创新的点,作用也只能是儿童益智数字小游戏。不过在学习的过程中,对单片机功能有了很多的了解,所以在之后的使用中,也可以更好更完善的进行创新思考。
    设计过程中遇到了很多问题,比如不了解ADC的初始化与K3的按键端口重合,在写非易失存储器时一直以为是非易失的问题,查漏补缺了很久才解决;又比如猜测次数计数参数一直写到的是串口中断里,会产生很多的抖动,之后才灵光一闪想到写到K1下降沿导致的外部中断的K1消抖里;再比如蜂鸣器写到串口中断中发不了声,也是之后才考虑把它也写到K1消抖里。这些问题现在看起来微不足道,但在当时还是困扰了很久很久,一度甚至想通过简单的方法来避免这类问题。所以解决时也感受到了极大的愉悦,并且也可以进一步的促使我添加更多的功能并完善部分内容。
    同时在实验中也发现了自己前两周所学知识的不够深刻,在后两周也进行了查漏补缺。 在发现自己功能的创新性不足后,我也明白了只有把所学理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
  2. 设计心得
    这次课程设计实验对我来说意义重大。不仅是因为独立完成了设计任务,也是第一次学会利用数据手册等专业性材料进行查阅理解,并运用进行编写实现。这样就有一种步入专业领域,不是还在知识海洋外围浅尝辄止的感觉了。查阅资料并做完所有预设想法的感觉很开心很满足。

七、 参考资料

https://mooc1.chaoxing.com/course/203998550.html(电子系统设计与创新基础训练课程平台)
https://xiaopengzhen.blog.csdn.net/article/details/115755156(51单片机外部中断)
https://blog.csdn.net/lee_xuwei/article/details/83380281(上电串口发送0x00)
https://blog.csdn.net/asukaztc/article/details/78502201(推挽输出)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值