導航:首頁 > 操作系統 > 單片機計時器

單片機計時器

發布時間:2022-04-27 22:20:19

單片機計時器原理

單片機用一個振盪器(比如晶體振盪器)作為時間基準,和石英手錶裡面的振盪器差不多,振盪器每震盪一次的時間間隔是一樣的,可以通過振盪器的參數算出來的,每次振盪會產生一個脈沖信號給單片機,單片機只要數數字就能計算時間了。

㈡ 單片機的計時器有什麼用

在工業生產及各種控制系統中,常常需要實現定時報警或延時控制、定時中斷、定時檢測、定時掃描等等,也往往需要用計數器對外部事件進行計數。
定時功能實質上也是通過計數器的計數來實現的。當計數器的輸入脈沖頻率恆定時,計數器所記錄的數值就代表了時間的概念。頻率恆定的脈沖可以來自外部晶振,也可以來自內部RC電路。

㈢ 單片機的計時器TH和TL怎麼計時,如每秒運行一次中斷程序

溢出的時候進入中斷,也就是從0xFFFF到0x0000的時候,標准51的晶振頻率除以12就是計時器加1的頻率,如果你用的是12MHz的晶體,那就是每隔1us你的計時器自動加1,所以最大能計時的時間范圍就是從0x0000到0xFFFF,也就是從0到65535,65.5ms左右,你要每秒定時,或者你用頻率很低的晶振,或者你要設置一個變數來計數,把定時器設置到50ms一中斷,然後在中斷中給變數加1,等變數到20,就證明到1秒了,再執行你的程序。

㈣ 單片機計時器

(65536-10000)/256 意思是:
括弧內的相減結果,即單片機定時器的預裝時間常數X,
X/256 意思是整除取商,目的是取X的二進制數高8位,裝入TH1;

X%256 意思是整除取余,目的是取X的二進制數低8位,裝入TL1。

㈤ 如何用單片機做一個簡單的倒計時器

我已經完成了,下面是電路圖和實際效果,你也試試,程序已經調試完成了!!!是使用秒錶程序改編完成的,喜歡的話,點一個贊吧!希望能幫到你!!!

#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器

typedef unsigned int u16; //對數據類型進行聲明定義

typedef unsigned char u8;

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

u8 code smgan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f};//顯示0~F的值

u8 ssec=100,sec=60,min=04;

u8 DisplayData[8];

sbit beep=P1^5;

unsigned long counter=0;

unsigned int c=0;

sbit p15=P1^5;

bit p;

/*******************************************************************************

* 函 數 名 : delay

* 函數功能 : 延時函數,i=1時,大約延時10us

*******************************************************************************/

void delay(u16 i)

{

while(i--);

}

/*******************************************************************************

* 函 數 名 : Timer0Init

* 函數功能 : 定時器0初始化

* 輸 入 : 無

* 輸 出 : 無

*******************************************************************************/

void Timer0Init()

{

TMOD=0X11;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

TH0=0Xd8; //給定時器賦初值,定時10ms

TL0=0Xf0;

ET0=1;//打開定時器0中斷允許

EA=1;//打開總中斷

TR0=1;//打開定時器 -->啟動定時器中斷!

ET1=1;

TR1=1;

TH1=(65536-250)/256; //FC

TL1=(65536-250)%256;

}

/*******************************************************************************

* 函 數 名 : DigDisplay

* 函數功能 : 數碼管動態掃描函數,循環掃描8個數碼管顯示

*******************************************************************************/

void DigDisplay()

{

u8 i;

for(i=0;i<8;i++)

{

switch(i) //位選,選擇點亮的數碼管,

{

case(0):

LSA=0;LSB=0;LSC=0; break;//顯示第0位

case(1):

LSA=1;LSB=0;LSC=0; break;//顯示第1位

case(2):

LSA=0;LSB=1;LSC=0; break;//顯示第2位

case(3):

LSA=1;LSB=1;LSC=0; break;//顯示第3位

case(4):

LSA=0;LSB=0;LSC=1; break;//顯示第4位

case(5):

LSA=1;LSB=0;LSC=1; break;//顯示第5位

case(6):

LSA=0;LSB=1;LSC=1; break;//顯示第6位

case(7):

LSA=1;LSB=1;LSC=1; break;//顯示第7位

}

P0=DisplayData[i];//發送段碼

delay(100); //間隔一段時間掃描

P0=0x00;//消隱-->撤銷選中;

}

}

void datapros()

{

DisplayData[0]=smgan[ssec%10];

DisplayData[1]=smgan[ssec/10];

DisplayData[2]=0x40;

DisplayData[3]=smgan[sec%10];

DisplayData[4]=smgan[sec/10];

DisplayData[5]=0x40;

DisplayData[6]=smgan[min%10];

DisplayData[7]=smgan[min/10];

}

/*******************************************************************************

* 函 數 名 : main

* 函數功能 : 主函數

* 輸 入 : 無

* 輸 出 : 無

*******************************************************************************/

void main()

{

Timer0Init(); //定時器0初始化

while(1)

{

datapros();

DigDisplay();

}

}

/*******************************************************************************

* 函 數 名 : void Timer0() interrupt 1

* 函數功能 : 定時器0中斷函數

* 輸 入 : 無

* 輸 出 : 無

*******************************************************************************/

void Timer0() interrupt 1

{

TH0=0Xd8; //給定時器賦初值,定時10ms

TL0=0Xf0;

ssec--;

if(ssec==00) //1s

{

ssec=100;

sec--;

if(sec==00)

{

sec=60;

min--;

if(min==-1)

{

P1=1;

ssec=0;sec=0;min=0;

TR0=0;

}

}

}

}

void Timer1() interrupt 3

{

TH1=(65536-250)/256; //FC

TL1=(65536-250)%256;

if(p!=1) p15=~p15;

if(p==1) p15=0;

c++;

if(c==250)

{

//c=0;

p=~p;

}

if(c>=250&&1695);

if(c==1696) c=0;

}

㈥ 單片機計時器如何編寫

#include<reg52.h>
#define
uint
unsigned
int
#define
uchar
unsigned
char
sbit
key1=P3^0;
//定義"啟動"按鈕
sbit
key2=P3^1;
//定義"停止"按鈕
sbit
key3=P3^2;
//定義"復位"按鈕
sbit
DP
=P0^7;
//定義"小數點(.)"
uchar
aa,bb,cc,dd,ee,qian,,shi,ge;
uchar
code
table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//共陰極數碼管依次從0到9的編碼
void
delay(uint
z)
//延時子函數
{
uint
x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void
display(uchar
qian,uchar
,uchar
shi,uchar
ge)
//顯示子程序
{
P2=0xfe;
P0=table[qian];
//千位
delay(10);
P2=0xfd;
P0=table[];
//百位
delay(10);
DP=1;
delay(10);
P2=0xfb;
P0=table[shi];
//十位
delay(10);
P2=0xf7;
P0=table[ge];
//個位
delay(10);
//使用動態掃描的方法實現數碼管顯示
}
void
init()
//初始化子程序
{
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
TMOD=0x01;
//使用定時器T0的方式1
TL0=0x18;
TH0=0xfc;
//定時1ms中斷一次
fosc=12MZH
EA=1;
//中斷總允許
ET0=1;
//允許定時器T0中斷
}
void
timer0()
interrupt
1
{
TL0=0x18;
TH0=0xfc;//重新賦初值
aa++;
//中斷一次變數aa的值加1
if(aa==8)
//中斷10次後,定時時間為10*1ms=10ms=0.01s
PS:實際模擬中發現程序顯示時間比實際時間慢20%左右
所以把a改為8
{
aa=0;
bb++;
ge=bb%10;
}
if(bb==10)
//中斷100次後,定時時間為100*1ms=100ms=0.10s
{
bb=0;
cc++;
shi=cc%10;
}
if(cc==10)
//中斷1000次後,定時時間為1000*1ms=1000ms=1.00s
{
cc=0;
dd++;
=dd%10;
}
if(dd==10)
//中斷10000次後,定時時間為10000*1ms=10000ms=10.00s
{
dd=0;
ee++;
qian=ee%10;
}
if(ee==10)
//中斷100000次後
,全部歸零重新開始
{
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
}
}
void
main()
{
init();
//調用初始化子程序
while(1)
{
if(key1==0)
//檢測"啟動"按鈕是否按下
{
delay(10);
//延時去抖動
if(key1==0)
//再次檢測"啟動"按鈕是否按下
{
while(!key1);
//鬆手檢測,若按鍵沒有釋放,key1始終為0,那麼!key1始終為1,程序就一直停在此
TR0=1;
//啟動定時器開始工作
}
}
if(key2==0)
//檢測"停止"按鈕是否按下
{
delay(10);
//延時去抖動
if(key2==0)
//再次檢測"停止"按鈕是否按下
{
while(!key2);
//鬆手檢測
TR0=0;
//關閉定時器
}
}
if(key3==0)
//檢測"復位"按鈕是否按下
{
delay(10);
//延時去抖動
if(key3==0)
//再次檢測"復位"按鈕是否按下
{
while(!key3);
//鬆手檢測
aa=0;
bb=0;
cc=0;
dd=0;
ee=0;
ge=0;
=0;
shi=0;
qian=0;
TR0=0;
//關閉定時器
}
}
display(qian,,shi,ge);
//調用顯示子函數
}
}

㈦ 如何用單片機做一個簡單的倒計時器

51單片機實現數碼管99秒倒計時,其實很簡單,就是使用定時器中斷來實現。目的就是學習怎樣用單片機實現倒計時,從而實現一些延時控制類的東西,99秒只是一個例子,你完全可以做出任意倒計時如10秒倒計時程序。定時器定時時間計算公式:初值X=M(最大計時)-計數值。
初值,換算成十六進制,高位給TH0,低位給TL0,如果用定時器0的話。
M(最大計時)如果是16位的,就是2的16次方,最大定時,65535 微秒,實現1秒定時,可以通過定時10毫秒,然後100次改變一次秒值即可。10*100毫秒=1S
計數值:你要定時多長時間,如果定時1毫秒,就是1000微秒,(單位為微秒),如果定時10毫秒,就是10000(微秒),當然,最大定時被定時器本身位數限制了,最大2的16次方(16位定時計數器),只能定時65.535毫秒。定時1S當然不可能1S定時器中斷。
下面為實現99秒倒計時C語言源程序
/*了解定時器,這樣的話,就可以做一些基本的實驗了,如定時炸彈~~,10秒後打開關閉繼電器*/
/*數碼管,12M晶振*/
#include <reg52.h>
#define uchar unsigned char
sbit p11=P1^1; //連的是繼電器。。
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shiwei;
uchar gewei;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD|=0x01; /*定時器0 16位定時器 X=65535-10000(10毫秒)=55535=D8F0(十六進制)定時10ms
*/
TH0=0xd8;
TL0=0xf0;
IE=0x82; //這里是中斷優先順序控制EA=1(開總中斷),ET0=1(定時器0允許中斷),這里用定時器0來定時
TR0=1; //開定時器0
while(1)
{
P0=shiwei; //99的十位
P2=0; //99的個位,
delay(300); //動態掃描數碼管延時
P0=gewei;
P2=1;
delay(300);
}
}
void tim(void) interrupt 1 using 1 //定時器0中斷
{
static uchar second=99,count; //99隻是一個數,可以任意改,因為這里只學習怎樣實現倒計時
TH0=0xd8; //定時10毫秒
TL0=0xf0;
count++;
if(count==100) //10毫秒定時,10*100=1000(毫秒)=1秒
{
count=0;
second--;
if(second==0)
{
p11=0; //這里讓繼電器動作,當然動作之後,要復位才能等下次倒定時再動作。
second=99; //回到99再循環來,當然,可以做其他的控制,
}
shiwei=tab[second/10]; //數碼管10位
gewei=tab[second%10]; //數碼管個位
}

㈧ 如何利用51單片機實現一個計時器

方法一:用定時器中斷計時模式循環計時。
方法二:用CPU消耗時鍾周期指令計時(浪費資源)。
思路:
用定時器中斷計時,溢出時形成中斷信號,標識為一個基本周期t,所定時間T/t=n為周期循環數,到時形成定時觸發信號。

㈨ 單片機 計時器

你在 Initialize() 里開啟了TIMER1中斷,但沒有寫T1的中斷程序,導致T1溢出時程序跑飛。
只要加上一段如下程序就行了。
void timer1() interrupt 3 using 1
{
}
如果要讓T1作波特率發生器,只要把T1設置成方式2,設好初值,把ET1關掉,把TR1打開就可以了,也不必理會T1的中斷向量了。

㈩ 單片機60秒計時器的程序

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};
void display(uchar fen,uchar miao);
uchar a,fen,miao,shu;
void delay(uint z);
void init();
void main()
{
init();
while(1)
{
display(fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
shu++;
fen=shu/10;
miao=shu%10;
if(shu==60)
shu=0;
}
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(uchar fen,uchar miao)
{
P1=0xFe;
P2=table[fen];
delay(5);//延時5毫秒
P1=0xFf;
P2=table[miao];
delay(5);//延時5毫秒
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

閱讀全文

與單片機計時器相關的資料

熱點內容
把pdf轉為word的軟體 瀏覽:799
程序員去面試產品經理 瀏覽:463
魏晉玄學pdf 瀏覽:160
單片機步進電機接線圖 瀏覽:148
如何關閉安卓通話設置 瀏覽:417
方舟生存進化雲伺服器配置 瀏覽:216
微信app廣告的廣告主是什麼 瀏覽:984
java兩個隊列實現棧 瀏覽:700
先學c語言還是單片機 瀏覽:48
伺服器的全稱和英文是什麼 瀏覽:23
zip包解壓庫java 瀏覽:498
白嫖pdf 瀏覽:482
有什麼app可以控制空調的 瀏覽:863
python標識符可以有減號 瀏覽:911
股票kd中k值完整演算法 瀏覽:74
mysqlmac命令行啟動 瀏覽:708
app會閃退怎麼辦啊 瀏覽:415
濟寧程序員培訓 瀏覽:678
世界五千年pdf 瀏覽:155
java翻譯api 瀏覽:840