单片机外部中断计数中断关闭后计时器还计数吗

51单片机同时使用两个计时器的问题_百度知道
51单片机同时使用两个计时器的问题
遇到的问题是两个内部计时器同时使用会造成数码管无法正常扫描。以下面程序为例,下面程序结果数码管(从0开始自加,8位数码管显示后4位)无法正常扫描,请问该如何修改?#include&re...
遇到的问题是两个内部计时器同时使用会造成数码管无法正常扫描。以下面程序为例,下面程序结果数码管(从0开始自加,8位数码管显示后4位)无法正常扫描,请问该如何修改?#include&reg52.h&#define uchar unsigned char#define uint unsigned int#define DATAPORT P0uchar code NUMBER[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code POSITION[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar TEMP[4];sbit duanma=P2^2;sbit weima=P2^3;void display(uchar first,uchar total){
DATAPORT=0 weima=1; weima=0; DATAPORT=TEMP[i]; duanma=1; duanma=0; DATAPORT=POSITION[i+first]; weima=1; weima=0; i++; if(i==total) i=0; }void TIMER_ini(){ TMOD |=0x11; TH0=()/256; TL0=()%256; TH1=()/256; TL1=()%256; EA=1; ET0=1; ET1=1; TR0=1; TR1=1; }void main(){ TIMER_ini(); while(1) {
TEMP[0]=NUMBER[num/1000];
TEMP[1]=NUMBER[num/100%10];
TEMP[2]=NUMBER[num/10%10];
TEMP[3]=NUMBER[num%10];
} }void TIMER0() interrupt 1{ TH1=()/256; TL1=()%256; num++; if(num&9999) num=0; }void TIMER1() interrupt 3{ TH1=()/256; TL1=()%256; display(4,4); }
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
11kxmx知道合伙人
采纳数:4231
获赞数:4209
同时用两个中断肯定会冲突定时器1完全可以不用,主程序只管显示就行,定时器0中断程序中更新计时数值还可以尝试在定时器0的中断程序里关闭定时器1,交且将定时器0的中断优先级设高
不是,这个程序只是方便演示,其实是我在做超声波测距的时候遇到这个问题。请问用两个中断如何避免冲突呢?做数字钟的时候也遇到过这个问题。
如果在定时器1的中断程序中关闭定时器0,会造成计时不准扫描数码管,快一点慢一点都无所谓,不必用定时器1,并且中断函数尽量简短我在红外线发射时用两个定时器时,一个是定时器0长定时MS级,另一个是定时器1短定时13US 短定时自动重装,只执行程序一个语句,使红外发射管电平翻转 长定时中断也就一个话句,将一个标志置1 其余的都交给主程序作总之是利用长定时控制短定时在某段时间内允许定时器1和红外管工作,另一段时间不允许允许定时1和红外管工作象你的定时器1的程序不是太长的话,可以夹在定时器0中断程序中,长的话加在主程序中void TIMER0() interrupt 1{ TH1=()/256; TL1=()%256;a++;if(a==25) { num++; a=0;} if(num&9999) num=0;display(4,4) }中断程序里干这么多事,也不会超2ms(或4ms),主程序还有时间来分离num最好还是将显示函数放在主程序中
lycdl知道合伙人
采纳数:8750
获赞数:12205
就你现在的程序可以正常扫描显示的呀,就是有点闪烁的效果。但不知道,这是和谁学习的,数码管显示要用定时器定时,中断一次显示一次,这可是仿真,运行速度肯定比实物要慢,所以,就会有闪烁的。其实,你的主程序中有计算四位数的程序
TEMP[0]=NUMBER[num/1000];TEMP[1]=NUMBER[num/100%10];TEMP[2]=NUMBER[num/10%10];TEMP[3]=NUMBER[num%10]; 这是很费时的,这个时间足够显示一位的延时了,所以,就在主程序中调用显示子函数就很好的,何必还定时扫描呢。这样void main(){ TIMER_ini(); while(1) {
TEMP[0]=NUMBER[num/1000];
TEMP[1]=NUMBER[num/100%10];
TEMP[2]=NUMBER[num/10%10];
TEMP[3]=NUMBER[num%10];
display(4,4); }}问题就解决了。最后就一句,那计数是很快了,是每秒计一个数吗,还是就是计数?这样改,要关掉定时器T1的中断。
谢谢,我的主要问题是数码管有闪烁。但请问一下同时用两个中断的话能否做到互不影响?这个问题是我在写超声波测距显示在数码管上的程序时碰到的,需要同时用两个中断,一个做计数器用来算时间一个做定时器用来扫描数码管。
为什么非要“一个做定时器用来扫描数码管”呢?单片机的中断源不要做那些无关紧要的事情。数码管扫描放在主程序就能搞定的事,就不要用中断。当多个中断源,特别是扫描数码管的中断,因定时时间短,中断频繁,是会耗费单片机的时间的,各中断就会有影响的,得不偿失了。中断源互相影响这是克服不了的。如果是几个中断源都是必须的,可以分成不同优先级的。中断源多了,并不是一件好事。因单片机的运行速度毕竟是有限的,不能同电脑相比的。当然这里还有一个事实,就是用仿真来调试程序,因运行速度慢,运行的结果会与实物有很大区别的。如果你有实物板,或者就是为实际产品设计的程序,就不要用仿真来调试程序,就直接在实物上调试程序。就是算是在仿真里调试好了,但到了实物上运行结果还是不同的。所以,仿真调试程序等于走了弯路。就你上面的程序,放在实物上运行,应该是可以,效果肯定是不同的,不然你就试试,上实物板上运行一下看看。
本回答被网友采纳
CHQIC知道合伙人
来自电子数码类芝麻团
采纳数:406
获赞数:580
参与团队:
display中真不知道你要干嘛,你只这样传递参数有何意义
可以任意控制8位数码管亮几个,44即第5678个亮,08即全亮,02即前两个亮。数码管不是重点,主要是两个计时器同时工作导致我数码管无法正常扫描
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机课程设计 马拉松比赛计时器设计_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机课程设计 马拉松比赛计时器设计
&&很好的报告
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩8页未读,
定制HR最喜欢的简历
你可能喜欢您当前的位置:&>&&>&&>&
51单片机中断系统详解(定时器、计数器)
51单片机中断级别
默认中断级别
序号(C语言用)
INT0---外部中断0
T0---定时器/计数器0中断
INT1---外部中断1
T1----定时器/计数器1中断
TX/RX---串行口中断
T2---定时器/计数器2中断
中断允许寄存器IE
EA---全局中允许位。
EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。
EA=0,关闭全部中断。
-------,无效位。
ET2---定时器/计数器2中断允许位。&&&EA总中断开关,置1为开;
ET2=1,打开T2中断。&&&&&&&&&&&&&&&&&&&&EX0为外部中断0(INT0)开关,&&
ET2=0,关闭T2中断。&&&&&&&&&&&&&&&&&&&&ET0为定时器/计数器0(T0)开关,&& &&&&&
ES---串行口中断允许位。 &&&&&&&&&&&&&&&&&&EX1为外部中断1(INT1)开关,&&
ES=1,打开串行口中断。&&&&&&&&&&&&&&&&&&ET1为定时器/计数器1(T1)开关,&&
ES=0,关闭串行口中断。&&&&&&&&&&&&&&&&&&ES为串行口(TX/RX)中断开关,&&
ET1---定时器/计数器1中断允许位。&&&&&&&&ET2为定时器/计数器2(T2)开关,&&
ET1=1,打开T1中断。
ET1=0,关闭T1中断。
EX1---外部中断1中断允许位。
EX1=1,打开外部中断1中断。
EX1=0,关闭外部中断1中断。
ET0---定时器/计数器0中断允许位。
ET0=1,打开T0中断。
ET0=0,关闭T0中断。
EX0---外部中断0中断允许位。
EX0=1,打开外部中断0中断。
EX0=0,关闭外部中断0中断。
中断优先级寄存器IP
-------,无效位。
PS---串行口中断优先级控制位。
PS=1,串行口中断定义为高优先级中断。
PS=0,串行口中断定义为低优先级中断。
PT1---定时器/计数器1中断优先级控制位。
PT1=1,定时器/计数器1中断定义为高优先级中断。
PT1=0,定时器/计数器1中断定义为低优先级中断。
PX1---外部中断1中断优先级控制位。
PX1=1,外部中断1中断定义为高优先级中断。
PX1=0,外部中断1中断定义为低优先级中断。
PT0---定时器/计数器0中断优先级控制位。
PT0=1,定时器/计数器0中断定义为高优先级中断。
PT0=0,定时器/计数器0中断定义为低优先级中断。
PX0---外部中断0中断优先级控制位。
PX0=1,外部中断0中断定义为高优先级中断。
PX0=0,外部中断0中断定义为低优先级中断。
定时器/计数器工作模式寄存器TMOD
&&&&&&&&|-----------------定时器1------------------------|--------------------定时器0----------------------|
GATE---门控制位。
GATE=0,定时器/计数器启动与停止仅受TCON寄存器中TRX(X=0,1)来控制。
GATE=1,定时器计数器启动与停止由TCON寄存器中TRX(X=0,1)和外部中断引脚(INT0或INT1)上的电平状态来共同控制。
C/T---定时器和计数器模式选择位。
C/T=1,为计数器模式;C/T=0,为定时器模式。
M1M0---工作模式选择位。
方式0,为13位定时器/计数器
方式1,为16位定时器/计数器
方式2,8位初值自动重装的8位定时器/计数器
方式3,仅适用于T0,分成两个8位计数器,T1停止工作
定时器/控制器控制寄存器TCON
TF1---定时器1溢出标志位。
当定时器1记满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。需要注意的是,如果使用定时器中断,那么该位完全不用人为去操作,但是如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0。
TR1---定时器1运行控制位。
由软件清0关闭定时器1。当GATE=1,且INIT为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器1。
TF0---定时器0溢出标志,其功能及其操作方法同TF1。
TR0---定时器0运行控制位,其功能及操作方法同TR1。
IE1---外部中断1请求标志。
当IT1=0时,位电平触发方式,每个机器周期的S5P2采样INT1引脚,若NIT1脚为定电平,则置1,否则IE1清0。
当IT1=1时,INT1为跳变沿触发方式,当第一个及其机器周期采样到INIT1为低电平时,则IE1置1。IE1=1,表示外部中断1正向CPU中断申请。当CPU响应中断,转向中断服务程序时,该位由硬件清0。
IT1外部中断1触发方式选择位。
IT1=0,为电平触发方式,引脚INT1上低电平有效。
IT1=1,为跳变沿触发方式,引脚INT1上的电平从高到低的负跳变有效。
IE0---外部中断0请求标志,其功能及操作方法同IE1。
IT0---外部中断0触发方式选择位,其功能及操作方法同IT1。
从上面的知识点可知,每个定时器都有4种工作模式,可通过设置TMOD寄存器中的M1M0位来进行工作方式选择。
方式1的计数位数是16位,对T0来说,由TL0寄存器作为低8、TH0寄存器作为高8位,组成了16位加1计数器。
关于如何确定定时器T0的初值问题。定时器一但启动,它便在原来的数值上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHz,12个时钟周期为一个机器周期,那么此时机器周期为1us,记满TH0和TL0就需要216&-1个数,再来一个脉冲计数器溢出,随即向CPU申请中断。因此溢出一次共需65536us,约等于65.6ms,如果我们要定时50ms的话,那么就需要先给TH0和TL0装一个初值,在这个初值的基础上记50000个数后,定时器溢出,此时刚好就是50ms中断一次,当需要定时1s时,我们写程序时当产生20次50ms的定时器中断后便认为是1s,这样便可精确控制定时时间啦。要计50000个数时,TH0和TL0中应该装入的总数是=15536.,把15536对256求模:装入TH0中,把15536对256求余:6装入TL0中。
以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式1时,设机器周期为TCY,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/TCY&,装入THX和TLX中的数分别为:
THX=(65536-N)/256&&&&,&&&&&&TLX=(65536-N)%256&&&&&&&&x为0或1&
中断服务程序的写法
void&函数名()interrupt&中断号&using&工作组
&&&中断服务程序内容
在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下:
(1)对TMOD赋值,以确定T0和 T1的工作方式。
(2)计算初值,并将初值写入TH0、TL0或TH1、TL1。
(3)中断方式时,则对IE赋值,开放中断。
(4)使TR0和TR1置位,启动定时器/计数器定时或计数。
例:利用定时器0工作方式1,实现一个发光管以1s亮灭闪烁。
程序代码如下:
&&TMOD=0x01;&&&&&&//设置定时器0位工作模式1(M1,M0位0,1)
&&TH0=()/256; &//装初值11.0592M晶振定时50ms数为45872
&&EA=1;&&&&//开总中断
&&ET0=1;&&&//开定时器0中断
&&TR0=1;&&&//启动定时器0
&&&&&if(num==20)&&&&//如果到了20次,说明1秒时间
&&&&led1=~led1;&&&&//让发光管状态取反
&&&TH0=()/256; &//重新装载初值努力让人生更加完美。
单片机在中断函数里定时器是否还计数问题
以stm32F103为例解释:如果初始化配置的是自动重装初值(寄存器TIMx-&CR1中第三位默认为发生更新事件时计数器不停止,可软件置1更改为手动开启计数器),那么定时器溢出后(即进入中断后)就会立刻进行下一轮计数,不过如果中断标志没有清除,那么溢出后不会产生中断,直到清除上次中断标志产生本次中断。
总结:找到相应的寄存器配置查看或时序图。
51单片机定时器的原理与使用
51中断-定时器/计数器中断
(C51学习四)外部中断和定时器中断
第一篇:51单片机的中断和定时
51单片机计时器中断
51实现定时器定时调整
51单片机学习笔记【四】——定时器和中断系统
浅谈通用定时器中断
没有更多推荐了,关于单片机的计时器与中断系统
> 关于单片机的计时器与中断系统
关于单片机的计时器与中断系统
关于嵌入式,我就自己的XXX长话短说一下,说来话就长了,学过Java、JavaWebandsoon,也做过一些东西,说实话成就感还是蛮大的,但是,学过之后却总是感觉这些东西都太浅显了,用另一总话说来,就是感觉学这些东西,站在巨人的肩膀上,却看不到巨人。什么东西都是封装好的,知道怎么用就行了,说实话,确实,学这些东西压力很小,但是总感觉不是真本事。所以生产实习的时候自己报的是Java,但是老是跑到嵌入式的去听课,之前也没听过嵌入式的课,所以是云里雾里。Java的课也没听过几节,最后做东西的时候根本不知道老师叫做个什么东西。对于Java的图形化编程我还是比较讨厌的,没什么技术含量还麻烦的要死,到最后XXX说让我帮帮忙,说实话我是真的不会。生产实习的结果就是最后两头都没捞着好(嵌入式写了一些驱动,但是他们说跟他们用的接口不一样,最后发现老师给的有范例,直接按照上面改就行了,搞的我跟傻X一样,Java直接写都不想写,真不知道那段能两个星期不洗澡的日子是怎么熬过来的)。我自己感觉最后的大体方向就是:底层开发,包括操作系统什么的这一系列开发,当然,扎实的硬件、汇编、语言、算法等基础是少不了的。为什么写这些东西呢?因为在家大冬天的这么冷,手都不想伸出来写代码,只能学学理论,实际实践缺少了很多,所以写下加深印象,也为以后查资料方便(课程设计的时候我的博客真是一大宝库啊!!!:-),下面是以我的51单片机为例说明的)。下面进入正题:1、计时器下面先看一个图:其中可以清楚的看到,TH0和TL0是两个8位寄存器,这两个寄存器组合成T0加1计数器,所以计数器为16位计数器。同理,TL1和TH1组合成了T1加1计数器。再看TMOD寄存器,它是一个8位寄存器,名字叫做工作方式寄存器,显然它是控制工作方式的,看电路图上看它有两条灰色的线条延伸到T0和T1,即它可控制T0和T1的工作方式,也可以清楚的看到,其低四位控制T0的工作方式,高4位控制T1的工作方式。那么什么叫做工作方式呢?工作方式就是指开或者关,芯片是工作在定时模式还是计数模式,和寄存器的使用情况。总体如下:GATE是门控位,GATE=0时,TCON中TR0/TR1=1时可启动。GATE=1时,TCON中TR0/TR1=1,且外部中断引脚为高电平时可启动。C/T=0:定时模式。C/T=1:计数模式。M1M0组合使用,其值如下:0013位定时/计数器0116位定时/计数器108位自动重装定时/计数器11T0分成两个定时/计数器,T1停止关于这四种方式的使用下面再介绍。再看TCON寄存器,它与TMOD一样,叫做控制寄存器,它是用于控制外部中断启动、申请的一系列工作的。定时器/计数器的工作要依赖于溢出中断,在中断处理中处理相关事件T0或者T1寄存器溢出时会申请中断,然后再处理。比如所以如果想要使用T0计数100,那么就用16位寄存器的溢出值减去初始值,既是计数值,那么就是436(=100),所以T0要首先置初始值65436。这里先介绍TCON的高4位。TF1:T1溢出中断请求标志位,T1溢出时TF1为1,相应中断后自动清0,也可使用软件控制。TR1:T1运行控制位,TR1为1时,T1工作,TR1为0时,T1停止工作。TF0:T0溢出中断请求标志位。同理TF1。TR0:T0运行控制位,同理TR1。M1M0控制的四种工作方式如下:0013位计数,使用了TL0的低5位和TH0的8位组成,TH0溢出置TF0中断。0116位计数,使用T0。同00。10自动重装初值的8位计数方式。11T1停止,TH0和TL0分开计数。计时器使用步骤:&对TMOD赋值,确定T1、T0的工作方式。&计算初值,并将其写入T0或者T1。&对IE(IE后面再介绍)赋值,开放中断。&使TR0或者TR1置位,启动计数。二、中断中断估计都知道是干啥的,这些就不啰嗦了,这里先上一幅图:看这图估计都没心情,下面剖开来看:其他的先不看,先看这点图,这是一个中断源,其中IT0是选择中断的方式,IT0=1时为选择下降沿有效,IT0=0时为低电平有效(有一个非门)。当中断触发时就将IE0置1,此时,向CPU申请中断。那么,IT0和IE0是在什么地方呢?还记得上面讲的TCON吗?现在把低四位也加进去:TF1TR1TF0TR0IE1IT1IE0IT02、参照1:INT0。3、TF0中断,上面已经介绍。4、TF1中断,上面已经介绍。5、(RI或TI中断)串行口中断请求标志,当串行口接收完一帧串行数据时,置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。TCON中断其中,TCON中的中断标志有如下几个:TF1TR1TF0TR0IE1IT1IE0IT0IT0:外部中断0触发方式门控位。&IT0=0为下降沿有效&IT0=1为负边沿触发IE0:外部中断0中断请求标志位。IT1:外部中断1触发方式控制位(同IT0)。IE1:外部中断1中断请求标志位。TF0:T0溢出中断。TF1:T1溢出中断。SCON中断SCON中的中断如下:TIRIRI:串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI,同样,RI必须由软件清除。TI:串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程,每发送完一个串行帧,由硬件置位TI,CPU响应中断时,不能自动清除TI,TI必须由软件清除。下面再看上图的下一部分:这部分叫做中断允许控制,当一个中断发生时,必须由中断允许控制来检测是否允许,如果允许则转入中断处理,否则不处理。先看右边的EA,这个是总的中断允许控制位,CPU想要处理中断,必须开此中断允许。再看左边:其中各个中断允许控制如下:&EX0:外部中断0允许位&ET0:T0中断允许位&EX1:外部中断1允许位&ET1:T1中断允许位&ES:串行口中断允许位其中,这几个位都是由中断允许寄存器IE控制的,IE寄存器具体如下:EAESET1EX1ET0EX0很明了,中断响应条件如下:1、有中断请求2、中断源中断允许位为13、CPU开中断(EA=1)其中,8051有两个中断优先级,可以实现二级中断嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。IP寄存器如下:PT2PSPT1PX1PT0PX0PX0:外部中断0优先级设定位,当将其设置为1时中断优先级较高。可以按照上图以此类推。(这里,PT2是80C52的中断,不介绍)优先级高的中断可以打断优先级低的中断而先执行,实现中断嵌套。那么同一优先级之间不能打断,如果多个同优先级中断同时申请,则按照自然优先级顺序执行中断,自然优先级如下:中断源中断标志中断服务程序入口优先级顺序外部中断0IE00003H高T0TF0000BH&外部中断1IE10013H&T1TF1001BH&串行口中断RI或者TI0023H低中断使用方法如下所示:函数名interruptxusingy例如:voidfun()interrupt0using1那么,这里的x代表的是何种中断具体如下:0:代表外部中断01:定时/计数器02:外部中断13:定时/计数器14:串行口中断这里y代表寄存器组,可取0~7,也可以不写。例如,外部中断0可以写:interrupt0using1外部中断1可写interrupt2using1下面看一个使用定时器和中断的数字时钟的例子:#include#defineucharunsignedcharucharsecond=1; //秒,全局变量ucharcount=0; //中断次数ucharcodetab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7};voidDelay(inta){ //延迟inti;while(a--){for(i=0;i<148;i++);}}//次函数表明使用的是定时器,定时为50msvoidTime0_Init(){TMOD=0x01;//TMOD为00000001 表明定时器处于定时模式,//且为16位定时器,GATE=0,配合下面TR0=1,则启动寄存器TH0=0x4c;//设定初值,即设定定时时间TL0=0x00;//设定初值,即设定定时时间IE =0x82;//0x82二进制为10000010,即RA=1,ET0=1,//设定允许响应总中断和T0中断TR0=1;//设置TCON中TR0=1,允许T0工作}voidTime0_Int()interrupt1 //中断处理{TH0=0x4c;//重新设定初值TL0=0x00;count++;if(count==20){count=0;second++;//时间秒数加1}}ucharkeyscan(){//4&4键盘扫描检测ucharhang[4]={0xfe,0xfd,0xfb,0xf7};ucharinti,j;for(i=0;i<4;i++){P1=hang[i];temp=0x10;for(j=0;j<4;j++){if(!(temp&P1)){returni*4+j;}temp<<=1;}}return0;}ucharshow_hour(ucharh){ //显示小时ucharx=h/24;uchary=h$;P2=0;P0=tab[y/10]-0x80;Delay(1);P2=1;P0=tab[y];returnx;}ucharshow_minute(ucharm){ //显示分钟ucharx=m/60;uchary=m`;P2=3;P0=tab[y/10]-0x80;Delay(1);P2=4;P0=tab[y];returnx;}ucharshow_second(uchars){ //显示秒ucharx=s/60;uchary=s`;P2=6;P0=tab[y/10]-0x80;Delay(1);P2=7;P0=tab[y];returnx;}voidmain(){ucharhour=1,minute=1;ucharh,m,s;uchark,mk=0;Time0_Init();while(1){Delay(1);if(mk==0){s=show_second(second);second%=60;mk++;}elseif(mk==1){minute+=s;m=show_minute(minute);minute%=60;mk++;}else{hour+=m;h=show_hour(hour);hour%=24;mk++;mk=mk%3;}k=keyscan();//检测按键if(12==k||13==k||14==k){Delay(50);k=keyscan(); //软件消抖if(12==k||13==k||14==k){if(12==k)hour++;elseif(13==k)minute++;elseif(14==k)second++;}}}}
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一

我要回帖

更多关于 单片机中断计数000-999设计 的文章

 

随机推荐