# 有趣的项目--51单片机 **Repository Path**: zhiyong21/funny_51 ## Basic Information - **Project Name**: 有趣的项目--51单片机 - **Description**: 本仓库用于存放我制作过的各种与【51单片机】有关的有趣项目。 51单片机也是我最早接触的一款单片机,从高二就开始编程制作了。 欢迎大家来探讨交流,提出更多有趣的项目。 本仓库使用AGPL开源协议,请大家遵循协议。 - **Primary Language**: C - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 20 - **Created**: 2022-05-01 - **Last Updated**: 2024-08-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 有趣的项目--51单片机 ## 介绍 - 本仓库用于存放我制作过的各种与【51单片机】有关的有趣项目。 - 51单片机也是我最早接触的一款单片机,从高二就开始编程制作了。(2015年至xxx) - 最初呢,是一位好朋友跟我说单片机这个东西很强大,可以按照你想要的效果执行,对比以前玩的纯电路,真的很强大,促使着我去学习它。经过看视频自学c语言+单片机,结合以前摸索的电路知识,为我打开了一个新世界,越学越来劲。先后从流水灯到七彩心形灯多种动画,到自行车码表,到旋转屏幕POV,到摇摇棒与旋转屏幕的结合等等。就是喜欢玩有趣的东西~ - 欢迎大家来探讨交流,提出更多有趣的项目。 - 本仓库使用AGPL开源协议,请大家遵循协议。 ### 软件架构 - 使用keil3或以上编程的,大部分使用stc89cxx系列的,少部分使用stc12、stc15系列的单片机。 - 使用stc-isp-15xx-v6.85I.exe及更新版本,通过串口就可以烧录了。 - 由于是多年后整理的,可能需要自行在代码中找引脚连接等硬件信息。 ### 视频展示链接(B站) (后续会贴上大部分视频地址) 1. 2016 心形流水灯: https://b23.tv/UQ5ETiS 2. 2016 自行车码表: https://b23.tv/znecuCh 3. 2017 led旋转屏幕(圆柱屏): 4. 2017 摇摇棒+平面旋转屏幕: 5. 2017.10 第二届创客马拉松大赛: https://b23.tv/yIopMCF 6. 2017.11 广州塔led焊接大赛: https://b23.tv/3Fzfesp 7. 计步器6: https://b23.tv/H7N88wN 8. 蓝牙家电控制8: 9. 模拟停车场刷卡系统10: 10. 简易家居控制终端11: 11. 打乒乓球系统20: 12. 两机远程控制21: 13. esp8266wifi控制23: 14. 秒表计时汇编27: 15. 串口音乐和弹琴29.37: 16. 16x16点阵移动特效31.36: 17. 多功能电子钟32: 18. 宠物喂养系统33: 19. 简易频率计实物34: 20. 大量程电压采集35: 21. 农作物自动灌溉43: 22. ws2812七彩台灯45: 23. 简易智能药瓶46: 24. 光控路灯50: ## 各项目简介 ### 1、心形流水灯 - 最开始学会了led流水灯的控制,在网上找到了心形流水灯这个东西,很好玩,就打算自己写一个流水灯效果集合,使用了七彩快闪灯,后续使用七彩慢闪灯效果会更好。 - 原理也不难,就是利用单片机的IO引脚控制亮灯的顺序和颗数,点亮间隔时间与慢闪颜色变化结合可得到颜色渐变流动的效果。 - 因为想切换各个单独的效果和自动循环全部效果,所以加了一个按键控制,在非常用的32个引脚外找到第33个引脚进行控制的。曾经还打算买套件来焊接用我的程序,配置聚合物电池和充电板能充电,效果不错但卖不出去(朋友间),哈哈哈,就当做是玩耍啦。 - 两种外形流水灯 - ![五角星流水灯](1%E3%80%81%E5%BF%83%E5%BD%A2%E6%B5%81%E6%B0%B4%E7%81%AFv1%E6%85%A2%E9%97%AA+%E6%8C%89%E9%94%AE/%E6%95%88%E6%9E%9C/%E4%BA%94%E8%A7%92%E6%98%9F%E6%B5%81%E6%B0%B4%E7%81%AF.jpg) ![心形流水灯](1%E3%80%81%E5%BF%83%E5%BD%A2%E6%B5%81%E6%B0%B4%E7%81%AFv1%E6%85%A2%E9%97%AA+%E6%8C%89%E9%94%AE/%E6%95%88%E6%9E%9C/%E5%BF%83%E5%BD%A2%E6%B5%81%E6%B0%B4%E7%81%AF.jpg) - 效果图: - ![输入图片说明](1%E3%80%81%E5%BF%83%E5%BD%A2%E6%B5%81%E6%B0%B4%E7%81%AFv1%E6%85%A2%E9%97%AA+%E6%8C%89%E9%94%AE/%E6%95%88%E6%9E%9C/P00822-223650.jpg) ![输入图片说明](1%E3%80%81%E5%BF%83%E5%BD%A2%E6%B5%81%E6%B0%B4%E7%81%AFv1%E6%85%A2%E9%97%AA+%E6%8C%89%E9%94%AE/%E6%95%88%E6%9E%9C/S80921-122458.jpg) ![输入图片说明](1%E3%80%81%E5%BF%83%E5%BD%A2%E6%B5%81%E6%B0%B4%E7%81%AFv1%E6%85%A2%E9%97%AA+%E6%8C%89%E9%94%AE/%E6%95%88%E6%9E%9C/S80921-122506.jpg) ### 2、自行车码表 - 这是我高二做的第二个有趣玩意,喜欢骑自行车,当时我还没有智能的手机,想知道我骑了多少公里,多久,实时速度多少,让我想到了可以利用自行车车轮检测加计算来得到这些参数。 于是在我根据所了解的知识,使用霍尔传感器+强磁铁检测车轮圈数,在单片机开机时需要设置车轮周长,计算更精确。骑行时数码管轮流显示速度、路程、时间等。可通过按键控制。 - 当时还测试了增加密码、防盗、蜂鸣器报警等功能设计,就是利用三极管,让设备开机后只能在特定按键顺序下才能解除强制供电,否则电源自锁开关会失效,设备不会断电。检测到没正常流程关机会让蜂鸣器响来报警,当时是想防止设备被偷的。后来做到一半觉得意义不是很大,好像就没有继续搞了。 - 前后制作了2块码表: - ![输入图片说明](2%E3%80%81%E8%87%AA%E8%A1%8C%E8%BD%A6%E7%A0%81%E8%A1%A8/%E6%95%88%E6%9E%9C/%E8%87%AA%E8%A1%8C%E8%BD%A6%E7%A0%81%E8%A1%A81.jpg) ![输入图片说明](2%E3%80%81%E8%87%AA%E8%A1%8C%E8%BD%A6%E7%A0%81%E8%A1%A8/%E6%95%88%E6%9E%9C/%E8%87%AA%E8%A1%8C%E8%BD%A6%E7%A0%81%E8%A1%A82.jpg) ### 3、led旋转屏幕(圆柱屏) - 这个是我在网上找到这个idea的,觉得很炫酷,于是我打算自己动手制作。当时是高三,在很大的学习压力下和父母让我好好学习的空余,我悄悄的开发着,虽然好几次被父母骂。。。所以我考到了广州大学,很多人说我当时不搞那些岂不是考上更好的大学?我觉得有可能,但可能并不是很快乐,哈哈哈 - 这个的原理理论上不难,但实际会遇到很多问题。利用人眼的视觉暂留的效果,当led亮后,人眼能在短时间内觉得还在亮,即使led真的灭了。于是旋转一周led变换着亮,速度快一些人眼就以为是同时在亮,达到觉得看到一整个圆柱体都在亮的效果。至于显示内容,就需要逻辑和数据处理能力。利用红外或者霍尔元件来告知主控固定位置,从而重新显示,固定显示区域。这个版本不算很复杂,固定时间间隔变换led即可,数据通过取码软件存到flash中。 - 前前后后开发了很多次,所上传的是一部分而已。当时在纸上写代码也有好几张了(因为被限制非读书天电脑上网,而且每天不超过1h,太难了)。构思完电路图就开始用洞洞板拆剪焊接元器件,飞线连接。增加红外传感器、马达等。功能上遇到很多问题,逻辑理清后逐步解决,也就有了最后这个很成功的版本。对了,最后版本还用了自制的无线供电电路,让顶部无线供电运转,但发热有些多导致效率因温度高而降低供电不足,就加了自制的涡轮风机散热。都是纯手工制作的。 - 高三毕业那会还带去学校展示呢,把班级的口号写上,哈哈哈。还把某位关系很好的异性朋友名字写上,一豆比。毕业后的朋友可能就很少再见了 - **整体图** (相机没能捕捉到全画面,与相机频率有关) - ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E6%95%B4%E4%BD%93%E5%9B%BE.jpeg) ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E6%97%8B%E8%BD%AC%E6%95%88%E6%9E%9C%E5%9B%BE.jpeg) - 上层旋转显示主控板: - ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E9%A1%B6%E5%B1%82%E6%9D%BF%E5%AD%90.jpeg) ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E9%A1%B6%E6%9D%BF%E4%BF%AF%E8%A7%86.jpg) ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E9%A1%B6%E5%B1%82%E6%9D%BF%E5%BA%95%E9%83%A8.jpeg) - 底座: - ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E5%BA%95%E5%BA%A71.jpg) ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E5%BA%95%E5%BA%A72.jpg) ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E5%BA%95%E5%BA%A73.jpg) ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E5%BA%95%E5%BA%A74.jpg) - 底座给自制的无线供电模块散热涡轮风扇 - ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E6%B6%A1%E8%BD%AE%E9%A3%8E%E6%89%871.jpg) ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E6%B6%A1%E8%BD%AE%E9%A3%8E%E6%89%872.jpg) ![输入图片说明](3%E3%80%81led%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95-%E5%9C%86%E6%9F%B1%E5%B1%8F/%E6%95%88%E6%9E%9C/%E6%B6%A1%E8%BD%AE%E9%A3%8E%E6%89%873.jpg) ### 4、摇摇棒+平面旋转屏幕 - 这个是上大学前暑假开始搞的,找到了摇摇棒,想改造后出售一下,然而理想很美好,现实。。。当做锻炼吧。可以说是第二代旋转屏幕。 - 至于摇摇棒,是因为成本低,改造成旋转屏幕也很快。买上锂电池,霍尔传感器,了解电路后对电路改造。找到平衡支点沾上连接头接上电机,又是个旋转屏幕了,之不过是平面的。以前显示字很好,现在就不太合适了。电路改造后,设计跟摇摇棒功能叠加,摇摇棒的效果能兼得,也就是可以切换模式不同使用。 - 圆形的适合显示圆的东西,比如时钟,当时就开始设计用小的数字显示此时时间,改造电路接入ds1302,让其开机连接自动获取时间,后续不用连这个模块定时器走时。 解决的数字显示时钟,感兴趣的还是指针式的时钟了,这个挺有难度的。写完调试了很久的代码,终于能比较正常的显示了,跟平时的指针钟差不多,就有时因霍尔传感器那影响,显示微微跳动。也增加了简单算法,解决电机速度变化导致画面变形问题。也有一种是三个圆圈代表的时钟,这个容易就实现了。 - 以上算不是很难,如何解决文字显示,我想到了整个圆圈显示一个汉字或图案。这个构思了很久,也找了一些资料。最后再ps找到了一种将图片一系列处理后,用取模软件得到显示数据,再显示出来,效果挺好的,能够显示任意低分辨率图案了,毕竟只有16个led显示。后续还做了一些动画:小人跑步等,挺好玩的。整体到大一中旬制作改造完毕。 - ![输入图片说明](4%E3%80%81%E6%91%87%E6%91%87%E6%A3%92+%E5%B9%B3%E9%9D%A2%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95/%E6%95%88%E6%9E%9C/%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95%20%E6%91%87%E6%91%87%E6%A3%92.jpg) ![输入图片说明](4%E3%80%81%E6%91%87%E6%91%87%E6%A3%92+%E5%B9%B3%E9%9D%A2%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95/%E6%95%88%E6%9E%9C/%E6%91%87%E6%91%87%E6%A3%92%E6%95%88%E6%9E%9C.jpg) ![输入图片说明](4%E3%80%81%E6%91%87%E6%91%87%E6%A3%92+%E5%B9%B3%E9%9D%A2%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95/%E6%95%88%E6%9E%9C/%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95%E6%95%88%E6%9E%9C.jpg) ### 5. 创客马拉松大赛(声明:赛中没有损坏共享单车,赛后还原并放回校园使用) - 这是我大学参加的第一个比赛,那时是刚入学不到两个月,全凭借自己的能力,在了解到学校有举办这个比赛后,高中羡慕别人能参赛的我瞬间来了激情,而且参加比赛能加一些学分、第二课堂分,于是拉上认识不久的舍友和同学,一起参赛。 整个过程好像只有3天的制作时间,还是比较赶的。 - 这个比赛是学术科技节的主题比赛,题目内容可以由自己决定。于是我们结合一些参考题目,讨论出最后的内容:“共享单车增加提醒功能”。那时也只能我来分析实现可行性,编程写代码的人也只有我。。。确定题目后,我们就构思具体内容,我下单买所需要的材料并进行编程制作,其他伙伴帮忙写项目内容ppt等事项。下面也长话短说吧: - 那时构思提醒功能:自行车扫码解锁后,一定时间内没打上车脚,蜂鸣器会间歇响,提示用户。骑行可以在手把上的按键控制后方led点阵显示左转、右转来提示后方单车将要的转向。直行一会就会关闭led点阵。单车刹车能检测并全亮提醒后方车辆。其中,安装在车头转轴的多个霍尔传感器能判断出单车正在直行/左转/右转,从而使单车即使不手动按转向灯按键,也能自动准确提示后方单车转向,转向灯和刹车灯能重叠同时展示。当用户到达目的地后,停下单车,打下车脚。一定时间内没锁车就会鸣叫提醒。锁车后就会用激光和小镜片反射多个路线检查车篮东西是否已拿走,未拿走则鸣叫提醒,拿走后就恢复正常了。 - 想整个流程好像不复杂,但真正写代码会遇到些问题,比如显示屏重影,那时还不懂,调试好久意识到,也终于排除了;车头转动自动检测,如何使用少量霍尔传感器实现大范围检测,也是个小难题,调试比较久。代码也分块逐步完成。各种检测模块的固定安装也得找个合适的位置。虽然比赛有些累,但也收获了很多,积攒经验。后来才知道,这比赛主要是大二及以上人参加的,而大一的只有2个队伍且都获奖,那时师兄也说我这届不简单。 - **整体图** 传感器简单标记 - ![输入图片说明](5%E3%80%81%E5%A4%A7%E4%B8%80%E5%88%9B%E5%AE%A2%E9%A9%AC%E6%8B%89%E6%9D%BE%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E5%B7%A6-%E6%A0%87%E5%8F%B7.jpg) - 主控采用stc89c52单片机 那时还不知有排线,苦逼地用漆包线,接线焊接好麻烦。。 - ![输入图片说明](5%E3%80%81%E5%A4%A7%E4%B8%80%E5%88%9B%E5%AE%A2%E9%A9%AC%E6%8B%89%E6%9D%BE%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E4%B8%BB%E6%8E%A7.jpg) ![输入图片说明](5%E3%80%81%E5%A4%A7%E4%B8%80%E5%88%9B%E5%AE%A2%E9%A9%AC%E6%8B%89%E6%9D%BE%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E4%B8%80%E5%A0%86%E7%BA%BF.jpg) - 各个部分 - ![手刹](5%E3%80%81%E5%A4%A7%E4%B8%80%E5%88%9B%E5%AE%A2%E9%A9%AC%E6%8B%89%E6%9D%BE%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E6%89%8B%E5%88%B9.jpg) ![车尾巴](5%E3%80%81%E5%A4%A7%E4%B8%80%E5%88%9B%E5%AE%A2%E9%A9%AC%E6%8B%89%E6%9D%BE%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E5%B0%BE.jpg) ![转轴](5%E3%80%81%E5%A4%A7%E4%B8%80%E5%88%9B%E5%AE%A2%E9%A9%AC%E6%8B%89%E6%9D%BE%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E8%BD%A6%E5%A4%B4%E8%BD%AC%E8%BD%B4.jpg) ![车篮](5%E3%80%81%E5%A4%A7%E4%B8%80%E5%88%9B%E5%AE%A2%E9%A9%AC%E6%8B%89%E6%9D%BE%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E8%BD%A6%E7%AF%AE.jpg) ### 6. 广州塔led焊接大赛 - 这个比赛是我大一第二个比赛,当时是别的学院举办的校级比赛,我们在纠结参不参加,导生师兄鼓励我们去,于是就报名成功了。当时主要是物电学院参加,机电学院参加3个队伍,最后呢,前3名都是机电学院的。同学都说,我们是不是去“砸场”的?把人家学院获奖名额都拿走了,哈哈哈。 - 这个原理也还行,就是圆柱状的矩阵led屏,通过控制引脚组合、七彩快闪led的间隔来得到不同展示效果的。 - 那时报名前几个队伍有资金补助,就是不用交材料费,刚好我们不用交。赛前有简单焊接培训,其实跟我高中自玩的一样。然后发材料进行焊接,都是插件就比较好焊接。我焊接比较难的部分,也让队友试着焊接一些。比赛要求也是3天左右时间,我们上完课就过去焊接。因为我宿舍有很多元器件和设备,虽然简陋但齐全,于是我也可以待会宿舍进行制作。不到2天就完美焊接完成了,最顶层的尖塔有近10颗灯,看电路是接到一个io控制,我觉得不合理电流太大,于是我改电路接到5v长亮。后续也成为了亮点。听评委说自己写程序能加分,于是我就开始调试。 - 单片机是STC12的,以前用89的,了解一番,代码上区别不大,就顺利的写出一些效果,也结合网上演示视频代码进行优化,最后有了成效。激动地心颤抖的手,提交了作品,最后获奖了,师兄说我焊接手艺很好(其还我从初中就开始拿电烙铁的了。。。)。 - 后续有次活动要拍照,慌忙之下我不小心坐了一下我的塔,横着坐下去。。。等我发现时,已经变形了,变成了妖娆的弯塔。。。我赶紧想把它掰直,队友已捧腹大笑,说要拍个照片先。。。最后修修补补,我把它调回来了,那种妖娆照片没找到,找到一定贴上来~ - 亮着的那个广州塔就是我们队的 - ![输入图片说明](6%E3%80%81%E5%A4%A7%E4%B8%80%E5%B9%BF%E5%B7%9E%E5%A1%94led%E7%84%8A%E6%8E%A5%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E6%91%86%E6%91%8A%E5%B1%95%E7%A4%BA.jpg) - ![输入图片说明](6%E3%80%81%E5%A4%A7%E4%B8%80%E5%B9%BF%E5%B7%9E%E5%A1%94led%E7%84%8A%E6%8E%A5%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E5%B9%BF%E5%B7%9E%E5%A1%94%E5%BA%95%E9%83%A8.jpg) - ![输入图片说明](6%E3%80%81%E5%A4%A7%E4%B8%80%E5%B9%BF%E5%B7%9E%E5%A1%94led%E7%84%8A%E6%8E%A5%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E5%B9%BF%E5%B7%9E%E5%A1%94led.jpg) ![输入图片说明](6%E3%80%81%E5%A4%A7%E4%B8%80%E5%B9%BF%E5%B7%9E%E5%A1%94led%E7%84%8A%E6%8E%A5%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/%E7%84%8A%E7%94%B5%E8%B7%AF%E5%A4%A7%E8%B5%9B-%E5%B9%BF%E5%B7%9E%E5%A1%94LED%E6%A8%A1%E5%9E%8B%E5%88%B6%E4%BD%9C%20%E6%A0%A1%E7%BA%A7%E4%B8%80%E7%AD%89%E5%A5%96.jpg) - 各组评分 - ![输入图片说明](6%E3%80%81%E5%A4%A7%E4%B8%80%E5%B9%BF%E5%B7%9E%E5%A1%94led%E7%84%8A%E6%8E%A5%E5%A4%A7%E8%B5%9B/%E6%95%88%E6%9E%9C/S71128-084234.jpg) ### 7.计步器6 - 这个计步器呢,是看到了一些极客视频,也想动手做一个,练练手的,简单开发一下。 - 原理也不算难,就是通过adxl345获取xyz三轴的加速度值,通过简单滤波、取得加速度瞬时平均值,多次获取到的平均值作为阈值对比,判断偏差到一定条件就判断为走了一步。其中数值是以三轴平方和为最后对比数据的,这样可以让模块处于各种姿势都能顾及和检测到(静态时约等于重力加速度的平方值,走动时数值大小波动)。阈值偏差也是经过测试选择合适数值。解决计步的关键问题后,结合lcd1602进行显示,能够显示此时的步数、总步数、路程、消耗的卡路里、查看历史数据、显示此时的姿态及阈值数据。也可以通过按键清除此时的步数、总步数等,进行复位。其中数据是用51单片机内部的伪eeprom来存储的,使得能够存储数据而不会因断电而丢失。 - 这也只是个初步的设计构思,后续升级也能使用oled屏幕、贴片单片机、以及增加蓝牙模块、wifi模块进行扩展。目前就介绍到这里。 - ![输入图片说明](7%E3%80%81%E8%AE%A1%E6%AD%A5%E5%99%A86/%E6%95%88%E6%9E%9C/%E6%95%B4%E4%BD%93%E6%AD%A3%E9%9D%A2.jpg) ![输入图片说明](7%E3%80%81%E8%AE%A1%E6%AD%A5%E5%99%A86/%E6%95%88%E6%9E%9C/%E6%8B%86%E5%BC%80.jpg) ![输入图片说明](7%E3%80%81%E8%AE%A1%E6%AD%A5%E5%99%A86/%E6%95%88%E6%9E%9C/%E8%83%8C%E9%9D%A2.jpg) ### 8.蓝牙家电控制8 - 这个项目呢,是那时智能家居兴起,我也做过挺多的无线控制的电路,那这次就跟着潮流做个简单的智能家居控制吧,使用的是蓝牙模块,发送命令控制家电。 - 原理:手机蓝牙连接电路板的蓝牙,通过蓝牙发给信息,信息经过规则编码的,所以在板子上能识别出不同的命令,根据命令执行功能。 - 这个项目设计有lcd1602显示屏,可以显示蓝牙发来的信息以及实时年月日时分秒。其中时间是通过与ds1302通信来保持时间的实时性,这个模块自带电池,所以板子断电不会导致时间丢失。还能通过蓝牙发送时间,从而直接修改板子的实时时间并存储到ds1302中。板子配有继电器和led灯,可通过蓝牙模块命令控制其开关。继电器继而控制家电是否通电工作。板子自带四个按键,分别单独控制继电器和led的状态。 - 实物图片: - ![输入图片说明](8%E3%80%81%E8%93%9D%E7%89%99%E5%AE%B6%E7%94%B5%E6%8E%A7%E5%88%B68/%E6%95%88%E6%9E%9C/%E6%AD%A3%E9%9D%A2%E8%BF%90%E8%A1%8C.jpg) ![输入图片说明](8%E3%80%81%E8%93%9D%E7%89%99%E5%AE%B6%E7%94%B5%E6%8E%A7%E5%88%B68/%E6%95%88%E6%9E%9C/%E6%8B%86%E5%BC%80.jpg) ![输入图片说明](8%E3%80%81%E8%93%9D%E7%89%99%E5%AE%B6%E7%94%B5%E6%8E%A7%E5%88%B68/%E6%95%88%E6%9E%9C/%E6%AD%A3%E9%9D%A2.jpg) ### 9.模拟停车场刷卡系统10 - 这个是看到学校停车场的实际操作,就打算制作一个来练练手,先是用仿真进行测试编写的代码,后续买来实物进行制作还是挺成功的。 - 构思:使用刷卡模块,读取到卡的卡号,模块通过SPI与单片机交互,得到车牌号信息后,蜂鸣器会响一下,打开闸门,通过红外对管传感器来判断车是进还是出(只有一个出入口,确实不太合理),判断为入则显示欢迎光临以及车库空位-1,反之汽车出库,就显示一路平安,车库空位+1。闸门状态有led进行指示。当有紧急事情需要打开闸门的时候,按下按钮,即可无条件打开闸门,直至解除按钮按下。 - 仿真部分,由于刷卡部分无法仿真,就是用串口发送特定格式数据,来模拟识别到的卡号,从而进行与真实情况下的仿真。 - 制作实物,先是找了RC522模块,不过在于单片机通信方面卡了很久,更换成FM1702模块。,通过自学的软SPI接口就能通信了,电路上构思好IO口的分布,在程序上对应起来。由于这个刷卡模块是3.3v供电的,所以还需要AMS1117进行5v降压到3.3v另外供电。整理凑合放在一块大的洞洞板上。 - 仿真图 - ![输入图片说明](9%E3%80%81%E6%A8%A1%E6%8B%9F%E5%81%9C%E8%BD%A6%E5%9C%BA%E5%88%B7%E5%8D%A1%E7%B3%BB%E7%BB%9F10/%E6%95%88%E6%9E%9C/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) - 实物图片 - ![输入图片说明](9%E3%80%81%E6%A8%A1%E6%8B%9F%E5%81%9C%E8%BD%A6%E5%9C%BA%E5%88%B7%E5%8D%A1%E7%B3%BB%E7%BB%9F10/%E6%95%88%E6%9E%9C/%E6%AD%A3%E9%9D%A2%E5%9B%BE.jpg) ![输入图片说明](9%E3%80%81%E6%A8%A1%E6%8B%9F%E5%81%9C%E8%BD%A6%E5%9C%BA%E5%88%B7%E5%8D%A1%E7%B3%BB%E7%BB%9F10/%E6%95%88%E6%9E%9C/%E6%8B%86%E5%BC%80.jpg) ### 10. 简易家居控制终端11: - 这个项目是制作一个手机远程控制家电的,不过是仿真练习的,就只做了终端,后续开发4G上网模块可通过串口连接51单片机,通过通信来实现控制。 - 原理:使用51单片机的IO高低电平功能,实现通过继电器来控制电饭锅、热水器、电灯等,通过控制步进电机来控制窗户窗帘的升降,达到开关窗的效果。同时通过两个光敏传感器、两个ds18b20温度传感器对前边4个设备闭环检测,确保有真正控制,同时又几个指示灯进行显示当前电器状态,以及在lcd1602直接显示实时状态。 - 代码逻辑中,对灯或窗帘的控制,只有检测到灯的光敏电阻是对应的状态,才会认为是控制成功;当开启电饭锅或热水器时,对应的温度传感器检测温度低于一定温度则认为是控制失败,直至温度是高的。同时将温度值显示在lcd1602上。 - 仿真图: - ![输入图片说明](10%E3%80%81%E6%99%BA%E8%83%BD%E5%AE%B6%E5%B1%85%E7%BB%88%E7%AB%AF-%E4%BB%BF%E7%9C%9F11/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 11. 打乒乓球系统20: - 能在单片机仿真中玩乒乓球吗?当然能了,所以有次好奇,就拿这个想法来做练习,还能较好的玩耍,只不过鼠标有些难玩。 - 设计:计划使用一排led,亮代表乒乓球的位置,在最左边和最右边时需要玩家各自按按钮来模拟击球,击中就会回弹,击不中就对手得分,当然需要加点声音增加氛围啦,每人五次发球机会轮流来。至于如何提示谁发球呢?就设计左右各1个led来提示。那分数总得有显示吧,就拿两个两位的数码管来显示。有些高手不过瘾,那就设计16个难度等级,可供选择吧。整体逻辑就很清晰了,那就编写程序吧。 - 仿真图: 实测在最难情况下,球速很快,鼠标很难反应,其他难度还能很好控制的。 - ![输入图片说明](11%E3%80%81%E6%89%93%E4%B9%92%E4%B9%93%E7%90%83%E7%B3%BB%E7%BB%9F-%E4%BB%BF%E7%9C%9F20/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 12. 两机远程控制21: - 这个呢,是想使用nrf24l01、蓝牙等这类远程遥控模块的,在仿真中就算了,因为很多是串口通信的,那就连起来当做远程控制吧。这次是打算一个做遥控器,一个做执行器,来控制执行器的设备运行次序,这里用led亮灭表示。 - 思路:遥控端呢,使用3x4的矩阵键盘,共有12个按钮来组合控制。同时配置有lcd1602进行显示状态。执行器有8位流水灯,可以直接看到执行效果,还有一个紧急按钮,使用的是外部中断0,按下就立即停止流水灯,短时间不受遥控器控制,同时通知遥控器,在lcd1602上显示状态。遥控器通过扫描矩阵得到按键信息,按下数字键再按*号就执行对应的功能。 - 仿真图: - ![输入图片说明](12%E3%80%81%E4%B8%A4%E6%9C%BA%E8%BF%9C%E7%A8%8B%E6%8E%A7%E5%88%B6-%E4%BB%BF%E7%9C%9F21/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 13. esp8266wifi控制23: - esp8266模块的热度升高,我也打算买外玩一玩,做个小项目。这次就做个通过这个wifi模块进行局域网模拟控制家电。 - 原理:这里没有更改8266的at固件,所以编程让51单片机使用AT指令一步一步设置wifi模块,让其开启AP模式,也就是热点,设置名字为esp8266和密码,配置器开启服务器,8080端口,获取当前esp8266的IP地址显示出来,此时手机打开wifi,连接wifi模块的,打开手机上网络调试助手,输入IP地址和端口,点击开启客户端,就能够跟8266连接上了,此时可以互相发送数据,这里就直接通过单片机的串口接收中断来解析对应的命令格式,根据命令来开关灯。 - 那时有时间,也有模块,就制作了实物,由于8266电源需要3.3v,单片机是5v的,所以需要一个降压模块,这里用ams1117降压。整体测试成功,能够通过命令分别控制两颗灯的亮灭。 - 实物图: - ![输入图片说明](13%E3%80%818266wifi%E6%8E%A7%E5%88%B623/%E5%AE%9E%E7%89%A9%E5%9B%BE.jpg) - 原理图: - ![输入图片说明](13%E3%80%818266wifi%E6%8E%A7%E5%88%B623/%E5%8E%9F%E7%90%86%E5%9B%BE.jpg) ### 14. 秒表计时汇编27: - 这个是之前好奇汇编语言,简单写了个秒表计时器程序,仿真没问题,焊接电路烧录代码也能正常运行,但汇编真的挺难读懂的,比c语言易读性差很多,所以后续也就不再碰汇编代码了。其实汇编代码也有好处,其运行速度比c语言快,一般在某些对时序要求很严格,单片机主频又不高的时候使用的。 - 这有流程图,设计思路也简单,就是开启定时器0计时,然后在大循环中通过数码管显示此时的秒数,同时判断两个按键,一个按键用于暂停继续,另一个按键用于清零重新开始。数码管是使用动态扫描的方式显示的。在汇编之下,逻辑也还有些难,在c语言下,这个逻辑就不难了。 - ![输入图片说明](14%E3%80%81%E7%A7%92%E8%A1%A8%E8%AE%A1%E6%97%B6%E6%B1%87%E7%BC%9627/%E6%B5%81%E7%A8%8B%E5%9B%BE.JPG) - 实物图: - ![输入图片说明](14%E3%80%81%E7%A7%92%E8%A1%A8%E8%AE%A1%E6%97%B6%E6%B1%87%E7%BC%9627/%E5%AE%9E%E7%89%A9%E5%9B%BE.jpg) - 仿真图: - ![输入图片说明](14%E3%80%81%E7%A7%92%E8%A1%A8%E8%AE%A1%E6%97%B6%E6%B1%87%E7%BC%9627/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 15. 串口音乐和弹琴29.37: - 电子琴是大家最熟知的了,当时也是感兴趣,就仿真制作一下,后续也制作了实物,可以通过串口在电脑通信弹琴,也可以通过蓝牙模块连接手机弹琴。 - 原理:一定频率的方波经过喇叭能发出声音,那么计算出标准的电子琴按键频率,就可以发出对应的按键声音了。加上音符间隔,就能有曲子可以听了。可以提前把音谱写进flash中,让其连续播放出来,就是电子音乐了,后来也优化代码,实现了根据串口命令来发出音符,这样就能够自己弹琴了。 - 这个项目呢,就设计了内置4首音乐,上电开机就能播放音乐,可以通过发送命令控制:abcd是播放4首对应的内置的音乐,可以通过s来停止播放,可以按p开始或继续播放,w命令来暂停播放,此音乐还能继续播。u是控制播放上一曲,会循环切换音乐的,d是下一曲。数字键1-8是播放对应的8个音符,这样的话就能够自己弹琴,自己决定音谱了。 - 实物图: 在实物中,为防止停止播放时,喇叭接电导致耗电也易损坏,就有留意不播放时为低电平。 - ![输入图片说明](15%E3%80%81%E4%B8%B2%E5%8F%A3%E9%9F%B3%E4%B9%90%E5%92%8C%E5%BC%B9%E7%90%B429.37/%E5%AE%9E%E7%89%A9%E5%9B%BE.jpg) - 仿真图: - ![输入图片说明](15%E3%80%81%E4%B8%B2%E5%8F%A3%E9%9F%B3%E4%B9%90%E5%92%8C%E5%BC%B9%E7%90%B429.37/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 16. 16x16点阵移动特效31.36: - 该项目也是当时看到点阵显示数字文字符号都很好奇,就决定自己仿真制作一个,也是练练手,还挺强大的。 - 原理:这个是利用人眼视觉暂留的,点阵其实是动态扫描的,也就是分很多时间间隙,每个间隙只对其中一排led进行显示操作,下一刻第二排操作,第一排灭,依次显示。因为刷新的很快,所以人眼看到好像是同时显示一样。这里使用51单片机进行控制,使用了最少的引脚控制16x16点阵的显示,仅用3个引脚而已。这也是利用了74HC595芯片的io拓展功能,让一个595能控制8个引脚,还可以级联,从而4个595控制32个引脚,刚好是横总向各16个。设计有六个按键来控制整体的显示特效切换。 - 这首先是使用全部引脚实现了对点阵的整体控制,以及多种特效的实现,了解了595控制原理,进行程序的移植,尝试了很多次,终于实现了,这样还能继续扩展显示更大的点阵。最上面的按键是控制切换显示内容的,下边5个按键,中间按键控制逐页显示特效的,就是显示内容逐个显示出来。剩下四个方向的按键是控制点阵内容上下左右平移特效的。显示内容中有长汉字、以及数字等,后续可继续开发。 - 仿真图:![输入图片说明](16%E3%80%8116x16%E7%82%B9%E9%98%B5%E7%A7%BB%E5%8A%A8%E6%98%BE%E7%A4%BA-%E4%BB%BF%E7%9C%9F31.36/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 17. 多功能电子钟32: - 这个呢,相当于以前那种普通电子手表吧,增加了一点新功能,动手写写代码来练习一下,主要是按键之间的逻辑控制会有些复杂,其他都还好。 - 原理:估计大家都知道吧?,使用51单片机对8位数码管动态扫描显示,实现时间闹钟等量的显示。通过单线协议与ds18b20通信可获得此时的温度值,通过五个按键来控制。按键1是模式,来控制显示的实时时间、闹钟时间、温度及秒表计时功能。在任意模式下都能按设置功能(按键2)进行设置,再按一次是确认。按键4和5是增加减少的按键。按键3是移位的按键,在设置时间、闹钟时候切换位数设置数值用的。其中闹钟可以设置是否开启。在秒表计时模式下,可以直接读取到温度值,按键2控制开始和暂停,按键3可以控制复位秒表计时数值。整体运行也还好,后续没空就没有制作成实物了。 - 仿真图: - ![输入图片说明](17%E3%80%81%E5%A4%9A%E5%8A%9F%E8%83%BD%E7%94%B5%E5%AD%90%E9%92%9F-%E4%BB%BF%E7%9C%9F32/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 18.宠物喂养系统33: - 这个是当时看到有类似的宠物喂养机在卖,还不是很实用,于是打算自己设计一个练练手,简单仿真一下,然后也制作了实物,这个逻辑代码会复杂一些。 - 原理:使用51单片机,通过数据io口和三位控制口来控制lcd1602显示内容,通过写好的函数能直接控制显示的内容。通过动态扫描矩阵键盘来获取键盘的按键信息。设计有0-9的数字按键和其他功能按键。按键11是显示限制的温度,可以按下设置按钮和其他数字按键,可用来设置最低和最高温度,用于限制宠物饮用水的温度判断的,可按sure/cancel来确认和取消。按键12是显示设置的闹钟,同样可以通过设置按键配合数字键设置,确认和取消按钮。同样可以设置此时的时间。 - 在循环中判断饮水温度,温度高则控制电机吹风,温度低则控制继电器加热,温度在范围内则属于正常,用led显示对应状态。当判断闹钟时间到时,另一个电机转动让食物落下,然后蜂鸣器响起,提醒宠物可以开饭了。然后设计30s后,蜂鸣器停止鸣叫,电机不转,这个可以根据实际设置时间长度,来控制下落的食物多少。 - 平时正常循环显示:此时的年月日时分秒跟闹钟时间、所设置的温度上下限。同时,改设计还能接串口,连接到蓝牙等模块进行无线控制。发送#开头*结尾的命令,单片机就能解析成对应的命令去执行,比如#t*就是让单片机回发实时时间,n是读取闹钟时间,c是读取此时室内温度,a和b控制散热器电机是否转动,e和f是控制蜂鸣器是否鸣叫,g和h控制粮食相关的电机是否转动。可以用"#200623122311*"指令来设置此时的实时时间:2020,6,23, 12:23:11。 - 实物图: 为方便焊接,就把lcd的一排数据口P0改为其他口p1,这样就不用给P0口焊接上拉电阻了。 - ![输入图片说明](18%E3%80%81%E5%AE%A0%E7%89%A9%E5%96%82%E5%85%BB%E7%B3%BB%E7%BB%9F33/%E5%AE%9E%E7%89%A9%E5%9B%BE.jpg) - 仿真图: 里边有高低版本的,低版本能被高版本软件打开。 - ![输入图片说明](18%E3%80%81%E5%AE%A0%E7%89%A9%E5%96%82%E5%85%BB%E7%B3%BB%E7%BB%9F33/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 19. 简易频率计34: - 此项目是看到网上有类似的题目,感觉很神奇,原来单片机也能测频率而不是高级设备,于是动手试一试。 - 原理:51单片机驱动lcd1602进行显示,通过信号从外部中断1引脚接入单片机,内部通过定时器及外部中断1来判断,经过一个周期即可确认到信号的周期,从而计算得到频率。这个缺点也有,就是峰峰值要接近工作电压5v,太低可能就没反应了,信号波形也是比较有限的。 - 具体不太记得了,也仅剩下hex文件也一些图片,代码、仿真找不到了,就这样发一下吧。 - 实物图: - ![输入图片说明](19%E3%80%81%E7%AE%80%E6%98%93%E9%A2%91%E7%8E%87%E8%AE%A1%E5%AE%9E%E7%89%A934/%E5%AE%9E%E7%89%A9%E5%9B%BE2.jpg) - 仿真截图: - ![输入图片说明](19%E3%80%81%E7%AE%80%E6%98%93%E9%A2%91%E7%8E%87%E8%AE%A1%E5%AE%9E%E7%89%A934/%E4%BB%BF%E7%9C%9F%E5%9B%BE.png) ### 20. 大量程电压采集35: - 这个项目是当时逛公众号有人课设是这个题目,于是我也打算制作一个能自动切换量程,精度能较高的电压采集表。也是自己大概的构思设计了如何达到自动切换量程电路和功能的。 - 设计过程:利用电阻网络,配合继电器来分压被测量电压,让测量电压达到ADC0832能测量的范围,再按电阻网络比例去计算原本的电压值。但如果一直都用大量程来测量的话,会导致较大的误差,特别是在测量低电压的时候。所以就简单设计了16.66:1、8.33:1、1:1的电路,以及组合起来的12.36:1四种量程,最后一个其实就是四个电阻两两并联得到的。(对应的电压测量最大值为:83.33v、42v、5v、61.81v)选用的电压读取芯片是adc0832,是8bit的,精度范围为0~255,对应0~5v,那就可以开始写程序了。先写好lcd1602显示的驱动,然后连接adc0832,同样写好驱动,接着就剩逻辑代码。先控制继电器对应的引脚,选择对应的量程,测量adc值,转化为电压,实际仿真确实存在误差,需要在软件中微调校正。4个量程都能较准确测量后,自动测量其实就是从大量程开始扫描,读取大概值,当电压值小于5v直接切换至不用分压电阻;其次当电压小于40v时,选用42v量程;其次当电压小于60v时选用61.81v量程。若都没符合就直接使用刚最大的量程读取的数值。这样能保证最多2次尝试即可选对量程测量。电压值读取后转化格式显示到lcd1602上。当然也要提醒超过最大量程,判断符合则控制蜂鸣器鸣叫。仿真中配置了电表,用滑动电阻调待测电压,可以进行直观的对比电压值。 - 仿真图: (由于间隔很久了,没有找到实物图) - ![输入图片说明](20%E3%80%81%E5%A4%A7%E9%87%8F%E7%A8%8B%E7%94%B5%E5%8E%8B%E9%87%87%E9%9B%8635/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 21. 农作物自动灌溉43: - 这个项目是模拟农作物大棚蔬菜那样的控制小系统,构思实现自动根据湿度值进行是否抽水灌溉,同时也可以通过按键控制,在数码管上显示湿度值和设置范围。 - 简单构思:首先是显示,这里用数码管来显示,显示了设置的湿度最低最高值,以及此时的实时湿度值,一同显示。湿度是通过SHT11模块进行读取的,两线协议。抽水机用水泵表示,这里就简单通过三极管控制大电流电机,同时加led指示状态。配置了5个按键,可以用于对湿度范围的设置。最后为了能让设置的湿度范围值能保存起来,使用了24c02存储。按键可分别为 确定、设置、移位、增加数值、减小数值。 - 关于代码:依次写好sht11、数码管的驱动、24c02的驱动,开机初始化,读取已存储的湿度范围值,通过定时器0中断刷新数码管显示,这是因为防止在按键交互的时候影响数码管的显示,导致体验不好。在主函数的大循环中,进行判断按键和显示细节的逻辑代码。进入设置后,对应的设置位能够闪烁显示,限制最低湿度需要比最高湿度低,按增减移位来设置全部,设置完点确认,就存储到24c02中,而剩余则判断湿度范围,进行水泵控制,同时也判断开关,在湿度范围内可手动控制水泵。 - 仿真图: - ![输入图片说明](21%E3%80%81%E5%86%9C%E4%BD%9C%E7%89%A9%E8%87%AA%E5%8A%A8%E7%81%8C%E6%BA%8943/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) ### 22. ws2812七彩台灯45: - 这个项目呢,是在18.4的led显示屏比赛后决定弄的,那时用avr控制ws2812灯带控制了七彩旋转屏幕,具备频谱显示功能的一个作品(具体可看avr项目中的第2条)。那时使用avr开发成本也比较高,烧录也不方便,而且在家有灯带和自学新的51单片机,那就试试做个七彩台灯吧。具备多种显示特效,也加了白灯、淡黄灯的控制,还能调节亮度,实用性会很高。 - 分析可行性:前期先分析一下,毕竟51单片机老一些的(比如stc89、stc90)基本是12T的,就是1个机器周期为12个震荡周期,所以在计算定时器等参数时,需要主频/12.而新出的stc12、stc15都可以1T了,速度可以比老的至少快12倍,在价格上,我觉得比avr的香~ 我找过stc89的驱动ws2812是否可行,找到文章(https://blog.csdn.net/yaleond/article/details/83474974)说使用其在24MHz晶振下,打开6T功能测试,可以驱动ws2812,这是机器周期是多小呢?我算出来是0.25us,驱动0.4us、0.85us的信号确实是很极限了。难以做更多的特效,于是我打算用STC12C5A60S2试试,在12MHz晶振下,机器周期为0.083us,理论是可行的,我就编写代码测试,后续发现好像不太对,用起来也是挺极限,有一定的通信出错率导致led闪烁其他颜色。后来分析可能是指令周期没理论那么小,也有其他指令运算花费太长时间的因素。更换为stc15w408as后,可运行选择33MHz主频,计算机器周期为0.03us,也是最后的版本,编写测试代码,成功带动灯带,可以展示很多种特效。 - 1.stc12的尝试:我这边有12Mhz晶振,就用上了,先按照数据手册编写好尝试代码:尝试用0/1码的方式循环发送同一个颜色的数据,逐渐调试高低电平中的nop()个数来达到延时的效果,多次尝试可以找到合适参数,封装成函数。当我打算用结构体存储一颗led的三种颜色数值,直接解析成每个位同事进行发送,发现异常,可能就是解析花费时间使通信时间改变。于是尝试将0-255数值对应的二进制数值存储到大数组中,这样就减少了解析过程,可直接寻址。但是char的256*8的数组,很大,只能存到flash中,可是,寻址读取也花费时间,所以写好函数后测试发现前1颗正常,其他都不行了。明显是读取flash速度限制。多次尝试其他方法,也忘了尝试什么了。最后是使用指针的方式读取flash数据,然后将最底层的发送码函数不用成函数调用,直接写到大循环中,终于能正常控制了,单色很正常,七彩也正常,但就是偶尔某颗灯闪一下,说明偶尔通信时序不对。我觉得有些极限了,也可能可以减小码的nop个数来抵消一些访问多消耗的时间,我就没打算尝试了。毕竟代码已不太方便开发了(为了速度),直接上stc15吧。 - 2.stc15的尝试:在这里,我可以选的更高的工作频率,内置的震荡电路。在这我也了解到可以使用sbit bit0 = LED_data ^ 0; 的方式来直接对应数据的位,免去解析运算,于是先编写好最底层的发送码函数,成功后,直接根据数据位发送,往外就是传入颜色的RGB值,提前从24bit数据中解析成3个颜色值放到缓存数组中,即可控制。尝试了22Mhz,还是不太行,为了稳定,选33Mhz。预置了7中常见的颜色,后续七彩灯动画就根据其来组合操作,编写了17种特效,包括旋转、呼吸灯、亮度调节、七彩流水等,这里就不一一介绍了。整体配置了5个按键,可控制工作还是待机,有对应的小led灯指示,工作时可以选择白色灯带、淡黄色灯带单独亮,或者都亮,可调节亮度。或者选择只亮七彩灯,七彩灯中可选择展示的不同效果,可以调节不同亮度、选择不同颜色等。功能性很强。若加上好看的外壳,那就可以作为产品了。 - 这个花费了我挺多时间的,也是在疫情在家没事干,来锻炼学习的,积累开发经验。 - 实物控制板: - ![输入图片说明](22%E3%80%81ws2812%E4%B8%83%E5%BD%A9%E5%8F%B0%E7%81%AF45/STC15W408AS/%E5%AE%9E%E7%89%A9.jpg) - 电路图: - ![输入图片说明](22%E3%80%81ws2812%E4%B8%83%E5%BD%A9%E5%8F%B0%E7%81%AF45/STC15W408AS/%E7%94%B5%E8%B7%AF%E5%9B%BE.jpg) ### 23. 简易智能药瓶46: - 做一个简单的药品提醒单片机,能够显示实时时间,可设置3个闹钟,设置对应的出药量,当闹钟到了就蜂鸣器提醒,然后按照设置转动电机,出对应数量的药品,半分钟后停止鸣叫。也能复位重新计数。 - 设计过程:使用的是lcd1602显示,实时时钟用ds1302模块获取,电机用小型步进电机,共3个。接上一个蜂鸣器,配合一些按键即可完成。首先呢,先写好lcd1602、ds1302驱动代码,我就直接移植以前写好的代码,步进电机也挺好控制的,直接根据每步编程,中间加上延时,成一个圈就能转动了,再根据不仅角度计算脉冲数,控制能转动一周的脉冲数驱动即可。再整合三个电机一个函数统一控制,就方便多了。时间闹钟用数组做缓存,开机各种初始化,欢迎界面后显示实时时间、有在运行的闹钟序号,通过按键可依次在正常显示、闹钟1、闹钟2、闹钟3循环显示和设置,进入设置闹钟则不显示已有时间,通过加减右移来设置闹钟时间、和药的数量,这里边逻辑会有点复杂,也限制了数值不超过一些时间规则,按确定后就回到正常显示界面。在工作中循环检测闹钟与实时时间,到了就间歇响蜂鸣器,屏幕有提示闹钟需要以及药片数量,同时控制对应的步进电机转动对应圈数。半分钟后停止提醒返回正常显示界面,闹钟会在接下来24h继续有效。这里使用串口通信来修改实时时间,毕竟刚开始是需要设置的,通过固定的格式发送,即可配置好时间同步到ds1302中并显示在lcd1602上。 - 实物图: (直接做了实物调试) - ![输入图片说明](23%E3%80%81%E7%AE%80%E6%98%93%E6%99%BA%E8%83%BD%E8%8D%AF%E7%93%B646/%E5%AE%9E%E7%89%A9%E5%9B%BE.jpg) ### 24. 光控路灯50: - 这次呢,打算模拟一下自动路灯,再增加一些人为可直接控制的按键。同时有个小屏幕进行显示状态。 - 设计过程:首先路灯需要有大功率灯泡,不过处于节约用电的构思,计划使用pwm来控制亮度,需要有晶闸管进行控制pwm来间接调节灯泡功率。而这个并不是简单的pwm即可,需要配合市电50Hz的交流电频率来的,否则灯泡会有时爆闪,网上资料说是需要检测0v电压位置再进行pwm调节的,在一个周期内调整导通占空比,即可不闪烁地调光。由于这部分电路涉及市电,安全考虑就买了一块晶闸管模块来控制(其实可以使用单片机,利用外部输入io检测进行的,但高压电没隔离感觉不太安全)。经过调试基本可以(模块有点小问题,某占空比下一场,所以仿真跟实物程序有所不同)。接着控制灯泡亮度的变量来自光敏电阻,则需要adc0809来读取光敏电阻,获取电压值来计算得到大概亮度值,光敏电阻值越小则代表越亮。亮则将灯泡亮度调小,省电使用。而且需要有人才亮,没人不亮,则需要人体热释放感应模块,检测到有人模块输出高电平,以此触发灯泡亮。通过lcd1602进行显示。也设计了手动控制按钮,按下后切换为手动控制,再按下换回自动模式。手动模式下,可直接调暗调亮灯泡进行测试。同时也支持将数据通过串口发送出来。 - 仿真图: - ![输入图片说明](24%E3%80%81%E5%85%89%E6%8E%A7%E8%B7%AF%E7%81%AF50/%E4%BB%BF%E7%9C%9F%E5%9B%BE.jpg) - 实物图: (暂时没找到实物图) - 电路原理图: - ![输入图片说明](24%E3%80%81%E5%85%89%E6%8E%A7%E8%B7%AF%E7%81%AF50/%E5%8E%9F%E7%90%86%E5%9B%BE.JPG) #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)