當前位置:首頁 » 編程語言 » c語言單片機定時器

c語言單片機定時器

發布時間: 2022-07-07 04:32:29

⑴ 單片機的定時器c語言編程中:TH0與TL0為什麼是TH0=(65536-50000)/256;TL0=(65536-50000)%256

1、首先第一步要定時器0設置於模式1時,然後由高8位TH0和低8位TL0兩個8位寄存器組成,注意的是當設定計算值為65536-50000=15536(D)時,轉換為十六進制就是3CB0(H),此時,TH0=3C,TL0=B0分別裝入就可以了。

⑵ 單片機C語言定時器如何調用

單片機中通過中斷的方式來調用定時器。


具體的調用方式可以參考通過如下程序:

程序功能:利用定時器進行定時,實現每秒中led閃爍一次

#include<reg52.h>
sbitled=P0^0;
unsignedintnum;
voidmain(void)
{
TMOD=0x00;//工作方式0
TH0=(8192-5000)/32;//12M晶振下定時5ms
TL0=(8192-5000)%32;
EA=1; //開總中斷
ET0=1; //開定時器中斷
TR0=1; //啟動定時器
while(1)
{
if(num==200) //定時1秒鍾到
{
num=0; //計數器清零
led=~led; //led燈取反,實現1秒閃爍一次
}
}
}

voidtimer()interrupt1//定時器1工作與方式0
{
TH0=(8192-5000)/32;//重裝初值
TL0=(8192-5000)%32;
num++; //計數器加1

}

⑶ 單片機C語言用定時器1工作方式1怎麼寫

#include<reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uinti,num;
voidmain()
{
i=0;
num=0;
TMOD=0x10;//設置定時器1為工作方式1【查看TMOD每一位的含義,你就知道怎麼設置了】
EA=1;//開總中斷
ET1=1;//開定時器1中斷
TR1=1;//啟動定時器0
TH0=(65536-50000)/256;//定時器0計數初值高位
TL0=(65536-50000)%256;//定時器0計數初值低位
P2=0xFE;
P0=0xc0;
while(1)
{
if(i==10)
{
P2=0xff;
}
if(i==20)
{
i=0;
P2=0xfe;
num++;
if(num==10)num=0;
P0=table[num];
}
}
}
voidtime()interrupt1
{
TH0=(65536-50000)/256;//計數初值重載
TL0=(65536-50000)%256;
i++;
}

⑷ 單片機c語言里怎麼用2個定時器

是51單片機嗎?
如果是51單片機,你可以使用tmod設置兩個定時器,然後使用tr0、tr1分別啟動兩個定時器。pt0置為「1」,就可以中斷定時器1的服務函數,相反,如果pt1置為「1」就可以中斷定時器0的服務函數。
如果不設置pt的值,默認為「0」,這樣的話,t0和t1誰也不能中斷誰。

⑸ 求單片機定時器簡單程序(C語言)詳解。不勝感激~

用定時器0中斷做流水燈,程序如下:#include<reg52.h>#include<intrins.h> //包含_crol_()循環左移函數
unsigned char temp,count;void init() //初始化函數{ TMOD=0x01;//設置定時器0為工作方式1 TH0=(65536-50000)/256;//裝初值,高8位 TL0=(65536-50000)%256;//裝初值,低8位 EA=1;//開總中斷 ET0=1;//開定時器0中斷 TR0=1;//啟動定時器0 temp=0xfe; count=0;//記數值清0}void main(){ init(); while(1){ P1=temp;}}void timer0() interrupt 1 using 1 //定時器0中斷函數{ TH0=(65536-50000)/256;//重裝初值,同上 TL0=(65536-50000)%256; count++;//計數值加1 if(count==10)//500ms{ count=0;//計數值清0 temp=_crol_(temp,1);循環左移一位}

⑹ 請問單片機C語言定時器程序怎麼寫

你看過匯編嗎?與匯編的格式是一樣的。具體就是先開中斷允許標志位(IE裡面對應的各個位)在設定TMOD工作方式。下一步就是設定初始值了(TH、TL)。設置完這些就可以開定時器了。寫中斷中段函數是是需要另加interrupt 加上一個常數(比如是定時器0就在後面加上1)。我用89S52晶元編過一個定時器程序你參考一下,希望對你有一點幫助。
//功能:感應外界溫度並用數碼管顯示
//時間:2005年6月20日
//設計人:
#include<reg52.h>
#define uchar unsigned char
sbit ad0809_oe=P1^0; //定義各個位
sbit ad0809_start=P1^1;
sbit ad0809_ale=P1^2;
sbit ls595_rclk=P1^3;
sbit ad0809_eoc=P1^5;
sbit ls595_oe=P1^4;
sbit ls595_ser=P3^0;
sbit ls595_srclr=P3^1;
uchar nn,mm;
uchar code tab[]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};
send(uchar); //聲明函數
AD(uchar);
void display(uchar);
void init();
//********普通口輸入數據*****************
send(uchar shu) //普通口串列輸入
{
unsigned char i,k;
k=0x01;
for(i=0;i<8;i++)
{
if(k==(k&shu)) //判斷每位上是否為1
ls595_ser=1;
else
ls595_ser=0;
k<<=1; //左移一位
ls595_srclr=0; //輸入一個上升沿講數送入595中
ls595_srclr=1;
}
}
//*****************595顯示子程序********************
void display(uchar )
{
uchar ge,shi,flge; //ge拆字後個位的存放處shi拆字後十位的存放處flge ℃的存放處
shi=tab[/10]; //拆字
send(shi); //給595送數
ge=tab[%10];
send(ge);
flge=0xb1;
send(flge);
ls595_rclk=0; //上升沿送出數據
ls595_rclk=1;
}
//*******************初始化程序********************
void init() //初始化AD、定時器
{
ad0809_start=0; //Start管教上升沿將AD內部寄存器清零
ad0809_start=1;
ad0809_ale=1; //ALE高電平選擇通道
nn=0;
mm=0;
TMOD=0x01; //定時器初始化
//IE=0x82;
EA=1;
ET0=1;
TCON=0x00;
TL0=(65536-50000)%256; //定時50ms
TH0=(65536-50000)/256;

}
AD(uchar wen)
{
// unsigned char tt=0;
// ad0809_ale=1; //選擇通道
ad0809_start=1;
ad0809_start=0; //start下降沿啟動轉換信號
while(ad0809_eoc==0); //判斷轉換是否結束
ad0809_oe=1; //轉換結束送出轉換數據
wen=P2;
return (wen);
}

//**************中斷服務程序*********************
void tiam0() interrupt 1 using 1 //中斷服務程序
{
TL0=(65536-50000)%256; //定時50ms
TH0=(65536-50000)/256;
nn++;
if(nn==10) //0.5秒M加一
{
mm++;
nn=0;
}
}

//****************主程序***************************
void main()
{
unsigned char bb,aa,cc; //bb=計算後得到溫度,aa=AD輸出數據
unsigned char wen; //wen存放轉換的得到的數據
init();
// wen=17;
ls595_oe=0;
cc=0;
TR0=1;
while(1)
{
aa=AD(wen);
// ad0809_oe=0;
aa=~aa;
bb=aa/4;
if(mm==2)
{
mm=0;
cc=bb;
}
display(cc); //調用顯示子程序

}
}

⑺ 單片機c語言 如何用定時器得到隨機數

keil
c中有生成
隨機數
的函數,可以直接調用。

⑻ 51單片機定時中斷C語言的寫法步驟,可追加分數

程序說明:51單片機定時器0工作於方式一,定時50ms中斷一次
晶振為12M
#include

void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
ET0
=
1;
//開定時器0中斷
EA
=
1;
//開總中斷
TR0
=
1;
//啟動定時器0
while(1)
{

}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
}
/***************************************************************************************************************/
上面是比較好理解的。如果實在要求簡潔的話,看下面的,跟上面功能一樣
#include

void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值
IE
=
0x82;//開總中斷並開定時器0中斷
TR0
=
1;
//啟動定時器0
while(1)
{

}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值}

⑼ 單片機c語言編程中關於定時器賦值的問題

程序是利用2種類型數據轉換的方式來賦值的,一般來講16位數賦給8位數時,高8位就被屏蔽掉,只賦值低8位給th0和th1。
程序中有點問題的,,其中TH1是放高8位地址所以應該放左移後的8位數,而TL1是放低8位地址,直接復制就可以,,不用&0xff,&了浪費了運行時間。
TH1=(0xffff-40000)>>8;
TL1=(0xffff-40000);
就可以了。

⑽ 求高手用C語言寫一下89C51單片機內部定時器中斷典型運用

說一下思路吧,使用兩個定時器(T0和T1),T0為P0.0的接的LED定時,T1為P0.1接LED定時,需要兩個變數led1_time和led2_time來計時(單位是秒),然後分別根據LED的狀態來判斷led1_time(或led2_time)需要計多少秒,按照你的要求,LED1(P0.0)亮時led1_time需要計時3秒,LED1滅時led1_time需要計時7200秒,即兩個小時,對於LED2(P0.1)也是一樣的道理。那麼,廢話說完了,接下來看代碼吧!!!

#include<reg51.h>

typedefunsignedcharuint8;
typedefunsignedintuint16;

sbitled1=P0^0;
sbitled2=P1^1;

staticuint16led1_time=0x00;
staticuint8led2_time=0x00;
staticuint8led1_a_second=0x00;
staticuint8led2_a_second=0x00;

#defineA_SECOND(0x14)/*定時50ms,20中斷得一秒鍾*/
#defineTH_VALUE(0x3c)/*定時器溢出值,高位*/
#defineTL_VALUE(0xb0)/*定時器溢出值,地位*/
#defineLED1_ON_TIME(0x03)/*LED1亮3秒*/
#defineLED2_ON_TIME(0x01)/*LED2亮1秒*/
#defineLED1_OFF_TIME(0x1c20)/*LED1滅7200秒,兩個小時*/
#defineLED2_OFF_TIME(0x02)/*LED2滅2秒*/

#defineLED_ON1/*高電平LED亮*/
#defineLED_OFF0/*低電平LED滅*/
/*
*初始化定時器函數
*/
staticvoidinit_time(void){

TMOD=0x11;/*使用T0、T1兩個定時器,均選擇模式1,定時模式*/
TH0=TH_VALUE;
TL0=TL_VALUE;
TH1=TH_VALUE;
TL1=TL_VALUE;
ET0=1;/*允許T0中斷*/
ET1=1;/*允許T1中斷*/
EA=1;/*打開總中斷*/
TR0=1;/*開啟定時器T0*/
TR1=1;/*開啟定時器T1*/
}

voidmain(void){

led1=LED_ON;/*上電點亮LED1、LED2*/
led2=LED_ON;

init_time();/*初始化定時器*/

while(1){
/*
*檢測LED1狀態,如果LED1處於亮的狀態,
*那麼3秒後熄滅LED1;如果LED1是滅的,
*那麼兩個小時後點亮LED1。
*/
if(led1==LED_ON){

if(led1_time>=LED1_ON_TIME){

led1_time=0x00;
led1=LED_OFF;
}
}elseif(led1==LED_OFF){

if(led1_time>=LED1_OFF_TIME){

led1_time=0x00;
led1=LED_ON;
}
}
/*
*檢測LED2狀態,如果LED2處於亮的狀態,
*那麼1秒後熄滅LED2;如果LED2是滅的,
*那麼2秒後點亮LED2。
*/
if(led2==LED_ON){

if(led2_time>=LED2_ON_TIME){

led2_time=0x00;
led2=LED_OFF;
}
}elseif(led2==LED_OFF){

if(led2_time>=LED2_OFF_TIME){

led2_time=0x00;
led2=LED_ON;
}
}
}

}
/*
*T0定時器中斷向量值為1,中斷地址為0x000b
*/
voidP0_0_timing(void)interrupt1{

TH0=TH_VALUE;
TL0=TL_VALUE;
/*
*如果計時滿1秒,則led1_time加一,
*led1_time的單位是秒。
*/
led1_a_second++;
if(led1_a_second>=A_SECOND){

led1_a_second=0x00;
led1_time++;
}
}
/*
*T1定時器中斷向量值為3,中斷地址為0x001b
*/
voidP0_1_timing(void)interrupt3{

TH1=TH_VALUE;
TL1=TL_VALUE;
/*
*如果計時滿1秒,則led2_time加一,
*led2_time的單位是秒。
*/
led2_a_second++;
if(led2_a_second>=A_SECOND){

led2_a_second=0x00;
led2_time++;
}
}

有用點一下採納,謝謝!

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:433
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:744
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:147
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:240
java駝峰 發布:2025-02-02 09:13:26 瀏覽:652
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726