历史上的今天
今天是:2025年05月31日(星期六)
2019年05月31日 | STM32掌机教程2,掌机的原理
2019-05-31 来源:eefocus
打地鼠的逻辑
打地鼠的逻辑很简单:我点亮某个LED,然后开始计时。如果在规定的时间内按下了LED对应的按键,那么加分,点亮下一个LED。按错按键,或者规定时间内没有按下,则减命,点亮下一个LED。
那么如何点亮某个LED?如何检测按键是否按下呢?
我选择了一款带LED的按键。大小是12mm乘12mm,用手指按大小正好,手感也不错,就是有一点,真贵。

淘宝就1块钱了,我找的中发配单就更贵了。并且其实吧,,,,,灯和按键完全是分开的!两个器件,凑到一块了而已。
我把按键做成了一个集成库的封装。原理图就是这个样子:

SLED接到单片机的引脚上,只要单片机引脚给低电平,就能点亮LED。不同颜色的灯限流电阻值大小不一样,根据亮度稍微试一下就行。
SKEY也接到了单片机上,由于STM32可以设置为内部上拉输入,所以不需要外接上拉电阻。按键按下去以后,SKEY接到GND上。也就是没按下按键的时候,SKEY是高电平,按下按键以后,SKEY是低电平。
供电设计
电脑的USB口就是5V供电,所以生活中很容易得到5V的电源,我用microUSB来供电。就是以前的安卓充电头,不是快充那种。

除此之外,预留了插针P3,也可以改造为电池供电,4.5V,6V都可以工作。供电芯片是LDO,电源的质量比较有保障。

为了方便调试,也可以用Jlink OB供电和下载程序。板子预留了SWD下载方式,相对于JLink V8,OB便宜多了。并且的Jlink OB还送了一根microUSB线。

为了避免马大哈接错电源正负极,烧坏板子,电源部分用F1和D4的配合做了防反接设计。如果VCC_IN和GND接反了,那么D4导通,大电流通过保险丝,保险丝瞬间断开,保护电路。保险丝同志是不是因此牺牲了?并不,我们用的是自恢复保险丝,在通过高电流时并不是烧坏,而是变为“高阻态”,等故障排除以后,重新变为“低阻态”。在接线正常的情况下,D4反向截止,相当于断路。
D5是个TVS管,用于防静电,它有个特点,在它感受到两侧收到反向瞬态高能量冲击时,可以很块变为低阻抗,吸收高达数千瓦的浪涌功率,使两极间的电压箝位于一个预定值,有效地保护电子线路中的精密元器件,免受各种浪涌脉冲的损坏。 简单来说,就是它两端的电压不能超过这个预设值。而人体带的静电通常超过几百伏特,击穿小小的掌机轻而易举,所以,要加防护。再加上我这霹雳贝贝的体质,曾经玩无人机的时候,第一次触摸无人机就把主控芯片击穿了,累积击穿的器件估计超过1000块了,所以来个大只的TVS管,SMB封装,妥妥的。
屏幕显示设计
考虑到显示分数的需求,选用了一款0.96寸的OLED屏幕。这个屏幕应用很广泛,某宝上有很多,买来模块,通过杜邦线连接就能用。

而我把OLED画到PCB上了,因为对于我来说,可能画个PCB比接线还省事。实际上在企业里,几乎没有人用开发板,也没人用杜邦线跳来跳去接线。
至于具体的电路设计——太多了,我去网上找了几个方案,综合了一下,把IIC与SPI两种接口都保留了,图纸如下。

不过,,,后来发现屏幕可能太小了,0.96寸打个俄罗斯方块都有点费劲。以后要是升级的话,可以考虑1.44寸,还能全彩。话说,屏幕哪有够用的时候,做手机的那帮人想做个全面屏,刘海屏,水滴屏,都快疯了。
蜂鸣器的设计
用过蜂鸣器的同学可能都会有一个疑问,到底选用有源蜂鸣器,还是无源蜂鸣器?
这里的源指的不是电源,而是震荡源。有源蜂鸣器内部有震荡源,通电就会叫,控制起来很简单,也贵一些。无源蜂鸣器没有内部震荡源,便宜一些,不能通电就叫。
那么无源蜂鸣器怎么工作?写程序来控制引脚的电平变化周期,看似用起来复杂一点,其实能玩的花样就多得多了,频率可控,也就是音调可控,音调可控,那就唱歌呗。听说,只要采集人声,分析人声的频率,然后以极快的速度发送给蜂鸣器,蜂鸣器就可以模拟人声了。潜力无限啊。我们当然要选无源的蜂鸣器了。
以后让代码来播放背景音乐。也可以把掌机作为点唱机,按下某个按键,就播放某个音乐。虽然是简陋的电子音,但是,可以展现工科生的浪漫啊!
蜂鸣器算是大功率器件了,引脚不能直接驱动,要借助三极管。R22是个下拉电阻,可以让蜂鸣器在默认状态下不要发出声音。BEEP输出高电平时,三极管导通,蜂鸣器发出声音。但是由于是无源蜂鸣器,只能响一声;需要BEEP输出低电平,然后再输出高电平,才可以继续发出声响。
其实无源蜂鸣器没有正负极,引脚的状态不用太在意。

说到有源和无源了,晶振也分有源和无源。一般情况下,没有特殊要求的晶振,用的都是无源的。
整体电路设计大概就是这样,基本上就是最小系统板+OLED+带灯按键。
史海拾趣
|
1. 要和人配合。以我们做硬件的工程师为例,测试的时候一般都需要软件的配合,一个对硬件来说无比复杂的工作,可能在软件工程师看来就是几行简单的代码。所以要和人配合,多听听别人的意见,这样必然可以产生新的 know-how 从而加快测试和开发的速 ...… 查看全部问答> |
|
我用C语言进行单片机编程,虽然功能都实现了但是感觉自己就是在为了实现功能而堆砌代码,感觉很乱没有章法,打个比方:就像一副人体骨架,有个人形,但没有人样,骨骼之间的关节都是靠胶水或拉线连接起来的,生硬而呆板。这个骨架需要包上皮肉,加 ...… 查看全部问答> |
|
在mcu中,我想在一个c文件中用同样的宏,却在每个函数中实现不同的功能。。 各位高手,,有没有什么办法实现呀。。 例:#define setSDA P1|=(1… 查看全部问答> |
|
刚刚入门 所以我在运行程序时出现错误如下: D:\\森汉机器人光盘备份\\程序\\6S-C语言\\basal.c(2): Could not find include file C:\\icc\\bin\\imakew -f test.mak C:\\icc\\bin\\imakew.exe: Couldn\'t open D:/icc/include/macros.h GetLa ...… 查看全部问答> |
|
榕盛文化公司(rssdbook.)致力于图书的选题策划、编辑加工和出版,由具有大型出版社工作背景、从事图书出版10余年的资深编辑组建。公司以“弘扬优秀文化、传播卓越品质”为出版理念,成立以来已有数十本图书在全国出版,其中畅销书多达30本,有10 ...… 查看全部问答> |
|
代码如下: 当i=0时,会调用DSPUP(&zuozhe[i-1][32],1). 难道此时为:DSPUP(&zuozhe[-1][32],1)? /***************************左屏显示信息*********************************/void fun40(){ & ...… 查看全部问答> |




