单片机之基础编程 流水灯(二)

我们在知道STC-B板的焊接一系列过程之后,我们现在就将使用一系列的代码及原理来使用我们的板子,我们就最先来接触最简单的流水灯案例吧


流水灯案例

我们可以先来看
实验板图片

单片机之基础编程 流水灯(二)
界面如下:
单片机之基础编程 流水灯(二)
可看到串口号变为USB接口(若没有改变,自己查找自己对应的USB接口,否则检查线与板子是否插稳)
  • 打开程序文件(即选择我们刚下载好的hex文件)

    单片机之基础编程 流水灯(二)
    出现如下界面
    单片机之基础编程 流水灯(二)
  • 可同时观察到板子上的LED灯开始从右往左依次亮起

  • 后面的一系列工程都是如此来观察实验现象的
    知道了实验现象,激起了我们的兴趣之后,我们来了解一下其原理

    实验原理

    这一部分,我们不仅要了解部分接口,同时也要知道代码的含义及其编写,改进

    相关电路及工作原理图

    芯片引脚对应图
    (这幅图对于我们理解代码以及明白交互式有非常重要的作用)

    单片机之基础编程 流水灯(二)

    由实验现象可以知道,是从L7-L0依次闪烁的,而观察其电路图(上面第二幅图)P0 的八个接口对应了8个发光二极管L0-L7的阳极,而他们拥有共同的阴极,且通过反相器,其端口为P2.3,且信号为LED_SEL

    发光二极管具有单向导通性,(即阳极为高,阴极为0才会导通发光,然而有个反相器,故LED_SEL(P2.3)应为高电平)
    之后我们可以设置其P0的8个端口来设置哪个灯亮

    既然这样
    我们好好了解一下P0口的设置及工作原理吧!

    STC系列芯片有5组8位输入口,分别为P0到P5,其中P5口仅P5.0~P5.5用于输入输出。
    STC芯片的所有I/O口都可以配置为四种工作模式之一:

    • 准双向口/弱上拉
    • 推挽/强上拉
    • 输入/高阻
    • 开漏模式

    STC15系列单片机上电复位后为准双向口/弱上拉工作模式

    注意:
    每个I/O口的工作模式由2个控制寄存器中的相应位控制(PnM0和PnM1,n=0、1、2、3、4、5)。也就是说P0口的具体工作模式由P0M0和P0M1控制。
    可参看下表

    P0M1[1: 0]该寄存器地址为93H P0M0[1: 0]该寄存器地址为94H I/O口模式
    0 0 准双向口,灌电流可达20mA,拉电流为270微安,由于制造误差,实际为270-150
    0 1 推挽输出(可达20mA,要加限流电阻)
    1 0 仅为输入(高阻)
    1 1 开漏,内部上拉电阻断开,其模式即可读外部状态,也可对外输出(高或低电平),e.g.要正确读取外部状态或需要对外输出高电平,需外加上拉电阻,否则读不到外部状态,也对外不输出高电平

    具体模式说明:

    1. 准双向口
      真正的双向口指的是具有输入和输出两种模式的端口,在不同模式之间需要进行转换;如果从输入改为输出,需要对某些控制寄存器进行设定,才能完成
      51系列单片机的I/O口线在输入和输出之间没有明确的模式区别。相应端口在同样模式下,既可以作为输入,又可以作为输出。P3口除外,因为它需要连接外设
      51单片机的I/O口如果要读必须先写1才可以,因此称为“准”双向口
      需要大电流高电平输出能力的场合和高速场合不能使用该模式

    2. 推挽电路输入输出(push-pull)模式
      推挽电路的输出端好像有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。对负载而言,好象是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务
      该电路模式的主要作用是增强驱动能力,为外部设备提供大电流,可以直接输出高电平电压

    3. 输入/高阻模式
      仅用于输入

    4. 开漏电路
      I/O口的开漏就是没有连接上拉电阻

    故对于流水灯
    需要将P0的8个引脚和P2.3都设置为推挽输出

    案例代码

    下面解析其代码(我们后面将详细涉及其代码的编写)
    一个UV文件都涉及三个基础文件,但其放置的对应子文件夹不同,我们现在只解析.c版本的代码(因为我学的是C++)

    设计思路
    为点亮发光二极管

    1. 首先需要把P0口和P2.3设置为推挽输出,然后将P2.3置“1”,使能发光二极管电路(设置端口初始值
    2. 再对P0口赋值,即可点亮对应的led灯。
    3. 要实现“流水灯”的效果,则可以点亮一个led灯,等待一定时间,将其熄灭,同时点亮下一个led灯,然后如此一直循环下去,即能看到“流水灯”的效果。

    即需要三大函数(初始化设置端口,延时,主函数的永真循环
    可参照P0的工作模式表,编写这部分代码

    • 初始化
    • 延时函数
      在正式了解之前,我们需要了解单片机的周期,即与实时时钟的频率关系,这样我们才能换算出我们期望的延时是多少

    故我们先来了解单片机是如何控制延时的

    单片机工作时,是在统一的时钟脉冲控制下有序进行的。
    这个脉冲是由单片机控制器中的时钟电路产生的。
    时钟电路由振荡器和分频器组成,
    振荡器产生基本的振荡信号,然后进行分频,得到相应的时钟。振荡电路通常有内部振荡和外部振荡两种方式。
    STC15F2K60S2单片机内部集成高精度R/C时钟,工作时钟可以使用内部振荡器或者外部晶体振荡器(简称晶振)产生的时钟。外部振荡信号通过内部时钟电路,经过分频,得到相应的时钟信号。

    该图为外部震荡模式工作原理图

    单片机之基础编程 流水灯(二)
    该图可以更直观的帮助大家了解上述关系

    举个例子

    若MCS-51单片机外接晶振为12MHz时,则单片机的四个周期的具体值为:

    振荡周期=1/12MHz=1/12μs=0.0833μs

    时钟周期=1/6μs=0.167μs

    机器周期=1μs

    指令周期=1~4μs

    单片机晶体振荡器M的频率可以在4MHz~48MHz之间选择,典型值是11.0592MHz(因为使用这个频率的晶振可以准确地得到9600bits/s和19200bits/s的波特率)

    后面11.0592MHz这个数值我们将频繁遇到

    既然我们已经知道指令周期等数值,那如果我们期望延迟200ms,那是不是要通过计算才能确定我们代码实际需要执行多少次的空指令呢
    代码如下:

    不了解的人可能不能明白为啥200ms是这样的,也更不理解这是计算出来的结果

    故我们还是用高端一点的方式来实现延迟吧!

    单片机之基础编程 流水灯(二)

    看到这我们就恍然大悟啦,整个程序实现并不困难,那我们后面就慢慢接触难一点的代码原理,并尝试写出来吧!

    来源:我要糖

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2019年7月16日
    下一篇 2019年7月16日

    相关推荐