个人成就
- 发布了50篇内容
- 获得了4次赞同
- 获得了3次收藏
个人简介
擅长领域
暂时没有设置哦~
-
8脚51单片机DIY时间显示+闹钟技术分享(一)
最近因为家里闹钟被小朋友摔坏了,所以想着买来买去还是没什么新意,不如自己做一个,这样不是更有意义吗?那就开始吧,想着自己做就可以用最小资源来实现最大功能了,然后开始查找需要的芯片资料,平时时间显示我们最起码要有小时和分钟吧,那么最起码要四位数码管了,还要有按键来调整时间吧,那么对IO口的管脚就开始有要求了,虽然是时钟显示,但是想来还是觉得不想因为节约管脚来把按键变少再去处理组合按键或者长按的按键。然后就开始各种查资料,后来找到一款很好的芯片,I2C通讯,直接可以实现4位数码管和四个按键的处理(当然这我只用到四个按键,其实这款芯片可以实现同时进行28键的键盘扫描),哇,这也太好了吧,迫不及待上图分享给大家了,就是下面这款:

哇,功能好到真的跪了,太好用了,好用到没朋友啊。因为这款芯片我太喜欢了,我会把这个芯片的数据手册放在附件,有兴趣的可以下载看看,真的好用还省去很多IO口。
选到这款芯片,那单片机选型就自由了太多了,幸福感瞬间提升了,自己做时钟,要有个DIY的感觉,所以我选择把数码管全部换成LED(主要还有成本低哦),还有跟别人的东西不一样的感觉吧。然后既然我要做时间显示那么我就要选个时钟芯片的,既然显示和按键的选择了一个芯片实现,并且还是一个I2C接口,那同样时钟芯片我也选择了一款I2C通信的,那这样两个芯片用单片机的两个管脚就够了,是不是很省呢。既然要时间显示,如果单纯的时钟是不是很单调呢,最起码还要有个小闹钟吧,所以选择了一款带闹钟的时钟芯片,并且是I2C通信的,那这样时钟芯片也选好了,既然有闹钟,我就要加个蜂鸣器让它时间到了叫出来啊,不然怎么叫闹钟呢,这里我除了想到让闹钟报时滴滴的叫,还想到可以通过给蜂鸣器不同的频率让它唱歌呢,这里蜂鸣器我选择了一款无源蜂鸣器,这样蜂鸣器就只占用单片机的一个管脚也够了啊。现在的产品大多都是USB供电的,我也选择USB供电就可以了。到现在就只用了单片机的三个管脚,这样我就可以选择51(STC8G1K08A)单片机中8脚的就够了。那么想到这些觉得有些意思了,那我就可以慢慢来实现了。
其实别看我选的这些比较常用,还是挺简单的,这个看起来还是很容易实现的,起初我也这样想的,然而过程中并不是想象的那么顺利,还是踩了很多坑的。因为每个芯片都是有不同的特点,技术资料难免一次就能读透,还有就是会有点盲目的自信导致过程会有点曲折,所以还是要脚踏实地点好吧,我的曲折过程都会分享给大家,大体的器件选型好了,怎么实现呢,怎么做成我想要的东西呢,这个过程莫急,慢慢看我展示,主要会给大家分享避坑。
后面就开始设计原理图和PCB了,最后产品出来才开始程序的实现,每个过程都好玩又有收获的,如果大家也感兴趣的话就持续关注我这个DIY的实现过程吧。随时欢迎大家跟我来探讨,也让我可以开阔下思路,或许下个小玩意更有意思呢。
-
看完这篇,SPI其实也很简单嘛
首先我们来简单介绍一下SPI,SPI是串行外设接口(Serial Peripheral Interface),简单来讲就是它一种高速的,全双工,同步的通信总线。
那么被各种总线搞的晕头转向的人来说就会问了,为什么要弄那么多种总线?太难了。一会I2C,一会SPI;一会内部总线,一会外部总线。
碰到总线这样的字眼,千万别急,通过接触你会发现都有各自的特点,通过实践了你才会真正理解这些总线的用途,那么我们今天就来聊一聊SPI。
下面我们来看一下SPI的框图,我们从框图上来介绍SPI通信的原理
1. SPI传输需要有一个时钟,因为他是同步通信,所以连接引脚有串行时钟SCK
2. SPI以主从方式工作,通常有一个或者多个从设备连接。所以MOSI,M是主机,S就是从机,从机输入,所以叫MOSI,I就是input输入的意思,那么MISO也是一样的原理。
3. NSS就是片选,是SPI从设备是否被选中的,只有片选信号为预先规定的使能信号时(高电位或低电位),对此 SPI 从设备的操作才有效。如果从机没有被选中,主机发送数据从机是不会接收的。
4. Rx FIFO,Tx FIFO:发送缓冲和接收缓冲,当高速通信的时候,数据来不及处理就可以放在缓冲区里面,可以节省一定的时间去处理其他事情。
5. CRC controller:CRC校验,是一种数据检测方式。
6. Communication controller:SPI的主控模块,从框图中我们得到一些重点信息,就是关于寄存器的配置信息。时钟输出波特率受BR[2:0],这3个位来控制。
以上就是单片机整个的SPI通信的架构,只有这些配合工作才能实现SPI通信。单片机SPI一般作为主机工作,那么参数配置就需要从机的一些信息了。那么看到这里大家可能觉得这不算讲了SPI啊,我还不懂怎么应用啊,没关系,上面只是简单介绍,知道基本信息了再去实现不就容易多了嘛。
首先既然有时钟,那么就存在时钟极性的问题,既然有从机,那么可以根据从机的时钟极性来设置主机的,保持一致就好了,相当于相约好规则。
SPI的时钟极性(哪种电平状态是有效的):
CPOL为0的时候,空闲状态(不传输数据的时候)是低电平,CPOL为1的时候,空闲状态是高电平;两种时钟极性是相反的
其次时钟频率,波特率表示每秒钟发送多少位数据,可以根据波特率计算发送一位需要的时间。波特率由主机决定。
接着就是时钟相位,也就是时钟信号SCK的第一个边沿出现对应位置在数据传输周期的开始位置还是中央位置。是不是有点绕,那看图说话,直接理解了。
上面是开始位置,下面是中间位置,注意是第一个时钟信号的边沿啊。
这里还要注意就是时钟极性和相位主从机必须设置一致(如果从机是不可编程的,那么要根据从机时序决定)
那么对于从机来说是不是还要看个时序图,那什么是时序图?
就是根据时间做不同的动作,就是时序图会把大家搞晕吧。我们来看一个时序图:
根据上面对单片机SPI的分析,拿到这个从机的时序图你能分析出一些什么呢?
如果根据这个时序图让你来做模拟SPI通信,你是否可以实现呢?(平时设计项目或产品碍于各种问题不得不用普通管脚实现SPI通信,这是很常见的)
-
单片机漫漫学习路
当你在懵懂的年纪的时候,是否也对身边的新鲜事物感兴趣过?也试过很多超越想象的第一次?每个人都是在慢慢成长,有时候会碰到喜欢的事情留恋不已,回想起来是不是觉得当时也是对的?谁还没点回忆呢。谁都有过青春期,谁都有过抗拒学习的心理,那个时候觉得除了学习什么都是美好的。当你真正过了那个阶段,发现学习才能最好的武装自己,有的人会继续前行,把浪费掉的补上;有的人则会真的掉队了,去做了再也不能学习的路。
其实每个人都有自己的特长,当你发现自己的特长并发挥出来都算是成功的。并不是每个人都能考第一,不是每个人都要上清华北大才算是有出息。话说360行,行行出状元。每个人都要找准自己的定位,发挥了自己的优势,生活自然不会亏待你。
不管什么年纪,每个人都在调整自己的心态和眼界,每个人都在时间的长河里醒悟自己,及时调整自己,让自己能有个更好的状态。不管是什么岗位,都要保持积极向上的心态,保持让自己不断进步才是最佳状态。每天都很美好,每天伸手都能触碰到阳光,人生需要奋斗。
除了心态,还要有选择后的坚持,其实近几年智能化产品几乎都占领了大多市场,物联网正是火热,沉静下来,或许你也能找到自己的那一块发光发热的土地。
就拿单片机来说,说难不难,说简单不简单,学精了真的可以有自己的傲娇的小领地可以去施展一下的。
现在太多芯片厂商为了获取客户的依赖,做了很多底层的库函数,所以才会导致太多程序员要依附于他们的工具,依附于他们的库函数做产品,甚至连芯片手册都没碰过,觉得我能实现就好了啊,碰到问题百度好了呀。产品到了交付期,问题还很多,这个时候你焦急了没有?话说真的太多单片机程序员碰到过的。大环境所致,很少有人能静下来心来去研究单片机到底是怎么启动的?到底是怎么工作的?结构是怎么样的?只有碰到问题百感交集时才会觉得其实自己真的不懂单片机,只是会拷贝,会改动。真正从头到尾做过一个产品吗?从底层启动到寄存器配置到上层应用逻辑?话说真的绝大多数程序员没有做过的。
那么到最后是不是发现自己其实什么长进都没有,都在做修修补补的活了。跳槽是不是成了奢望了,想有跳槽的资本就要去做别人不会的,别人没做过的。比如单片机,很多人说我会啊,做项目做产品,可说到一些基本的单片机操作又慌乱了。
如果你尚且有些梦想,如果你是在做单片机软件程序工作,请一定要去把它的原理搞懂,从底层一步一步去实现一下,工程都是从小到大的,当你碰到很多困难还继续前行了,那等待你的肯定是更多的机会。你付出了多少的汗水都会有多少的收获等着你的。只要努力了坚持了,那么看到的风景都是不一样的。加油吧打工人,我们都会更好的~
-
USB令牌包
上一篇文章我们介绍了数据包的结构以及传输过程,提到了令牌、数据、握手、特殊等等专业的名词,后面的文章我们来一个一个详细介绍一下他们,今天我们先来介绍令牌包。
令牌包用来启动一次USB传输。因为USB是主从结构的拓扑结构,所以所有的数据传输都是由主机发起的,设备只能被动地接听数据(唯一的例外是支持远程唤醒的设备能够主动改变总线的状态让集线器感知到设备的唤醒信号,但是这个过程并不传送数据,只是改变一下总线的状态)。这就需要主机发送一个令牌来通知哪个设备进行响应,如何响应。
令牌包有4种,分别为输出(OUT)、输入(In)、建立(SETUP)和帧起始(sOF Start Of Frame).
>输出令牌包用来通知设备将要输出一个数据包。
>输入令牌包用来通知设备返回一个数据包。
>建立令牌包只用在控制传输中,它跟输出令牌包的作用一样,也是通知设备将要输出一个数据包,两者的区别在于: SETUP令牌包后只使用DATA0数据包,且只能发到设备的控制端点,并且设备必须要接收,而OUT令牌包没有这些限制。
>帧起始包在每帧(或微)开始时发送,它以广播的形式发送,所有USB全速设备和高速设备都可以接收到SOF包。USB全速设备每毫秒产生一个帧,而高速设备每125s产生一个微帧USB主机会对当前帧号进行计数,在每次帧开始时(或者微帧开始时,每毫秒有8个微帧,这8个微帧的帧号是一样的,即相同的SOF)通过SOF包发送帧号。SOF中的帧号是11位的。在4个令牌包中,只有SOF令牌包之后不跟随数据传输,其他的都有数据传输图1.9.2是SOF令牌包的结构。
每个令牌包,最后都有一个CRC5的校验,它只校验PID之后的数据,不包括PID本身,因为PID本身已经有4个取反的位进行校验了。
图1 SOF令牌包的结构图
图1.9.3是OUT、IN、 SETUP令牌包的结构。它们具有同样的结构:同步域、包标识域、地址域、端点域、CRC5校验域和包结束。其中,地址域是要访问的设备的地址,端点域是要访问的端点号(还记得前面说过的教学楼模型吗?回忆一下地址和端点的概念);CRC5校验只计算PID之后的地址域和端点域,而不包括PID。前面说过,数据在总线上传输时,每个域的LSB在前,请记住这一点。例如,7位地址在总线上传输的先后就是A0、A1、A2、A3、A4、A5、A6。
图2 OUT IN SETUP令牌包结构图
上面就是令牌包的全部介绍了,大家对令牌包有一个认识了吗?
-
8脚51单片机DIY时间显示+闹钟技术分享(四)
软件设计
前情提要:首先感谢大家能持续关注我的DIY闹钟的实现过程,前面分享了我的PCB设计过程,接下来就是拿到PCB板焊接程序调试了,开始的想法到慢慢实现,真的收获多多啊,接下来我还是主要分享我的程序设计思路,以及实现过程的坎坷。希望能给大家带来不一样的收获。学习总归是好的,变成自己的才是王道哈。
具体思路和程序部分我也会陆续更新出视频,感兴趣的可以关注下哈~
接下来就是我当时的设计初衷了,想要实现的功能,那就可以分模块来实现了。先把思路捋顺,事情会变得事半功倍的,还不会容易出错,到最后的调试也会变得轻松许多了。
我们知道程序设计就是数据结构加算法,首先要有算法才能实现,那么算法的表示方法可以很多,主要我还是倾向于用流程图实现,就很直观了。那么接下来我会用流程图和实际程序部分来表述我的程序设计。
1、程序主要实现的功能:
这就是在我最初设想下需要实现的功能模块。具体再根据想法一步步实现。蜂鸣器是要唱歌的,那么我放在了定时器中断内部处理了,后面讲原因哈。
2、首先是初始化部分,一起来看下都需要初始化什么,
首先就是对单片机的初始化,比如平常我们用到的时钟配置等等。这个呢就是要研读我们的单片机数据手册了,不能想当然,选取了单片机数据手册要反复看多次呢,每款都是不一样的,除非你经常用一款,那么就方便多了,由于这款我是第一次用,所以还是要仔细些好。
先看下对I2C管脚的配置,配置模式如下,
再有就是定时器的初始化了。后面的部分就是对每个模块的全局变量(所有全局变量我一般定义成结构体)初始化了。模块化逻辑清晰,方便扩展的。这里主要说下我的设计思路,具体实现可以关注视频部分哈。
3、接下来就是每个功能模块具体的实现流程了,
先看下显示处理模块,显示处理先来分析下当时需要实现的功能,
一是正常时间的显示;
二是对时间的设置,有小时和分钟的设置,会有闪烁;
三是对报警时间的设置,有小时和分钟的设置,快闪(区别于时间设置);
最后就是把不同模式下的数据显示出来。
这样显得很清晰了,那么这里就可以用一个模式变量来进行判断当前状态就可以了
4、继续看下时间处理模块都有哪些功能需要实现,
首先要读取时钟芯片的当前时间,
二是判断是否是半点,蜂鸣器叫一声状态置位
三是判断是否是整点,蜂鸣器叫两声状态置位
四是读取报警标志,如果是当前报警时间,蜂鸣器唱歌状态置位。
4、最后就是按键处理模块,就是一个按键扫描和按键处理,是不是看上去挺简单的,最开始就跟大家介绍过这款数码管驱动芯片带按键处理的,芯片强大的不知道大家有没有看看呢。下面我们一起来看看特点吧,
是不是真的很强大,按键也处理了,那么对于我们应用来说就直接扫描就够了,处理起来也方便太多了。
接着看下按键处理,也就是对按键读取过来的实际应用了,这个按键我设计了四个,一个模式键,一个加值键,一个减值键,一个确认键。上图吧:
其实处理一定要有条理性,模块化,这样真的调试也会清晰很多。
5、最后就是中断处理部分了,对于一些显示和按键的计数处理,定时器我配置的1ms;前面说蜂鸣器处理放在了定时器内部,这里说下我的原因,其实开始我是放在主循环的,后面加了蜂鸣器唱歌的部分,发现调调总是不对,这个确实让我调试了不少时间,后来经过示波器测试发现主循环时间过长,导致唱歌时间无法保证。所以我才把这个蜂鸣器的处理放在中断里面处理,具体这个蜂鸣器模块处理时间不长。话说这个是调试最多的部分了,一直纠结于音调和频率的问题,后来实际测试才发现是主循环长导致。
6、下面来说下这个蜂鸣器模块,也是通过模式处理的,通过全局变量的当前模式处理不同的响声。因为我选用的无源蜂鸣器,那么就要看下它的响的频率,也就是PWM周期配置。
对于唱歌的话还要去研究下歌曲的调、节拍、延长音等,一度觉得自己都是音乐的研究人了,哈。当然有同事的帮忙快速学了植入到程序内,这个也是难啃的骨头啊。如果有人对这块感兴趣可以看我的详细视频来了解下,话说不学音乐也不影响实现蜂鸣器的响啊,这个其实也是在研究单片机的PWM功能,也算长进不少啊。
这个就是我最终的结果了。
做到这里程序设计的思路都分享完了,以至于我的闹钟DIY设计也实现了,其实纵观看下只要有条理,还需要细心,然后就都可以实现。大家看下我的设计有没有值得借鉴的地方或者有需要改进的,随时欢迎沟通交流。实现方法有很多,或者大家有更多更好的方法呢,欢迎来交流啊。后面会陆续更新其他小玩意的设计过程,感兴趣的持续关注吧。
