让后四位数码管以0.01秒(利用定时器)的速度从0显示到9999,在使用定时器定时,为什么定时时间不对,计算应该没错呀
时间:10-02
整理:3721RD
点击:
让后四位数码管以0.01秒(利用定时器)的速度从0显示到9999
#include <reg52.h>
#include <intrins.h>
int ge,shi,bai,qian;
unsigned int x;
sbit wei=P2^7;
sbit duan=P2^6;
char code A[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(int z)
{
int t,y;
for(t = z; t> 0; t--)
for(y = 114; y > 0 ; y--);
}
void display( unsigned int s)
{
qian=s/1000;
bai=(s-1000*qian)/100;
shi=(s-1000*qian-100*bai)/10;
ge=s-1000*qian-100*bai-10*shi;
//第一个数码管 51单片机数码管 位:从左到右 低位到高位 且 低电频亮
wei=1;
P0=0x7f;
wei=0; //位选
duan=1;
P0=A[ge];
duan=0; //段选
delay(1);
//第二个数码管
wei=1;
P0=0xbf;
wei=0;
duan=1;
P0=A[shi];
duan=0;
delay(1);
//第三个数码管
wei=1;
P0=0xdf;
wei=0;
duan=1;
P0=A[bai];
duan=0;
delay(1);
//第四个数码管
wei=1;
P0=0xef;
wei=0;
duan=1;
P0=A[qian];
duan=0;
delay(1);
if(ge==9&&shi==9&&bai==9&&qian==9)
{
wei=1;
P0=0xff;
wei=0;
while(1);//显示9999后熄灭
}
}
void main()
{
TMOD=0x01;
TH0=(65536-56320)/256;//晶振频率11.0592Mhz,//时钟频率0.9216Mhz//1.085069444微秒计数器+1时间
TL0=(65536-56320)%256;//定时10ms,计数器+9216次,十六进制为2400,高八位0x24,低八位0x00
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=1;
TH0=0x24;//
TL0=0x00;
x++;
}
display(x);
}
}
//晶振频率11.0592Mhz,//时钟频率0.9216Mhz//1.085069444微秒计数器+1时间
//定时10ms,计数器+9216次,十六进制为2400,高八位0x24,低八位0x00
这样的思路应该没问题吧 为什么会有大约2倍的时间误差,数码管跑数大概快了两倍
#include <reg52.h>
#include <intrins.h>
int ge,shi,bai,qian;
unsigned int x;
sbit wei=P2^7;
sbit duan=P2^6;
char code A[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(int z)
{
int t,y;
for(t = z; t> 0; t--)
for(y = 114; y > 0 ; y--);
}
void display( unsigned int s)
{
qian=s/1000;
bai=(s-1000*qian)/100;
shi=(s-1000*qian-100*bai)/10;
ge=s-1000*qian-100*bai-10*shi;
//第一个数码管 51单片机数码管 位:从左到右 低位到高位 且 低电频亮
wei=1;
P0=0x7f;
wei=0; //位选
duan=1;
P0=A[ge];
duan=0; //段选
delay(1);
//第二个数码管
wei=1;
P0=0xbf;
wei=0;
duan=1;
P0=A[shi];
duan=0;
delay(1);
//第三个数码管
wei=1;
P0=0xdf;
wei=0;
duan=1;
P0=A[bai];
duan=0;
delay(1);
//第四个数码管
wei=1;
P0=0xef;
wei=0;
duan=1;
P0=A[qian];
duan=0;
delay(1);
if(ge==9&&shi==9&&bai==9&&qian==9)
{
wei=1;
P0=0xff;
wei=0;
while(1);//显示9999后熄灭
}
}
void main()
{
TMOD=0x01;
TH0=(65536-56320)/256;//晶振频率11.0592Mhz,//时钟频率0.9216Mhz//1.085069444微秒计数器+1时间
TL0=(65536-56320)%256;//定时10ms,计数器+9216次,十六进制为2400,高八位0x24,低八位0x00
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=1;
TH0=0x24;//
TL0=0x00;
x++;
}
display(x);
}
}
//晶振频率11.0592Mhz,//时钟频率0.9216Mhz//1.085069444微秒计数器+1时间
//定时10ms,计数器+9216次,十六进制为2400,高八位0x24,低八位0x00
这样的思路应该没问题吧 为什么会有大约2倍的时间误差,数码管跑数大概快了两倍
就灭看懂为什么会有两倍的差距 唉