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

計時單片機

發布時間:2022-04-28 21:55:21

1. 單片機計時

按你的要求給你寫了個簡單程序,可用定時器寫。下邊是不用定時器寫的。如按你的要求,按鍵接P1.0另一邊接地,低電平說明按鍵按下。LED燈我習慣用低電平來點亮。程序如:
#include<reg51.h>
#define uchar unsigned char

sbit start=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
uchar count=0;

void delayms(int x)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}

void delay5s(int x)
{
;//自己重寫一個或者按上邊改一下也可以
}

main()
{
start=1; //置輸入
LED1=1;
LED2=1;
LED3=1;
LED4=1;
for(;;)
{
if(start==0)
{
delayms(20);// 20ms延時防抖動
if(start==0)
{
delay5s(1); //5s 5s延時函數照1ms函數改下就可以了。
LED1=0;
delay5s(6); //30s
LED2=0;
delay5s(9); //45s
LED3=0;
delay5s(13); //65s
LED4=0;
while(start==0) //等待按鍵解放
}
}
}
}

2. 單片機倒計時工作原理

單片機倒計時工作原理。在程序中設置一個時間然後不斷的減少時間,時間減少為0時就是倒計時時間到了。

3. 單片機計時計分器的計時原理是

單片機計時,就是利用內部的定時器實現的,但是定時器最大隻能定時65毫秒(按晶振12M計算),其實可以定時50毫秒,再用中斷的方式,中斷20次,即計了20次50毫秒,就是1秒鍾了。
有了1秒,其餘的計時問題就好解決了,計時鍾,就按秒,分,小時來計時。
球類計時計分器,也同理,60秒計1分,60分計1小時。

4. 單片機定時器怎麼實現時間計時越細越好

定時/計數器的實質是加1計數器(16位),由高8位和低8位兩個寄存器組成。TMOD是定時/計數器的工作方式寄存器,確定工作方式和功能;TCON是控制寄存器,控制T0、T1的啟動和停止及設置溢出標志。

加1計數器輸入的計數脈沖有兩個來源,一個是由系統的時鍾振盪器輸出脈沖經12分頻後送來;一個是T0或T1引腳輸入的外部脈沖源。每來一個脈沖計數器加1,當加到計數器為全1時,再輸入一個脈沖就使計數器回零,且計數器的溢出使TCON中TF0或TF1置1,向CPU發出中斷請求(定時/計數器中斷允許時)。如果定時/計數器工作於定時模式,則表示定時時間已到;如果工作於計數模式,則表示計數值已滿。
可見,由溢出時計數器的值減去計數初值才是加1計數器的計數值。

•設置為定時器模式時,加1計數器是對內部機器周期計數(1個機器周期等於12個振盪周期,即計數頻率為晶振頻率的1/12)。計數值N乘以機器周期Tcy就是定時時間t。

5. 51單片機怎麼實現計時

嘿嘿 還是讓俺來幫你解決吧
1 關於定時器定時時間的計算問題:
如果使用的是12M晶振計算,指令周期1uS,定時器是加1計數器,即是對內部時鍾即指令周期脈沖計數 每當1uS到時,計數器加1。
假設 定時器的初始值=X,則每到1uS 計數器的值就加1 ,則計數器值=X+1+1+...+1 值越來越大,最後達到FFFFH+1 就會產生溢出 結果計數器值回0(FFFFH+1=65536)
可以推出 定時時間=計數的1的個數×1uS=(65536—X )1 uS
結論: 定時時間跟初始值即時間常數X有關。
如果要定時0.5毫秒=500uS 根據定時時間公式 500=(65536—X )
即X=(65536-500) 一般把高8位送TH0 即 (65536-500)/256
把 (65536-500)%256即除上256後的余數 即低8位數送給TL0
每當定時時間到 計數器值都回0 必須重新送時間常數X
2每條指令的時間怎麼算? 答復:
可以查指令表 每一條指令的執行時間的周期數 都是固定的 如 NOP 為一個機器周期
MOV R6,#200; 為2個機器周期
機器周期=12/晶振頻率 如果晶振頻率=12MHZ 則機器周期=1 uS
就可以知道 ; 執行NOP指令的執行時間為 1 uS
執行MOV R6,#200指令的執行時間為 2 uS
因此 是可以精確計算出指令的延時時間的
呵呵 就介紹這些吧 滿意就 給加分吧

6. 單片機計時器

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

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

7. 單片機計時器如何編寫

#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);
//調用顯示子函數
}
}

8. 單片機計時器原理

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

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

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]; //數碼管個位
}

閱讀全文

與計時單片機相關的資料

熱點內容
河北視頻加密有哪些 瀏覽:649
桌面兩個微信怎麼都加密碼 瀏覽:276
長沙單身程序員 瀏覽:883
伺服器下載異常是因為什麼 瀏覽:703
java防刷 瀏覽:842
3dmax取消當前命令 瀏覽:359
顯示當前模式下所有可執行的命令 瀏覽:758
為什麼程序員拿了股份還要高薪 瀏覽:946
電腦運行命令里的記錄能刪嗎 瀏覽:697
linuxwss 瀏覽:848
一個軟體需要登錄伺服器地址 瀏覽:923
哪裡有解壓程序 瀏覽:299
java靜態方法內存 瀏覽:545
我的世界ec伺服器如何帶vip 瀏覽:737
什麼是由解析器域名和伺服器構成 瀏覽:414
自動識別電影信息源碼 瀏覽:850
柱筋箍筋加密區怎麼算 瀏覽:48
鋼筋中加密15倍是什麼意思 瀏覽:366
esc加密演算法 瀏覽:518
linux運行exe命令 瀏覽:125