導航:首頁 > 操作系統 > c語言單片機t0計數值

c語言單片機t0計數值

發布時間:2024-10-20 21:28:16

『壹』 各位大牛,我想問:我把51單片機的定時器TO出於計數器模式,但是計數值的高八位,為什麼要乘以256呢

T0的計數值,是16位數。
讀出時,只能每次讀出8位。
需要讀出兩次。

而T0的計數值,是動態的。
先、後讀出的,難保是同一個16位數字。
為此,要讀出一遍,再讀出一遍。。。。
當,先後兩次相同時,才能認為讀出了同一個數,BREAK,退出讀數的操作。

高八位乘以256,加上低八位,就是合成為16位數。

『貳』 用52單片機C語言編寫程序,實現00~59計時。要求用T0,工作方式1。

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6; //段選
sbit wela=P2^7; //位選
uchar shi,ge,num1,num2; //變數
uchar code table[]={0x3f,0x06,0x5b,0x4f, //共陰極字型碼
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint x) //延時子程序
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void init()
{
TMOD=0x01; //設置定時器0的工作方式
TH0=(65536-50000)/256; //裝初值
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
}
void display() //顯示子程序
{
la=1;
P0=table[ge]; //送段選數據
la=0;
P0=0xff; //送位選數據前關閉所有顯示
wela=1;
P0=0xfe; //送位選數據
wela=0;
delay(5); //延時

la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
}
void main()
{
init();
while(1)
{
display();
}
}
void timer() interrupt 1
{
TH0=(65536-50000)/256; //重裝初值
TL0=(65536-50000)%256;
num1++;
if(num1==20) //到了20次,1秒時間到
{
num1=0; //清0重新計數
num2++;
if(num2==60)
num2=0;
P1=0x00;
delay(500);
P1=0xff;
shi=num2/10; //把一個2位數分離後分別送數碼管顯示
ge=num2%10; //十位和個位
}
}

試了的,可以放心,採納吧!

『叄』 51單片機使用T0和T1外部脈沖計數,C語言如何編程

1、使用T0和T1外部脈沖計數,控制兩個電機,到1700個脈沖電機停止,
--統計脈沖個數,用外部中斷更好。
--T0和T1,留著定時用。
用四個按鍵控制,按鍵1控制電機正轉,按鍵2控制電機反轉,按鍵3控制電機1正轉,按鍵4控制電機2正轉。


2、常式:

#include<reg51.h>
sbitk1=?;//自己定義
sbitk2=?
sbitk3=?
sbitk4=?
sbitDIAN1=?
sbitDIAN2=?
sbitDIAN3=?
sbitDIAN4=?
sbitSEN1=?
sbitSEN2=?
voiddelay(unsignedintx)
{
unsignedintm,n;
for(m=x;m>0;m--)for(n=115;n>0;n--);
}
voidmain(void)
{
TMOD=0x55;
IE=0x8a;
while(1){
if(!k1){
delay(10);
if(!k1){
while(!k1);
TH0=(65536-1700)/256;
TL0=(65536-1700)%256;
SEN1=0;
DIAN1=0;DIAN2=1;
SEN1=1;
TR0=1;
}
}
if(!k2){
delay(10);
if(!k2){
while(!k2);
TH0=(65536-1700)/256;
TL0=(65536-1700)%256;
SEN1=0;
DIAN1=1;DIAN2=0;
SEN1=1;
TR0=1;
}
}
if(!k3){
delay(10);
if(!k3){
while(!k3);
TH1=(65536-1700)/256;
TL1=(65536-1700)%256;
SEN2=0;
DIAN3=0;DIAN4=1;
SEN2=1;
TR1=1;
}
}
if(!k4){
delay(10);
if(!k4){
while(!k4);
TH1=(65536-1700)/256;
TL1=(65536-1700)%256;
SEN2=0;
DIAN3=1;DIAN4=0;
SEN2=1;
TR1=1;
}
}
}
}

『肆』 單片機用C編程時定時器部分的 TH0=(65536-50000)/256;TL0=(65536-50000)%256;是什麼意思

今天剛剛在自學定時器這塊,終於搞懂了@.@!
方式1為16位的定時器/計數器,對定時器T0來說是分成兩個寄存器:TH0為高八位,TL0為低八位,組成了16位的定時器,當低位TL0計滿就向高位TH0移一個數,然後清零。
以12Mhz的晶振來說,機器周期是1us,計滿TH0、TL0就需要216-1個數,再來一個數就「溢出」產生中斷,一次溢出也就是65536us,約等於65.5ms,如果要定時50ms的話就要給他們裝一個預裝值(初值),總值-需要值=預裝值.
也就是65536-50000=15536,預裝後,定時器從預裝值開始加值,定時器溢出中斷後,會重新從預裝值開始加值加到50ms就再產生中斷,從而達到了定時的目的。如果要定時1s就可以讓定時器中斷1000ms/50ms=20次。
另外一點,TH0和TL0中應該裝入的總數是15536,然後把15536對256求模:15536/256=60裝入TH0中,把15536對256求余:15536%256=176裝入TL0中,因為這是兩個八位28*28的容器。那麼為什麼要介入256呢?其實並不難理解,做一下10——16進制的換算就知道了,256(D)=0100(H),這里01就是高8位的數據,00就是低8位的數據,通俗點說,15536(D)里有多少個256,就相當於高8位有多少數值,就是除的關系了,商存入高8位寄存器後餘下的數存入低8位即可.所以就有了:
TH0=(65535-50000)/256
TL0=(65535-50000)%256
如果是直接賦值TH=B8;TL=00,是編程者算過後填寫進去的:
TH0=0xB8;
TL0=0x00;
具體是如何計算的呢?
65536-x=B800(16進制)= 47104(D)

x= 18432us=18.43ms=0.018s
(以上根據2位很厲害很厲害大師的帖子匯總出來的)

『伍』 單片機C語言實現紅外脈沖計數計算車速

以51單片機 12MHz晶振情況下為例

#define STAYTIME 781//定時200ms 其他時間可以自己算
int tcount,p_count;
double speed;
void t0_init(void)
{
TH0=0x00;
TL0=0x00;
TMOD|=0x02;
ET0=1;
TR0=1;
IT0=1;//外部中斷下降沿觸發
EX0=1;
}
void pulse_int(void) interrupt 0
{
p_count++;
}
void t0_int(void) interrupt 1
{
tcount++;
if(tcount>STAYTIME){
tcount=0;
EX0=0;//關輸入脈沖的中斷
ET0=0;
speed=p_count/20;//單位就是 轉/秒
//下面重新開始
p_count=0;
ET0=1;
EX0=1;
}
}
}
void main()
{
t0_init();
EA=1;
while(1);

}

閱讀全文

與c語言單片機t0計數值相關的資料

熱點內容
玩子君手作解壓丸子 瀏覽:250
php上傳php文件出錯 瀏覽:685
群暉盤陣建ftp子文件夾 瀏覽:542
天空都市伺服器地址 瀏覽:431
c游戲編程入門教程pdf 瀏覽:670
php框架安全 瀏覽:715
夢里和程序員談戀愛 瀏覽:173
特價伺服器什麼意思 瀏覽:379
程序員交接不想接怎麼辦 瀏覽:873
vb文件夾怎麼選擇 瀏覽:118
公眾號驗證碼登陸源碼 瀏覽:524
居民樓用電量與電纜演算法 瀏覽:357
安裝mysql步驟linux 瀏覽:192
模擬器開app卡頓是怎麼回事 瀏覽:432
安卓手機如何將應用安裝到sd卡 瀏覽:1002
調取命令符 瀏覽:720
核酸檢測報告怎麼能加密 瀏覽:96
單片機燒錄是什麼意思 瀏覽:454
phpmysqlmysqlnd 瀏覽:539
php獲取伺服器端ip 瀏覽:429