綜合知識

當前位置 /首頁/綜合知識 > /列表

單片機定時器編程怎麼使用,單片機定時器怎麼用

1.單片機定時器編程怎麼使用

#include <reg52.h>

單片機定時器怎麼用 單片機定時器編程怎麼使用

#define uchar unsigned char //類型重定義

#define uint unsigned int

#define ulong unsigned long //類型重定義

sbit led=P0^0;

sbit K_1= P2^0; //按鍵

ulong num;

void delay(uint xms) //ms級延時子程序

{ uint x,y;

for(x=xms;x>0;x--)

for(y=130;y>0;y--);}

//=================================================

void main()

{

led=1; //上電初始化,led燈不亮

delay(100);

TMOD=0x01; //設定定時器0為工作方式1

TH0=(65536-50000)/256; //裝載初始值,12MHZ晶振50ms數為50000

TL0=(65536-50000)%256; //

(開啟總中斷允許);

(開啟定時器中斷允許);

while(1)

{

if(K_1==0)

{

while(K_1==0);

TR0=1; //啟動定時器0 */

led=0; //按鍵1按下時燈亮

}

if(num==200)

{num=0;

(關閉定時器0);

led=1; //200*50ms後燈滅

}

}

void interrupt_timer0(void) interrupt 1

{

(關閉T0中斷);

TH0=(65536-50000)/256; //裝載初始值,12MHZ晶振50ms數為50000

TL0=(65536-50000)%256; //

num++;

(開啟T0中斷);

}

PS:自己把小括號裏面的東西加上吧。我忘記是什麼了,

2.單片機定時器計數器如何使用

使用12MHz晶振,其機器週期為1us

欲產生5000us週期方波,只需在p1.0以2500us時間交替輸出高低電平

1.T0為方式0,則M1M0=00H。使用定時功能,C/T=0,GATE=0。T1不用,其有關位設為0。因此,TMOD=00H

2.方式0為13長度計數(TL0高3位不使用),設計數初值為X,則(8192-X)*1us=2500us,得X=5692D。X=1011000111100B。因為TL0高3位不用,所以10110001-00011100B得TH0=B1H,TL0=1CH

3.由控制寄存器TCON的TR0位來控制定時的啟動和停止,TR0=1啟動,TR0=0停止

C語言程序如下(編譯器Keil C)

#include<REG51.H>

sbit FB=p1^0;

void initial(void)

{

TMOD=0x00;

TH0=0xb1;

TL0=0x1c;

IE=0x00;

TR0=1;

}

void main(void)

{

initial();

for(;;)

{

while(!TF0);

TF0=0;

FB=!FB;

}

}

彙編程序如下

ORG 0000H

AJMP START

ORG 30H

START: MOV P1.0,#0FFH

MOV TMOD,#00H

MOV TH0,#0B1H

MOV TL0,#1CH

SETB TR0

LOOP: JBC TF0,NEXT

LJMP LOOP

NEXT: CPL P1.0

MOV TH0,#0B1H

MOV TL0,#1CH

LJMP LOOP

END

3.51單片機的3個定時器怎樣使用

51單片機只有T0,T1。52才有T2的。

定時器設置方法:

做定時用一般採用16位模式,也就是TMOD=0x11(10或01單獨一個定時器的話),初值的計算是這樣的:

1. 假設時間是X毫秒,晶振為YMhz,那麼:

THn=(65536-1000*X*Y/12)/256

TLn=(65536-1000*X*Y/12)%256

2. 之後就是TRn=1(開啟定時器)

ETn=1(開啟定時器中斷)

EA=1

4.單片機

樓主的程序並無大錯,稍加修改即可正常運行。

下列程序已經實現了“(響4次/秒和響1次/秒),用定時器1控制發聲時間(3秒)”。

//==========================

#include

sbit FM = P1^3; //FM是蜂鳴器.

unsigned char i, j, count;

int k;

//------------------------------------------

void main()

{

TMOD = 0x11; //把定時器0和1都設置為16位.

TH0 = (65536 - 50000) / 256;

TL0 = (65536 - 50000) % 256; //50000代表50毫秒.

TH1 = (65536 - 50000) / 256;

TL1 = (65536 - 50000) % 256; //50000代表50毫秒.

TR0 = 1; //啟動定時器0

TR1 = 1; //啟動定時器1

ET0 = 1; //打開中斷T0

ET1 = 1; //打開中斷T1

EA = 1; //打開總中斷.

i = 0;

j = 0;

k = 1;

count = 5;

while(1);

}

//------------------------------------------

void timer0() interrupt 1 //中斷1函數,使用定時器0

{

TH0 = (65536 - 50000) / 256;

TL0 = (65536 - 50000) % 256; //50000代表50毫秒.

j++;

if(j >= (count / 2)) FM = 0;//打開蜂鳴器.

else FM = 1;//關閉蜂鳴器.

//count由定時器1控制;

//count=5表示蜂鳴器每秒響4次,count=20表示每秒響1次.

if(j >= count) j = 0;

}

//------------------------------------------

void timer1() interrupt 3 //中斷3函數,使用定時器1

{

TH1 = (65536 - 50000) / 256;

TL1 = (65536 - 50000) % 256; //50000代表50毫秒.

i++;

if(i == 60) { //60表示60x50毫秒=3秒.

i = 0;

k--;

if(k == 0) k = 2;

switch(k) {

case 1: count = 5; break; //把count=5賦給中斷函數1中,讓蜂鳴器每秒響4次.

case 2: count = 20; //把count=20賦給中斷函數1中,讓蜂鳴器每秒響1次.

}

}

}

//------------------------------------------

看網友的熱心回答,水平參差不齊,嘲諷帥哥學童的回答確實別開生面,如此多的錯誤觀點也敢亮出來,呵呵,叫人駁不勝駁!

請教一下:

----

2.千萬不要

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

這樣定義,因為做(65536-50000)/256;這個運算,很佔用機械週期,要知道,減法用1個機器週期,。。工作週期至少多了20個,。

----

説説看,究竟是多少個?

你要是調試過程序,就會知道,“至少多了20個”究竟是多少個。

你要是調試過程序,就會知道,這個運算是否是由單片機進行的。

看來,這位學童還沒有接觸過單片機。

5.單片機 定時器程序中怎麼用

#include <reg52.h>

unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};

unsigned char num,cont;

void Init_Timer0(void)

{

TMOD = 0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA = 1;

ET0 = 1;

TR0 = 1;

}

void main(void)

{

unsigned char i;

P1=tab[i];

Init_Timer0();

num=0;

cont=0;

while(1);

}

void Timer0_isr(void) interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

cont++;

if(cont>20)

{

cont=0;

P1=tab[num];

num++;

num%=10;

}

}

6.如何用單片機定時

用單片機本身的定時來做電子錶,現在有很多時鐘芯片,與單片機接口也很簡單,它有專門的外部晶振,而且在時間精確是,是絕對準確的。只要能夠按照時序與它產生通訊,就可以達到時間的精確。

畢竟,單片機本身不是專讓用來做時鐘的,而專門的時鐘芯片才會有此條件。

定時器其實就是單片機的一個內部自身時鐘的計數器,每一個週期計數器加1,所以使用定時器功能時候先要給定時器付初值,就是先寫TH0TL0的值,寫完初值後就等着定時器功能的那個計數器記滿了數後也就是到了65536後就溢出了。

所以一次定時的過程就是65536-初值 之間的數 所代表的時鐘週期,計數滿了溢出要產生中斷就要寫一箇中斷服務子程序;

參考如下:

void main()

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;//定時器0初值,定時50ms 定時多少MS就多少*1000

EA=1;//開啟總中斷

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

TR0=1;//開啟定時器0

while(1)

{

}

}

void timer0() interrrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

7.51單片機的定時器是怎麼設置的

單片機定時器的設置步驟為:

1、設置定時器的工作模式,共4種工作方式,兩種模式(計數器/定時器)。比如:

MOV TMOD,#01;設置定時器0位定時器模式,工作方式1

2、根據定時時間賦初值。比如定時10毫秒,那麼如果12M晶振的話是10000個機器週期。定時器是溢出申請中斷,所以用溢出值減去定時週期為初值。

MOV TH0,#HIGH(65536-10000)

MOV TL0,#LOW(65536-10000)

3、開啟中斷、定時器。

SETB ET0

SETB EA

SETB TR0

8.怎麼利用單片機定時器實現定時的編程過程

定時器其實就是單片機的一個內部自身時鐘的計數器,每一個週期計數器加1,所以使用定時器功能時候先要給定時器付初值,就是先寫TH0TL0的值(如下),寫完初值後就等着定時器功能的那個計數器記滿了數後也就是到了65536後就溢出了,所以一次定時的過程就是65536-初值 之間的數 所代表的時鐘週期,計數滿了溢出要產生中斷就要寫一箇中斷服務子程序,子程序如下void timer0() interrrupt X 中斷服務子程序中還要給定時器計數器的TH TL付初值 進行下一次的計數,明白了吧。。樓上的那個沒寫interrupt 選擇定時器工作方式。哎呀,媽呀 累死我了

void main()

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;//定時器0初值,定時50ms 定時多少MS就多少*1000

EA=1;//開啟總中斷

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

TR0=1;//開啟定時器0

while(1)

{

}

}

void timer0() interrrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

TAG標籤:定時器 單片機 編程 #