发帖数

50

原创数

50

关注者

12

阅读数

8965

点赞数

4

蔡琰

  • 8脚51单片机DIY时间显示+闹钟技术分享(四)

    软件设计

    前情提要:首先感谢大家能持续关注我的DIY闹钟的实现过程,前面分享了我的PCB设计过程,接下来就是拿到PCB板焊接程序调试了,开始的想法到慢慢实现,真的收获多多啊,接下来我还是主要分享我的程序设计思路,以及实现过程的坎坷。希望能给大家带来不一样的收获。学习总归是好的,变成自己的才是王道哈。


    具体思路和程序部分我也会陆续更新出视频,感兴趣的可以关注下哈~

    接下来就是我当时的设计初衷了,想要实现的功能,那就可以分模块来实现了。先把思路捋顺,事情会变得事半功倍的,还不会容易出错,到最后的调试也会变得轻松许多了。


    我们知道程序设计就是数据结构加算法,首先要有算法才能实现,那么算法的表示方法可以很多,主要我还是倾向于用流程图实现,就很直观了。那么接下来我会用流程图和实际程序部分来表述我的程序设计。

    1、程序主要实现的功能:

    1.jpg

    这就是在我最初设想下需要实现的功能模块。具体再根据想法一步步实现。蜂鸣器是要唱歌的,那么我放在了定时器中断内部处理了,后面讲原因哈。

    2、首先是初始化部分,一起来看下都需要初始化什么,

    2.jpg

    首先就是对单片机的初始化,比如平常我们用到的时钟配置等等。这个呢就是要研读我们的单片机数据手册了,不能想当然,选取了单片机数据手册要反复看多次呢,每款都是不一样的,除非你经常用一款,那么就方便多了,由于这款我是第一次用,所以还是要仔细些好。

    先看下对I2C管脚的配置,配置模式如下,

    3.jpg


    再有就是定时器的初始化了。后面的部分就是对每个模块的全局变量(所有全局变量我一般定义成结构体)初始化了。模块化逻辑清晰,方便扩展的。这里主要说下我的设计思路,具体实现可以关注视频部分哈。


    3、接下来就是每个功能模块具体的实现流程了,

    先看下显示处理模块,显示处理先来分析下当时需要实现的功能,

    一是正常时间的显示;

    二是对时间的设置,有小时和分钟的设置,会有闪烁;

    三是对报警时间的设置,有小时和分钟的设置,快闪(区别于时间设置);

    最后就是把不同模式下的数据显示出来。

    这样显得很清晰了,那么这里就可以用一个模式变量来进行判断当前状态就可以了


    4继续看下时间处理模块都有哪些功能需要实现,

    首先要读取时钟芯片的当前时间,

    二是判断是否是半点,蜂鸣器叫一声状态置位

    三是判断是否是整点,蜂鸣器叫两声状态置位

    四是读取报警标志,如果是当前报警时间,蜂鸣器唱歌状态置位。

    4.jpg


    4、最后就是按键处理模块,就是一个按键扫描和按键处理,是不是看上去挺简单的,最开始就跟大家介绍过这款数码管驱动芯片带按键处理的,芯片强大的不知道大家有没有看看呢。下面我们一起来看看特点吧

    5.jpg

    是不是真的很强大,按键也处理了,那么对于我们应用来说就直接扫描就够了,处理起来也方便太多了。

    接着看下按键处理,也就是对按键读取过来的实际应用了,这个按键我设计了四个,一个模式键,一个加值键,一个减值键,一个确认键。上图吧:

    6.jpg

    其实处理一定要有条理性,模块化,这样真的调试也会清晰很多。


    5、最后就是中断处理部分了,对于一些显示和按键的计数处理,定时器我配置的1ms;前面说蜂鸣器处理放在了定时器内部,这里说下我的原因,其实开始我是放在主循环的,后面加了蜂鸣器唱歌的部分,发现调调总是不对,这个确实让我调试了不少时间,后来经过示波器测试发现主循环时间过长,导致唱歌时间无法保证。所以我才把这个蜂鸣器的处理放在中断里面处理,具体这个蜂鸣器模块处理时间不长。话说这个是调试最多的部分了,一直纠结于音调和频率的问题,后来实际测试才发现是主循环长导致。


    6、下面来说下这个蜂鸣器模块,也是通过模式处理的,通过全局变量的当前模式处理不同的响声。因为我选用的无源蜂鸣器,那么就要看下它的响的频率,也就是PWM周期配置。

    对于唱歌的话还要去研究下歌曲的调、节拍、延长音等,一度觉得自己都是音乐的研究人了,哈。当然有同事的帮忙快速学了植入到程序内,这个也是难啃的骨头啊。如果有人对这块感兴趣可以看我的详细视频来了解下,话说不学音乐也不影响实现蜂鸣器的响啊,这个其实也是在研究单片机的PWM功能,也算长进不少啊。

    7.jpg

    这个就是我最终的结果了。

    做到这里程序设计的思路都分享完了,以至于我的闹钟DIY设计也实现了,其实纵观看下只要有条理,还需要细心,然后就都可以实现。大家看下我的设计有没有值得借鉴的地方或者有需要改进的,随时欢迎沟通交流。实现方法有很多,或者大家有更多更好的方法呢,欢迎来交流啊。后面会陆续更新其他小玩意的设计过程,感兴趣的持续关注吧。


    收藏 0 回复 0 浏览 65
  • USB与TTL通信之默契轨道---技术剖析(一)

    话说做这个转换的全隔离小模块也是因为自己做单片机软件设计那么多年,各种通信端口软件都做过,然而需要调试都会用到这些辅助模块来跟上位机通信,这个是最简洁的通信验证方式,那么这些小模块还是很容易坏的,好多时候都会赶在项目节点上突然故障,被迫停下赶紧采购,影响进度不说,还很影响调试产品的心情啊,所以才想去研究设计一个,自己做过的不是用起来也会顺手一些呢。


    首先开始分析实现流程,然后选取集成芯片等工作。

    开始了,那一起看下标题,我想要实现的是转换通信模块,那么需要一个转换芯片;还有就是全隔离,自然需要一个隔离芯片。这是大体方向,细节再慢慢实现下吧。


    1、既然是USB转,那么我直接用USB供电就好了,就不需要再外部供电了

    输入5V电,后端TTL也是5V;输入端加个保险丝,以及后面加的隔离芯片,都是为了保护电脑USB接口。输入端一般我会加一个LED灯,指示用的。

    1.png


    2、输入后的信号就开始进行转换了,我选用了CH340G转换芯片,附件可以自行查看下数据手册啊,如果对你其他项目有帮助可以查看下呢。

    信号线一般需要加个小电阻(10R够了)做防震荡作用,这个芯片工作起来需要一个晶振,晶振的起震电容设计就不用多说了吧,电源端部分还要有储能和滤波电容,这个也不用多说了吧,那么一起来看下转换端部分的设计原图:

    2.png


    3、信号转换后就是进行全隔离了,前面加保险丝的时候说明了隔离的作用,就是保护,有些时候我们也知道如果没隔离,对于我们的USB接口还是有不确定性的,接入的模块你不确定会不会有干扰,什么干扰,我觉得还是很有必要对这些频繁用到的模块加隔离比较稳妥,个人见解。

    对于隔离,除了信号还有电源和地的隔离,这才叫全隔离,那上图看下吧。

     

    3.png

    4.png

    另外输出部分有电源、地、信号发送接收了,输出是5V输出能力100mA,如果目标板电流过大,建议使用外部独立电源供电,使用外部独立供电时可不接5V,但必须要接GND,这个是要注意的。

    主要部分的设计就完成了,是不是觉得其他我们平时买的小模块内容也没想象中那么复杂,其实做任何设计都要选定芯片研读芯片手册,不管做软件设计也好,硬件设计也好,只是关注点不一样。当然还有一些是经验值。

    当我们熟悉了这些模块的设计,即便买来的碰到故障了不是很容易分析处理一下的,最起码不会影响工作进度的。多学点总归没错的。


    后面就开始设计PCB过程了,最后产品出来就可以通信使用了,每个过程都会有收获的,如果大家感兴趣的话就持续关注我吧。后面会陆续分享出我的设计视频过程,随时欢迎大家跟我来探讨,也让我可以开阔下思路,或许还有其他实现方式,不同的尝试过程才是经验积累成长的过程。


    收藏 0 回复 0 浏览 121
  • USB与TTL通信之默契轨道---技术剖析(二)

    前情提要:前面一篇说了我设计这个全隔离小模块的想法和原理图设计,那么接下来就说下我的PCB设计过程,有些需要注意的点,我经历的坎坷分享给大家,希望能有些值得借鉴的地方。

    对于PCB设计,虽然我设计的是个小模块,然而不能因为产品小就大意,每个产品都有它的特点,都有需要注意的地方,经验积累都是一点一滴开始的。


    首先是左进右出原则,左边是USB端口,右边是TTL端口。(当然这个根据个人喜好,我的原则就是接口在板边)

    导入后布局前首先就是设置规则,有了规则约束布局走线自然也顺畅些了,没规矩不成方圆。

    继续简单看下我的常规规则设置,


    1、间距的设置,常规间距我是配置0.2,敷铜间距0.5;根据实际需求设定。

    1.jpg 


    2、线宽的范围放大,推荐的一般我不会改变。

    2.jpg 


    3、孔径的大小我一般会把范围设置大点,个人调节不受约束。

    4、一些间距的设置一般我都会设置为0,布局以及走线靠个人把控,比如孔到孔的间距,最小阻焊的间距,丝印到阻焊的间距,丝印到丝印的间距等。这个都可以根据自己需要设置。

    规则设置好就开始布局了,布局过程遵循规则就可以了。

    因为全隔离,有隔离芯片加隔离电源,隔离的要分开,考虑敷铜的方便,所以在布局的时候把模块要摆放好。

    布局模块化先把位置放置好,USB端口已经说过了,接着看下转化芯片的放置,直接上图看下吧。

    3.jpg 


    接下来看下隔离部分的布局,前面说了因为全隔离,通过敷铜共地,然后就要考虑隔离部分器件的摆放。

    4.jpg 


    布局的过程也就对走线也考虑了,那么在走线的时候就可以顺利很多了。当然会有小的调整。

    大体就是这样的。

    走线主要注意的是线宽,常规都是推荐线宽就可以了,电源和地的部分还是需要宽一些,一般我用0.4mm。再有需要注意的一点是最后需要加泪滴效果,为了避免焊接线容易断。

    还有敷铜后需要加一些过孔,为了铜皮的电位平等。这些都是需要注意的点。丝印的调整,以及一些版本号,日期号的添加,这些都是很有必要的。

    这里分享下我的最终实现效果:


    5.jpg 

    到这里,这个全隔离小模块就实现了,其实并不难,后面就是打板事宜了,感兴趣的可以试着实现一下,真正的实践才是真的成长,后面我还会陆续分享我的视频实现过程,那是整个过程走了一遍,希望能给到大家一些值得借鉴的东西,还希望大家能多跟我交流和沟通。我陆续分享乌云踏雪系列的转换模块的实现过程,有视频,有文章,这个是乌云踏雪系列的C1AConnect),后面会实现更多。有兴趣的就持续关注下哈,如果有想实现的点子也可以跟我们交流,一起实现哈。

    收藏 0 回复 0 浏览 99
  • 女工程师跟你分享和嵌入式的不解之缘

    ①邂逅

    女汉子是从小挂在我身上的标签,身体好,性格直。然而报志愿也是听亲戚推荐然后选择了计算机,话说计算机是没有嵌入式以及单片机的,只会学些计算机的语言(偏上位机),大学的所有懒惰的美好(通宵打游戏,谈恋爱等等)都体验了一番才发现是要毕业了,突然意识到自己能去干点啥,就在这个时候学校有合作的嵌入式培训,起初也是想着就业去的,而且当时看到师兄做了个机器人,又会唱歌又会跳舞,太好玩了,这个真的是激起了我的兴趣。就这样开启了学习嵌入式以及单片机的路程~

    图片1.png 

    ②笨手笨脚的第一次

    单片机,ARM一系列课程,当时感觉真的可以收获颇丰,也不会很难的吧。兴趣满满的去上课,认识元器件,画原理图,看程序。简直眼花缭乱啊,自信被打去了一大半,开始怀疑人生了,不知道自己是否能学会,就这样结束了学习的第一课。

    图片2.png 

    ③越挫越勇,继续奋斗

    当一个人想认真做一件事的时候,你会发现潜力无限啊,韧劲也是无限的呢。认真起来的样子也是很可爱的,每天充实的生活,学习,什么都不想了。当你坚持下来之后,回头看看那些坚持是收获了太多。单片机就这样在曲折的道路上学完了,有时候学了会自信满满,有时候会在崩溃的边缘,然鹅这都被我强大的内心压下去了。

    想来学完单片机真的自己会设计东西吗,记得第一次做交通灯的时候那个兴奋劲,从原理图设计,到PCB,再到程序设计,虽然做出来了,其实现在想想当时并没有完全理解了。

    从此开始对各种电子小产品有了兴趣,拆拆装装,虽然不是每次都能完全对上,但总归让自己觉得一只脚踏入了智能社会了。哇,那个心情啊~

    其实每个知识点的学习都是垫脚石,除了坚持不懈,还要不断的学习,不断的实践,买来开发板自己研究,去网上搜集各种资料,从多次失败中总结经验,每次踩过的坑都是经验的积累过程,学习的过程不就是把知识变成自己的嘛,能灵活运用了才是真的学到了。

    图片3.png 

    ④心得

    作为一个女汉子我想对那些想接触单片机以及嵌入式的萌新说,我一开始也是被嵌入式做的产品吸引才学的,也做了无数次的实验,经历过无数次的失败,也担心不是科班出身还想做电子产品,被质疑的眼神以及话语再退缩了。

    开始找工作确实很没有底气,总是觉得自己不行,不敢投简历,不敢去面试,一段时间的低迷让我整个人有点没了方向。谁让我还算强大呢,即使是兴趣是最好的老师,那也离不开对爱好的不离不弃啊~汗水下面永远都是会夹杂点泪水的呢,笑到最后的永远都是靠坚持的。

    我只是想告诉大家如果对嵌入式感兴趣就一定去试试,不管结果怎么样,爱好就去接触下,没准就能爱了呢,会有很大收获的。

    大家一定要有个记录的好习惯,好记性不如烂笔头,记录不仅可以鼓励自己,还能留下你的拼搏奋斗的脚印。回头发现原来自己还能如此优秀。

    行走江湖,技艺可多但是需精湛,每个项目的磨炼,每个日夜的奋斗都会给你留下美好的回忆。同为爱好者,我们有机会可以一起畅谈人生,畅谈理想~

    收藏 0 回复 0 浏览 146
  • 轻松解码串口通信

    说到通信,在我们的生活方方面面体现的淋漓尽致,比如手机信号,WiFi等这些无线通信更是近些年热点,并且各种通信设备都出来了,真的是科技社会,对我们的生活太方便了。


    对于通信,我们今天聊一下串口通信,其实做过单片机的基本都会用到,即便没有外设需求,就单独拎出来做个调试助手也是好的,可以通过和电脑通信直接打印出你想要的信息,直观。

    常规的通信方式就类似下图这样,是不是看上去很简单~

    1.jpg 

    对于串口通信属于串行异步通信,有相应的协议,是不是读懂并遵守协议就可以通信了?不一定。哈,不要有疑问,一个模块的方方面面都要照顾到它才给你工作不是,如果你家养了一个小狗,你把狗粮都买好了,都倒在食盆里了,最后却忘记放到它能看到的地方,是不是会饿肚子了。属于前面的工作都是无效的。


    我们先来了解下串口通信的底层规则都有哪些,通用规则你熟知了,然后选用不同款的单片机来控制的时候要再去研读对应单片机模块的相关配置,这个是必备的技能了。

    接下来我们看下串口通信的格式:

    2.jpg 

    空闲位UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平
    起始位:开始进行数据传输时发送方要先发出一个低电平’0’来表示传输字符的开始。

    数据位:起始位之后就是要传输的数据,数据可以是56789位,构成一个字符,一般都是8位。先发送最低位最后发送最高位。

    奇偶校验位:数据位传送完成后,要进行奇偶校验,校验位其实是调整个数,串口校验一般分以下3种方式:
    1.无校验(no parity
    2.奇校验(odd parity):如果数据位中’1’的数目是偶数,则校验位为’1’,如果’1’的数目是奇数,校验位为’0’
    3.偶校验(even parity):如果数据为中’1’的数目是偶数,则校验位为’0’,如果为奇数,校验位为’1’

    停止位:数据结束标志,一般可以是1/1.5/2位的高电平。

    波特率:数据传输速率使用波特率来表示,单位bpsbits per second

    常见的波特率9600bps115200bps等等,其他标准的波特率是120024004800192003840057600。举个例子,如果串口波特率设置为9600bps,那么传输一个比特需要的时间是1/9600≈104.2us

    3.jpg 

    电脑端的配置就要做出同样的选择才能通信,所以往往如果你的产品是需要串口通信的话,最基本的产品手册就要把这些信息写上,否则通信不上。通信如果没数据,可以通过示波器来单独测试发送和接收端口数据进行分析。

    那么单个数据的规则有了,就是通信协议了,有自定义协议(方便定义,不方便客户开发)和标准协议(ModBus)等。话说如果自作产品端到端通信,那自定义协议就够用了,如果和外界通信,建议还是用标准协议,这样规则更强,方便扩展。

    4.jpg 

    对于标准协议ModBus,很多人还是会一知半解,如果有兴趣的话我可以单独拎出来一篇跟大家分享它的规则和使用方面的建议,毕竟我也算熟知,做了挺多产品的。附件我跟大家分享标准协议的相关规范文档,大家有兴趣记得下载去学习下。串口通信过程中碰到的层出不穷的问题可以和我交流啊,断帧,丢字节是常用的事,一般需要分段采集数据分析,发送接收状态寄存器的读取也有讲究的。对于不同的单片机我这里就不列举了,如果你有死结问题,可以一起分析哈~

    关注我们,单片机实际经验分享或许会带你走出调试死结。

    收藏 0 回复 0 浏览 306
×
蔡琰