51单片机——动态数码管

目录

实验内容

protues电路连接

所需原件

电路原理图

动态数码管原理

keil代码

测试代码

实验代码


实验内容

基于protues8.13,搭建51单片机最小系统连接八位数码管,进行八位显示(动态数码管显示)。

显示年月日(例如2024年09月19日)如下图所示

protues电路连接

所需原件

自上而下分别是8位共阴数码管、51单片机、晶振、电解电容、电阻、电容、排阻

电路原理图

如上图所示完成基本的电路连接,在最小系统电路的基础上,将数码管的段选脚连接到P0口(P0口的上拉电阻一定要,不能少),位选连接至P3口。

动态数码管原理

动态数码管显示原理是通过快速地逐个刷新数码管的每一位来显示数字的。在极短的时间内(通常几毫秒到几十毫秒),切换到下一个数码管,并重复上述过程。由于人眼的视觉暂留现象,当切换速度足够快时,人眼会感觉到多个数码管同时显示,从而形成一个完整的、连续变化的数字或字符显示效果。这主要依赖于两个关键信号:位选信号(P3口)和段选信号(P0口)。

  1. 位选信号:用于选择要显示的数码管。在多位数码管显示系统中,每个数码管都有一个公共端(也称为位选端),通过将这些公共端连接到微控制器或其他逻辑电路的不同I/O口上,并逐个地将相应的数码管的公共端置为低电平(或高电平,取决于电路设计,本实验为共阴数码管故为低电平),来选择要显示的数码管。

  2. 段选信号:用于控制每一位要显示的数字或字符。段选信号连接到数码管的a、b、c、d、e、f、g七个引脚(以及可选的dp引脚),通过控制这些引脚的高低电平组合,可以控制数码管显示相应的数字或字符。

keil代码

注*    在对实际的电路硬件中,我们在开始对功能进行编码前,应该对每一位的数码管进行测试,以防硬件的问题影响到后续代码的调试。

测试代码

让每位数码管都显示(8.,保证数码管的每个段都能正常亮起。

#include<reg52.h> 
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int 
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, //共阴型段码表0~9
									 0x6d,0x7d,0x07,0x7f,0x6f};

unsigned int i;

void main()
{
    while(1)
    {
        for(i=0;i<8;i++)
        {
            Select_DotSMG(i,8);//通过for循环对8位数码管进行一次点亮8.
        }
    }

}

//无点数码管
void Select_SMG(unsigned char pos,val)
{
  //*
    由于是共阴数码管P3口的初始状态应为高电平1
    但是高电平0XFE(1111 1110)在进行移位炒作后就变成了0XFC(1111 1100)
    为防止移位操作导致的乱码,故采用~反转电平的操作,先对(0000 0001)
    进行移位转为(0000 0010),再进行电平反转(1111 1101)
    就可以获得我们想要的结果
   *//
  P3 = ~(0x01 << pos);
  P0 = table[val];
}
//有点数码管
void Select_DotSMG(unsigned char pos,val)
{
  P3 = ~(0x01 << pos);
  P0 = table[val]& 0x7f;//在基础数字段码后与上0x7f即是有小数点的
}

检测数码管正常后在进行本次实验的内容!!!!!!!! 

实验代码
#include<reg52.h> 
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int 
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, //共阴型段码表0~9
									 0x6d,0x7d,0x07,0x7f,0x6f};

unsigned int i;
unsigned char code num[]={2,0,2,4,0,9,1,9};
//*
    因为只是做简单的动态显示功能,故直接将要显示的内容做成数组
    让table[]=table[num[]](假设显示的内容见复杂则应该单独写一个显示的函数,更为方便)
    然后通过for的循环实现
    当i=1时,pos=1,是第二位数码管,val=1,
    则一步步嵌套num[1],即是0,最后table[0]
    结果为第二位显示的是0;
*//
void main()
{
    while(1)
    {
        for(i=0;i<8;i++)
        {
            
            Select_DotSMG(i,I);//通过for循环对8位数码管进行一次点亮8.
        }
    }

}

//无点数码管
void Select_SMG(unsigned char pos,val)
{
  P3 = ~(0x01 << pos);
  P0 = table[num[val]];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值