#include<reg51.h>#define uchar unsigned charuchar sec=0,time=0,wr=0; //sec每过一秒加一,time每中断一次加一 //wr用来控制每过一秒就写入一次uchar code num[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};//0--9的编码sbit DU=P2^6;sbit WE=P2^7;sbit SDA=P2^0;sbit SCL=P2^1;void delay(uchar n) //n=1,延时0.2ms{ uchar i,j; for(i=0;i<n;i++) for(j=0;j<110;j++);}
void t0_init() //定时器T0初始化函数
{
P0=0xff;
TMOD=0x01; //选择定时器T0方式为1 ,16位
TH0=60;
TL0=176;//装初值
TR0=1; //让T0开始工作
ET0=1; //打开T0中断
EA=1; //打开全局中断
delay(5);
}
void display(uchar sec) //数码管显示函数{ uchar Ge,Shi; //Ge用来显示个位,Shi 十位// if(sec>=100)// sec=0; Ge=sec%10; Shi=sec/10; DU=1; // 个位显示 P0=num[Ge]; DU=0; P0=0xff; WE=1; P0=0xfd;//1111 1101 WE=0; delay(5); DU=1; // 十位显示 P0=num[Shi]; DU=0; P0=0xff; WE=1; P0=0xfe; //1111 1110 WE=0; delay(5); //这个延时一定要加}void main(){ t0_init(); while(1) { display(sec); }}void t0()interrupt 1 //定时器T0中断函数{ time++; if(time==20) {// if(sec>=100)// sec=0; sec++; time=0; wr=1; } TL0=176; TH0=60;}本来是想要99秒计时,注意上面两个注销的地方,为什么选择前面一个,到了99,接着00,之后要等好久才会重新开始计时,而如果选后面的,不用等,又直接从00开始计时,两个的作用不是相同的吗?不知道有没表达清楚,但还是谢谢了,
|