参考链接:
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         3CB0TL0=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++;
}

最后也来个动图演示吧

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

  1. 51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真

    51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真 本实验通过51单片机读取DS18B20温度传感器的温度,然后通过数码管显示,并通过串口,将读取到的温度数据发送出去. 本案例需要使 ...

  2. 51单片机实现数码管显示小数

    51单片机实现数码管显示小数 要求 1 Proteus 面向编程的模型搭建 2 代码实现 2.1. 实现数码管刷新 2.2 对小数进行分解的函数 3 测试用例 4 仿真结果 要求 要求1:根据整数部分 ...

  3. 单片机直流电机转速控制(数码管显示、独立按键控制正反转、停止、开始、PID算法)

    单片机直流电机转速控制(数码管显示.独立按键控制正反转.停止.开始.PID算法) proteus仿真演示 程序源码 #include<reg52.h> #include<stdio. ...

  4. 51单片机(二十五)—— 独立按键控制LED

    在51单片机的前面的文章中,我们主要讲述了单片机IO口的输出功能的应用,如LED控制.数码管控制等.这篇文章我们来讲解如何用单片机的IO口读取按键的状态,并根据按键的状态来控制LED.关于51单片机按 ...

  5. 51单片机动态数码管显示自己学号

    实验题目:使用51单片机实现动态数码管显示自己8位学号,例如20220018 在此原理图又分两种连接方式: 第一种是8位数码管接38译码器来减少端口使用. 第二种是,没有端口要求接好就可以那就是,把位 ...

  6. 基于51单片机的数码管显示方案

    这一次给大家带来的项目是课堂作业级别的51单片机数码管显示,本次的项目着重于讲解原理,让大家明白单片机的io对于外界设备的控制是如何进行的. 共阳极和共阴极数码管的差异 (1)驱动方法的差异.一个数码 ...

  7. 51单片机 静态数码管显示

    本章博客讲述使用51单片机编写程序静态数码管显示 1.新建工程,选择芯片型号,这里注意--为了防止出现在插入头文件reg时出现某些引脚不定义的情况 可尝试切换为AT89C52型号的芯片,插入头文件即为 ...

  8. 51单片机动态数码管显示时间+protues仿真

    项目场景: 纯小白 第一次写文章 写的不好请见谅 做51单片机数码管显示时间实验的时候protues 仿真出现了问题 问题描述 做51单片机数码管显示时间实验的时候protues 仿真出现了问题 仿真 ...

  9. 基于51单片机密码锁数码管显示步进电机开锁设计

    视频演示地址:https://www.bilibili.com/video/BV1Eg411G7JW/ 该设计是由AT89C51单片机为主控芯片数码管显示 开机后输入密码正确步进电机转半圈错误蜂鸣器报 ...

最新文章

  1. java 嵌套对象转xml_Gson对Java嵌套对象和JSON字符串之间的转换 | 学步园
  2. TileList自动滚动指定单元格,可视部分
  3. WIN配置git 配置后失败 can't be established
  4. python数据结构推荐书-关于数据结构,有哪些不错的参考书推荐?
  5. 梅露可物语虚拟服务器,【图片】【萌新】主界面的使用方法(零基础版)【梅露可物语日服吧】_百度贴吧...
  6. python 高级语言特性_Pytohon学习笔记(一)Python编程语言历史及特性
  7. python浅复制与深复制_Python中的浅复制与深复制
  8. java被电脑阻止怎么办_学电脑,一定要记住的6个常用命令,它能让你快速成为电脑达人...
  9. 读《向外行一样思考、像专家一样实践》之 简单、省略、抽象化、例子分析
  10. android 上传图片给js,安卓中HTML5图片上传实例详解
  11. 如何获取微信好友的地理位置信息
  12. 理解HTML HTTP API 和URL
  13. 图片去除水印两种工具及多种思路
  14. Appium统计iOS或者Android应用的性能
  15. https证书风险修复
  16. 98-微服务项目的编写(下篇)
  17. 【机器学习】异常检测
  18. 永磁同步电机参数自整定 包括电机极对数、电阻、电感、磁链、反电势常数、编码器零位等
  19. django 聚合查询 最大值与最小值 200316
  20. 网站服务器 加密狗,致远软件自助服务网站

热门文章

  1. 社区发现评价指标Q和NMI讲解、代码实现
  2. redis数据类型插入输出命令
  3. 解决symbol(s) not found for architecture x86_64报错
  4. 从AFDS 2012看异构计算 无处不在的应用zz
  5. 图像保存为二进制文件及二进制文件读出图像数据
  6. linux--ss命令 和 find 和 tar命令
  7. 一个程序员专用网站(各种开发辅助工具、学习、娱乐、三方应用等等)
  8. StringUtils系列之StringUtils.isNotBlank()和StringUtils.isNotBlank()的区别
  9. 非物质文化遗产的法律保护模式(九)
  10. skew算法_一种基于FPGA的多通道高速输入信号自动de‑skew算法的制作方法