51单片机:动态数码管显示

- 模块图

- 显示原理

– 消抖

静态数码管技术 + 人眼视觉停留
显示原理类似于以前的 胶片机放影视,也就是只要我切换的速度足够快你就看不出来其实我是一次次显示的(滑稽)

影视中为了流畅,我们的最低帧数为24帧,即每秒钟放24张影视图和24张黑屏,那么一张图片的周期为 T = 1s/(24+24) = 20.8ms
而在动态数码管的显示中,假设我们为8数码管,则一张视图应该是8个数码管共同的时间,即应该在原来周期上除以8, T = 1s/(24+24)/8 = 2.6ms

讲了这些能干啥呢?
消抖啊!不然显示出来后就跟影流之主一样。

– 数码管显示


段选控制哪个数码管亮,位选控制数码管显示的值。

– 码表

共阴极数码管码表 = ~共阳极数码管码表
1、共阳:
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
2、共阴:
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

话不多说,上代码:

#include "reg52.h"
#include  "intrins.h"//38译码器A、B、C
sbit sA = P1^0;
sbit sB = P1^1;
sbit sC = P1^2;//位选控制码表
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//延迟1ms
void delay500us(void)   //误差 0us
{unsigned char a,b;for(b=71;b>0;b--)for(a=2;a>0;a--);
}//显示八数码管
void showDigital()
{int i;for(i=0;i<8;i++){switch(i){case(0):sA = 0;sB = 0;sC = 0;break;case(1):sA = 1;sB = 0;sC = 0;break;case(2):sA = 0;sB = 1;sC = 0;break;case(3):sA = 1;sB = 1;sC = 0;break;case(4):sA = 0;sB = 0;sC = 1;break;case(5):sA = 1;sB = 0;sC = 1;break;case(6):sA = 0;sB = 1;sC = 1;break;case(7):sA = 1;sB = 1;sC = 1;break;}P0 = table[i+1];delay500us();P0 = 0x00;}
}void main()
{while(1)showDigital();
}

稍微再加点小功能:用红外遥控显示静态数码管

/*******************************************************************************
*通过红外遥控控制数码管显示
*
*******************************************************************************/#include "reg52.h"
#include  "intrins.h"//38译码器A、B、C
sbit sA = P1^0;
sbit sB = P1^1;
sbit sC = P1^2;//中断0
sbit IRIN = P3^2;//接收到的4组数据
unsigned char IrValue[4];
unsigned char Time;//位选控制码表
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//延迟1ms
void delay500us(void)   //误差 0us
{unsigned char a,b;for(b=71;b>0;b--)for(a=2;a>0;a--);
}//显示八数码管
void showDigital()
{int i;if(IrValue[2] == 0x44){for(i=0;i<8;i++){switch(i){case(0):sA = 0;sB = 0;sC = 0;break;case(1):sA = 1;sB = 0;sC = 0;break;case(2):sA = 0;sB = 1;sC = 0;break;case(3):sA = 1;sB = 1;sC = 0;break;case(4):sA = 0;sB = 0;sC = 1;break;case(5):sA = 1;sB = 0;sC = 1;break;case(6):sA = 0;sB = 1;sC = 1;break;case(7):sA = 1;sB = 1;sC = 1;break;}P0 = table[i+1];delay500us();P0 = 0x00;}}else if(IrValue[2] == 0x45){for(i=0;i<8;i++){switch(i){case(0):sA = 0;sB = 0;sC = 0;break;case(1):sA = 1;sB = 0;sC = 0;break;case(2):sA = 0;sB = 1;sC = 0;break;case(3):sA = 1;sB = 1;sC = 0;break;case(4):sA = 0;sB = 0;sC = 1;break;case(5):sA = 1;sB = 0;sC = 1;break;case(6):sA = 0;sB = 1;sC = 1;break;case(7):sA = 1;sB = 1;sC = 1;break;}P0 = table[6];delay500us();P0 = 0x00;}  }else{for(i=0;i<8;i++){switch(i){case(0):sA = 0;sB = 0;sC = 0;break;case(1):sA = 1;sB = 0;sC = 0;break;case(2):sA = 0;sB = 1;sC = 0;break;case(3):sA = 1;sB = 1;sC = 0;break;case(4):sA = 0;sB = 0;sC = 1;break;case(5):sA = 1;sB = 0;sC = 1;break;case(6):sA = 0;sB = 1;sC = 1;break;case(7):sA = 1;sB = 1;sC = 1;break;}P0 = table[0];delay500us();P0 = 0x00;}    }
}/*******************************************************************************
* 函数名         : IrInit()
* 函数功能         : 初始化红外线接收
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void IrInit()
{IT0=1;//下降沿触发EX0=1;//打开中断0允许EA=1;   //打开总中断IRIN=1;//初始化端口
}/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(unsigned int i)
{while(i--);
}/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能         : 读取红外数值的中断函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void ReadIr() interrupt 0
{unsigned char j,k;unsigned int err;Time=0;                     delay(700);    //7msif(IRIN==0)      //确认是否真的接收到正确的信号{    err=1000;             //1000*10us=10ms,超过说明接收到错误的信号/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时侯,程序死在这里*/    while((IRIN==0)&&(err>0))  //等待前面9ms的低电平过去         {           delay(1);err--;} if(IRIN==1)          //如果正确等到9ms低电平{err=500;while((IRIN==1)&&(err>0))       //等待4.5ms的起始高电平过去{delay(1);err--;}for(k=0;k<4;k++)       //共有4组数据{               for(j=0;j<8;j++)  //接收一组数据{err=60;       while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去{delay(1);err--;}err=500;while((IRIN==1)&&(err>0))    //计算高电平的时间长度。{delay(10);    //0.1msTime++;err--;if(Time>30){return;}}IrValue[k]>>=1;    //k表示第几组数据if(Time>=8)          //如果高电平出现大于565us,那么是1{IrValue[k]|=0x80;}Time=0;        //用完时间要重新赋值                         }}}if(IrValue[2]!=~IrValue[3]){return;}}
}void main()
{IrInit();while(1){showDigital();}}

51单片机入门——动态数码管显示详解相关推荐

  1. 51单片机静态动态数码管显示

    51单片机静态动态数码管显示 通过此实训了解动态数码管的显示原理,掌握编码方法.共阴极和其阴极数码管的不同之处及常用设计方法. 实训设备 这里使用的377锁存器模块控制的数码管下面就是电路图 显示内容 ...

  2. 单片机入门——动态数码管显示

    前言 在实际应用中通常都需要显示多位数值,如果采用静态数码管显示就不够好,因此就需要采用另外一种显示方式,即数码管动态显示.开发板上板载2 个四位一体的共阴数码管,接下来我们就来介绍下如何使用51 单 ...

  3. 51单片机_动态数码管显示

    动态数码管显示(延时函数) 编程原理 利用延迟函数,每秒钟数码管加1显示,一直加到250.延时函数精度不高,最好使用定时器中断. 数码管动态显示原理 动态数码管显示有段选和位选.段选是单个数码管显示的 ...

  4. 51单片机c语言显示hello,51单片机控制动态数码管显示12345和HELLO字样的设

    1.实验任务 如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示"12345"字样:当开关接低电平 ...

  5. 51单片机定时器动态数码管显示0-999999

    注意事项: 1.数码管真值表是共阳还是共阴,需要看你自己所接的原理图定. 2.原理图1处的E1E2E3,你可以接在两个端口上(这样你在代码6.7行就需要把端口赋值给ADDR3和ENLED)也可以像我一 ...

  6. 【51单片机】七段数码管显示实验+详细讲解

    [51单片机]七段数码管显示实验 前言 一.兵马未动,粮草先行--认识七段数码管 1.关于显示器 2.七段数码管 3.七段数码管的结构 4.数码管显示方法 二.数码管显示程序 1.静态显示 效果 2. ...

  7. 单片机学习笔记————51单片机实现带数码管显示的象棋比赛专用计时器

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

  8. 单片机学习笔记————51单片机实现带数码管显示的加法简易计算器

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

  9. 51单片机:动态数码管

    51单片机:动态数码管 目录 51单片机:动态数码管 一.显示原理 1.简介 2.静态显示与动态显示 二.原件使用 1. 74HC138芯片 2. 74HC245芯片 三.硬件连接 四.程序设计 五. ...

最新文章

  1. LeetCode-笔记-525. 连续数组
  2. linux网络配置及IP绑定
  3. 黑盒測试(一)-----边界值測试
  4. innodb和my查询速度_吃透MySQL:MyISAM和InnoDB存储引擎详细介绍
  5. 【TensorFlow】TensorFlow函数精讲之tf.get_variable()和tf.get_variable_scope()
  6. 如何加声调口诀_李变美:美容院老板小白如何快速打造自己的引流型文案系统!...
  7. 小米立 Flag:要做年轻人的第一个深度学习框架
  8. 需求分析报告或需求调研报告和需求规格说明书有什么区别?
  9. 睡眠阶段分期——SVM和ELM分别与粒子群算法结合(main)
  10. 计算机视频剪辑教程,电脑怎么剪辑视频?新手都能上手的视频剪辑教程分享
  11. 浏览器-IE主页被篡改后修复
  12. 电商直播带货模式的发展现状
  13. 科学计算机感叹号,电脑网络黄三角感叹号怎么解决
  14. kruskalCase克鲁斯卡尔算法
  15. 地理地貌3D打印案例
  16. 针对有APP签名的系统中,短信不能收发的问题解决过程
  17. Linux debug 常用命令
  18. 强大的矩阵奇异值分解(SVD)及其应用
  19. 平稳过程之均值遍历性定理 - 随机过程
  20. 通过NTP协议进行网络授时时钟同步服务

热门文章

  1. 微信小程序抽奖插件分享
  2. Vue的安装及使用教程【超详细图文教程】
  3. MailRaider Pro for Mac(Outlook邮件格式转换工具) v3.5.0永久激活
  4. CPU、GPU、TPU、NPU等到底是什么
  5. PVE7更新AQC107网卡驱动,解决奇葩问题。
  6. extern 用法小结
  7. CrowdHuman数据集转成VOC格式并训练模型
  8. Python爬虫|Python爬虫入门:请求
  9. webview加载网页,tel协议不会调出拨号盘?该如何处理
  10. component组件