51单片机在普通时钟程序里加上定时器功能怎么写
答案:3 悬赏:0 手机版
解决时间 2021-02-10 21:36
- 提问者网友:斑駁影
- 2021-02-10 05:11
6位数码管的,主要不知道按键怎么中断,按一下就进入定时器功能,怎么实现,附上原程序#include#define uint unsigned int #define uchar unsigned char uchar code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar t; //中断次数计数uchar second; //秒计数变量uchar minite; //分钟计数变量uchar hour; //小时计数变量sbit K1=P1^0; sbit K2=P1^1; sbit K3=P1^2;void delayms(uint xms){ uchar i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--);}void keyscan (){ if(K1==0) { delayms(30); if(K1==0) { second++;while(!K1); if(second==60) {minite++;second=0; } } } if(K2==0) { delayms(30); if(K2==0) { minite++;while(!K2); if(minite==60) {hour++;minite=0;} } } if(K3==0) { delayms(30); if(K3==0) { hour++;while(!K3); if(hour=24) {second=0;minite=0;hour=0; } } }}void display(){ P2=0x02; P0=Tab[second/10]; delayms(1); P2=0x01; P0=Tab[second%10]; delayms(1);}void dimplay(){ P2=0x10; P0=Tab[minite/10]; delayms(1); P2=0x08; P0=Tab[minite%10]; delayms(1); }void dihplay(){ P2=0x80; P0=Tab[hour/10]; delayms(1); P2=0x40; P0=Tab[hour%10]; delayms(1); }void main(){ EA=1; ET0=1; TMOD=0x01; TH0=(65536-46083)/256; TL0=(65536-46083)%256; TR0=1; t=0; second=0; minite=0; hour=12; while(1) { keyscan(); display(); delayms(1); dimplay(); delayms(1); dihplay(); delayms(1); } }void timer0() interrupt 1{ t++; if(t==20) { t=0; second++; if(second==59) { second=0; minite++; if(minite==59) { minite=0; hour++; if(hour>23) { hour=0; } } } } }
最佳答案
- 五星知识达人网友:举杯邀酒敬孤独
- 2021-02-10 06:43
跳转函数吧
你这么乱,我也不知道怎么看,总之给你个原理
首先,定时器功能,就是定时器到了之后,设置跳转到另外的函数(void xxxx1)执行
然后,中断的时候,也跳转到(void xxxx1)执行
这样不就解决了?
你这么乱,我也不知道怎么看,总之给你个原理
首先,定时器功能,就是定时器到了之后,设置跳转到另外的函数(void xxxx1)执行
然后,中断的时候,也跳转到(void xxxx1)执行
这样不就解决了?
全部回答
- 1楼网友:平生事
- 2021-02-10 07:51
这个分两种: 一种是静态扫描,二是动态扫描。静态的太耗资源,一般很少用,除非资源足够用。多数都是用动态扫描的。 动态扫描的原理是:首先有八个数据线,分别连接到七段数码管的七个位,和小数点位。然后就是有一批使能信号线。假如你有八个数码管,那就需要八个使能信号线。同一个时刻,其实只有一个数码管在亮着的,只是扫描信号比较快,肉眼的感觉好像就是都亮着的。基本原理就是这样的
- 2楼网友:一秋
- 2021-02-10 06:53
需要给你完成吗
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯