利用hc595驱动数码管做一个60s计时,在如图所示j=0处设置断点,在keil内调试sec显示60s,没有错误,但是在proteus内仿真,数码管每跳动一次的时间却接近3秒。是我的程序哪里出问题吗?
程序与调试图如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SH_CP=P1^0;
sbit DS=P1^1;
sbit ST_CP=P1^2;
uchar ge,shi;
uchar code Duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code Wei[]={0x7f,0xbf};
void time1init()
{
TMOD=0X10;
TH1=(65536-50000)/256; //设置定时50ms初值
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void time1() interrupt 3
{
uchar i,j;
i++;
IF(i==20) //重复50ms定时20次来达成定时1s
{
i=0;
j++;
ge=j%10; //个位
shi=j/10; //十位
if(j==60) //定时达到60s后清零重新计数
{
j=0; //仿真中在此处设置断点sec显示60s,表示定时没有出错
}
}
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
void send(uchar dat) //发送数据
{
uchar t;
for(t=0;t<8;t++)
{
dat<<=1;
DS=CY;
SH_CP=0;
_nop_();
SH_CP=1;
}
}
void display()
{
send(Duan[ge]); //传送个位的段码
send(Wei[0]); //传送个位的位码
ST_CP=0; //锁存
_nop_();
ST_CP=1;
_nop_();
send(Duan[shi]); //传送十位的段码
send(Wei[1]); //传送十位的位码
ST_CP=0; //锁存
_nop_();
ST_CP=1;
}
void main()
{
time1init();
while(1)
display();
}