51单片机数码管显示60秒倒计时(C语言)

2023-05-16

51单片机数码管显示60秒倒计时(C语言)

基于普中51单片机开发板,运用定时器/计数器0和1,实现60秒的倒计时和LED灯0.5s间隔闪烁

文章目录

  • 51单片机数码管显示60秒倒计时(C语言)
  • 前言
  • 一、数码管动态扫描
  • 二、中断、定时器/计数器
      • 现象视频
      • 程序文件
  • 二、代码
    • 1.MAIN
    • 2.中断定时相关程序代码
    • 3.数码管LED灯相关程序代码
    • 4.相关H文件程序代码
    • 总结


前言

本程序涉及中断,定时器的配置,数码管动态扫描知识。程序基于模块化编写。程序里有详细的注解。

一、数码管动态扫描

数码管分为静态和动态两种显示方法。一般多位数码管选用动态显示。这样可以节约单片机的端口资源。但是需要外加数码管驱动电路。在此用的是138译码器。可以简称为38译码器,38译码器为三通道输入,八通道输出。通过3通道即可控制8位数码管。也就是说只用占用单片机的3个端口。在这里插入图片描述
只用了解其真值即可 A为控制端 Y为数码管端。
在这里插入图片描述
数码管动态扫描的原理是利用人肉眼的视觉残留。在此需要说两个概念位选和段选。位选就是用来控制那个数码管显示的。段选是用来控制显示的内容的。在很短的时间内送出段码和控制未选来实现数码管的动态显示。在这里插入图片描述
共阳数码管段码:
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; 0~F
共阴数码管段码:
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 0~F

二、中断、定时器/计数器

中断、定时器/计数器。的难点就在于对各种相关寄存器。
定时器/计数器的相关寄存器,定时器/计数器的实质是加1计数器。可以对其选择是定时模式还是计数模式。在这里插入图片描述
在这里插入图片描述
中断号格式,可以参照这个来。
中断号0 外部中断0中断号
中断号1 定时计数器0中断号
中断号2 外部中断1中断号
中断号3 定时计数器1中断号
中断号4 串行口中断序号
中断号5 定时计数器2中断号
在这里插入图片描述

有很多相关资料,我能力有限,对此我就不过多赘述了。程序里有详细的注解。

现象视频

下面是一个我上传到哔哩哔哩上十几秒的程序现象小视频 : https://b23.tv/IlFvwU
哔哩哔哩

程序文件

程序源文件:https://download.csdn.net/download/qq_54311788/19976902
程序文件

二、代码

1.MAIN

代码如下:

/*****
"hardware.h"自创的头文件、hardware翻译为:五金器具; 计算机硬件; 武器装备;
“”用于自己创建的头文件、<>反之 例:<reg51.h>

******/
#include "hardware.h"  //此头文件已包含了<reg51.h>头文件
void main()
{
	TMOD = 0X11;       //设置定时器1和定时器0为工作方式1,16位定时器/计数器
	/****
	0X11>0001 0001
	0X11 设置的全部内容为:设置定时器/计数器的启动停止只由寄存器TRX(X=0或1)控制 >>> TRX为定时器X运行控制位
	                       设置定时器/计数器为定时器模式
	                       设置定时器0和定时器1为工作方式1,16位定时器/计数器
	*****/
	TH0 = (65536-45872)/256; //装初值,11.0592M晶振,定时50ms,计数个数 N = 45872(在计数时需要预先填装初始计数个数)
	TL0 = (65536-45872)%256; //...
	TH1 = (65536-45872)/256; //...
	TL1 = (65536-45872)%256; //同上
	/*****
	THX、TLX为高八位和低八位寄存器。用来储存计数次数
	X=0或1
	计数个数 N = 中断时间 / 机器周期
	机器周期 = 12 * (1/时钟频率)
	例 ;时钟频率为11.0592MHz
	     机器周期 = 12 * (1/110592) = 1.09 us (约)
	     计数个数 N = 50 * 1000 / 1.09 = 45872 (约)<需要换算单位 * 1000>	1秒=1000毫秒(ms)
    1秒=1,000,000 微秒(μs)
	1毫秒=1000微秒     
	******/
	EA = 1; //全局中断允许位 | 打开总中断(相当于中断的总开关,打开之后其他中断发生时才能有效)
	ET0 = 1;//定时器/计数器0中断允许位 | 打开
	ET1 = 1;//定时器/计数器1中断允许位 | 打开
	TR0 = 1;//定时器0运行控制位 | 允许定时器0运行
	TR1 = 1;//定时器1运行控制位 | 允许定时器1运行
	while(1)  //主循环 不断对数码管服务函数扫描
	{
		 tube();//数码管服务函数(不断对数码管进行扫描)
	}
}

2.中断定时相关程序代码

代码如下:

/*****
 "software.h"自创的头文件、software.h翻译为:(计算机)软件;

******/
#include "software.h"
uchar num , num1; //定义num , num1的数据类型为无符号字符型类型
num2 = 60;        //初始化此变量的值

void delayms(uint xms)   //简单延时
{
	uint a , b;
	for(a=xms; a>0; a--)
	 for(b=110; b>0; b--);
}

void Timer0_Rountine(void) interrupt 1  //中断号 定时器/计数器0中断  1为定时器/计数器0的中断号(重要)
{
	TH0 = (65536-45872)/256;      //方式1需要重装初值
	TL0 = (65536-45872)%256;
	num++;      //mun变量自加1
	if(num == 10)  //判断定时时间是否等于0.5s 为真之后 LED灯的电平状态转换
	{
		num = 0;   //清零,好判断下次计时
		LED =~ LED;//电平状态取反
	}
}

void TimerI_Routine(void) interrupt 3  //中断号 定时器/计数器1中断  1为定时器/计数器0的中断号 (重要)
{
	TH1 = (65536-45872)/256;  //方式1需要重装初值
	TL1 = (65536-45872)%256;
	num1++;   //mun1变量自加1
	if(num1 == 20)   //判断定时时间是否等于1s 
	{
		num1 = 0;   //清零,好判断下次计时
		num2--;     //mun2变量自减1  mun2的初始值为60
		if(num2 == 0) //判断是否计时结束
		   num2 = 60; //重新赋值,以便重新计时
	}
	
}
	

3.数码管LED灯相关程序代码

代码如下:

/*****
"hardware.h"自创的头文件、hardware翻译为:五金器具; 计算机硬件; 武器装备;
“”用于自己创建的头文件、<>反之 例:<reg51.h>

******/
#include "hardware.h"
#include "software.h"  //调用此函数的变量(因此包含此文件)
//共阴数码管段码
uchar code block[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //定义无符号字符型类型数组来储存段码

void tube()    //数码管扫描函数
{
  uchar i;  //定义i变量
	for(i=0;i<2;i++)
	{
		switch(i)	
		{														 
		   case(0):			 //位选,第一个数码管	
				LSA=1;
				LSB=1;
				LSC=1;
		        P0 = block[num2/10];  //十位数拆分
				 break;
			case(1):          //位选,第一个数码管
				LSA=0;
				LSB=1;
				LSC=1;
			    P0 = block[num2%10];  //个位数拆分
				 break;
		}
//		P0 = block[num%10];
		delayms(5);   //延时一会(视觉残留)
		P0=0x00;      //消影
	}
}

4.相关H文件程序代码

代码如下:

#ifndef __SOFTWARE_H__  
#define __SOFTWARE_H__ 

#include <hardware.h>  //包含此头文件,以便在此C文件中调用

extern void delayms(uint xms);    // extern(外部的) 声明此函数给外部调用
extern num2;                      //声明此变量给外部函数调用
#endif
#ifndef __HARDWARE_H__
#define __HARDWARE_H__

#include <reg51.h>    //51单片机头文件
//#include <software.h>


//数码管    138译码器 
sbit LSA=P2^2;	
sbit LSB=P2^3;	
sbit LSC=P2^4;
//LED灯
sbit LED=P2^0;

typedef unsigned int uint;	  // typedef(类型定义) 用来给无符号整型类型数据 unsigned int 定义新名字 uint
typedef unsigned char uchar;  //用来给无符号字符型类型数据 unsigned char 定义新名字 uchar
extern uint;    //声明给外部函数使用
extern uchar;   //声明给外部函数使用
extern void tube(void);   // extern(外部的) 声明此函数给外部调用

#endif

以下是编译的结果:
Rebuild target ‘porject’
assembling STARTUP.A51…
compiling main.c…
compiling hardware.c…
compiling software.c…
linking…
Program Size: data=14.0 xdata=0 code=529
creating hex file from “.\Objects\porject”…
“.\Objects\porject” - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:01

提示:模块化编程很重要,如果有不了解的小伙伴推荐大家去看这篇文章写得很好:https://blog.csdn.net/weixin_30764137/article/details/96185151
keil5 的模块化编程详解

总结

首先我也是一个单片机入门的小白,编写文章不易。如果我的文章对大家有所帮助,我感到很开心。其次有很多的不足之处,希望大家多多包涵。另外,如果大家有什么好的意见,欢迎大家留言讨论。一起共同进步!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机数码管显示60秒倒计时(C语言) 的相关文章

  • Pycharm terminal激活虚拟环境

    Pycharm terminal激活虚拟环境 xff0c 首先需要保证系统完成了conda的安装 xff0c 并在Powershell中完成虚拟环境的创建 xff08 操作创建的虚拟环境名称为deep pool xff0c 这个虚拟环境在接
  • xftp成功安装但连接Ubuntu失败

    Xftp连接Ubuntu失败 1 查看主机的IP地址是否填写正确 xff0c 如何查看Ubuntu的IP地址 xff1a 在terminal中输入ifconfig xff0c 如果Ubuntu ifconfig失败 xff0c 原因是未安装
  • skynet中给日志关键字加上颜色

    skynet中给控制台日志关键字加上颜色 控制文本颜色的ANSI转义序列 通用的控制文本颜色的转义序列格式如下 xff1a CSI n1 n2 m 其中CSI全称为 控制序列引导器 xff08 Control Sequence Introd
  • Ubuntu20.4安装docker

    在线安装docker xff08 确保curl已经安装 xff09 curl fsSL https get docker com o get docker sh sudo sh get docker sh 离线安装docker 参考资料ht
  • ubuntu20.4搭建本地地图服务(本地OSRM)

    下载地图数据文件 xff08 xxx osm pbf xff09 xff0c 下载网址http download geofabrik de xff0c 例如下载Asia下的China的文件 xff08 China osm pbf xff09
  • Ubuntu20.4输入ifconfig之后只有ens33,没有具体的ip地址

    出现的问题 xff1a Ubuntu20 4输入ifconfig之后只有ens33 loc docker xff08 这是自己安装的docker分配的端口 xff09 xff0c 发现ens33没有具体的ip地址 解决方法 xff1a 1
  • 使用anaconda创建虚拟环境

    方法一 xff1a 使用anaconda navigator 打开anacodna navigator 选择environments xff0c 点击Create xff0c 填写环境名 选择python版本 方法二 xff1a 使用ana
  • 日常问题——电脑相机灰色带斜杠打不开

    电脑相机灰色带斜杠 xff1f xff1f xff1f 解决方法 OK xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01
  • 云计算课程-Ubuntu系统搭建jenkins服务

    博客内容是云计算课程搭建DevOps流水线的步骤之一 xff0c 即搭建jenkins服务 可以单独运用于jenkins服务的搭建 也可以作为搭建dev ops中jenkins server主机的步骤之一 使用的实验环境为 xff1a Ub
  • 蓝桥杯单片机-静态数码管

    该板子为共阳数码管 Y7C控制每个数码管的内容 xff0c Y6C控制显示数码管的位置 只需要先通过Y6C打开需要显示的数码管 xff0c 即让对应的数码管com口为1 xff0c 再通过Y7C向该数码管写入内容即可 include 34
  • Linux系统(Ubuntu20.04)安装Anaconda及报错解决

    1 错误 2 解决 错误原因 xff1a 现有的文件的md5与真实的md5值不匹配 xff08 现有的文件是在win10系统上下载 xff0c 直接通过FileZilla软件传输 xff0c 得到的文件被修改 xff09 链接 xff1a
  • Ubuntu下的SD卡分区操作(制作Linux启动文件)

    最近在使用SD卡制作Linux启动文件时 xff0c 要进行SD卡的分区操作 总结了主要的流程 xff0c 操作步骤如下 xff1a 1 插入SD卡并挂载到Ubuntu下 xff0c 输入以下命令查看SD卡挂载信息 sudo fdisk l
  • STM32程序正常烧录后不能运行的可能原因(关于新旧CUBE的型号问题)

    STM32程序正常烧录后不能运行的可能原因 xff1a 1 没有勾选Mirco Lib xff1b 2 没有在烧写选项里勾选reset and run xff0c 然后自己也没有手动复位 xff0c 把自己吓到了 xff1b 3 对于使用H
  • vim退出插入模式

    vim退出插入模式其实很简单的 xff0c 直接按键盘Esc键就可以了 xff0c 但是Esc键在键盘上布局位置比较远 xff0c 取而代之的还有另外一种方式就是Ctrl 43
  • 常见的几种数据加密算法

    常见的数据加密算法 一 xff0c 数据加密的含义 数据加密 xff08 Data Encryption xff09 指将一个信息 xff08 或称明文 xff0c plain text xff09 经过加密钥匙 xff08 Encrypt
  • Proxmox 实现存储复制及高可用HA

    proxmox存储复制 和 HA故障切换 存储复制 命令行工具pvesr用于管理Proxmox VE存储复制框架 存储复制能够提高使用本地存储的客户机的冗余性 xff0c 同时降低客户机迁移时间 该工具能够将客户机的虚拟磁盘复制到其他节点
  • 如何利用起家里的旧电脑当个人网盘使?这里有半小时教程(逐步)

    旧电脑这种东西啊 xff0c 扔也不得 xff0c 不扔又不知道怎么利用 xff0c 实乃头疼之事 网盘这种东西啊 xff0c 我们需要的是什么 xff1f 容量 隐私性对吧 xff1f xff08 隐私性你懂的 xff09 xff08 这
  • Docker入门程序

    1 编写Dockerfile文件 创建一个空的Docker工作目录dockerspace 进入该目录 xff0c 并使用sudo vim Dockerfile指令新建并打开一个Docker文件 xff0c 然后向该文件中编写内容 2 编写外
  • Ubuntu 系统中网络总是断掉重新连接

    Ubuntu 系统中网络总是断掉重新连接 xff0c 让人很烦恼 xff0c 在网上寻找多种方法后还是无法解决 xff0c 因此在经过团队成员的不断尝试 xff0c 最终将解决办法总结如下 xff1a 在设置完ip DNS和网关后 xff0
  • 数据结构之顺序表

    目录 前言 一 顺序表的结构 二 顺序表各接口函数及实现 1 顺序表的初始化 2 顺序表的打印 3 顺序表的插入函数 顺序表头部插入函数 顺序表尾部插入函数 任意位置插入函数 4 顺序表的删除函数 头部删除函数 尾部删除函数 任意位置删除

随机推荐

  • WSL2配置代理 记录下遇到的所有坑

    第一步 开放windows对wsl2的防火墙 大家都知道wsl2和wsl1不一样 wsl2基本上就是一个虚拟机 虚拟了一个linux的系统 主机之间是有防火墙的 现在我们要关闭它 打开powershell7以管理员身份运行 PS C spa
  • 三、共阳数码管的静态显示

    目录 1 数码管的电路分析 2 代码 8个数码管分别单独依次显示0 9的值 xff0c 然后所有数码管一起同时显示0 F的值 xff0c 如此往复 1 数码管的电路分析 共阳数码管 xff1a xff08 接低 61 亮 xff09 0 1
  • 十四、基础技能综合实训案例解析

    目录 自己实现有问题的部分 xff1a 跑马管 xff08 左到右依次点亮数码管的所有段码 xff08 怎么实现数码管全亮 xff1f xff09 xff0c 再依次从左 到右熄灭 xff09 独立按键 xff1a 按下按键 xff0c 灯
  • lua os.time与os.date的简单用法

    local start 61 os time year 61 2016 month 61 2 day 61 1 hour 61 20 min 61 0 sec 61 0 local finish 61 os time year 61 201
  • python opencv 调用摄像头失败问题的解决 Windows

    省流 xff1a 内含 Python Opencv 双目相机拍照代码 xff08 手动 or 自动 xff09 xff0c 可自取 xff1b 如果你的 cv2 VideoCapture 函数卡住但不报错 xff0c 打开 Windows
  • 使用PCtoLCD2002字模提取软件

    一 PCtoLCD2002基本介绍 PCtoLCD2002是专业的取字模软件 xff0c 采用C语言和汇编语言两种格式 xff0c 支持逐行 逐列 行列 列行四种取模方式 xff0c 还可以选择字体 大小 文字的长宽 xff0c 自动生成你
  • Java——打印出所有的水仙花数(两种方法实现)

    目录 概念介绍 代码实现 结果展示 概念介绍 34 水仙花数 34 是指一个三位数 xff0c 其各位数字立方和等于该数本身 例如 xff1a 153是一个 34 水仙花数 34 xff0c 因为153 61 1的三次方 xff0b 5的三
  • 虚拟机mac已连接以太网但是依旧没网络解决方法

    提供以下解决方案 1 关闭虚拟机 xff0c 在虚拟机网络适配器中更改 xff0c 每台电脑体质不一样 xff0c 桥接不行就net xff0c 再不行就选择主机 xff0c 不能一棵树吊死 xff0c 往往都是这个问题 xff0c 百度找
  • Debian 10服务器安全优化脚本

    vim anquanjiaoben sh bin bash echo 34 服务器安全脚本 34 echo 34 系统更新 34 sudo apt get update y sudo apt get upgrade y echo 34 ip
  • VS2017报错 class “Cxxxx“没有成员“GetContextMenuManager“ “GetContextMenuManager“:不是“Cxxxx“的成员

    项目场景 xff1a 系统 xff1a WIN 10 软件 xff1a VS 2017 问题描述 看B站MFC教学视频 xff0c 一直看到一个完整项目的搭建 xff0c 按照视频步骤来发现会报一个错误 xff1a class Cxxxx
  • 用户回调期间遇到未经处理的异常

    项目场景 xff1a 系统 xff1a WIN10 软件 xff1a VS 2017 问题描述 按照视频教学 xff0c 编译通过但是调试失败 提示错误为 xff1a 0x0FD7FD71 mfc140u dll SaleSystem ex
  • 无法打开源文件stdafx.h

    在VS 2019中使用Strcpy函数会报错 xff0c 大意是说该函数不安全 xff0c 建议使用 34 strcpy s 34 函数 百度发现 strcpy s 34 函数需要include stdafx h 然后编译器就说无法打开源文
  • 轮盘赌选择法

    遗传学基本术语 基因型 genotype xff1a 性状染色体的内部表现 xff1b 表现型 phenotype xff1a 染色体决定性状的外部表现 xff0c 或者说 xff0c 根据基因型形成的个体 xff1b 进化 evoluti
  • MFC使用roid设置全选与反选

    span class token comment 全选 span span class token keyword void span AllResultsListThcDlg span class token operator span
  • 使用wmic获取运行中进程的路径

    我们常常需要知道运行的进程在哪个目录下 使用wmic非常方便 xff0c 能够知道进程的详细信息 例如 xff1a 任务管理器中显示的进程名为c exe 查找路径方法是 xff1a 打开cmd exe 输入wmic 然后输入process
  • GWL_WNDPROC 、GWL_USERDATA、GWL_HINSTANCE未定义

    提示GWL HINSTANCE未定义则添加以下宏定义 xff1a span class token comment Window field offsets for GetWindowLong span span class token m
  • C语言:数组排序

    定义一个数组 xff0c for循环排列 include lt stdio h gt int main int argc char const argv int a printf 请输入数组长度 xff1a scanf 34 d 34 am
  • Android_广播机制实战演练(数鸭子)

    Android 广播机制实战演练 数鸭子 所需文件 MainActivity span class token keyword package span span class token namespace com span class t
  • [初学单片机]stm32f103C8T6最小系统板快速完成点亮led灯

    目录 一 准备工作 二 建立工程模板 三 配置keil5 四 程序 五 程序下载 xff08 烧录 xff09 六 总结 一 准备工作 keil5 xff0c 自行下载安装 xff1b 库函数包 xff0c 这里我上传了一个F1xx的库函数
  • 51单片机数码管显示60秒倒计时(C语言)

    51单片机数码管显示60秒倒计时 xff08 C语言 xff09 基于普中51单片机开发板 xff0c 运用定时器 计数器0和1 xff0c 实现60秒的倒计时和LED灯0 5s间隔闪烁 文章目录 51单片机数码管显示60秒倒计时 xff0