天天看点

51单片机学习笔记【三】——数码管实验

数码管基础:

  • 数码管由八个发光二极管组成成“8“字型,按极性分为共阴极数码管(阴极链接在一起)和共阳极数码管(阳极连接在一起)。本实验采用的是共阳极,若要亮,则相应位置0,即为低电平。
    51单片机学习笔记【三】——数码管实验
  • 可以通过给数码管引脚置值来控制亮和灭,显示不同的图案,如下图所示
    51单片机学习笔记【三】——数码管实验
    共阳极数码管再进行取反操作便可以显示相同的图案。

一.静态数码管实验

1.电路原理图

51单片机学习笔记【三】——数码管实验

2.说明:实验中使用P0口控制,用排线接P0口和JP3.让数码管依次显示0-9。

3.源代码如下:

/***********************************************
   > File Name: 静态数码管
   > Author: pengshp
   > Mail: [email protected]
   > Date: 2015年 7 月 17 日
*************************************************/

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_DIG P0
uchar code DIG_CODE[]={,,,,,
                         ,,,,};//显示0-9的值
void Delay(uchar);
void main()
{
    uchar i;
    while()
    {
        for(i=;i<;i++)           //依次显示0-9
        {
            GPIO_DIG=~DIG_CODE[i];
            Delay();             //延时处理
        }
    }
}
void Delay(uchar x)
{
    uint a,b;
    for(a=x;a>;a--)
    {
        for(b=;b>;b--)
        {
        }
    }
}
           

备注:程序中的code关键字表示将数据存储在程序存储空间(Flash)中,以节约RAM的空间,存储的数据只能读不能写入。

二.动态数码管(不带译码器)

1.电路原理图

51单片机学习笔记【三】——数码管实验

2.说明

  • 本实验通过控制八个数码管分别显示0-7个数字,使用的数码管为共阴极,即要亮时把相应位置1,输出高电平。接线为JP10(P0)接JP12,JP8接JP16右排(注意:有金属触电的一排朝右),再把JP165断开。

3.源代码如下

/**************************************
  >File Name: 动态数码管显示
  > Author: pengshp
  > Mail: [email protected]
  > Date: 2015年 7 月 17 日
***************************************/

#include<reg51.h>
#define GPIO_DIG   P0   //段选
#define GPIO_PLACE P1   //位选
#define uchar unsigned char
#define uint unsigned char

uchar code DIG_PLACE[] = {,,,,
                           ,,,};//位选控制   查表的方法控制
uint code DIG_CODE[] = {,,,, //0、1、2、3
                          ,,,, //4、5、6、7
                          ,,,, //8、9、A、B
                          ,,,};//C、D、E、F
uchar DisplayDate[]=; //存放要显示的8位数字
void DigDisplay();
void main()
{
    uchar i;
    for(i=;i<;i++)
    {
        DisplayDate[i]=DIG_CODE[i];
    }
    while()
    {
        DigDisplay();
    }
}

void DigDisplay()
{
    uchar i;
    uint j;
    for(i=;i<;i++)
    {
        GPIO_PLACE = DIG_PLACE[i];   //发送位选,控制要亮的数码管
        GPIO_DIG = DisplayDate[i];   //发送段码,显示相应的数字
        j = ;                      //扫描间隔时间设定
        while(j--); 
        GPIO_DIG = ;             //消隐
    }
}