利用定时器0模式1中断消除4位数码管动态显示闪烁问题的项目工程

 1 /********************************************************************************
 2 定时器定时1ms,数码管以秒钟计时,加上定时器0中断可消除数码管刷新时的闪烁问题,
 3 闪烁问题是由while语句中分离数字时计算造成的,因为每次1s时间到,在数码管刷新前
 4 都要进行计算,耽误了时间,导致闪烁,加了中断以后则是先刷新数码管再分离数字。
 5 ********************************************************************************/
 6 #include <reg52.h>//52单片机头文件
 7 #define uchar unsigned char   // 自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
 8 #define uint unsigned int     //自定义uint为unsigned int(即有符号整数型数据,数据范围:0到65535。)
 9 uint count,i,sec,shumaguainitflag;//声明定时器0中断次数变量、选位变量、秒钟变量、数码管初始化标志位变量
10 uint ge,shi,bai,qian;//声明数码管个位变量、数码管十位变量、数码管百位变量、数码管千位变量
11 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。
12   void Timer0Init()//定时器0初始化
13 {
14    TMOD=0x01;//设定定时器类型为定时器0,定时器工作模式为模式0。
15    TH0=(65536-1000)/256;//TH0装初值
16    TL0=(65536-1000)%256;//TL0装初值
17    EA=1;//开启定时器总中断
18    ET0=1;//开启定时器0中断开关
19    TR0=1;//启动定时器0
20  }
21   void Timer0() interrupt 1//定时器0中断函数
22 {
23    TH0=(65536-1000)/256;//TH0重新装值
24    TL0=(65536-1000)%256;//TL0重新装值
25    count++;//定时器0中断次数变量先赋值再加
26    P2=0xff;//此句为消除瞬间错误,例如case 1下,P0已刷新而P2暂留在case 0瞬间状态,会造成case 0下数码管瞬间显示错误数值,在每次进入开关语句前关闭所有数码管即可消除该错误。
27    switch(i)//让4位数码管以1ms间隔轮流刷新
28  {
29
30     case 0:
31            P0 = ge;//数码管个位数值显示
32            P2 = 0xf7;//数码管个位显示位
33            i++;//选位变量先赋值再加加
34            break;
35     case 1:
36            P0 = shi;//数码管十位数值显示
37            P2 = 0xfb;//数码管十位显示位
38            i++;//选位变量先赋值再加加
39            break;
40     case 2:
41            P0 = bai;//数码管百位数值显示
42            P2 = 0xfd;//数码管百位显示位
43            i++;//选位变量先赋值再加加
44            break;
45     case 3:
46            P0 = qian;//数码管千位数值显示
47            P2 = 0xfe;//数码管千位变量显示位
48            i=0;//选位变量置0
49            break;
50
51     default : break;//自定义
52    }
53  }
54   void main()//主函数
55 {
56    Timer0Init();//定时器0初始化函数
57    while(1)//固定循环
58  {
59     if(count<1000&&shumaguainitflag==0)//判断定时器0中断次数变量是否小于1000和数码管初始化标志位变量是否等于0
60   {
61      ge = table[0];//数码管个位变量为0
62      shi = table[0];//数码管十位变量为0
63      bai = table[0];//数码管百位变量为0
64      qian = table[0];//数码管千位变量为0
65     }
66     if(count>=1000)//判断定时器0中断次数变量是否大于等于1000,即1s。
67   {
68      count = 0;//定时器0中断次数变量置0
69      sec++;//秒钟变量先赋值再加加
70      shumaguainitflag=1;//数码管初始化标志位变量置1
71      ge = table[sec%10];//数码管个位变量
72      shi = table[sec%100/10];//数码管十位变量
73      bai = table[sec%1000/100];//数码管百位变量
74      qian = table[sec/1000];//数码管千位变量
75     }
76    }
77   }

原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/12316271.html

时间: 2024-08-18 10:35:04

利用定时器0模式1中断消除4位数码管动态显示闪烁问题的项目工程的相关文章

利用定时器 1和定时器0控制led1和led2分别 2hz和0.5hz闪烁

1 //利用定时器 1和定时器0控制led1和led2分别 2hz和0.5hz闪烁 2 //利用定时器0 1s,led1取反,利用计数器1,(65535-10)%256,取反 3 #include<reg52.h> 4 #define uchar unsigned char 5 #define uint unsigned int 6 sbit led1=P1^3; 7 sbit led2=P1^7; 8 uchar count0,count1; 9 10 void delay(uint x)

[STM32F10x] 利用定时器测量脉冲宽度

硬件:STM32F103C8T6 平台: ARM-MDk V5.11 前面一篇文章讲过如何利用定时器测量信号的频率(见[STM32F10x] 利用定时器测量频率),使用的是定时器的捕获/比较单元(Capture/compare),它也可以测量输入信号的脉冲宽度. 利用定时器测量脉冲宽度有两种方法. 方法1: 在捕获中断函数里改变捕获信号的触发沿(上升沿触发改为下降沿触发,或者下降沿触发改为上升沿触发),通过两次触发得到的计数器的差值,来计算出脉冲宽度.这种 方法需要定时器的配置和[STM32F1

奶爸业余单片机学习之:定时器使用方法——非中断,TF值软件重置法

============定时器使用方法——非中断,TF值软件重置法======== 第一:设置特殊功能寄存器TMOD,配置好工作模式. 第二:设置计数寄存器TH0和TL0的初值. 第三:设置TCON,通过TR0置1来让定时器开始计数. 第四:判断TCON寄存器的TF0位,监测定时器溢出情况.  实例: //LED由三极管及73HC138控制//用定时器0实现亮与灭之间的1秒时 # include <reg52.h> sbit led2 = P0^0; sbit addr0 = P1^0;sbi

JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯

分布式开发的历史 利用Remote方式调用远程对象实现服务器与客户端之间通讯是一种常用的网络开发方式,在.NET与JAVA开发当中,对Remote远程对象早已有着足够的支持(对Remote远程对象调用有兴趣的朋友欢迎参考一下利用远程对象实现分布式开发). 从2003年开始.NET当中就盛传着.NET Remoting远程对象调用的分布式开发,.NET Remoting主要用于管理跨应用程序域的同步和异步RPC 会话.在默认情况下,Remoting可以使用 HTTP 或 TCP 协议进行信息通讯,

在Debug模式下中断, 在Release模式下跳出当前函数的断言

在Debug模式下中断, 在Release模式下跳出当前函数的断言 #ifdef DEBUG #define __breakPoint_on_debug asm("int3") #else #define __breakPoint_on_debug #endif // 验证 #define UXY_ASSERT_RETURN_ON_RELEASE( __condition, __desc, ... ) \ metamacro_if_eq(0, metamacro_argcount(__

定时器和延时器(利用定时器制作倒计时)

一.延时器(setTimeout) 1.延时器(setTimeout)的工作方式是:当设定一个延时器是5s后进行时,并不代表它5s后就立即执行,只是代表它5s后会被加入队列,如果5s后,队列没有其他东西,那么延时器的代码会立即执行,否则会延迟执行. 因此,关于延时器最重要的一点是:指定的时间间隔(如设置5s后执行),表示何时将延时器加入到队列,而不是何时真正执行代码. 二.定时器(setInterval) 1.定时器的一大特点是每隔一段时间(如每隔2s)就会执行,一直重复.这样有个问题:设定一个

定时器0工作方式1

#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit led1=P1^0; uchar num; void main() { TMOD=0X01; //设置定时器0为工作方式1(M1M0为01) TH0=(65536-45872)/256; //装处初值11.0592M晶振定时50ms数为45872 TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; while

定时器0的方式1 定时器1的方式1 数码管和led

#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit led1=P1^0; uchar code table[]= { 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71 }; void delayms(uint); vo

【Servlet】利用Servlet3.0标准与JSTL表达式实现文件上传系统,支持图片上传后显示

伴随着JDK1.6一起出现的Servlet3.0标准,使得JSP的文件上传系统不再艰难,此前在JSP的文件上传系统需要<[Jsp]使用jspsmartupload完成简单的文件上传系统>(点击打开链接)类似这样的插件才能完成的文件上传系统,还不支持中文,使得各位程序猿掏空心思才能解决这个问题.现在Servlet3.0对文件上传的方法进行封装,无须分块就可以实现.而且Servlet3.0还不用类似<[Servlet]最简单的Servlet JavaWeb程序>(点击打开链接)在web