关于单片机做的秒表的问题 时间不准是怎么回事 我用PROTEUS模拟的 不准 慢了10多秒 单片机晶振是12mhz

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0; //定义"启动"按钮
sbit key2=P3^1; //定义"停止"按钮
sbit key3=P3^2; //定义"复位"按钮
sbit DP =P0^7; //定义小数点
uchar temp,aa,bb,cc,dd,ee,qian,bai,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //共阴极数码管编码

void delay(uint z) //延时子函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void display(uchar qian,uchar bai,uchar shi,uchar ge) //显示子程序
{
P2=0xfe;
P0=table[qian]; //千位
delay(10);

P2=0xfd;
P0=table[bai]; //百位
delay(10);
DP=1;
delay(10);

P2=0xfb;
P0=table[shi]; //十位
delay(10);

P2=0xf7;
P0=table[ge]; //个位
delay(10);
//使用动态扫描的方法实现数码管显示
}

void init() //初始化子程序
{
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
TMOD=0x01; //使用定时器T0的方式1
TL0=0x18;
TH0=0xfc; //定时1ms中断一次
EA=1; //中断总允许
ET0=1; //允许定时器T0中断
}

void timer0() interrupt 1
{
TL0=0x18;//重新赋初值
TH0=0xfc;
aa++; //中断一次变量aa的值加1
if(aa==10) //中断10次后,定时时间为10*1ms=10ms=0.01s
{
aa=0;
ge=bb%10;
bb++;
}
if(bb==10) // 中断100次后,定时时间为100*1ms=100ms=0.10s
{
bb=0;
shi=cc%10;
cc++;
}
if(cc==10) //中断1000次后,定时时间为1000*1ms=1000ms=1.00s
{
cc=0;
bai=dd%10;
dd++;
}
if(dd==10) //中断10000次后,定时时间为10000*1ms=10000ms=10.00s
{
dd=0;
qian=ee%10;
ee++;
}
if(ee==10) //中断100000次后,所有的归零,重新开始
{
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
}
}

void main()
{
init(); //调用初始化子程序
while(1)
{
if(key1==0) //检测"启动"按钮是否按下
{
delay(10); //延时去抖动
if(key1==0) //再次检测"启动"按钮是否按下
{
while(!key1); //松手检测,若按键没有释放,key1始终为0,那么!key1始终为1,程序就一直停在此

TR0=1; //启动定时器开始工作
}
}
if(key2==0) //检测"停止"按钮是否按下
{
delay(10); //延时去抖动
if(key2==0) //再次检测"停止"按钮是否按下
{
while(!key2); //松手检测
TR0=0; //关闭定时器
}
}
if(key3==0) //检测"复位"按钮是否按下
{
delay(10); //延时去抖动
if(key3==0) //再次检测"复位"按钮是否按下
{
while(!key3); //松手检测
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
TR0=0; //关闭定时器
}
}

display(qian,bai,shi,ge); //调用显示子函数
}
}

第1个回答  2011-08-03
中断函数太长,建议用时钟芯片,如DS13820
第2个回答  2011-08-03
首先你没有说明多长时间没10秒,其次你的中断里面执行的程序太长也会占用中断的。所以时间也会不准。你可以在中断里设置个标志位,然后在主程序中查询!
第3个回答  2011-08-03
cc=0;
bai=dd%10;
dd++;
——qian,bai,shi,ge,放到++的后面来。进入下一级了,就说明上一级要进一了,要先进位再赋值本回答被网友采纳
第4个回答  2011-08-03
定时不准,用单片机没法做到很准确的
第5个回答  2011-08-03
中断函数执行太长,占用时间

...时间不准是怎么回事 我用PROTEUS模拟的 不准 慢了10多秒 单片机晶振...
中断函数太长,建议用时钟芯片,如DS13820

关于AT89C51单片机用proteus仿真的问题
首先,是protues,你拼错了哈 这个软件的仿真功能很强,但并不是完美的额。当仿真涉及到时间和显示的时候,就会表现得不准确。原因很多,在这里我不方便一一道来。因为你没有发程序出来,不知道是不是你的程序上有错 只能给你一个建议,涉及到时间的操作 仿真时不要看手表来对,要用软件自带的模拟示...

单片机 用proteus仿真 “电子秒表显示器”时无法复位,就是图中红色圈...
这个可能是你程序的问题 不防检查检查程序 看中断对不 在一个复位按键完全可以用最小系统里的复位 可以节省一个按键

学校的课程设计,用proteus单片机和keil设计一个LED数码管显示的秒表...
你的程序有问题,仿真图不要用三极管驱动,反而不显示。如下画法就行,那4个按键不变,没有画。程序中的按键处理,方法不当。先改成如下的程序,先调出能显示,然后你自己再增加按键功能。include <reg52.h> define uchar unsigned char define uint unsigned int sbit START = P1 ^0;sbit STOP =...

单片机实验板是不是学习单片机必备的,怎么选择
4、板子上共有18个LED小灯,其中一个是USB电源指示灯,插上电源就亮。还有一个是单片机电源指示灯。5、板子上共有8个数码管,可以用来做数码管的简单秒表实验,计算器功能,显示温度时间等等。6、板子上配有一个数字旋转编码器,可以通过旋转完成数据的加、减以及作为确认按键使用。7、板子上配套一个...

利用Proteus仿真软件设计一个具有按键清零功能的计时00-59的两位秒表时...
keycnt=0;second=0;P1=dispcode[second\/10];P2=dispcode[second%10];break;} while(P3_5==0);} } } } void t0(void) interrupt 1 using 0 { tcnt++;if(tcnt==4000){ tcnt=0;second++;if(second==100){ second=0;} P1=dispcode[second\/10];P2=dispcode[second%10];} } ...

全国电子设计大赛大赛又来临了 请问各位放大类题目需要准备哪些模块啊...
电源类好似是每年必出之题,所以建议不管出不出这类题,学生在平时锻炼的时候还是锻炼下为好,做几个电源,电流的、电压的,不出专门题目,说不准在其他题目上还能有所应用。再说,你就做个DDS信号源锻炼下,也浪费不了多长时间嘛。 放大器类题目前面几届也出过,上届专科组出过,本科组没有,预计今年会继续加入放大器...

相似回答