文章目录

  • 数码管
    • 一、数码管基础知识
    • 二、数码管系列代码
      • 1. 数码管操作(单个数码管静态显示)
        • (1)仿真电路图
        • (2)源代码
        • (3)实验结果
      • 2. 数码管操作(多个数码管静态显示)
        • (1)仿真电路图
        • (2)源代码
        • (3)实验结果
      • 3. 数码管操作(单只静态数码管循环显示0-9,无开关控制)
        • (1)仿真电路图
        • (2)源代码
        • (3)实验结果
      • 4. 数码管操作(单只静态数码管循环显示0-9,k1复位,k2暂停与开始)
        • (1)仿真电路图
        • (2)源代码
        • (3)实验结果
      • 5. 数码管操作(动态数码管循环移位显示0-9)
        • (1)仿真电路图
        • (2)源代码
        • (3)实验结果
      • 6. 数码管操作(独立按键控制数码管增加与减少)
        • (1)仿真电路图
        • (2)源代码
        • (3)实验结果
      • 7. 数码管操作(数码管流水显示"20235218")
        • (1)仿真电路图
        • (2)源代码
        • (3)实验结果
        • (4)结果分析

数码管

一、数码管基础知识

  • 数码管的工作原理:数码管内部其实就是LED灯拼接而成的,只需要在一端给高电平,而另一端给低电平就可以让数码管显示。它们分别称为数码管的位选端段选端

  • 静态显示:只需要通过位选确定显示哪一位,再通过段选控制显示的数字即可。

  • 动态显示:动态显示的特点就是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描的方式。所谓动态扫描,就是轮流向各位数码管送出字形码和相应的位选,利用人眼视觉暂留效应,使人的感觉就是各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

  • 原理图

    段选:数码管上方的LED1~LED8,静态显示时只需要给赋低电平即可,动态显示时使用动态扫描的方式实现。段选通过74HC138译码器实现。

    位选:数码管下方的abcdefgdp,分别对应LCD0~LCD7,使用74HC245驱动。

  • 74HC245:双向数据缓冲器,由于单片机或CPU的数据、地址、控制总线端口都有一定的负载能力,如果负载超过负载能力,就达不到要显示的效果,因此需要驱动芯片。74HC245就是可以提高驱动能力的芯片,作用就是只需要提供一个信号,通过芯片内部的电源把驱动信号拉高,让其变为高电平,驱动数码管显示。

  • 74HC138:起到译码的功能,就是用少的引脚控制多的引脚,来满足单片机引脚不足的一种方式,138是用三位输入控制8位输出。

二、数码管系列代码

1. 数码管操作(单个数码管静态显示)

(1)仿真电路图

(2)源代码
#include "reg52.h"sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//段选的数字,从0~f
unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void main()
{    //74HC138控制端,全为0时选择最低位数码管显示LSA=0;LSB=0;LSC=0;  while(1){P0=smgduan[0];}
}
(3)实验结果

2. 数码管操作(多个数码管静态显示)

(1)仿真电路图

(2)源代码
#include "reg52.h"//数码管段选端位定义
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//显示0~f
unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//延时函数
void delay(unsigned int i)
{while(i--);
}//数码管显示函数
void DigDisplay()
{unsigned int i;for(i = 0;i < 8;i++){switch(i)     {case(0):LSA = 0; LSB = 0; LSC = 0; P0 = smgduan[9]; break;case(1):LSA = 1; LSB = 0; LSC = 0; P0 = smgduan[1]; break;case(2):LSA = 0; LSB = 1; LSC = 0; P0 = smgduan[4]; break;case(3):LSA = 1; LSB = 1; LSC = 0; P0 = smgduan[0]; break;case(4):LSA = 0; LSB = 0; LSC = 1; P0 = smgduan[3]; break;case(5):LSA = 1; LSB = 0; LSC = 1; P0 = smgduan[2]; break;case(6):LSA = 0; LSB = 1; LSC = 1; P0 = smgduan[0]; break;case(7):LSA = 1; LSB = 1; LSC = 1; P0 = smgduan[2]; break;}   delay(100); P0 = 0x00;}
}//主函数
void main()
{    while(1){ DigDisplay();  }
}
(3)实验结果

3. 数码管操作(单只静态数码管循环显示0-9,无开关控制)

(1)仿真电路图

(2)源代码
//单只静态数码管循环显示0-9
#include "AT89X51.h"int i,j,k;
int a[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(int n)
{for (j = n;j > 0;j--)for (k = 110;k > 0;k--);
}void main()
{P2_2 = 1;P2_3 = 1;P2_4 = 1;P0 = 0x00;while (1){for (i = 0;i < 16;i++){P0 = a[i];delay(250);}}
}
(3)实验结果

4. 数码管操作(单只静态数码管循环显示0-9,k1复位,k2暂停与开始)

(1)仿真电路图

(2)源代码
#include "reg52.h"
#include "intrins.h"//数码管段选端位定义
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//按键位定义
sbit k1 = P3^0;
sbit k2 = P3^1;//显示0~f
unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char control;                        //延时函数
void Delay1ms(unsigned int xms)
{unsigned char i, j;while(xms--){_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}//按键操作函数
void keyboard(void)
{int i;if(k1 == 0){Delay1ms(20);while(k1 == 0);Delay1ms(20);while (1){for (i = 0;i < 10;i++){P0 = smgduan[i];Delay1ms(350);if (k1 == 0){Delay1ms(20);while(k1 == 0);Delay1ms(20);//跳出当前for循环,就会从0开始break;}//k2按键按下的第一次进入if (k2 == 0){Delay1ms(20);while(k2 == 0);Delay1ms(20);//k2按键按下的第二次退出do{P0 = smgduan[i];Delay1ms(350);}while(k2 != 0);}}}P0 = 0x00;}
}//主函数
void main()
{//控制数码管段选LSA = 1;LSB = 1;LSC = 1;//数码管初始化P0 = 0x00;while(1){    keyboard();}
}
(3)实验结果

5. 数码管操作(动态数码管循环移位显示0-9)

(1)仿真电路图

(2)源代码
#include "AT89X51.h"int a[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//延时函数
void delay(int n)
{int i,j;for (i=n;i>0;i--)for (j=110;j>0;j--);
}//数码管显示函数
void DigDisplay()
{int i,t;for(i=0;i<8;i++){//位选,选择点亮的数码管switch(i)     {case 0:P2_2=0;P2_3=0;P2_4=0; break;//显示第0位case 1:P2_2=1;P2_3=0;P2_4=0; break;//显示第1位case 2:P2_2=0;P2_3=1;P2_4=0; break;//显示第2位case 3:P2_2=1;P2_3=1;P2_4=0; break;//显示第3位case 4:P2_2=0;P2_3=0;P2_4=1; break;//显示第4位case 5:P2_2=1;P2_3=0;P2_4=1; break;//显示第5位case 6:P2_2=0;P2_3=1;P2_4=1; break;//显示第6位case 7:P2_2=1;P2_3=1;P2_4=1; break;//显示第7位}//段选for (t=0;t<10;t++){P0=a[t];delay(150);}//间隔一段时间扫描delay(50); //消隐}
}void main()
{    while(1){ DigDisplay();      }
}
(3)实验结果

6. 数码管操作(独立按键控制数码管增加与减少)

(1)仿真电路图

(2)源代码
#include<reg51.h>
#include "intrins.h"sbit key1=P3^1;
sbit key2=P3^0;
sbit ad=P2^2;
sbit bd=P2^3;
sbit cd=P2^4;unsigned int xianshi[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(int n)
{unsigned int i,j;for (i=n;i>0;i--)for (j=110;j>0;j--);
}void Delay1ms(unsigned int xms)
{unsigned char i, j;while(xms--){_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}void main()
{unsigned int count=0;P0 = 0x00;while(1){ad=1;bd=1;cd=1;if (key1 == 0){Delay1ms(20);while(key1 == 0);Delay1ms(20);count++;if(count==17)count=0;P0=xianshi[count];delay(250);   }if (key2 == 0){Delay1ms(20);while(key2 == 0);Delay1ms(20);if (count==0)count=15;else count--;P0=xianshi[count];delay(250);  }    }
}
(3)实验结果

7. 数码管操作(数码管流水显示"20235218")

(1)仿真电路图

(2)源代码
#include "AT89X51.h"
#include "intrins.h"void main()
{//0~9int a[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示的内容int b[8] = {2,0,2,3,5,2,1,8};//w: 窗口显示数据的位置,t: 每轮显示的时间长度int i, j, w = 0, t = 0;  while(1){ //位选要有八段,指定一个八位的窗口for (i = 0; i < 8; i++){if (i + w < 8)           P0 = 0;                else if (i + w > 15)   P0 = 0;else{//位选P0 = a[ b[i + w - 8] ];//段选P2 = (7-i)*4; //延时for (j = 0; j < 800; j++);                                  }//清零P0 = 0;}//控制显示速度与流水if (t++ == 20)      {if (w++ == 15) w = 0;t = 0;}}
}
(3)实验结果
(4)结果分析

如上图所示,我们需要把中间的窗口当做显示窗口,然后两边的窗口作为辅助窗口,当程序运行到最左边的窗口时,我们把位选端置零,不选择任何的位选。当程序运行到中间窗口时,因为中间窗口作为我们的显示窗口,所以要对段选端和位选端同时操作,改变段选的同时要改变位选,程序中巧妙用到嵌套数组的方式实现段选,同时位选端与段选循环同步,达到同步效果。每次操作之后需要延时一段时间,并且对位选端清零。为了更好的控制速度,程序中我们引入变量t来控制,滑动窗口使用变量w来控制。

嵌入式51单片机03-数码管系列相关推荐

  1. 51单片机八位数码管1到F动态滚动显示仿真及程序

    51单片机八位数码管1到F动态滚动显示仿真及程序 动态滚动显示仿真及程序 #include<reg51.h> #define uchar unsigned char #define uin ...

  2. 51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真

    51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真 本实验通过51单片机读取DS18B20温度传感器的温度,然后通过数码管显示,并通过串口,将读取到的温度数据发送出去. 本案例需要使 ...

  3. 51单片机实现数码管显示小数

    51单片机实现数码管显示小数 要求 1 Proteus 面向编程的模型搭建 2 代码实现 2.1. 实现数码管刷新 2.2 对小数进行分解的函数 3 测试用例 4 仿真结果 要求 要求1:根据整数部分 ...

  4. 51单片机学习 数码管 倒计时

    51单片机学习 数码管 倒计时 简介 1.硬件部分 普中单片机 开发板 (138译码器控制)数码管 2.软件部分 keil软件 硬件部分 138译码器 简介 74LS138 为3 线-8线译码器,共有 ...

  5. 单片机学习笔记————51单片机实现数码管中的倒计时程序

    一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...

  6. 51单片机七段数码管显示时钟无按键控制—①—74HC595版

    参考链接: 51单片机七段数码管显示时钟加按键控制-③-74HC595版 51单片机七段数码管显示时钟加按键控制-②-74HC595版 文章目录 一.实验内容: 二.实验分析: 三.仿真图: 四.源代 ...

  7. 51单片机控制数码管显示

    前言 今天学习51单片机的数码管模块 我的学习板上面的数码管是4为一体由12个引脚控制的模块. 今天就编程控制它显示我们想要的输出. 数码管本质上是由8个LED拼接而成的,他们分别叫做a,b,c,d, ...

  8. 基于51单片机的数码录音放音系统设计

    摘  要 随着语言的处理技术在工业生产.交通.通信等方面的运用得到不断创新.数码录音放音系统已得到了越来越多的人的青睐,通过对多种录音放音系统的设计方案进行了比较和分析,本论文最终选定以STC89C5 ...

  9. 使用51单片机以及数码管来显示十字路口红绿灯

    最近老师让我们使用51单片机做一个十字路口红绿灯实验,正好发表一篇文章,希望能给有需要的同学们带来一些帮助,如果有不合理的地方,还请大家帮忙指正. 一. 首先要利用51做一个红绿灯我们需要知道这个红绿 ...

最新文章

  1. Ubuntu下打开rar乱码问题的解决方法
  2. 音视频技术开发周刊(第126期)
  3. 算法竞赛——快速排序
  4. 5006.c++类中使用static变量bug
  5. SBI旗下交易所SBI VC Trade推出比特币借贷服务
  6. qt自定义控件_Qt编写自定义控件60-声音波形图
  7. CPC客户端安装教程(2022/4/1)
  8. SpringBoot+Redis+Lua防止(黑客)IP重复防刷攻击
  9. NYoj 366 D的小L 【DFS】
  10. 用KOPPT,大家的姿势对了没?
  11. STM32项目分享---MQTT智能门禁系统(含APP控制)
  12. 微信内置浏览器API的常用的js方法
  13. Android安卓手机版火狐浏览器设置简洁主页
  14. C语言基础知识入门和C语言入门基础知识大全
  15. Python绘制三维立体图详解与绘图填充
  16. 每天盯着电脑,眼睛疲劳怎么办?
  17. python分时间段统计_Python Pandas:按日期分组并统计每个时段的新记录
  18. 阿里云跨境游戏及电商网络加速方案(全球加速和CDN)
  19. RK3588平台开发系列讲解(RTC篇)RTC的使用
  20. 基于贝叶斯生存分析的《冰与火之歌》人物死亡率分析

热门文章

  1. 2013 9.10       光大环保之行的自我总结(有点伤心)
  2. 儿童抽动症有哪些表现?
  3. 07-19 解决灰鸽子新变种 Rootkit Vanti gen等及www 58111 com劫持 第5版
  4. Plücker 矩阵相关资料1
  5. NVM - Nodejs的版本管理工具安装和使用
  6. 简单的企业电子传真解决方案
  7. JCL源码使用日志框架源码查看
  8. opencv2矩阵操作
  9. 坐标转换:墨卡托 经纬度
  10. 为了推进陪玩系统源码开发,前端可以做什么?