10天学会嵌入式技术之51单片机-day-2

嵌入式软件--51单片机 DAY 3 按键的作用相当于一个开关,按下时接通(或断开),松开后断开(或接通)。 阅读详情

第七章 静态数码管显示

7.1需求分析

这一案例,我们让右边数码管的左 1 位显示数字 1。

7.2 硬件设计

7.2.1 PCB原理图

7.2.2 74HC138(解码器)

(1)实物图、原理图、封装

7.2.3 74HC245N(缓冲器、驱动器)

(1)实物图、原理图、封装

7.2.4 数码管简介

(1)数码管 4 位 0.36 英寸红色 共阴极

(2)实物图、原理图、封装

(3)数码管原理

数码管原理图在 PCB 原理图中是没有的,需要查询这个元件的规格。我们打开立创商
城,搜索 SR420361N,查看其手册(直达链接:点我下载),可以看到如下原理图:
 

P0 段为段选信号,控制单个数码管显示的内容;P13、P14、P15 为片选信
号,控制哪一位数码管发光。下面的表格为速查表:

想显示小数点的话,需要在原来的基础上加上 0x80。

7.3 软件设计

7.3.1 实现思路

为了实现当前需求,需要考虑两点,分别是显示位置和显示内容。确定显示位置称为
数码管的位选,确定显示内容称为数码管的段选,下面逐一分析。

(1)数码管的位选

根据原理图可知,数码管的位选通过 74HC138 芯片控制,更具体的说,是通过单片机
的 P13、P14、P15 引脚控制,具体的对应关系如下

(2)数码管的段选

根据原理图可知,数码的段选通过单片机的 P00~P07 这 7 个引脚控制,具体的对应关
系如下。

7.3.2 代码实现

#include<STC89c5xRC.H> //包含STC89c52的头文件

#define SMG_EN P36

//增加自定义类型,简化代码编写
typedef unsigned char u8;
typedef unsigned int u16;

//数0-9的编码
static u8 s_digital_code[10]={
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F // 9
};
* @brief 内部方法,让数码管某一位显示特定数字
*
* @param dig 片选, 从左到右[0-7]
* @param num 显示想要的数字编码
*/
void DigitalTube_DisplaySingle(u8 dig, u8 num)
{
// 清理上一次显示
    P0 = 0;
// 首先片选 dig
    P1 &= 0xC7;
    dig <<= 3;
    P1 |= dig;
    P0 = num;
}

void main()
{
// 打开数码管总开关
    SMG_EN = 0;
// 让 DIG5 显示 1,由于 5 的 138 解码器对应的二进制是 100,也就是 4,所以 5-1
    DigitalTube_DisplaySingle(5 - 1, s_digit_codes[1]);
// 卡住程序
    while (1);
}

7.3 数码管动态显示

7.3.1 需求描述

显示 8 位以内的任意整数,要求靠右显示,具体效果如下图所示。

7.3.2 软件设计

7.3.2.1 实现思路

目前我们已经能够在 8 位数码管的任一位置显示任一数字了,所以要想同时显示多位
置数字,我们只需提前规划好在哪一位显示哪个数字,然后快速的循环显示即可,下面举
例说明。

7.3.2.2 代码实现
#include <STC89C5xRC.H> //包含 STC89C52 的头文件
#include <INTRINS.H>
#define SMG_EN P36
// 增加自定义类型,简化代码编写
    typedef unsigned char u8;
    typedef unsigned int u16;
    typedef unsigned long u32;
// 数码管显示缓存
    static u8 s_digital_buffer[8];
// 数字 0-9 的编码
    static char s_digital_codes[10] = {
        0x3F, // 0
        0x06, // 1
        0x5B, // 2
        0x4F, // 3
        0x66, // 4
        0x6D, // 5
        0x7D, // 6
        0x07, // 7
        0x7F, // 8
        0x6F // 9
};
void DigitalTube_Refresh();
void DigitalTube_DisplayNum(u32 num);
void main()
{
// 打开数码管总开关
    SMG_EN = 0;
// 让数码管显示 12345678
    DigitalTube_DisplayNum(12345678);
// 不断刷新数码管
    while (1)
    {
        DigitalTube_Refresh();
    }
}
/**
* @brief 将要显示的数字写进数码管的缓存
*
* @param num 要显示的数字
*/
void DigitalTube_DisplayNum(u32 num)
{
    u8 i;
// 将显存清零
    for (i = 0; i < 8; i++)
    {
        s_digital_buffer[i] = 0;
    }
    // 如果待展示的数字为 0,直接展示
    if (!num)
    {
        s_digital_buffer[7] = s_digital_codes[0];
        return;
    }
// 赋值显存
    i = 7;
    while (num > 0)
{
// 对显存赋值,如果 num 是 12345,则 s_digital_buffer[]里面依次存储
    0,0,0,0x06,0x5B,0x4F,0x66,0x6D
    s_digital_buffer[i] = s_digital_codes[num % 10];
    i--;
    num /= 10;
    }
}
void Delay1ms(u16 count) //@11.0592MHz
{
    u8 i, j;
    while (count > 0)
    {
        count--;
        _nop_();
            i = 2;
        j = 199;
        do
        {
            while (--j);
        } while (--i);
    }
}
/**
* @brief 让数码管的某一位显示特定的组合
*
* @param dig 片选,取值范围[0-7]
* @param dat 段选信号
*/
static void DigitalTube_DisplaySingle(u8 dig, u8 dat)
{
// 关掉当前数码管
    P0 = 0;
// 完成片选
    P1 &= 0xC7; // 置零
    dig <<= 3; // 左移
    P1 |= dig;
// 段选
    P0 = dat;
}

void DigitalTube_Refresh()
{
    u8 i;
// 依次刷新 8 位数码管
    for (i = 0; i < 8; i++)
    {
    DigitalTube_DisplaySingle(i, s_digital_buffer[i]);
// 延时增加占空比
    Delay1ms(1);
    }
}

第 8 章 模块化编程

8.1 编码规范

随着我们的代码越来越复杂,我们的 main.c 越来越长,阅读性也越来越差。如果将来
开始做项目,我们可能要同时操作好几个模块,这种情况下我们无法再把代码写到同一个
文件,而是要分模块管理代码。具体实现方法,就是将源码按照不同功能和模块,拆成若
干部分源码,再用头文件相互引用。

8.2 数码管项目改造

8.2.1 常规定义和通用方法

我们可以将常用的宏定义和方法定义在专门的头文件和源文件,并将其置于 Com 目录。

(1)Com_Util.h

#ifndef __COM_UTIL_H__
#define __COM_UTIL_H__

typedef unsigned char u8;
typedef unsigned char u16;
typedef unsigned long u32;

void Com_Util_

(2)Com_Util.c

#include "Com_Util.h"
#include <INTRINS.H>

void Com_Util_Delay1ms(u16 count)
{
    u8 i, j;
    while (count > 0) {
        count--;
        _nop_();
        i = 2;
        j = 199;
        do {
            while (--j);
        } while (--i);
    }
}

8.2.2 数码管驱动

(1)Int_DigitalTube.h

#ifndef __INT_DIGITALTUBE_H__
#define __INT_DIGITALTUBE_H__
#define SMG_EN P36
#define LED_EN P34

#include "Com_Util.h"

void Int_DigitalTube_Init();
void Int_DigitalTube_DisplayNum(u32 num);
void Int_DigitalTube_Refresh();

#endif /* __INT_DIGITALTUBE_H__ */

(2)Int_DigitalTube.c

#include "Int_DigitalTube.h"
#include <STC89C5xRC.H>

// 数字0-9的编码
static u8 s_codes[10] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

static u8 s_buffer[8];

void Int_DigitalTube_Init()
{
    SMG_EN = 0;
    LED_EN = 0;
}

/**
 * @brief 内部方法,让数码管某一位显示特定数字
 *
 * @param position 片选, 从左到右[0-7]
 * @param num_code 显示想要的数字编码
 */
static void Int_DigitalTube_DisplaySingle(u8 position, u8 num_code)
{
    P0 = 0x00;
    // 位选:P15 P14 P13
    position <<= 3;
    P1 &= 0xC7;
    P1 |= position;

    // 段选:P0
    P0 = num_code;
}

void Int_DigitalTube_DisplayNum(u32 num)
{
    u8 i;
    for (i = 0; i < 8; i++) {
        s_buffer[i] = 0x00;
    }

    if (num == 0) {
        s_buffer[7] = s_codes[0];
        return;
    }

    i = 7;
    while (num > 0) {
        s_buffer[i] = s_codes[num % 10];
        num /= 10;
        i--;
    }
}

void Int_DigitalTube_Refresh()
{
    u8 i;
    for (i = 0; i < 8; i++) {
        Int_DigitalTube_DisplaySingle(i, s_buffer[i]);
        Com_Util_Delay1ms(1);
    }
}

(3) main.c

#include "Int_DigitalTube.h"

void main()
{
    Int_DigitalTube_Init();
    Int_DigitalTube_DisplayNum(-2345678);
    while (1) {
        Int_DigitalTube_Refresh();
    }
}

day01 51单片机 目前使用的51单片机一般是宏晶STC89系列,这其中流传最广的版本,也是我们课程的主角,就是STC89C52RC。 阅读详情

相关推荐

【25年】51单片机从零开始入门 Day1—51单片机基础知识与工程创建

【时间】:2025年10月11日【工具】:淘宝上买的普中51单片机开发板 A2标配,69.5元 == 我发现这个是STC89C52RC,注意这个RC,所以后面选配置的记得选RC的!!!!【个人情况】:本科软件工程、研究生计算机技术,本科学过C,了解一点,研究生没用,忘得差不多了,就记得通用知识学习资料:看B站上 江协科技 视频 + 买单片机送课程,他的课B站上也有,太啰嗦了,感觉送的PDF可以。优快云博主:Zevalin爱灰灰 他发的资料也很有用。

Claire的博客 1239

10天学会嵌入式技术之51单片机-day-1

手把手入行嵌入式之10天学会51单片机day-1

2301_80748708的博客 1332

基于51单片机的电子时钟设计

1、从DS1302中读取时间显示2、一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改完毕后,点击按键4确认修改3、不是修改模式下,按下按键2,可以切换时间和日期的显示4、修改模式下,对应修改的时间变量会闪烁仿真软件:Proteus 8.9代码编写:Keil5百度网盘链接:链接:https://pan.baidu.com/s/1RP_8MkZIqHt7WFPc6na3sQ 提取码:y2fn –来自百度网盘超级会员V4的分享Gitee链接:5

wan1234512的博客 2万+

10天学会嵌入式技术之51单片机-day-8

手把手入行嵌入式之10天学会51单片机day-8

2301_80748708的博客 2210

ArcGIS数据处理必备技能:从地理坐标到UTM投影的面转栅格完整流程

本文详细介绍了在ArcGIS中从地理坐标到UTM投影的面转栅格完整流程,包括坐标系转换、像元大小设置及质量控制等关键步骤。通过实战案例和Python脚本示例,帮助用户解决常见问题并优化数据处理效率,特别适合需要精确GIS数据分析的专业人士。

weixin_42628688的博客 180

高效复用PCB设计:Cadence Sub-Drawing跨项目复制技巧

本文详细介绍了Cadence Allegro中Sub-Drawing功能的应用技巧,帮助PCB工程师高效复用成熟设计模块。通过分步教学,从精准导出到完美导入,并提供了解决坐标错位与DRC冲突的实用避坑指南。掌握这一技巧能显著提升设计效率,实现团队知识的标准化积累与快速复用。

weixin_29172201的博客 397

10天学会嵌入式技术之51单片机-day-7

手把手入行嵌入式之10天学会51单片机day-7

2301_80748708的博客 1339

帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案

帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案 入门基础 11.多选题 以下方式中属于FineReport中预览模式的有( ) 分页预览、填报预览、新填报预览、数据分析、移动端预览 16.判断题 FineReport报表工具必须购买激活码后才能使用。 错误,可以免费获取激活码。 29.单选题 FineReport是一款利用( )语言开发的报表工具。java 41.多选题 访问帮助文档的方式有哪些?设计器中社区菜单下-帮助文档;直接访问http://help.finere

qq_37485720的博客 2万+

10天学会嵌入式技术之51单片机-day-3

手把手入行嵌入式之10天学会51单片机day-3

2301_80748708的博客 1393

一、Abaqus CAE 入门操作(薄膜应力计算)

一、Abaqus CAE 入门操作(薄膜应力计算)

A20802013的博客 4370

【项目管理】第8章 项目整合管理 --知识点整理

制定项目章程: 第一步,旨在明确项目的目标、范围、关键里程碑等关键信息,为项目的后续工作奠定基础。制订项目管理计划: 在项目章程的基础上,进一步详细规划项目的执行过程,包括时间、成本、质量、风险等方面的管理计划。指导与管理项目执行: 按照项目管理计划执行项目,同时监控项目的进展,确保项目按照计划进行。监控项目工作: 对项目的执行情况进行持续监控,及时发现并解决问题,确保项目目标的实现。

weixin_42081167的博客 1594

10天学会嵌入式技术之51单片机-day-4

手把手入行嵌入式之10天学会51单片机day-4

2301_80748708的博客 1453

总结目前开源的视频生成/视频编辑大模型

随着Sora的爆火,视频生成和视频编辑受到了越来越多的关注。这篇博客总结一下目前开源的视频生成和视频编辑的大模型,并分析他们各自的优缺点,以及在自己进行科研任务或者工作中应该如何选用对应的开源模型,希望能给从事这一领域研究和使用的小伙伴们帮助。

沉迷单车的追风少年 3544

10天学会嵌入式技术之51单片机-day-5

手把手入行嵌入式之10天学会51单片机-day5

2301_80748708的博客 1048

Motoman机器人离线编程——Motocom32开发简介

欢迎关注Jungle的Motoman机器人离线编程专栏系列文章: Motoman机器人离线编程——Motocom32开发简介 Motoman机器人离线编程——Visio Studio环境配置 Motoman机器人离线编程——Motocom32库函数的使用与封装 Motoman机器人离线编程——Motocom32参考文献及注意事项 Motoman机器人离线编程——MotocomES介绍 ...

冯Jungle的个人博客 8713

【Altium Designer】Off grid pin解决方法

​今天我画完原理图编译时,出现了太多的黄色(出现warning警告提示)Off grid pin警告,这个警告并不是原理图电气连接出问题了,而是元器件或器件PIN脚没有和栅格对齐造成的原因。再编译还是出现这个警告。 最后经过不断翻阅网上经验和实践,才最终解决,本经验详细记录了解决该警告的有效方法。 解决方案:以下是问题解决步骤... ​

夜半少年的博客 7548

十天学会嵌入式技术之51单片机—day-10

手把手入行嵌入式之10天学会51单片机day-10

2301_80748708的博客 2477

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

嵌入式—51单片机day2

通用输入输出,是与外界交互最基本的形式,可以独立的将 引脚配置为输入模式/输出模式输出模式:控制引脚输出高电平低电平(给定控制信号)开漏输出推挽输出复用开漏复用推挽输入模式:检测引脚的电平(接收外部信号)上拉输入下拉输入浮空输入模拟输入独立按键原理图工作原理:当按键未被按下时,引脚会呈现高电平,当按键被按下时,会造成引脚和GND短路到一起,此时对应的引脚会呈现低电平。判断按键是否被按下,只需要判断引脚是否为低电平即可中断概念当CPU。

2301_77373031的博客 898

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

STM32单片机和51单片机有何区别?

单片微型计算机简称单片机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口、并口等)和中断系统处于同一芯片的器件。 在我们自己的个人电脑中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑。而单片机将这些都集中在了一个芯片上。 一 51单片机 应用最广泛的8位单片机,当然也是初学者们最容易上手学习的单片机。最早由Intel推出,...

8973

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

十天学会嵌入式技术之51单片机—day-9

手把手入行嵌入式之10天学会51单片机day-9

2301_80748708的博客 1148

10天学会嵌入式技术之51单片机-day-6

手把手入行嵌入式之10天学会51单片机day-6

2301_80748708的博客 707

嵌入式—51单片机day1

嵌入式:以应用为中心,以计算机技术为基础,软硬件可裁剪的专用计算机系统。

2301_77373031的博客 644

嵌入式软件--51单片机 DAY 2

我们可以通过阴极控制显示的位置,通过阳极控制显示的内容。两个数码管共有8个阴极引脚和16和阳极引脚,如果所有引脚都直接接入MCU,会造成MCU引脚的极大浪费。为了节省MCU的引脚,我们可以将两个数码管的阳极接在一起。如此我们就有了8个阴极,8个阳极16个引脚。我们只需通过8个GPIO引脚就能控制这8位数码管的显示内容了。既然是八位,我们很快想到了38译码器,通过三位二进制数字的输入控制八种结果。

zx18831955136的博客 1919

自学嵌入式 day40 51单片机

51单片机、MCU、CPU、MPU、位运算、keil程序编写流程

2301_81142331的博客 1366

【C51】:基于51单片机的多功能时钟设计

#????基于51单片机的时钟设计 此文章为某年某月某次单片机作业 首先:再keil上写下代码,用protues调试(不懂得百度搜索“keil与protues联机调试”) 这次没有使用38译码器,直接将数码管引脚全部放在单片机上 不多说,上代码和图: 代码如下 #include<reg51.h> #define uChar unsigned char #define uInt unsign...

傅里叶也头大 6335

嵌入式软件--51单片机 DAY 4

外部中断0到外部中断3的中断号分别是:0、2、6、7,以外部中断0为例,其中断服务程序应定义为void()interrupt1//编写定时任务逻辑4.软件设计//重新状态脉冲计数器//统计中断次数count = 0;

zx18831955136的博客 1828
上一篇: 10天学会嵌入式技术之51单片机-day-1
下一篇: 10天学会嵌入式技术之51单片机-day-3
昊昊昊昊昊明
博客等级 码龄3年 285粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值