『壹』 51單片機計數器怎麼用
51單片機是基礎入門的一個單片機,還是應用最廣泛的。
51單片機的定時/計數器的概念
單片機中,脈沖計數與時間之間的關系十分密切,每輸入一個脈沖,計數器的值就會自動累加1,只要相鄰兩個計數脈沖之間的時間間隔相等,則計數值就代表了時間的流逝,因此,單片機中的定時器和計數器其實是同一個物理的電子元件,只不過計數器記錄的是單片機外部發生的事情(接受的是外部脈沖),而定時器則是由單片機自身提供的一個非常穩定的計數器,這個穩定的計數器就是單片機上連接的晶振部件;MCS-51單片機的晶振經過12分頻之後提供給單片機穩定脈沖;晶振的頻率是非常准確的,所以單片機的計數脈沖之間的時間間隔也是非常准確的。
51單片機的定時/計數器的工作原理
加1計數器輸入的計數脈沖有兩個來源,一個是由系統的時鍾振盪器輸出脈沖經12分頻後送來;一個是T0或T1引腳輸入的外部脈沖源。
作為定時器使用時,定時器計數8051單片機片內振盪器輸出經過12分頻後的脈沖個數,即:每個機器周期使定時器T0/T1的寄存器值自動累加1,直到溢出,溢出後繼續從0開始循環計數;所以,定時器的解析度是時鍾振盪頻率的1/12;
作為計數器使用時,通過引腳T0(P3.4)或T1(P3.5)對外部脈沖信號進行計數,當輸入的外部脈沖信號發生從1到0的負跳變時,計數器的值就自動加1由於檢測一個從1到0的下降沿需要2個機器周期,因此要求被采樣的電平至少要維持一個機器周期。當晶振頻率為12MHz時,最高計數頻率不超過1/2MHz,即計數脈沖的周期要大於2微秒。;計數器的最高頻率一般是時鍾振盪頻率的1/24;
由此可知,不論是定時器還是計數器工作方式,定時器T0和T1均不佔用CPU的時間,除非定時器/計數器T0和T1溢出,才可能引起CPU中斷,轉而去執行中斷處理程序。所以說,定時器/計數器是單片機中效率高而工作靈活的部件。
『貳』 單片機定時計數器程序運行過程
程序運行到這里就死循環了,
while
(1)
{
led2
=
0;
}
後邊的代碼是無緣運行的。
程序運行首先從地址0000H開始,跳轉到主程序入口也就是main()那裡開始,所以真正有意義的運行第一條是:
=
0x01;
依次往下執行,到TR0=1;開始定時器開始計數,根據你的賦值,計數到50000之後,定時器0溢出,開始申請中斷,進入中斷服務程序
void
intt0()
interrupt
1
using
2
執行完中斷後返回到主程序,你現在的情況是在while(1)那個死循環之中。
你說的那個while(1)後邊的{
}里邊的程序在執行完TR0=1之後就執行了,並一直在執行到中斷開始。中斷結束後又一直執行下去,一直反復如此。
『叄』 51單片機定時計數器方式2的工作過程
因為51單片機處理數據是按八位進行的,所以給定時器賦初值的時候,不能將一個數直接賦到t0中,而是將這個數先轉化為一個十六進制數,將它的高兩位數(也就是二進制的高八位)傳送給th0,將低兩位(也就是二進制的低八位)傳送給tl0!(65536-x)/256就是取計數值的高八位運算表達式,因為八位二進制的最大值為256,所以將一個十進制數除以256後就會得到這個十進制數高八位數。最後將所得的余數傳送到tl0,也就是後面(65536-x)%256的工作!希望能幫助你
『肆』 51單片機計數器如何使用,我想要一個簡單一點的程序
將定時器0或者1設置為計數器模式就可以了。舉例如下:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#06H
MOV TH1,#0FFH
MOV TL1,#0FFH
SETB TR1
SETB ET1
SETB EA
SJMP $
T0ISR:
INC A
MOV P1,A
RETI
END
『伍』 51系列單片機定時/計數器初始化的步驟
TMOD:模式控制寄存器,定時器的運行模式,定時計數模式等;
TCON:運行控制寄存器,定時器的中斷允許和外部觸發中斷允許,運行停止控制,溢出標志等
THx/TLx:計數值
IE:中斷控制,如果要開啟中斷允許,則需要配置這個寄存器;
IP:中斷優先順序控制,如果開了幾個中斷源,則需要配置中斷控制的先後;
總體就是:
先關運行和中斷,然後配置模式,配置計數值,定時器運行打開,定時器是否中斷允許,是否開啟總中斷;
如果不開中斷,就直接配置模式和計數值,然後運行即可,主程序里查詢溢出位,判斷是否到計數值(不準確)。
其他定時器T2等,有其他的寄存器,但配置方法同。
『陸』 怎樣用51單片機做計算器啊
1、硬體模擬圖
4、程序源代碼
#include <reg51.h>#include <intrins.h>
#include <ctype.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
uchar operand1[9], operand2[9];
uchar operator;
void delay(uint);
uchar keyscan();
void disp(void);
void buf(uint value);
uint compute(uint va1,uint va2,uchar optor);
uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dbuf[8] = {10,10,10,10,10,10,10,10};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan()
{
uchar skey;
P1 = 0xfe;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xee: skey = '7'; break;
case 0xde: skey = '8'; break;
case 0xbe: skey = '9'; break;
case 0x7e: skey = '/'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xfd;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xed: skey = '4'; break;
case 0xdd: skey = '5'; break;
case 0xbd: skey = '6'; break;
case 0x7d: skey = '*'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xfb;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xeb: skey = '1'; break;
case 0xdb: skey = '2'; break;
case 0xbb: skey = '3'; break;
case 0x7b: skey = '-'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
P1 = 0xf7;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xe7: skey = '$'; break;
case 0xd7: skey = '0'; break;
case 0xb7: skey = '='; break;
case 0x77: skey = '+'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
return skey;
}
void main()
{
uint value1, value2, value;
uchar ckey, cut1 = 0, cut2 = 0;
uchar operator;
uchar i, bool = 0;
init:
buf(0);
disp();
value = 0;
cut1 = cut2 = 0;
bool = 0;
for(i = 0;i < 9;i++)
{
operand1[i] = '