標(biāo)題:
新手請(qǐng)教各位,為什么定時(shí)器時(shí)間不對(duì)?
[打印本頁(yè)]
作者:
hsujinshan
時(shí)間:
2017-7-4 13:40
標(biāo)題:
新手請(qǐng)教各位,為什么定時(shí)器時(shí)間不對(duì)?
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit gewe=P1^3; //個(gè)位選通
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); //延時(shí)
qiwe=1; //千位選通關(guān)閉
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; //設(shè)置定時(shí)器0和1為工作方式1
TH0=(65536-45872)/256;//裝初值
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1; //開總中斷
ET0=1 ; //開定時(shí)器0中斷
TR0=1; // 啟動(dòng)定時(shí)器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--) //延時(shí)函數(shù)約延時(shí)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清零再計(jì)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清零再計(jì)20次
num++;
if(num==3600) //數(shù)碼管計(jì)到3600后歸零
num=0;
qian=num/1000;
bai=num%1000/100 ; //把一個(gè)四位數(shù)送數(shù)碼管
shi=num%1000%100/10;
ge=num%1000%100%10;
}
}
作者:
hsujinshan
時(shí)間:
2017-7-4 13:47
搞了2天了,我不會(huì)了
作者:
HC6800-ES-V2.0
時(shí)間:
2017-7-4 16:59
你的程序,我在我的板子上試過(guò)了。
從計(jì)時(shí)來(lái)說(shuō),可能不是十分準(zhǔn),但效果還是在的。
計(jì)時(shí)一小時(shí),我等不了,我通過(guò)賦值3580,過(guò)20下,是真的清了零,再計(jì)時(shí)的。LED燈也在閃。
沒(méi)有問(wèn)題啊。
你只發(fā)出來(lái)程序,不知道你的目標(biāo)是什么,是否達(dá)到。
從標(biāo)題來(lái)說(shuō),你說(shuō)的時(shí)間不對(duì),是指準(zhǔn)確的時(shí)間嗎?那個(gè)是不容易調(diào)到百分之百的,因?yàn)槎〞r(shí)器中斷發(fā)生后,執(zhí)行了一些語(yǔ)句,那是要占時(shí)間的,當(dāng)然不準(zhǔn)了。
作者:
luoluoluo136
時(shí)間:
2017-7-4 17:07
if(num2=20)????這里錯(cuò)了
作者:
wulin
時(shí)間:
2017-7-4 17:28
if(num2=20) //如果到了20次約為1秒....少一個(gè)=。 if(num2==20)
只要用一個(gè)定時(shí)器就可以完成,不必開T1。
void TO_time() interrupt 1
{
TH0=(65536-45872)/256; //重裝初值
TL0=(65536-45872)%256;
num1++;
num2++;
if(num1>=4) //到了4次=200ms
{
num1=0; //把num1清零再計(jì)20次
led1=~led1;
}
if(num2>=20) //如果到了20次約為1秒
{
num2=0; //把num2清零再計(jì)20次
num++;
if(num>=3600) //數(shù)碼管計(jì)到3600后歸零
num=0;
qian=num/1000;
bai=num%1000/100; //把一個(gè)四位數(shù)送數(shù)碼管
shi=num%1000%100/10;
ge=num%1000%100%10;
}
}
兩個(gè)顯示程序也可以合并在一起
作者:
wulin
時(shí)間:
2017-7-4 17:52
hsujinshan 發(fā)表于 2017-7-4 13:47
搞了2天了,我不會(huì)了
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit gewe=P1^3; //個(gè)位選通
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); //延時(shí)
qiwe=1; //千位選通關(guān)閉
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; //設(shè)置定時(shí)器0和1為工作方式1
TH0=(65536-45872)/256;//裝初值
TL0=(65536-45872)%256;
// TH1=(65536-45872)/256;
// TL1=(65536-45872)%256;
EA=1; //開總中斷
ET0=1 ; //開定時(shí)器0中斷
TR0=1; // 啟動(dòng)定時(shí)器0
// ET1=1;
// TR1=1;
while(1)
{
qian=table[num/1000];
bai=table[num%1000/100]; //把一個(gè)四位數(shù)送數(shù)碼管
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--) //延時(shí)函數(shù)約延時(shí)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清零再計(jì)20次
led1=~led1;
}
if(num2>=20) //如果到了20次約為1秒
{
num2=0; //把num2清零再計(jì)20次
num++;
if(num>=3600) //數(shù)碼管計(jì)到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清零再計(jì)20次
num++;
if(num==3600) //數(shù)碼管計(jì)到3600后歸零
num=0;
qian=num/1000;
bai=num%1000/100 ; //把一個(gè)四位數(shù)送數(shù)碼管
shi=num%1000%100/10;
ge=num%1000%100%10;
}
}*/
作者:
ahshmj
時(shí)間:
2017-7-4 20:55
(65536-
45872
)?是多少的晶振?
作者:
hsujinshan
時(shí)間:
2017-7-5 10:41
12M晶振
作者:
zl2168
時(shí)間:
2017-7-5 11:17
工作方式1需重裝定時(shí)常數(shù),就會(huì)產(chǎn)生誤差。工作方式2不需重裝定時(shí)常數(shù),不會(huì)產(chǎn)生誤差。
作者:
Jesse_ice
時(shí)間:
2017-7-5 11:46
程序沒(méi)什么問(wèn)題,就是定時(shí)器1中斷的里面的判斷==你寫成了賦值=
作者:
Jesse_ice
時(shí)間:
2017-7-5 11:48
如果是12M晶振賦初值50000更精確一點(diǎn)
作者:
jubaolun
時(shí)間:
2017-7-5 14:16
完全可以用1 個(gè)定時(shí)器就可以搞定的。
作者:
ndz517922
時(shí)間:
2017-7-5 16:54
你現(xiàn)在算的這個(gè)是按11.0592M的晶振算的,12M的話直接-50000就可以了,相對(duì)會(huì)更準(zhǔn)一些
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1