C51动态数码管

动态数码管

1.显示原理:
利用减少段选线,分开位选线,利用为选线不同时,选择通断,改变段选数据来实现的。

2.原理图
在这里插入图片描述A2—A4:看RP4

3.人眼区分在20-50ms
让0 1 2 3之间的时间小于20-50ms,利用人眼的余晖效应,使人眼观察为同时显示0 1 2 3。

4.74HC245芯片在这里插入图片描述根据芯片手册DIR为高电平输出

5.38译码器真值表
在这里插入图片描述真值表解释分析
L:0;H=1;
_(低电平有效) 简便记忆:A0 A1 A2
Y0:有效000 LED1 二进制:000=0
_
Y1:有效100 LED2 二进制:100=1
_
Y2:有效010 LED3 二进制:010=2
_
Y3:有效110 LED4 二进制:110=3
_
Y4:有效001 LED5 二进制:001=4
_
Y5:有效101 LED6 二进制:101=5
_
Y6:有效011 LED7 二进制:110=6
_
Y7:有效111 LED8 二进制:111=7

原理图对应真值表
C 对应的A2 ;管脚:P2^4
B 对应的A1 ;管脚:P2^3
A 对应的A0 ;管脚:P2^2
A0=P0^0
A1=P0^1
A2=P0^2
在这里插入图片描述

共阴极:输入低电平(0)

6.软件设计
实现功能:控制动态数码管从左到右显示数字0-7。
led8=0,led7=1…led1=8;

7.程序编码

#include <REGX51.H>

typedef unsigned char u8;
typedef unsigned int u16;

#define SMG_A_DP_PORT P0

/SMG:数码管;A_DP:段选a-dp;PORT P0:端口P0 ;(宏定义通常大写)/

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/sbit单个管脚的定义,38译码器的输入管脚/

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/定义数组共阴0-F;
8位:每一个段码都是一个字节,因此选用u8类型;
注意数组命名原则,g:全局变量(无g:内部变量)
/

void delay_10us(u16 ten_us)
{
while(ten_us–);
}

void smg_disply(void)
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSC=1;LSB=1;LSA=1;break;//led8
case 1:LSC=1;LSB=1;LSA=0;break;//led7
case 2:LSC=1;LSB=0;LSA=1;break;//led6
case 3:LSC=1;LSB=0;LSA=0;break;//led5
case 4:LSC=0;LSB=1;LSA=1;break;//led4
case 5:LSC=0;LSB=1;LSA=0;break;//led3
case 6:LSC=0;LSB=0;LSA=1;break;//led2
case 7:LSC=0;LSB=0;LSA=0;break;//led1

	 }
	SMG_A_DP_PORT=gsmg_code[i];//段选i=0——LED8显示0;i=1——LED7显示1;
	 delay_10us(100);//延时1ms 人眼余辉效应:20-50ms
	 SMG_A_DP_PORT=0x00;
	 /*数据口清零,消除重影(消除下一个数码管对上一个数码管的影响)
	 但非常短暂导致人眼发现不了*/  
}

}

void main()
{
while(1)
{
smg_disply();
//放在循环体里不断循环

}

}
8.改编
软件设计:
实现功能:流水形式:t s j y F R j y (唐山加油 丰润加油)
#include <REGX51.H>

typedef unsigned char u8;
typedef unsigned int u16;

#define SMG_A_DP_PORT P0

/SMG:数码管;A_DP:段选a-dp;PORT P0:端口P0 ;(宏定义通常大写)/

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/sbit单个管脚的定义,38译码器的输入管脚/

u8 gsmg_code[8]={0x78,0x6d,0x0e,0x6e,0x71,0x77,0x0e,0x6e};
//tsjy FRjy 唐山加油丰润加油

/定义数组共阴 tsjyFRjy;
8位:每一个段码都是一个字节,因此选用u8类型;
注意数组命名原则,g:全局变量(无g:内部变量)
/

void delay_10us(u16 ten_us)
{
while(ten_us–);
}

void smg_disply(void)
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSC=1;LSB=1;LSA=1;break;//led8
case 1:LSC=1;LSB=1;LSA=0;break;//led7
case 2:LSC=1;LSB=0;LSA=1;break;//led6
case 3:LSC=1;LSB=0;LSA=0;break;//led5
case 4:LSC=0;LSB=1;LSA=1;break;//led4
case 5:LSC=0;LSB=1;LSA=0;break;//led3
case 6:LSC=0;LSB=0;LSA=1;break;//led2
case 7:LSC=0;LSB=0;LSA=0;break;//led1

	 }
	 SMG_A_DP_PORT=gsmg_code[i];//段选i=0——LED8显示t;i=1——LED7显示s;
	 delay_10us(100);//延时1ms 人眼余辉效应:20-50ms
	 SMG_A_DP_PORT=0x00;
	 /*数据口清零,消除重影(消除下一个数码管对上一个数码管的影响)
	 但非常短暂导致人眼发现不了*/
}

}

void main()
{
while(1)
{
smg_disply();//放在循环体里不断循环

}

}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C51动态数码管6位的实现步骤如下: 1. 定义6个IO口分别连接6个数码管的数码引脚,同时定义一个IO口连接数码管的位选引脚。 2. 初始化定时器,设置定时器的计数器初值、计数器模式、定时器中断允许等参数。 3. 在定时器中断服务函数中编写控制数码管的代码,实现每隔一段时间更新数码管显示的数字。 4. 在主函数中编写将要显示的数字转换为数码管的对应数字的逻辑,实现动态显示。 具体的实现细节需要根据具体的硬件平台和使用的编译器来进行调整。下面是一个简单的示例代码: ```c #include <reg51.h> sbit LED1 = P1^0; // 数码管1引脚 sbit LED2 = P1^1; // 数码管2引脚 sbit LED3 = P1^2; // 数码管3引脚 sbit LED4 = P1^3; // 数码管4引脚 sbit LED5 = P1^4; // 数码管5引脚 sbit LED6 = P1^5; // 数码管6引脚 sbit DIG = P1^6; // 数码管位选引脚 unsigned char code LEDChar[] = { // 数码管显示的字符编码 0x3f, // 0 0x06, // 1 0x5b, // 2 0x4f, // 3 0x66, // 4 0x6d, // 5 0x7d, // 6 0x07, // 7 0x7f, // 8 0x6f // 9 }; void Timer0() interrupt 1 { // 定时器中断服务函数 static unsigned char i = 0; switch (i) { case 0: DIG = 0; LED1 = LEDChar[1]; break; case 1: DIG = 1; LED1 = 0xff; break; case 2: DIG = 0; LED2 = LEDChar[2]; break; case 3: DIG = 1; LED2 = 0xff; break; case 4: DIG = 0; LED3 = LEDChar[3]; break; case 5: DIG = 1; LED3 = 0xff; break; case 6: DIG = 0; LED4 = LEDChar[4]; break; case 7: DIG = 1; LED4 = 0xff; break; case 8: DIG = 0; LED5 = LEDChar[5]; break; case 9: DIG = 1; LED5 = 0xff; break; case 10: DIG = 0; LED6 = LEDChar[6]; break; case 11: DIG = 1; LED6 = 0xff; break; } i++; if (i == 12) i = 0; } void main() { TMOD = 0x01; // 定时器0工作在模式1 TH0 = 0xfc; // 设置定时器初值 TL0 = 0x66; EA = 1; // 开启全局中断 ET0 = 1; // 开启定时器0中断 TR0 = 1; // 启动定时器0 while (1) { // 在这里写将要显示的数字转换为数码管的对应数字的逻辑 } } ``` 这是一个简单的示例代码,具体的实现方式还需要根据具体的硬件平台和使用的编译器进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值