当前位置: 代码迷 >> 单片机 >> 51单片机学习笔记【3】——数码管实验
  详细解决方案

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

热度:394   发布时间:2016-04-28 14:42:08.0
51单片机学习笔记【三】——数码管实验

数码管基础:

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

一.静态数码管实验

1.电路原理图

静态数码管

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 P0uchar code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,                         0x6d,0x7d,0x07,0x7f,0x6f};//显示0-9的值void Delay(uchar);void main(){    uchar i;    while(1)    {        for(i=0;i<10;i++)           //依次显示0-9        {            GPIO_DIG=~DIG_CODE[i];            Delay(800);             //延时处理        }    }}void Delay(uchar x){    uint a,b;    for(a=x;a>0;a--)    {        for(b=2000;b>0;b--)        {        }    }}

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


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

1.电路原理图

动态数码管

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 charuchar code DIG_PLACE[8] = {0xfe,0xfd,0xfb,0xf7,                           0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制uint code DIG_CODE[17] = {0x3f,0x06,0x5b,0x4f, //0、1、2、3                          0x66,0x6d,0x7d,0x07, //4、5、6、7                          0x7f,0x6f,0x77,0x7c, //8、9、A、B                          0x39,0x5e,0x79,0x71};//C、D、E、Fuchar DisplayDate[8]=0; //存放要显示的8位数字void DigDisplay();void main(){    uchar i;    for(i=0;i<8;i++)    {        DisplayDate[i]=DIG_CODE[i];    }    while(1)    {        DigDisplay();    }}void DigDisplay(){    uchar i;    uint j;    for(i=0;i<8;i++)    {        GPIO_PLACE = DIG_PLACE[i];   //发送位选,控制要亮的数码管        GPIO_DIG = DisplayDate[i];   //发送段码,显示相应的数字        j = 10;                      //扫描间隔时间设定        while(j--);         GPIO_DIG = 0x00;             //消隐    }}

版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案