C51单片机数码管动态显示

2023-11-19

数码管作为最廉价的输出设备,在各种自动化设备中有很大的应用,最简单普通的显示方式为动态刷新显示,称为假动态显示,即通过分时扫描每一位,利于人眼的视觉停留现象,造成一种静态显示的效果,如下图所示:

C51单片机由于运行速度很慢,在高刷新频率下,单片机的资源耗费很厉害,这样单片机就不可以再进行大量的计算工作,实际上,单片机在刷新时,只需要周期性的改变GPIO口的状态就可以了,剩下的时间其实都是在空转的状态下,我们能不能将这个空转的状态拿来用呢?当然是可以的啦,这里,我们利用单片机的定时器周期地产能中断,在中断内进行数码管的刷新工作,就可以将等待中断的这个CPU时间拿来做别的事情了。

硬件电路:

代码贴过来:

主函数

#include "shumaguan.h"
#include "timer.h"


sbit sw_jdq=P1^0;//定义一位继电器操作
void main(void)
{
  int cnt=0;//设定初值
  timer_init();//初始化定时器
  while(1)
  {
    value_now = cnt;//送初值到显示缓存
    delay(50);
    cnt++;
    sw_jdq=~sw_jdq;//切换继电器状态
    if(cnt>9999)//数值超出界线,回归最小
      cnt=-999;
  }
}

数码管驱动函数

#include "shumaguan.h"

#define DType	1			//define the Digital LED type, 1: VCC in common, 0: GND in common
#if DType==1
/*--------------------------------------------------------
Set the digital LED display code 
From left to right for
0,1,2,3,4,5,6,7,8,9,a.b,c,d,e,f,dp,-, 
--------------------------------------------------------*/
uchar code DS_BUF[]={0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 
0x83 , 0xc6 , 0xa1 , 0x86 , 0x8e , 0x7f , 0xbf , 0xff };
#else
uchar code DS_BUF[]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6b , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 
0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x80 , 0x40 , 0x00 };
#endif
uchar xdata buf_sm[4];            //set display buffer
  
uchar frash_cnt=0;//刷新计数器
uchar wei_buf=0x10;//位输出计数器
 
/*--------------------------
Compute the number from Value
value: something to display, range from -999 to 9999, suport float
--------------------------*/
void calc_sm(float value)
{
	uint tmp=0;
	if(value>=0)//输入值为正数,不显示负号
	{
		if(value>9999)//输入值大于9999,显示----
		{
			buf_sm[0]=17;
			buf_sm[1]=17;
			buf_sm[2]=17;
			buf_sm[3]=17;
		}
		else if(value>=1000)//输入值大于999,只显示整数
		{
			tmp=value;
			buf_sm[0]=tmp/1000;
			buf_sm[1]=tmp%1000/100;
			buf_sm[2]=tmp%100/10;
			buf_sm[3]=tmp%10;
		}
		else if(value>=100)//显示一位小数
		{
			tmp=value*10;
			buf_sm[0]=tmp/1000;
			buf_sm[1]=tmp%1000/100;
			buf_sm[2]=(tmp%100/10)+20;
			buf_sm[3]=tmp%10;
		}
		else if(value>=10)//显示两位小数
		{
			tmp=value*100;
			buf_sm[0]=tmp/1000;
			buf_sm[1]=(tmp%1000/100)+20;
			buf_sm[2]=tmp%100/10;
			buf_sm[3]=tmp%10;
		}
		else//显示三位小数
		{
			tmp=value*1000;
			buf_sm[0]=(tmp/1000)+20;
			buf_sm[1]=tmp%1000/100;
			buf_sm[2]=tmp%100/10;
			buf_sm[3]=tmp%10;
		}
	}
	else//输入值小于0,显示负号,其余同上
	{
		if((value<0)&&(value>-10))
		{
			tmp=value*100;
			tmp=abs(tmp);
			buf_sm[0]=17;
			buf_sm[1]=(tmp/100)+20;
			buf_sm[2]=tmp%100/10;
			buf_sm[3]=tmp%10;
		}
		else if((value<=-10)&&(value>-100))
		{
			tmp=value*10;
			tmp=abs(tmp);
			buf_sm[0]=17;
			buf_sm[1]=(tmp/100);
			buf_sm[2]=tmp%100/10+20;
			buf_sm[3]=tmp%10;
		}
		else if((value<=-100)&&(value>-1000))
		{
			tmp=value;
			tmp=abs(tmp);
			buf_sm[0]=17;
			buf_sm[1]=(tmp/100);
			buf_sm[2]=tmp%100/10;
			buf_sm[3]=tmp%10;
		}
    
	}
  
}
/*
显示部分,每执行一次,显示的位左移一位,移到最左边时,重新回到最右边,开始下一次刷新。
定义有小数点的位+20,每次送断码,检查大于20,段与0x7f添加小数点。
*/
void display()
{
  if(frash_cnt<=3)
  {
    wei |=0xf0;//数码管的消隐
    
    if(buf_sm[3-frash_cnt]>=20)
    {
      duan = (DS_BUF[(buf_sm[3-frash_cnt])-20]&0x7f);//显示小数点
    }
    else
      duan = DS_BUF[buf_sm[3-frash_cnt]];//不显示小数点
    
    wei = ~wei_buf;
    wei_buf <<=1;//显示位左移一位
    frash_cnt++;
  }
  else
  {
    wei |=0xf0;//数码管的消隐
    frash_cnt=0;
    wei_buf=0x10;//显示位回到最右边
  }
}
/*
数码管自用延时
*/
void delay(uint i)
{
  uchar j;
  for(;i>0;i--)
  for(j=0;j<120;j++);

}

数码管头文件

#ifndef _shumaguan_h_
#define _shumaguan_h_
#include "math.h"
#include "reg52.h"
#define duan P0
#define wei P2

#define uchar unsigned char
#define uint unsigned int
  
extern uchar frash_cnt;
extern uchar wei_buf;

void calc_sm(float value);
void display();
void delay(uint i);


#endif

定时器配置及中断服务函数

#include "reg52.h"
#include "timer.h"
#include "shumaguan.h"


float xdata value=0 , value_now = 0;

void timer_init()
{
  TMOD = 0x02;                    //set timer0 as mode1 (16-bit)
  TL0 = T1MS;                     //initial timer0 low byte
  TH0 = T1MS;                //initial timer0 high byte
  TR0 = 1;                        //timer0 start running
  ET0 = 1;                        //enable timer0 interrupt
  EA = 1;                         //open global interrupt switch
}



/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
    if(value!=value_now)//检测显示值与当前值是否匹配
    {
      value=value_now;//刷新显示值
      calc_sm(value_now);//重新计算显示值的输出缓冲区
    }
    display();//刷新数码管显示

}

定时器头文件

#ifndef _timer_h_
#define _timer_h_
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
  
//-----------------------------------------------

/* define constants */
//#define FOSC 11059200L
#define FOSC 12000000L

#define T1MS 0   //1ms timer calculation method in 12T mode


//-----------------------------------------------

extern float xdata value , value_now;


void timer_init();


#endif

 

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

C51单片机数码管动态显示 的相关文章

  • FreeRTOS记录(八、用软件定时器?还是硬件定时器?)

    FreeRTOS软件定时器 相对前面的内容来说 软件定时器还是比较简单的 我们简单测试一下 因为是简单介绍 所以原理和源码的分析不会那么详细 具体可以根据文中API查看源码 使用起来记住创建 启动 回调函数核心步骤即可 增加测试Demo 再
  • STC89C52单片机数码管介绍以及代码示例

    目录 一 数码管介绍 二 数码管引脚定义 我们首先对单个引脚进行说明 其次 我们对多个引脚管进行说明 最后我们来详细说说如何进行位选还有段选 接着是段选 三 数码管段码表 四 数码管驱动方式 五 代码演示 一 数码管介绍 LED数码管 数码
  • STC89C52单片机蜂鸣器介绍以及《孤勇者》歌曲代码示例

    目录 蜂鸣器介绍 驱动电路 三极管驱动 集成电路驱动 音乐的相关知识 音符与计时器重装载值对应表 将乐谱转换为宏定义的音调谱 实际代码演示 蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件 常用来产生设备的按键音 报警音等提示信号 蜂鸣
  • 多线程、定时器----基础认识篇1

    1 多线程一般通过使用thread的子类或者往thread构造方法中传入runnable对象实现 也就是常说的 继承 thread类 和 实现runnable接口 注 实现runnable接口可以实现线程 原理是 在thread的run方法
  • Quartz概述

    Quartz是开源任务调度框架中的翘楚 它提供了强大的 任务调度机制 Quartz允许开发人员灵活的定义触发器的调度时间表 并可对触发器和任务进行关联映射 此外 Quartz提供了调度运行环境的持久化机制 可以保存并恢复调度现场 即使系统因
  • [Linux用户空间编程-3]:Linux定时机制的几种实现方法

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123376014 目录 前言 定时器的
  • SylixOS下定时器使用

    1 适用范围 本文档介绍SylixOS下实现定时器功能的方法 使用者应熟悉SylixOS以及SylixOS下的编程规范 2 实现方案 SylixOS提供标准定时器接口 用户可在应用层直接调用 下面列出定时器的创建 启动 停止以及删除等操作
  • Qt中关于定时器timerEvent和QTimer

    1 Qt 定时器类 QTimer 在进行窗口程序的处理过程中 经常要周期性的执行某些操作 或者制作一些动画效果 使用定时器类 QTimer 就可以解决 使用 只需创建一个 QTimer 类对象 然后调用其 start 函数开启定时器 此后
  • C51单片机学习笔记(二)——花样流水灯的实现

    C51单片机学习笔记 二 花样流水灯的实现 文章目录 C51单片机学习笔记 二 花样流水灯的实现 1 单片机引脚 晶振 复位的作用 2 流水灯原理图 3 单片机的周期 4 延时函数的编写 5 使用 位操作 控制流水灯 6 使用字节控制 并行
  • vue定时器无法停止。

    vue模板里面的定时器问题 文章目录 前言 一 定时器是什么 二 使用步骤 1 使用过程 2 读入数据 总结 前言 有些时候我们在使用vue模板时 不免会使用定时器来定时请求后台获取数据 但是在获取数据的时候 定时器就像踩不住刹车的小车 飘
  • STM32单片机示例:多个定时器级联使用

    文章目录 目的 基础说明 关键配置与代码 示例链接 目的 有些情况下会遇到单片机的定时器位数不够用 这时候可以使用低定时器级联的方式来处理 这里将对此做个示例说明 基础说明 这里说的定时器级联是指一个定时器正常计数工作 然后在发生溢出时发送
  • JavaEE初阶(5)多线程案例(定时器、标准库中的定时器、实现定时器、线程池、标准库中的线程池、实现线程池)

    接上次博客 JavaEE初阶 4 线程的状态 线程安全 synchronized volatile wait 和 notify 多线程的代码案例 单例模式 饿汉懒汉 阻塞队列 di Dora的博客 CSDN博客 目录 多线程案例 定时器 标
  • 看门狗定时器

    看门狗定时器 WDT Watch Dog Timer 是单片机的一个组成部分 它实际上是一个计数器 一般给看门狗一个数字 程序开始运行后看门狗开始倒计数 如果程序运行正常 过一段时间CPU应发出指令让看门狗复位 重新开始倒计数 如果看门狗减
  • stm32定时器与定时器中断

    1 定时器种类 注 主要使用通用定时器 2 通用计时器特点描述 说明 四个通道互不影响 3 定时器中断触发条件 4 定时器计数模式 分为向上 向下 向上向下模式 5 通用定时器作用用途 测量输入输出波长度等 说明 每个定时器完全独立没有共享
  • 基于51单片机的时钟设计

    今天小刚做了一个基于51单片机的时钟 本来想把数码管显示动态扫描放到定时器1的中断里到但是 一按按键 就卡住了 效果不是很理想 所以就放弃了这种方案 不过最后也实现了功能 以下是程序代码 4个按键功能 1 切换 2 时间 3 时间 4 清零
  • java定时器,每天00:00执行任务

    import java text SimpleDateFormat import java util Calendar import java util Timer import java util TimerTask public cla
  • 升序定时器的时间链表的完全实现

    李邦柱 helpylee 126 com 1 定时器简介 定时器通常包含至少两个成员 一个超时时间 通常采用相对时间或者超时时间 和一个超时时间到达后的一个回调函数 有时候还可能包含回调函数被执行时需要传入的参数 以及是否重新启动定时器 更
  • STM32定时器----TIMx->SR寄存器

    在研究stm32定时器时发现 当进入定时器的中断时 定时器计数器以及中断接收时正常运行的 并没有因为进入中断而停止 具体看以下分析 定时器初始化代码 TIM捕获通道开启宏定义 1 开启 0 关闭 define TIM ICCH1 1 def
  • 关于8266WiFi模块(AT)问题分析与解答(单片机和wifi模块连接)

    近段时间由于作品需要 就入手了一个esp 01 s 8266wifi模块 厂家已经刷好固件 这个模块使用起来还是很简单便捷的 但是在调试过程中会遇到各种问题 以下是个人的一个总结 希望对大家有帮助 1 单片机晶振和波特率问题 重要 有关单片
  • C51单片机数码管动态显示

    数码管作为最廉价的输出设备 在各种自动化设备中有很大的应用 最简单普通的显示方式为动态刷新显示 称为假动态显示 即通过分时扫描每一位 利于人眼的视觉停留现象 造成一种静态显示的效果 如下图所示 C51单片机由于运行速度很慢 在高刷新频率下

随机推荐

  • windows下java swt实现操作redis的客户端工具

    原文 windows下java swt实现操作redis的客户端工具 源代码下载地址 http www zuidaima com share 1902705862708224 htm redisclient 1 0 正式发布 适用于多个 R
  • ip广播系统服务器软件,【网络广播服务器软件IP网络广播软件数字广播软件】 - 太平洋安防网...

    参数说明 品牌 万凯wankai 详细描述 具备 版权局颁发的计算机软件 标准TCP IP网络协议 安装于连接以太网的计算机 IP广播的网络终端具有 立的ID号与IP地址 可以单 接收服务器的个性化定时播放节目 定时播放的操作 可以通过电脑
  • Hibernate之inverse和cascade详解

    继Hibernate学习笔记整理之后 发现inverse和cascade这两个属性在配置过程中比较含糊 仔细比较一下是有些地方比较像 所以很容易搞糊涂 借助此文来阐述下inverse和cascade的区别 什么是inverse 默认值为fa
  • centos8安装postgresql步骤

    1 安装源 1 sudo yum y install epel release 2 postgresql官网发布的postgresql对应的安装源 sudo yum install y https download postgresql o
  • There are multiple modules with names that only differ in casing.

    问题 在 npm run dev 后 控制台出现警告 没有出现链接 但是在浏览器上直接输入地址http localhost 8080 又可显示界面 There are multiple modules with names that onl
  • 华为机试HJ55 挑7

    HJ55 挑7 Python 题目 解题思路 代码 结果 题目 解题思路 1 多组输入 需要循环 2 循环查找到输入数值即可 字符串查找用in 能否整除 求余后判断是否 0 3 最后打印找到的数字的列表长度 代码 def func n in
  • 逐行对比LLaMA2和LLaMA模型源代码

    几个小时前 2023年7月18日 Meta发布了允许商用的开源模型LLaMA2 笔者逐行对比了LLaMA2模型源代码 和LLaMA相比 几乎没有改动 细节如下 是否改动 LLaMA2 LLaMA 模型整体构架 无 Transformer T
  • 面试必考真题

    1 输入一个链表 反转链表后 输出新链表的表头 package com csu marden public class Demo1 public static void main String args Node head new Node
  • 解决“17: 错误:程序中有游离的‘\240’,\302’

    参考链接 https blog csdn net asuphy article details 54602426 执行如下命令即可 sed i s o240 o302 g dy haikang test cpp
  • Invalid bound statement (not found):

    BUG描述 在执行动态SQL出现问题 原因 mapper接口中的方法名和mapper xml中的id标签不一致 解决方案 修改mapper接口中的方法名 使其对应到mapper xml中的id标签 参考资料
  • openssl的x509命令简单入门

    openssl的x509命令简单入门 openssl是一个强大的开源工具包 它能够完成完成各种和ssl有关的操作 命令说明 openssl help 会得到如下的提示 openssl Error help is an invalid com
  • 数据库常用命令之外键(foreign key)之多对一(总结,基础)

    我是小白 刚接触MySQL不久 现阶段正在学习 为此在CSDN上留下自己的学习笔记 如果有错误的地方还请大家见谅 评论或者私发我错误地方哦 谢谢大家 嘿嘿 此篇将记录外键的相关知识 上篇内容为对一张表的约束条件 传送门 创建表的完整性语法
  • golang基础教程

    目录 golang基础教程 一 环境搭建 golang基础教程 二 开发规范及API golang基础教程 三 变量与数据类型概述 golang基础教程 四 基本数据类型 golang基础教程 五 基本数据类型的转换 golang基础教程
  • 缺少nodejs环境,请在设置中配置nodejs的安装路径 - HBuilder - uniapp

    HBuilder运行uni app项目 点击 运行到 提示 缺少nodejs环境 请在设置中配置nodejs的安装路径 解决办法 找到工具 设置 运行配置 node运行配置 运行终端类型 选择 内置 外部 如果已经配置过 关闭编译器 重新打
  • Unity_如何使相机视角一直跟随角色移动

    实例代码如下 using System Collections using System Collections Generic using UnityEngine 相机视角跟踪 public class FollowTarget Mono
  • QHash & QMap 的顺序问题 (***)

    QT关联容器QMap QHash的Key值自动排序问题 对QMap中的key进行自定义排序 如何取消QMap自动排序 让QMap按照插入的顺序排列 通过插入顺序循环QHash QMap QHash插入后的显示顺序以及记录插入顺序的数据结构
  • OpenGL图形管线和坐标变换

    1 OpenGL 渲染管线 OpenGL渲染管线分为两大部分 模型观测变换 ModelView Transformation 和投影变换 Projection Transformation 做个比喻 计算机图形开发就像我们照相一样 目的就是
  • 最实用的chrome插件

    前言 说真的第一次看到CSDN这个插件的时候并没有感觉特别吸引我的地方 因为我个人安装了好多的插件 第二次看到CSDN插件还是因为广告上说的参赛拿奖 其实我的动机也不是很纯o o 插件地址 CSDN插件 走起 对于谷歌的插件安装方式很多 可
  • springboot——集成elasticsearch进行搜索并高亮关键词

    目录 1 elasticsearch概述 3 springboot集成elasticsearch 4 实现搜索并高亮关键词 1 elasticsearch概述 1 是什么 Elasticsearch 是位于 Elastic Stack 核心
  • C51单片机数码管动态显示

    数码管作为最廉价的输出设备 在各种自动化设备中有很大的应用 最简单普通的显示方式为动态刷新显示 称为假动态显示 即通过分时扫描每一位 利于人眼的视觉停留现象 造成一种静态显示的效果 如下图所示 C51单片机由于运行速度很慢 在高刷新频率下