单片机
返回首页

51单片机(十)—— 8位数码管-数码管扫描

2021-07-16 来源:eefocus

一、原理介绍

关于数码管的控制电路,在《51单片机(八)》中有详细的介绍,硬件电路如下图所示。

在这个实验中,我们对数码管进行扫描。在进行实验时,需要将单片机的P00~P07引脚与J44相连。接口的对应关系是(P00—D0),……,(P07—D7)。将单片机的P10和P11引脚与J45相连,P10与J45上的DM对应,P11与WM对应。


二、实例介绍

这个实验的代码如下所示


#include //包含头文件,一般情况不需要改动

 

#define DATA P0 //定义数据端口 程序中遇到DATA 则用P0口 替换

sbit DM = P1^0;  //定义锁存使能端口 段锁存

sbit WM = P1^1;  //定义锁存使能端口 位锁存

 

unsigned char BJTY_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0123456789

unsigned char BJTY_WeiMa[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

unsigned char m=0;

 

/********************************************************************/

/*                            延时函数                              */

/*               延时时间的计算对应单片机12MHz的晶振                */

/*            x为延时的ms数,例:x为10时,延时时间约为10ms          */

/********************************************************************/

void delay1ms(unsigned int x)

{

unsigned int i,j;

for(j=0;j for(i=0;i<123;i++);

}

/********************************************************************/

/*                              主函数                              */

/********************************************************************/

void main(void) 

{

for(;;) 

{

    DATA=0;           //清空显示以防重影

    DM=1;          //段锁存

    DM=0;

    DATA=BJTY_WeiMa[m]; //取位码 

    WM=1;    //位锁存

    WM=0;

    DATA=BJTY_DuanMa[m]; //取段码

    DM=1;    //段锁存

    DM=0;   

    delay1ms(2);    //延时2ms

   

    m++;

    if(m==8)    //检测8位扫描是否结束

    m=0;      //如扫描完成则从第一个开始再次扫描8位

}


将程序烧写到单片机中运行,效果如下所示。

 1、需要多位数码管显示不同数据时就需要用动态扫描。扫描的方式是,先点亮数码管的第一位,之后点亮第二位,并以此点亮其它位,点亮第八位之后,在转回来点亮第一位,如此反复点亮。动态扫描速度很快,由于人眼的视觉暂留,看到的效果是八位数码管都是同时点亮的。所谓“视觉暂留”是指人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。


由程序中可以看出,向数码管赋值一位数据后,延时2ms,


delay1ms(2);    //延时2ms


显示8位数据,总共耗时16ms,人眼的视觉暂留时间约为100ms,因此,虽然单一时刻只有一个数码管点亮,但是人看到的效果是8位数码管全部点亮,并且显示不同的数字。


2、if语句


        在这个程序中使用了if语句。


          if(m==8)    //检测8位扫描是否结束


                 m=0;      //如扫描完成则从第一个开始再次扫描8位


        这个if语句的作用是判断m是否等于8,如果是则,点亮了第八位数码管,则令m=0,下一个周期点亮第一位数码管。


        if语句可以构成分支结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种基本形式。


第一种形式为基本形式:


if(表达式)


语句


其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。其过程可表示为下图。

第二种形式为: if-else


if(表达式)


语句1;


else


语句2;


其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。其过程可表示为下图。

第三种形式为if-else if-else形式


前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else if-else语句,其一般形式为:


 if(表达式1)


语句1;


else if(表达式2)


语句2;


else if(表达式3)


语句3;



else if(表达式m-1)


语句m-1;


else


语句m;


其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句m。然后继续执行后续程序。if-else if-else语句的执行过程如下图所示。

关于锁存器的操作代码,可以参考《51单片机(九)》中的讲解。


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 锂离子/锂聚合物USB电池充电器

  • 6晶体管H桥

  • AVR LCD温度计—LM35

  • AVR PC步进电机驱动器

  • AVR温度计TCN75

  • JDM2 PIC 18F 编程器

    相关电子头条文章