普中89C52RC-X90C单片机详解:江协笔记第三版

第四节的内容为控制数码管,现在博主找到了89C52RC的电路详解,请感兴趣的读者移步在

剑鞘的流苏的STC89C52RC单片机原理图详解-CSDN博客。

前面两节的电路图我将在之后更改,电路图如无错误将引用上述博客的电路图,差异图将另行标注,感谢理解。

本节使用的数码管为共阴极数码管,说人话就是单个数码管中的发光二极管共接在负端上,图片引源B站,从上图原理图看,公共端即所接负端。

数码管讲解_哔哩哔哩_bilibili。

根据数码管端abcdefgdp的电位高低确定二极管是否会亮,dp为小数点,abcdefg为每个发光二极管的控制亮灭,如abcdefg端为1111110,dp为0则数字显示为8。

不同于单个数码管,博主所用单片机数显上并有四个数码管,江协中的视频给出了这种数码管的内部接线,从图中可以看到因为加电后四个数码管在一条线上,中间没有独立的控制分闸,想要控制某一个数码管不显示的信息只能在公共端(共阴极)上加一个高电平使二极管电压反向,所以公共端的存在是为了控制特定的数码管能不能亮。

搞清楚电路后剩下的问题就是控制数码管上每一路的通断来显示数字,到此就会有人问,那负载加的都在一条线路上让灯亮,不得都显示一种数字吗,有没有什么手段让亮起的数码管显示不同的东西。

有的,兄弟,有的,这里就用到了快速扫描作用,人是一种很神奇的生物,只要一个灯闪的足够快(如oled手机),眼睛看灯就是常亮,数码管显示不同的数字其实就是不同负载快速周期地加在abcd…与公共端上快速显示每个数字喽。

基本的运行原理搞懂了,那么现在我们来讲如何控制,首先,数码管的引脚非常多,此时如若让单片机直接控制明显引脚不够分,需要辅助芯片74LS与74HC,74LS138译码器的作用在于通过控制单片机P22 P23 P24端口的电平向ABC输入二进制数,之后会转换为10进制数0~8控制Y0~Y7上的电平达到控制COM的作用(公共端的目的),启动为0,在此我默认未改时均为11111111。

如图所示74HC245的作用要从引脚的作用讲起,从图中看,A0~A7与B0~B7端口的电平状态一一对应,与剑鞘的流苏中对于74HC125的输出电压存在不同,参考了b站的推挽 开漏 高阻 这都是谁想出来的词??_哔哩哔哩_bilibili的解释,MCU的电压输出属于弱上拉,上拉电阻大,即电流小导致驱动力小无法稳定地让数码管进行快速扫描,也就是说电压的周期变化波形无法满足快速扫描的需要,此时需要芯片处理输入的型号并输出更大的电流以来达到驱动数码管的目的;LE的输出0/1决定DIR控制AB谁输出谁输入;DIR上引脚的0/1影响芯片上A与B谁是输入谁是输出,因为LE接的是正端,所以DIR的状态控制在A到B,OE为使能。

上代码!

#include <REGX52.H>
#include <intrins.h>

void Delay10ms()        //@11.0592MHz
{
unsigned char i;

    _nop_();
    i = 43;
    while (–i);
}

void main()
{
        int i;    
    int arms[8][3] = {
        {0, 0, 0},
        {0, 0, 1},
        {0, 1, 0},
        {0, 1, 1},
        {1, 0, 0},
        {1, 0, 1},
        {1, 1, 0},
        {1, 1, 1}
    };
    unsigned char p0_values[8] = {0x07, 0x3f, 0x4f, 0x3f, 0x6b, 0x5b, 0x07, 0x5b};

    while(1)
    {
        for (i = 0; i < 8; i++)
        {
            P2_2 = arms[i][0];
            P2_3 = arms[i][1];
            P2_4 = arms[i][2];
            P0 = p0_values[i];
            Delay10ms();
                      P0=0X00;
        }
    }
}

与江协中的代码不同,本次使用的是自定义延迟函数,二维数组,for循环赋值的组合,读者如果不懂可以先去自行了解一下,简单介绍一下,二维数组是建立一个8行3列的表,每个格子里是一个数字,p0_values是数组,是一个单行8列的数据条,每个格子里面一个数字,此处for循环与新版visual studio中不同,i并没有在此处声明int类型而是在void main函数最前方声明,这是因为博主使用的for中如果对i进行数据类型定义会警告,需要在最前方先声明才行,for循环在此的作用就是,给i一个初始值,当i符合第二个条件时,执行{}中的代码后再让i自加1,在回到第二个条件句,符合再执行{}内,i再自加,再回到第二个条件,直到i在执行到7后自加为8不符合i<8后跳出循环,P0=0X00的作用是为了消影,重置灯的状态,既防止前一段的灯亮余辉影响新数字的展示效果。

第二部分视频内容江协讲了一下单片机(MCU)的运算资源利用优化,像数码管这类针脚较多的元件要让MCU一个个控制需要浪费掉大量的接口与运算能力,为了节省可以在MCU与数码管之间加一个扫描芯片,MCU只需要告诉它需要显示什么他会自己设置并进行快速扫描。

作者:gyhkjp

物联沃分享整理
物联沃-IOTWORD物联网 » 普中89C52RC-X90C单片机详解:江协笔记第三版

发表回复