51单片机七段数码管显示时钟无按键控制—①—74HC595版

2023-05-16

参考链接:
51单片机七段数码管显示时钟加按键控制—③—74HC595版
51单片机七段数码管显示时钟加按键控制—②—74HC595版

文章目录

    • 一、实验内容:
    • 二、实验分析:
    • 三、仿真图:
    • 四、源代码:

一、实验内容:

1.使用七段数码管显示一个时钟
2.编写程序让接在P0口的数码管显示时分秒,秒数每秒加一
3.要求1秒时间间隔使用定时器中断实现
4.七段数码管的位选和段选通过74HC595控制

二、实验分析:

①七段数码管显示屏需要显示数字的话需要知道段码(具体显示的数值)和位码(第 1——8 位)

②单片机传输信息告诉显示屏位码和段码是多少是通过74HC595芯片实现,使用此芯片的好处是能使用更少的引脚控制更多的位(原本需要单片机上8个引脚控制位码,8个引脚控制段值,现在只需要3根引脚即可“无限”扩展)

③单片机是怎么告诉显示器位码和段码是多少的呢,如果是使用8位+8位的话,那么直接就可以通过将配置引脚输出不同的值即可选中段码和位码 。示例
而使用74HC595的话则通过51芯片先发送八位位码,再送八位段码。一个比特一个比特传输,共两个字节,调用两次SendTo595(char byteData)函数。
因为51单片机是8位的不能一次送16位进去,所以分两次执行
在这里插入图片描述

8+8位控制举例:例如我拿出P0_0—P0_7 八引脚控制段值P2_0—P2_7八引脚控制位码。如果我要做第1位显示数字5,那么我只需要在P0八口输出0x6D——0110 1101, P2八口输出0x7F——0111 1111

位码选择:
位码选择:
*注:此处使用的是CC共阴数码管

选择段值 :
在这里插入图片描述

七段数码管引脚定义:
在这里插入图片描述
(这里的编码显示的是共阳的,共阴没找到相应的图,知道怎么对应就行。)

在这里插入图片描述

三、仿真图:

在这里插入图片描述

四、源代码:

(注释我感觉写的挺详细的,要看懂的话要先了解74HC595的工作方式)

#include "reg52.h"
#include "intrins.h"

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

//定义P0口的三个引脚,赋予不同的涵义
sbit SER = P0^1;    //p0.1脚控制串行数据输入
sbit SCK = P0^0;    //串行输入时钟
sbit RCK = P0^2;    //存储寄存器时钟

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
char duanMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//选择1-8哪个数码管段
char duanZhi[8]={0,0,0x40,0,0,0x40,0,0};	 	//保存8个数码管的中每个数码管段的数值 0x40:显示横杠

//num1:秒初始值 num2:分初始值 num3:时初始值
u16 num1=55,num2=59,num3=23;

static int i = 0;	//给中断计数使用

//函数声明
void SendTo595(char byteData);

/***********************************************************
*函数名		:display
*功能		:对传如的时分秒进行处理计算,转化为七段数码管要显示的值
*参数		:num1 秒	num2 分	  num3 时
************************************************************/
void display(u16 num1,u16 num2,u16 num3)
{

	//先发送8位位码,后发送8位段码
	//8位数码管需要发送8次
	char i=0;	//给单片机for循环使用,由于Keil4 把 变量定义放for里会报错,只能放函数体前面

	//分离每个数字的个位和十位/
	static char shi1,ge1,shi2,ge2,shi3,ge3;
	shi1=(char)num1/10;
	ge1=(char)num1%10;

	shi2=(char)num2/10;
	ge2=(char)num2%10;

	shi3=(char)num3/10;
	ge3=(char)num3%10;
	///=======

	//保存段值/
	duanZhi[0]=smgduan[shi1];
	duanZhi[1]=smgduan[ge1];
	duanZhi[3]=smgduan[shi2];
	duanZhi[4]=smgduan[ge2];
	duanZhi[6]=smgduan[shi3];
	duanZhi[7]=smgduan[ge3];	
	///=======

	i=0;
	for(;i<8;i++)	
	{
		SendTo595(~duanMa[i]); 		//送段码
		SendTo595(duanZhi[i]);		//送位码
		
		/*位移寄存器数据准备完毕,转移到存储寄存器*/
	   RCK = 0;         
	   _nop_();
	   _nop_();
	   RCK = 1; 	   //检测到上升沿,让存储寄存器时钟变为高电平
	}
		
}


/*******************************************************************************
* 函 数 名         : TimerInit
* 函数功能		   : 定时器0初始化
* 参数			   :无
*******************************************************************************/
void TimerInit()
{
	TMOD|=0X01;	//选择为定时器0模式,工作方式1,仅用TR0打开启动。
	TH0=0X4C;	//给定时器赋初值,定时50ms 		3CB0
	TL0=0X00;	//0X3CB0的十进制是15536 从15536计数到65536计数50000次 即50000us=50ms	
	ET0=1;		//打开定时器0中断允许
	EA=1;		//打开总中断
	TR0=1;		//打开定时器	

}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 参数			 :无
*******************************************************************************/	
void main()
{	
	TimerInit();
	
	while(1)
	{	
	 	if(i==20)//20个50毫秒即一秒
		{
			i=0;
			num1++;
			if(num1==60)
			{
				num1=0;
				num2++;
				if(num2==60)//定时一小时自动清零
				{
					num2=0;
					num3++;
					if(num3==24)
					{
						num3=0;
					}
				}	
			}
		}
		display(num3,num2,num1); 	
	}
}


/***********************************************************
*函数名		:SendTo595
*功能		:串行发送8个比特(一个字节)的数据给595,再并行输出
*参数		:byteData 
************************************************************/
void SendTo595(char byteData)
{
   char i=0;
    for(;i<8;i++)
   {
        SER = byteData>>7; 		//取出最高位(第8位)       
        byteData= byteData<<1;  //将第7位移动到最高位    

        SCK = 0;        //变为低电平,为下次准备  ,并延时2个时钟周期 
        _nop_();
        _nop_();

        SCK = 1;         //上升沿,让串行输入时钟变为高电平,
   }  
}


/*******************************************************************************
* 函 数 名         : Timer0()
* 函数功能		   : 定时器0中断函数
* 参数			   :无
*******************************************************************************/		
void Timer0() interrupt 1
{
	 TH0=0x4C;
	 TL0=0x00;
	 i++;		
}

最后也来个动图演示吧
在这里插入图片描述

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

51单片机七段数码管显示时钟无按键控制—①—74HC595版 的相关文章

  • 解决ubuntu网络调节助手之后打不开

    解决ubuntu安装deb文件之后打不开问题 xff08 安装libqtgui4 amd64 xff09 安装Ubuntu网络调试助手 链接 xff1a https pan baidu com s 1GSq pi1FOZxHFnY7PMBh
  • VSCODE中运行C语言(从安装到运行详细版)

    VSCODE中运行C语言 xff08 从插件安装到运行详细版 xff09 一 下载安装MinGW w64 官方下载网站 xff1a MinGW 64 往下来进入下一张页面图 xff0c 选择要下载的文件 二 环境变量配置 按照上面的步骤全部
  • 【ubuntu16.04 LTS】ping百度通,但浏览器打不开百度网页

    典型的DNS配置问题 1 xff0c 执行如下命令 span class token function sudo span span class token function vi span etc resolv conf 在文件最后添加
  • VLAN类型

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是VLAN类型 一 基于端口的VLAN xff1a 基于端口的VLAN是最简单 最有效的VLAN划分方法 xff0c 它按照设备端口来定
  • STM32开发(三) 使用printf 重定位到串口输出|CSDN创作打卡

    上一篇 主目录 下一篇 文章目录 背景 KEIL MDK环境下printf重定位串口输出 第一步 在KEIL MDK中使用MicroLIB如图中勾选 第二步 STM32Cube MX异步配置 第三步 KEIL代码演示 代码使用Cube 注意
  • 总线(二)CAN通讯协议介绍

    文章目录 CAN xff08 Controller Area Network xff09 是什么 xff1f 总线拓扑图CAN特征CAN协议数据帧遥控帧遥控帧和数据帧相关 xff1f 仲裁优先级决定数据帧和遥控帧的优先级标准格式和扩展格式的
  • CAN 简介

    1 目的 本文主要介绍一部分 CAN 协议层 2 CAN 简介 这里的内容参考的是 1991 9 的 2 0 版本的官方 CAN 规格书 2 1 概述 CAN 控制器局域网 是一种串行通讯协议 xff0c 传输速度可达 1Mbit s 总线
  • I2C 简介

    1 I2C 简介 这里的内容参考的是 2014 4 4 的 V 6 版本的官方 I2C Bus 规格书 xff0c 第六章有给出相应的链接 1 1 引脚 I2C 一般而言是一种同步半双工的通信方式 xff0c 所以除了电源引脚之外 xff0
  • MPC5744 烧录一直停留在 98% 的解决方法

    1 目的 本人在调试一块主控为 MPC5744 的板子时 xff0c 有时候在烧录时 xff0c 发现烧录总是停在 98 xff0c 卡在 CRC 这里 xff0c 在查找和看资料之后 xff0c 发现了几种解决方法 xff1a 使用 pe
  • MPC5744 Data Flash 仿真 EEPROM

    一 目的 本文主要是使用 MPC5744 中的 Data Flash 仿真 EEPROM 之前在 MPC5744 烧录一直停留在 98 的解决方法 中也简单介绍了 Flash xff0c 所以在这里直接介绍仿真过程 xff0c 注意这里可以
  • Keil添加文件和头文件

    Keil如何添加文件 在工程文件夹下面新建一个 c和一个 h文件 xff0c c文件就是要添加的文件 xff0c h文件就是要添加的头文件 右键点击Project下面的第一个文件夹 点击Manage Project Items 是新建文件夹
  • linux下简单的Socket+Http服务

    C语言体验Socket Http服务 代码部分实验结果实验总结 代码部分 socket监听80端口 xff0c 接收到访问数据 xff0c 返回简单的Http页面 span class token macro property span c
  • 不定态与高阻态,及modelsim默认波形颜色的含义

    数字电路只有高低电平 xff0c 没有实际电平对应不定态和高阻态 xff0c X和Z更多的是用来表示设计者的意图或者用于仿真目的 xff0c 旨在告诉仿真器和综合器如何解释这段代码 X态 xff1a 常用于判断条件 xff0c 只在告诉综合
  • 【ubuntu16.04 LTS】设置屏幕分辨率

    第一种方式 直接打开系统设置 xff0c 选择屏幕分辨率即可 xff0c 和Windows一样 xff0c 不多说 第二种方式 如果在第一种方式中 xff0c 没有找到自己想要设置的分辨率的话 xff0c 可以按如下操作 xff1a 1 x
  • verilog中taskd的用法

    本文转载自博客园作者 xff08 id xff09 xff1a 再也不喝冰了 任务就是一段封装在 task endtask 之间的程序 任务是通过调用来执行的 xff0c 而且只有 在调用时才执行 xff0c 如果定义了任务 xff0c 但
  • Github 安装和上手记录

    1 Git xff1a 分布式版本控制软件 xff08 本地含有版本库 xff09 2 安装 xff1a msysgit github io gt 3 Download gt 安装 4 安装时除了其中一步需要选择 use git from
  • Verilog02:结构化建模

    结构化描述是用Verilog HDL 进行电路设计中最基本描述方式 对于系统级电路设计 xff0c 为了把不同的功能模块有层次地组合在一起 xff0c 主要是采用模块调用的结构化建模方式实现 根据所调用子模块的不同抽象级别 xff0c 可将
  • 有无符号数及原码反码补码之间的关系

    前提知识 xff1a 加法器比减法器的电路实现方式更简单 无符号数表示的数值范围大于0 为了简化电路设计 xff0c 引入有符号数可以表示负数 xff0c 便可以用加法器实现减法运算 使用加法器和原码进行减法运算会产生错误结果 引入反码来修
  • MIPS指令格式定义

  • PTA 浙大版《C语言程序设计(第3版)》题目集--练习2-1 Programming in C is fun!

    题目 本题要求编写程序 xff0c 输出一个短句 Programming in C is fun 输入格式 本题目没有输入 输出格式 在一行中输出短句 Programming in C is fun 思路 一个简单的输出 代码 includ

随机推荐

  • 带参数的宏

    定义两个带参数的宏 xff0c 一个用来求s xff0c 另一个用来求area include lt iostream gt using namespace std define s a b c a 43 b 43 c 2 define A
  • RTK和网络RTK

    浅谈传统RTK工作模式与网络RTK工作模式 谈谈传统RTK工作模式与网络RTK工作模式 传统RTK工作模式就是电台工作模式 xff0c 网络RTK工作模式就是CORS系统测量 本文主旨 有网络信号和CORS覆盖范围的地方就选择网络RTK工作
  • KITTI数据集国内下载地址

    文件列表 xff1a http www functionweb tk kitti 如果遭遇下载失败的情况请访问 https blog csdn net weixin 43599336 article details 87801040 原始图
  • HTTP ERROR 405 Method Not Allowed

    一般访问web UI的时候出现以上错误 xff0c 都是浏览器的防火墙问题 可以进行在安全设置里取消一些防护功能即可
  • 【ubuntu16.04 LTS】更换国内清华源

    目录 1 xff0c 备份原始源文件sources list2 xff0c 修改源文件sources list3 xff0c 更新源 1 xff0c 备份原始源文件sources list 在终端输入如下命令 xff1a span clas
  • 串行通信——异步串行通信

    目录 I 串口通信简介 一 定义 二 意义 三 分类 II 异步串行通信详解 一 数据格式 1 起始位 2 数据位 3 奇偶校验位 4 停止位 二 通信制式 1 单工 2 半双工 3 全双工 三 通信速率 I 串口通信简介 一 定义 在一条
  • shell发送请求解析结果

    需求shell发送请求到服务获取返回结果 xff0c 解析结果后提取需要的数据 再次请求服务 1 发送get请求到服务器 xff0c 格式化返回结果输出到result json文件 2 解析json文件并循环处理解析结果 curl命令 X
  • VScode编辑器快捷键整理

    记录 xff1a VScode编辑器快捷键记录 1 代码块折叠 展开 操作光标所在文件中的所有代码块 xff1a 折叠所有 Ctrl 43 K 43 0 展开所有 Ctrl 43 K 43 J 仅仅操作光标所处代码块内的代码 xff1a 折
  • ROS不同版本消息传递问题

    ROS不同版本消息传递问题 问题 不同版本ros间可通信 xff0c 但消息发送接收有问题 主机 xff1a x86 BECKHOFF Ubuntu16 04 ROS Kinetic 从机 xff1a ARM AGX Xavier Ubun
  • 复位电路

    单片机复位电路 系统开始运行和重新启动都是依靠复位电路实现的 以MCS 51为例 xff0c 复位是需要在RST引脚加上2个机器周期 xff08 24个时钟周期 xff09 以上的高电平 简单的计算 xff1a 如果单片机的时钟频率是12M
  • WIFI原理

    1 路由器向下提供给接入的用户一个id xff0c 也就是类似于192 168 1 231 xff0c 这样的ip地址 xff0c 所有在这个路由器下的用户的ip地址的前面的网络号是相同的 xff0c 都是192 168 1 xff08 x
  • :: 在 C++ 中的作用

    一 作用域符号 xff1a 作用域符号 的前面一般是类名称 xff0c 后面一般是该类的成员名称 xff0c C 43 43 为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 另外 xff0c 在类外定义类中已申明的函数成员时 x
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • 基于stm32的mpu6050传感器实验

    64 TOCMPU6050 43 STM32学习笔记 学习了差不多两天的mpu6050 xff0c 参考了很多篇博客还有看一些资料 xff0c 今晚终于把这个东西在我的串口显示出来了 xff0c 下面就废话不多说 xff0c 开始我的笔记啦
  • Ubuntu 20.04 ROS Noetic及Realsense-ROS的安装和多机通信

    Ubuntu 20 04 ROS Noetic及Realsense ROS的安装和多机通信 1 Ubuntu20 04 ROS Noetic安装 参考官方安装教程 ROS Installation 请以以上安装步骤为准 xff0c 因为随着
  • 机械硬盘基本知识

    硬盘内部的物理结构很复杂 xff0c 只能从大的颗粒度去看内部的结构 xff0c 总体来说 xff0c 硬盘结构包括 xff1a 盘片 磁头 盘片主轴 控制电机 磁头控制器 数据转换器 接口 缓存 等几个部份 所有的盘片 xff08 一般硬
  • RTK八大基础知识

    RTK作为现代化测量中的测绘仪器 xff0c 已经非常普及 RTK在测量中的优越性也是不言而喻 为了能让RTK的优越性能在使用中充分的发挥出来 xff0c 为了能让RTK使用人员能灵活的应用RTK xff0c 我认为RTK使用人员必须了解以
  • 游戏思考04:网络游戏同步算法产生原因和相关介绍:跟随(插值)、预测、延迟补偿,三种算法(未完待续02/07)

    文章目录 一 网络同步的典型场景二 简单粗暴的数据同步为何行不通 xff1f xff08 帧同步的难题 xff09 1 xff09 网络同步的流程2 xff09 网络延迟和抖动的直观解释3 xff09 产生卡顿 瞬移的原因分析4 xff09
  • 51单片机定时器实现流水灯实验

    实验内容 xff1a 利用AT89C51的定时器0 方式1实现流水灯效果 xff0c 并用仿真验证 定时器0方式1的工作方式 xff1a 定时器的工作方式选择由寄存器TMOD控制 方式选择通过M0和M1控制 xff0c 方式1为16位定时器
  • 51单片机七段数码管显示时钟无按键控制—①—74HC595版

    参考链接 xff1a 51单片机七段数码管显示时钟加按键控制 74HC595版 51单片机七段数码管显示时钟加按键控制 74HC595版 文章目录 一 实验内容 xff1a 二 实验分析 xff1a 三 仿真图 xff1a 四 源代码 xf