标题:
新手请教各位,为什么定时器时间不对?
[打印本页]
作者:
hsujinshan
时间:
2017-7-4 13:40
标题:
新手请教各位,为什么定时器时间不对?
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit gewe=P1^3; //个位选通
sbit shwe=P1^2;
sbit bawe=P1^1;
sbit qiwe=P1^0;
sbit led1=P2^0; //二极管
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void delayms(uint);
void display1(uchar,uchar);
void dispiay2(uchar,uchar);
uchar num1,num2,qian,bai,shi,ge;
uint num;
void display1(uchar qian,uchar bai)
{
qiwe=0; //千位选通打开
P0=table[qian]; //千位段选
delayms(5); //延时
qiwe=1; //千位选通关闭
bawe=0;
P0=table[bai];
delayms(5);
bawe=1;
}
void display2(uchar shi,uchar ge)
{
shwe=0;
P0=table[shi];
delayms(5);
shwe=1;
gewe=0;
P0=table[ge];
delayms(5);
gewe=1;
}
void main()
{
TMOD=0x11; //设置定时器0和1为工作方式1
TH0=(65536-45872)/256;//装初值
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1; //开总中断
ET0=1 ; //开定时器0中断
TR0=1; // 启动定时器0
ET1=1;
TR1=1;
while(1)
{
display2(shi,ge);
display1(qian,bai);
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //延时函数约延时xms
for(j=110;j>0;j--);
}
void TO_time() interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num1++;
if(num1==4) //到了4次=200ms
{
num1=0; //把num1清零再计20次
led1=~led1;
}
}
void T1_time() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
if(num2=20) //如果到了20次约为1秒
{
num2=0; //把num2清零再计20次
num++;
if(num==3600) //数码管计到3600后归零
num=0;
qian=num/1000;
bai=num%1000/100 ; //把一个四位数送数码管
shi=num%1000%100/10;
ge=num%1000%100%10;
}
}
作者:
hsujinshan
时间:
2017-7-4 13:47
搞了2天了,我不会了
作者:
HC6800-ES-V2.0
时间:
2017-7-4 16:59
你的程序,我在我的板子上试过了。
从计时来说,可能不是十分准,但效果还是在的。
计时一小时,我等不了,我通过赋值3580,过20下,是真的清了零,再计时的。LED灯也在闪。
没有问题啊。
你只发出来程序,不知道你的目标是什么,是否达到。
从标题来说,你说的时间不对,是指准确的时间吗?那个是不容易调到百分之百的,因为定时器中断发生后,执行了一些语句,那是要占时间的,当然不准了。
作者:
luoluoluo136
时间:
2017-7-4 17:07
if(num2=20)????这里错了
作者:
wulin
时间:
2017-7-4 17:28
if(num2=20) //如果到了20次约为1秒....少一个=。 if(num2==20)
只要用一个定时器就可以完成,不必开T1。
void TO_time() interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num1++;
num2++;
if(num1>=4) //到了4次=200ms
{
num1=0; //把num1清零再计20次
led1=~led1;
}
if(num2>=20) //如果到了20次约为1秒
{
num2=0; //把num2清零再计20次
num++;
if(num>=3600) //数码管计到3600后归零
num=0;
qian=num/1000;
bai=num%1000/100; //把一个四位数送数码管
shi=num%1000%100/10;
ge=num%1000%100%10;
}
}
两个显示程序也可以合并在一起
作者:
wulin
时间:
2017-7-4 17:52
hsujinshan 发表于 2017-7-4 13:47
搞了2天了,我不会了
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit gewe=P1^3; //个位选通
sbit shwe=P1^2;
sbit bawe=P1^1;
sbit qiwe=P1^0;
sbit led1=P2^0; //二极管
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void delayms(uint);
void display1(uchar,uchar,uchar,uchar);
//void dispiay2(uchar,uchar);
uchar num1,num2,qian,bai,shi,ge;
uint num;
void display1(uchar qian,uchar bai,uchar shi,uchar ge)
{
qiwe=0; //千位选通打开
P0=table[qian]; //千位段选
delayms(2); //延时
qiwe=1; //千位选通关闭
bawe=0;
P0=table[bai];
delayms(2);
bawe=1;
shwe=0;
P0=table[shi];
delayms(2);
shwe=1;
gewe=0;
P0=table[ge];
delayms(2);
gewe=1;
}
void main()
{
TMOD=0x01; //设置定时器0和1为工作方式1
TH0=(65536-45872)/256;//装初值
TL0=(65536-45872)%256;
// TH1=(65536-45872)/256;
// TL1=(65536-45872)%256;
EA=1; //开总中断
ET0=1 ; //开定时器0中断
TR0=1; // 启动定时器0
// ET1=1;
// TR1=1;
while(1)
{
qian=table[num/1000];
bai=table[num%1000/100]; //把一个四位数送数码管
shi=table[num%1000%100/10];
ge=table[num%1000%100%10];
// display2(shi,ge);
display1(qian,bai,shi,ge);
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //延时函数约延时xms
for(j=110;j>0;j--);
}
void TO_time() interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num1++;
num2++;
if(num1>=4) //到了4次=200ms
{
num1=0; //把num1清零再计20次
led1=~led1;
}
if(num2>=20) //如果到了20次约为1秒
{
num2=0; //把num2清零再计20次
num++;
if(num>=3600) //数码管计到3600后归零
num=0;
}
}
/*
void T1_time() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
if(num2=20) //如果到了20次约为1秒
{
num2=0; //把num2清零再计20次
num++;
if(num==3600) //数码管计到3600后归零
num=0;
qian=num/1000;
bai=num%1000/100 ; //把一个四位数送数码管
shi=num%1000%100/10;
ge=num%1000%100%10;
}
}*/
作者:
ahshmj
时间:
2017-7-4 20:55
(65536-
45872
)?是多少的晶振?
作者:
hsujinshan
时间:
2017-7-5 10:41
12M晶振
作者:
zl2168
时间:
2017-7-5 11:17
工作方式1需重装定时常数,就会产生误差。工作方式2不需重装定时常数,不会产生误差。
作者:
Jesse_ice
时间:
2017-7-5 11:46
程序没什么问题,就是定时器1中断的里面的判断==你写成了赋值=
作者:
Jesse_ice
时间:
2017-7-5 11:48
如果是12M晶振赋初值50000更精确一点
作者:
jubaolun
时间:
2017-7-5 14:16
完全可以用1 个定时器就可以搞定的。
作者:
ndz517922
时间:
2017-7-5 16:54
你现在算的这个是按11.0592M的晶振算的,12M的话直接-50000就可以了,相对会更准一些
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1