㈠ 單片機計時器原理
單片機用一個振盪器(比如晶體振盪器)作為時間基準,和石英手錶裡面的振盪器差不多,振盪器每震盪一次的時間間隔是一樣的,可以通過振盪器的參數算出來的,每次振盪會產生一個脈沖信號給單片機,單片機只要數數字就能計算時間了。
㈡ 單片機的計時器有什麼用
在工業生產及各種控制系統中,常常需要實現定時報警或延時控制、定時中斷、定時檢測、定時掃描等等,也往往需要用計數器對外部事件進行計數。
定時功能實質上也是通過計數器的計數來實現的。當計數器的輸入脈沖頻率恆定時,計數器所記錄的數值就代表了時間的概念。頻率恆定的脈沖可以來自外部晶振,也可以來自內部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--);
}