我第一次跑起跑马灯程序的时候开心的像个两百斤的孩子

2022-05-11     大方老师单片机

原标题:我第一次跑起跑马灯程序的时候开心的像个两百斤的孩子

第一次跑起跑马灯程序的时候开心的像个两百斤的孩子

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免费的,私信我就可以~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比///

单片机底层思_硬件电路与寄存器编1

以控制灯跑马灯为例,思考硬件电路与寄存器编程的关系

最一般的实现跑马灯的电路如下

从任意单片机引出四个GPIO功能的引脚引出来GPIOGeneral Purpose Input Output是经典的实现设置输出电平,检测捕获输入电平的硬件电路。

GPIO口与电阻LED灯连接,共同连接在接地端。

如果想实12342134灭,类似这样的跑马灯功能,该如何实现呢?

如果是我来做这些事,首先我会把第一个电路接VCC上,然后其他电路都接在地上,这样一路电路有了压LED亮了,其他没有,就灭了,然后我再把一路接地,二路VCC,就实现了一个跑马灯的动画效果。

好像下图这样

以此类推,只要我不停的换连导线,就可以完成这样的动画效果了。

但是这样好麻烦,我不想一直不断的机械做这些事,可以花更多的时间在散步读书上才对。

所以我特别希望改进这个电路,仔细观察,找到规律

如果1代表导线接VCC0代表接地,那么顺序应该是

1000 -> 0100 -> 0010 -> 0001 ->1000

能不能有什么设备帮助我们换连导线呢?

这里有两个思路,第一个使用经典的数字电路,移位寄存器,用逻辑门啥的,在时钟信号的驱动下帮我们切换导线连接方法。

那么第二个思路就是用单片机啦!单片机那可比简单的数字电路厉害多了。

单片机GPIO设备有好几种工作方式,按照其工作的特点来看可以分/输入两种模式。

当我们需要单片机去感应外部电平的时候,我们会把它设置在输入模式,当然现在在我们希望他能输出特定的电压,所以设置他为输出模式。

单片机是一个大黑盒子,里面的原理很深奥很复杂,但是幸运的是,设计单片机的人,给我们提出了寄存器的概念,这样我们就不需要理解复杂的电路原理,就可以完成特定的功能操作了!

例如,选GPIO口为输出还是输入,其切换电路可以抽象成这样

P0SEL寄存器BIT0的数值1的时候P0.0口硬件与一大片输出相关电路相连,也就是说此P0.0口是处于输出功能状态下,反BIT0为数0则与一大片输入相关电路相连。其底层的原理大概是利用三极管开关特性完成的吧!无论如何我们配置寄存器,就完成了开关的操作,选择了怎样的电路与我P0.0口连接!

值得高兴的是GPIO一系列的寄存器里,我找到了切换输出电平的寄存 P0OUT寄存器,我抽象的思考这样寄存器应该是这样的。

当我P0OUT的最低位写1的时P0.0VCC连接,写0的时P0.0GND连接。大底是这样思考的。

于是我惊喜的发现,单片机可以帮助我实现切换导线连接这样的事情。

于是我用MSP430单片机,P0.0 P0.1 P0.2 P0.3接在了上述的电路上。

写下了这样C代码

int main(void){

unsigned char led_flash_pos=0x01;

Basic_init(); //基础配置

P0SEL = 0x0f;//P0SEL寄存器低四位1,使得硬件电路与输出相关电路相连

Loop:

if(led_flash_pos == 0x10)

led_flash_pos = 0x01; //限制左移范围

P0OUT = led_flash_pos;

DELAY_S(1); //1S让眼睛看到现象

led_flash_pos </计算机算法,左移操作

goto Loop;//循环

}

可以有非常花哨的写法,但是最底层的操作就是配P0OUT这个寄存器,单片机编程所有对硬件的操作都是对寄存器的操作,我们无需对底层硬件有太多深奥的理解,就可以完成操作!

作者思考:

分工的时代,如果认真深入的去了解学习单片机最底层的硬件原理的话,那会消耗大量的时间和精力,成为一名优秀的软件开发工程师的话,对底层硬件有一定的理解就好,更多精力花费在对代码数据结构,算法的优化,例如P0OUT这个寄存器,何时写他,怎么写他,写多少比较合适,这都是需要考虑的事情,还有就是延时的时间是否过长,用定时器延时比较好,还是用阻塞延时比较好?另外,怎样的跑马灯动画更好看?很多可以编程的花样!

记得笔者第一次跑起跑马灯程序,兴奋的写了好多衍生代码,例如隔着一个灯闪烁,快速闪烁,等等,好像往你手上塞了好多好多乐高积木(寄存器),你可以任意的搭接

文章来源: https://twgreatdaily.com/zh-hans/485fe6b8a5335fd33b437745bab2f488.html