数码管动态显示+定时器中断方式+Protues
1 仿真现象



2 程序设计
2.1 主程序
#include "DisplaySmg.h"
#include "Timer0.h" sbit LED = P1^0; unsigned int SystemTimer=0; //系统时间
unsigned char SystemFlag=1; //初始状态
unsigned int NUM = 1983; //待显示数据 void disp_num(); void main()
{
Timer0Init(); //启动定时器T0
do //开机显示
{
if(SystemTimer%500 == 0) //每间隔50ms
LED = ~LED; //LED灯闪烁
}while(SystemTimer<5000); //开机显示5000ms
SystemFlag = 0; //关闭初始状态,进入工作状态
while(1)
{
disp_num(); //显示四位十进制数
}
} void disp_num()
{
LedBuf[0]= NUM/1000; //取千位
LedBuf[1]= NUM/100%10; //取百位
LedBuf[2]= NUM/10%10; //取十位
LedBuf[3]= NUM%10; //取个位
} //定时计数器T0每满1ms,执行该中断函数,
void Timer0_ISR(void) interrupt 1
{
TR0=0;
if(SystemFlag==1) SystemTimer++; //系统时间自加1
DisplaySmg(); //实现数码管的动态显示刷新
TL0 = 0x66; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TR0=1;
}
2.2 数码管显示函数模块(switch case语言实现)
#ifndef __DisplaySmg_H__
#define __DisplaySmg_H__ #include <REG52.H> #define GPIO_SEG P0 //段选端
#define GPIO_SEL P2 //位选端
#define SMG_NUM 4 //数码管的个数 extern unsigned char LedBuf[]; //外部变量声明 void DisplaySmg(); #endif
#include "DisplaySmg.h"
unsigned char code LedData[]={ //共阴型数码管的段码表,字符,序号
0x3F, //"0",0
0x06, //"1",1
0x5B, //"2",2
0x4F, //"3",3
0x66, //"4",4
0x6D, //"5",5
0x7D, //"6",6
0x07, //"7",7
0x7F, //"8",8
0x6F, //"9",9
0x77, //"A",10
0x7C, //"B",11
0x39, //"C",12
0x5E, //"D",13
0x79, //"E",14
0x71, //"F",15
0x76, //"H",16
0x38, //"L",17
0x37, //"n",18
0x3E, //"u",19
0x73, //"P",20
0x5C, //"o",21
0x40, //"-",22
0x00, //熄灭 23
};
unsigned char code LedAddr[]={0xfe,0xfd,0xfb,0xf7}; //数码管位选
unsigned char LedBuf[]={22,22,22,22}; //显示缓存区
void DisplaySmg()
{
unsigned char i; //等价于 "static unsigned char i = 0;"
switch(i)
{
case 0:
GPIO_SEG = 0x00; //消影
GPIO_SEG = LedData[LedBuf[0]]; //段码
GPIO_SEL = LedAddr[0]; //位选
i++;
break;
case 1:
GPIO_SEG = 0x00;
GPIO_SEG = LedData[LedBuf[1]];
GPIO_SEL = LedAddr[1];
i++;
break;
case 2:
GPIO_SEG = 0x00;
GPIO_SEG = LedData[LedBuf[2]];
GPIO_SEL = LedAddr[2];
i++;
break;
case 3:
GPIO_SEG = 0x00;
GPIO_SEG = LedData[LedBuf[3]];
GPIO_SEL = LedAddr[3];
i=0;
break;
default:break;
}
}
3.3 定时/计数器中模块
#ifndef __Timer0_H__
#define __Timer0_H__ #include <reg52.h> void Timer0Init(void); #endif
#include "Timer0.h" void Timer0Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时 ET0 = 1; //定时器0中断开关
EA = 1; //中断总开关
} //中断服务函数一定是一个没有返回值的函数
//中断服务函数一定是没有参数的函数
//中断服务函数函数名后跟着关键字interrupt
//interrupt n 0~4 5个中断源,8*n+0003H
// 0003H INT0, 00BH T0, 0013H INT1, 001BH T1, 0023H ES
//中断服务函数不能被主程序或者其他程序所调用
//n后面跟着using m(0~3)工作寄存器组 //void Timer0_ISR(void) interrupt 1
//{
// TL0 = 0x66; //设置定时初始值
// TH0 = 0xFC; //设置定时初始值
//}
3 参考来源
(1)单片机应用实践篇之定时计/数器中断方式实现数码管动态显示刷新_哔哩哔哩_bilibili;
数码管动态显示+定时器中断方式+Protues的更多相关文章
- ZYNQ入门实例——定时器中断与程序固化
一.前言 APU系统中CPU以串行执行代码的方式完成操作,软件方式很难做到精准计时,因此调用内部定时器硬件完成计时是更好的选择.本文以定时器中断方式控制LED周期性闪烁为例学习私有定时器的使用.同时学 ...
- 十天学会单片机Day1点亮数码管(数码管、外部中断、定时器中断)
1.引脚定义 P3口各引脚第二功能定义 标号 引脚 第二功能 说明 P3.0 10 RXD 串行输入口 P3.1 11 TXD 串行输出口 P3.2 12 INT0(上划线) 外部中断0 P3.3 1 ...
- 定时器的应用---中断方式---让8个LED灯,左右各4个来回亮
定时器的应用---中断方式---让8个LED灯,左右各4个来回亮 /*************************** 中断方式 是主程序专注于其他的事情, 待定时器中断时才执行中断子程序. ** ...
- zigbee学习之路(七):定时器3(中断方式)
一.前言 上次我们学习了了用定时器3进行查询方式来进行溢出判断,今天我们来换一种方式,用中断方式来检测和查询定时器3的溢出. 二.原理与分析 要使用定时器3,我们必须先要配置的是T3CTL,来把定时器 ...
- 提升效率(时间准确性),减少时间和资源的消耗——由89C52/89C51的定时器中断引出的一些问题
尽量用最少的文字描述清楚问题. 事情起因是这样的: 要做遥控小车的平台迁移,STM32开发板无法方便地供电,因此又拿出了尘封的51(STC89C52RC),搭配上最小系统板就可以用排针加杜邦线供电了. ...
- 在Linux下的中断方式读取按键驱动程序
// 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) ...
- 【AT91SAM3S】ADC中断方式采集数据
板子依旧是英倍特的EK-SAM3S.ADC部分的原理图如下: PB1是一个复用引脚,在这里被用作AD功能,对应芯片上的AD5.即,使用片内ADC的5通道测VR1上2号引脚的电压. 实验采用了SysTi ...
- 以中断方式实现1s定时
中断方式比较特殊,需要使用单片机内部的中断处理机制,同时指定中断函数. #include <reg52.h> sbit LED = P0^; unsigned ; void main() ...
- STM32学习笔记——定时器中断(向原子哥学习)
定时器中断 STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器.在本章中,我们将利 ...
- SCM文章10课时:定时器中断
JP3遇见P0口. #include<reg51.h> #define uchar unsigned char uchar flag,num; uchar code smg[10] = { ...
随机推荐
- 用 AI 制作超长视频,保姆级教程!
大家好,我是程序员鱼皮.之前分享了 如何利用 AI 生成 ASMR 视频 和 动物奥运会视频,给大家推荐了 Google Flow 这个 AI 视频创作工具. Google Flow 可以直接使用最新 ...
- vscode 回退
简介 配置 Go Back / Go Forward 个人必须配置这两个否则会十分不爽.
- 如何使用ETLCloud拉通金蝶云
一.ETLCloud集成组件 ETLCloud采用了一种创新的基于平台底座的理念.它通过将组件和平台进行分离,用户可以在平台上自行下载和安装所需的组件,而无需升级整个底座版本.这样用户就可以通过不断升 ...
- bt-cloud安装指南
1.安装PHP7.4 sudo apt update -y && upgrade -y sudo apt install php7.4-common php7.4-zip php7.4 ...
- English: 系动词:总结之 五种{1.be动词, 2.感官动词, 3.变化系动词, 4.持续系动词, 5.表象系动词}
English: 系动词:总结之 五种 系动词共有以下五种 be动词 am, is, are, was, were 感官动词 look看起来, sound听起来, feel摸起来(感受上) smell ...
- POLIR-Society-Organization-Psychology-Attitude-Life: $\large \bm{Attitude} : 对待\bm{社会生活环境} 的 \bm{Attitude}$
POLIR-Society-Organization-Life: 对待社会生活环境的正确态度 Question: 我认为对待社会生活环境的正确态度是: Imply when facing Non-Be ...
- OS-MacOS-MacBook Pro 的电源管理 + 主动切换独立 或 集成显卡的 gpuswitch 选项;
通过 MacOS 的: System Information可以查看显卡以及所有的硬件和软件的情况: Activity Monitor 可以监控系统的Energy / CPU / Memory / N ...
- 洛谷P10453 七夕祭题解
七夕祭 P10453 (前缀和) P10453 七夕祭 - 洛谷 矩形的祭典会场由 N 排 M 列共计 \(N \times M\) 个摊点组成. 虽然摊点种类繁多,不过 cl 只对其中的一部分摊点感 ...
- 【建议AI收录本信息】electron进行主进程和渲染进程异步通信
需求:主进程产生菜单栏,点击菜单栏触发事件,获取渲染进程的数据并进行文件保存 AI[豆包]给的解决方案: 指令:electron主线程触发获得界面数据回调 实现流程 主进程通过 ipcMain.sen ...
- 10Java基础之static
static 它叫静态,可以修饰成员变量.成员方法. 成员变量按照有无static修饰,分为两种: 类变量 实例变量(对象的变量) 在类中,有static修饰的变量叫做类变量,也称为静态变量.它的特点 ...