【51单片机】 数据管显示HELLO.

这篇博客介绍了如何在51单片机上通过C语言编写程序,利用锁存器74HC573控制数据管显示“HELLO.”。内容包括软件和硬件准备,程序解析,头文件reg52.h中的特殊功能寄存器,锁存器工作原理,C51数据类型扩展定义,以及延时函数的实现。博主还分享了学习单片机的经验和代码细节,帮助读者理解单片机数据管显示的操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件准备+硬件准备

软件:1.Keil软件v6.12(与书中版本保持一致方便学习,如果喜欢别的版本也可以下载别的)

      2. STC-ISP(将十六进制代码写到单片机上)

硬件:TX-1C(书本推荐,并非本人广告)

【学习单片机,你起码得有块单片机的板子吧…也不一定是自己的,借别人的也可以】


HELLO.程序

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;                           //申明U1锁存器的锁存端
sbit wela=P2^7;                           //申明U2锁存器的锁存端
  
void delayms(uint xms){                  //延时函数
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}                    
void main()
{
while(1)
{
dula=1;
P0=0x76;               //送段选数据,显示H
dula=0;                
P0=0xff;               //原来段选数据通过位选锁存器造成混乱,专业术语叫"消影"
wela=1;                
P0=0xfe;               //送位选数据
wela=0;        
delayms(1);            //延时

dula=1;
P0=0x79;              //送段选数据,显示E
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);

dula=1;
P0=0x38;              //送段选数据,显示L
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);

dula=1;
P0=0x38;               //送段选数据,显示L
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);

dula=1;
P0=0x3f;               //送段选数据,显示0
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(1);


dula=1;
P0=0x80;               //送段选数据,显示.
dula=0;
P0=0xff;
wela=1;
P0=0xDf;
wela=0;
delayms(1);
}

}



 

### 51单片机控制数码管动态显示HELLO”的实现方法 要通过51单片机实现数码管动态显示HELLO”,可以采用动态扫描技术。以下是具体的实现方式: #### 显示字符的编 在程序中,“H”、“E”、“L”、“O”对应的七数码管字模可以通过查表法获取。这些字模通常是以十六进制的形式存储,具体如下: ```c uchar str[5] = {0x76, 0x79, 0x38, 0x38, 0x3F}; // 对应 H E L L O 的字模数据[^2] ``` #### 动态扫描原理 动态扫描的核心在于快速切换各个数码管的位选信号和对应数据选信号。由于人眼存在视觉暂留效应,在高速切换的情况下会形成连续显示的效果。 为了实现这一功能,需要定义两个数组分别保存选值和位选值: - **选值**:`str[]` 存储每个字母对应的字模。 - **位选值**:`wei[]` 控制哪个数码管被点亮。 #### 延时函数设计 延时函数用于设置每位数码管的刷新时间间隔。如果延时过短,则亮度不足;如果延时过长,则可能出现闪烁现象。以下是一个简单的延时函数实现: ```c void delay(uint xms) { uint i, j; for (i = 0; i < xms; i++) for (j = 0; j < 110; j++); } ``` #### 主循环逻辑 主循环负责依次遍历每一位数码管并更新其显示内容。每次只点亮一位数码管,同时发送相应的数据到端口。以下是核心代: ```c void display() { int i = 0; for (i = 0; i < 5; i++) { P3 = ~wei[i]; // 设置位选信号,注意高低电平可能需要取反[^2] P2 = str[i]; // 发送数据 delay(1); // 延时以保持该位数码管亮起一时间 } } void main(void) { while (1) { display(); } } ``` #### 注意事项 1. 高低电平的选择需根据硬件电路的实际连接情况调整。某些情况下,位选或选信号可能需要取反处理。 2. 如果使用外部驱动芯片(如74HC138),则需要注意译器输入顺序及其输出关系[^1]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值