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

一、原理介绍

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

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

二、实例介绍

        这个实验的代码如下所示

#include<reg52.h> //包含头文件,一般情况不需要改动

#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<x;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单片机(九)》中的讲解。

 

 

发布了78 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104346447
今日推荐