做的秒表0.000到9.999的,为什么第一位一直是0,不是毫秒那三位,毫秒那三位不用准确。是秒的那一位一直显示0,应该循环显示0到9的。
#include<reg52.h>#define date P0 //用date代替P0
unsigned char t=0; //t为多少毫秒
void display(); //声明数码管显示子函数void delay(); //声明延时子函数
void main(){ TMOD = 0x01; //方式1,为16位定时器
TH0 = 0xFC; //对高8位和低8位分别赋初值,使一个周期为1ms TL0 = 0x66; // EA = 1; //打开总中断 ET0 = 1; //打开定时器0中断 TR0 = 1; //打开定时器0 while(1) { display(); //进入数码管显示的子函数 }}
void Timer() interrupt 1 //定义定时器,1为定时器中断0{ TL0 = 0x66; //对低8位和高8位赋初值,使一个周期为1ms TH0 = 0xFC; // TF0 = 0; //定时器0溢出,用此语句清0 t++; //t加1毫秒
}/******************数码管*********************/unsigned char code c[]={0xC00xF90xA40xB00x990x920x820xF80x800x90 //定义一个数组显示0到9 0x880x830xC60xA10x860x8E0xFF};
unsigned char code d[]={0x400x790x240x300x190x120x020x780x000x10}; //定义一个数组显示0到9并带着小数点 void display() //数码管显示{
if(t > 9999) //当t=10000时,也就是10秒时 { t = 0; //t重新为0 }
P2 = ~0x08; //第一位 date = c[((t%1000)%100)%10];//第一位显示t的个位数 delay(); //延时 date = c[16]; //消隐
P2 = ~0x04; //第二位 date = c[((t%1000)%100)/10];//第二位显示t的十位数 delay(); //延时 date = c[16]; //消隐
P2 = ~0x02; //第三位 date = c[(t%1000)/100]; //第三位显示t的百位数 delay(); //延时 date = c[16]; //消隐
P2 = ~0x01; //第四位 date = d[t/1000]; //第四位显示t的千位数 delay(); //延时 date = c[16]; //消隐}
void delay() //延时{ unsigned char i = TH0+1; // if(i > 0xFE) // { i = 0xFC; // } while(i != TH0); //}
因为低位更新太快啊。
对人眼来说看不到那么快的频率的。就是0.0X的x位都看不清,更不要说0.00y的y位啦。
所以原来人工按秒表,的x位其实没有多大意义,现在体育赛事中都是用的电子计时才能到y位。
你的这个程序流程不太好,建议你这样做:
设定一个变量为 short类型。初值为0;
设定好定时器,每一毫秒中断一次;
然后在中断程序中变量++;
主程序中直接显示这个变量就可以。
然后在主程序中判断,如果到了10秒就清零即可。