源代碼如下,計時函式是我用stc軟體直接復制出來的 /ps我一直搞不懂這個定時器的代碼該如何寫。
如果把定時器函式放入while回圈里面的話,就必須要執行完整個回圈之后才能再次執行定時器函式,這樣應該會導致計數不準確吧?
請問要怎樣才能實作準確的一秒鐘計數?
//數碼管時鐘程式
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit du = P2^6;
sbit we = P2^7;
int num=0;
int shi=3;
int fen=2;
int miao=0;
//uchar hour = 8, minute = 5, sec = 1;
int miao2=0, fen2=5,shi2=2;
sfr AUXR =0x8e;
uchar duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //段碼
uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位碼
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定時器1T模式
TMOD &= 0x0F; //設定定時器模式
TL1 = 0xCD; //設定定時器初值
TH1 = 0xD4; //設定定時器初值
TF1 = 0; //清除TF1標志
TR1 = 1; //定時器1開始計時
num++;
}
void delay (uint k) //軟體延時
{
uint i;
uint j;
for(i = 0; i < k; i++)
for(j = 0; j < 80; j++); //原始資料 j < 114
}
void jisuan ()
{
if (num ==100)
{
miao++;
num =0;
}
if (miao ==10)
{
miao2++;
miao =0;
}
//----------------
if (miao2 == 6)
{
fen ++;
miao2 = 0;
}
if (fen == 10)
{
fen2++;
fen= 0;
}
//------------------
if (fen2 == 6)
{
shi++;
fen2= 0;
}
if (shi == 10)
{
shi2++;
shi= 0;
}
if (shi2 ==2 & shi ==4)
{
shi =0;
shi2=0;
}
}
//=============主函式================
//=============主函式================
void main ()
{
while(1)
{
Timer1Init();
jisuan();
du = 1;
P0 = duan[miao];
du = 0;
we = 1;
P0 = wei[7];
we = 0;
delay(1);
du = 1;
P0 = duan[miao2];
du = 0;
we = 1;
P0 = wei[6];
we = 0;
delay (1);
//----------------------
du = 1;
P0 = 0x40;
du = 0;
we = 1;
P0 = wei[5];
we = 0;
delay (1);
//----------------------
du = 1;
P0 = duan [fen];
du = 0;
we = 1;
P0 = wei[4];
we = 0;
delay (1);
du = 1;
P0 = duan [fen2];
du = 0;
we = 1;
P0 = wei[3];
we = 0;
delay (1);
//----------------------
du = 1;
P0 = 0x40;
du = 0;
we = 1;
P0 = wei[2];
we = 0;
delay (1);
//----------------------
du = 1;
P0 = duan [shi];
du = 0;
we = 1;
P0 = wei[1];
we = 0;
delay (1);
du = 1;
P0 = duan [shi2];
du = 0;
we = 1;
P0 = wei[0];
we = 0;
delay (1);
}
}
uj5u.com熱心網友回復:
51蛋騙雞使用中斷都不能準確,只有使用外部時鐘芯片才能比較準確。uj5u.com熱心網友回復:
有外部晶振,但是好像呼叫以后這個程式還是沒法獲得準確的時間uj5u.com熱心網友回復:
Timer1Init 為什么要放到回圈中?轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226537.html
標籤:單片機/工控
上一篇:為什么在Peripherals下拉選單選項找不到General Purpose I/O?
下一篇:有個問題啊
