完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
刚学完定时器,编写了一个电子时钟的程序,想用中断控制时钟的分或秒+1,但是一触发中断,数码管就会停止显示以前的数,为什么呢,然后加的数也不是一,怎么给中断像独立按键一样的那种“消抖”
|
|
相关推荐
17个回答
|
|
{:soso_e132:}不知道你是个什么情况,无图无程序
|
|
|
|
不懂帮顶
|
|
|
|
#include #define ui unsigned int #define uc unsigned char unsigned char code duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; unsigned char code wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; ***it fmq=P3^6; ***it K2=P3^3; uc shi=12,fen=0,miao=0,m=0,e ; delay(ui a) { uc z; while(a--) for(z=0;z<11;z++) {;} } void delay1ms(ui i) { while(i--) { uc j; for(j=0;j<115;j++) {;} } } void display() { P2=wei[0]; P0=duan[shi/10]; delay1ms(3); P2=wei[1]; P0=duan[shi%10]; delay1ms(3); P2=wei[2]; P0=0xbf; delay1ms(3); P2=wei[3]; P0=duan[fen/10]; delay1ms(3); P2=wei[4]; P0=duan[fen%10]; delay1ms(3); P2=wei[5]; P0=0xbf; delay1ms(3); P2=wei[6]; P0=duan[miao/10]; delay1ms(3); P2=wei[7]; P0=duan[miao%10]; delay1ms(3); } main() { EA=1; EX0=1; ET0=1; EX1=1; ET1=1; TMOD=0x01; TH1=(65536-55536)/256; TL1=(65536-55536)%256; TF1=0; TR1=1; while(1) { display(); } } void q()interrupt 0 { TR1=~TR1; } void qaq() interrupt 2 { if(miao<30) { miao=0; } if(miao>=30) { for(e=0;e<100;e++) { fmq=0; delay(1); fmq=1; delay(1); } miao=0; fen=fen+1; { if(fen==60) { fen=0; shi=shi+1; if(shi>23) { shi=fen=miao=0; } } } } } void qq() interrupt 3 { TF1=0; m++; if(m==120) { m=0; miao=miao+1; } if(miao==60) { for(e=0;e<100;e++) { fmq=0; delay(1); fmq=1; delay(1); } miao=0; fen=fen+1; { if(fen==60) { for(e=0;e<200;e++) { fmq=0; delay(4); fmq=1; delay(1); } fen=0; shi=shi+1; if(shi>23) { shi=fen=miao=0; } } } } TH1=(65536-55536)/256; TL1=(65536-55536)%256; } 延时不会调,都是瞎凑的数 |
|
|
|
怎么一个小小的计时器,用那么多中断,你还知道中断的优先级么?我怀疑你自己都搞乱了,先把程序简化吧。
|
|
|
|
动态扫描在主程序中,你的中断处理时间太长,所以看起来就是显示停止了。
|
|
|
|
楼上正解:
1、你把程序写的太复杂了,尤其是中断 2、中断思路比较乱,可以简化 3、定时器有自动装载的功能么(不好意思,不太熟悉51),即使没有,也可以在中断中修改一下就ok 4、定时器中断不需要 去抖动 处理 另外,你写程序最好加上适当的注释。。。拙见 |
|
|
|
就是把能写的都写进去了啊,2个外部中断,1个定时器,中断控制定时器的开关和miao加1的么 |
|
|
|
那要把动态扫描的程序在中断里也要写一遍? |
|
|
|
我就是想不明白怎么可以在触发中断时候数码管也能正常显示 |
|
|
|
|
|
|
|
|
|
我们看到的其实 数码管的 余晖, 只不过单片机速度快,不停的点亮数码管,所以我们看到数码管就好像一直亮着的,你中断中用到了许多延时,这个就会造成,单片机点亮时间间隔过大。。。估计会有看起来不连续的感觉(即是你说的,停止显示)。。。你说不加1,估计问题也是出在这儿,建议精简你的中断响应函数,中断耽搁的时间越短愈好。 |
|
|
|
哦,谢谢,那你的意思是说,精简的程序,中断就可以不打断数码管了么 |
|
|
|
本帖最后由 yatoo 于 2012-11-14 20:16 编辑
假设 定义了全局变量unsigned char S电子发烧友t, MinCnt, HourCnt,且均初始化为0, 其他部分正确,中断程序可以参照以下,刚刚写了下,没有实测。。。。。。 void Time_IRQHandler(void) interrupt 3 { //定时器秒中断 S电子发烧友t++; if(S电子发烧友t == 60) { S电子发烧友t = 0; MinCnt++; if(MinCnt == 60) { MinCnt = 0; HourCnt++; if (HourCnt == 24) { HourCnt = 0; } } } //定时器载入初值 TH1=(65536-55536)/256; TL1=(65536-55536)%256; } 编辑器有问题,S电子发烧友t ,不是本意,你自己改一下 好久没有接触51了,不太熟悉,仅供参考.. |
|
|
|
|
|
|
|
|
|
嗯嗯,好的,谢谢啦 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12011 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 22:35 , Processed in 1.061184 second(s), Total 104, Slave 87 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号