當前位置:首頁 » 編程語言 » 單片機定時器實驗c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

單片機定時器實驗c語言

發布時間: 2022-01-13 09:42:57

㈠ 單片機定時器中斷實驗 程序(匯編語言)不要c語言

;假定晶振頻率12M
;假定P1口對應接8個LED,且高電平有效
;MCU:8051系列

CONT_DISP EQU 30H ;定義查表的計數變數,用於8個LED燈的顯示狀態
CONT_INT EQU 31H ;定義中斷間隔的計數變數,用於控制20個中斷為1秒的時間間隔

ORG 00H
AJMP GO
ORG 0BH
AJMP INT0_1 ;定時器0,工作方式1

GO:
MOV SP,#60H
MOV P1,#00H ;P1口初始全部關閉
MOV CONT_DISP,#8 ;查表取LED點亮狀態,注意此處為了減少變數,查表採用從尾到首的順序,所以初始值為表末位數
MOV TMOD,#01H ;定時器工作方式1
MOV TH0,#0BH
MOV TL0,#3CH ;計數器初始設定,中斷間隔為50ms
SETB TR0
SETB ET0
SETB EA ;計數器開始工作
LOOP: ;以下幾句為不斷為P1口送值,點亮相應的LED
MOV A,CONT_DISP
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
AJMP LOOP
;----------------以下為中斷處理程序---------------
INT0_1:
PUSH ACC ;保護現場
MOV TH0,#0BH
MOV TL0,#3CH ;定時器初值重裝
DJNZ CONT_INT,RETINT
MOV CONT_INT,#20 ;20個中斷判定
DJNZ CONT_DISP,RETINT ;每20個中斷,即1秒,查表數減1
MOV CONT_DISP,#8 ;到1再循環
RETINT:
POP ACC
RETI

TAB:
NOP
DB 00H,0FFH,0AAH,55H,0A0H,50H,0AH,05H ;注意此表為從尾倒查式, 上面一句NOP不可少.

END

㈡ 單片機定時器控制電子門鈴c語言程序

圖中那示波器的接法有什麼用?應該是監測P2.0口和P2.3口吧。
編程如下:
#include <reg52.h> //52系列頭文件
#define uchar unsigned char //變數類型宏定義
#define uint unsigned int

sbit Key = P2^0; //按鍵位聲明
sbit Bell = P2^3; //門鈴位聲明
uint p; //中斷次數變數

void main() //主程序
{
TMOD = 0x00; //設置T0工作於方式0
TH0 = (8192-700)/32; //T0計數器裝入定時700us初值
TL0 = (8192-700)%32;
IE = 0x82; //開總中斷,開T0中斷

if(Key==0) //如果鍵被按下
{
TR0 = 1; //啟動T0定時器計時
}
while(Key==0); //等待按鍵松開
}

void Timer0() interrupt 1 //T0中斷服務子程序
{
Bell = ~Bell; //每次中斷發生時,門鈴狀態取反
p++; //中斷計次值加1
if(p<=400) //如果中斷<=400次,
{
TH0 = (8192-700)/32; //重裝700us定時初值
TL0 = (8192-700)%32;
}
if(p>400) //如果中斷次數>400
{
TH0 = (8192-1000)/32; //則重裝定時 1ms 初值
TL0 = (8192-1000)%32;
if(p==1000) //如果中斷次數 =800次
{
P = 0; //中斷計數值歸0
TR0 = 0; //關閉T0定時器
}
}
}
操作說明:每當按下並保持,響鈴一聲。松開後再按,即重復上述狀態。

㈢ 求單片機定時器簡單程序(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語言)

可以找個教程看看,實現這個應該不會太難吧!

㈥ 單片機定時器C語言

//定時器中斷初始化
void init()
{
TMOD=0x02;//方式2
TH0=6;
TL0=6;
EA=1;
ET0=1;
TR0=1;
}
//中斷函數
void time() interrupt 1
{
t++;
if(t==3686) //1s到了
m++,t=0;//m=2就是兩秒了
}
1秒鍾t就要加到3686,0.1秒t要加到多少,根據比例就算得出了,其他的也一樣。時間算得出,然後在這段時間內做什麼就很簡單了。

㈦ 關於單片機定時器C語言編程,這段程序看不懂

因為每個CLK後TL0是向上加1的,並且在FFFF變成0000的時候才中斷,所以正式的寫法應該是(0x10000-SYSCLK)/1000,而對於一個兩位元組寬的數,0x10000-SYSCLK就等於~SYSCLK,但~SYSCLK更省代碼和時間

㈧ 單片機定時器的設計,C語言或匯編語言

可以設計,使用Proteus模擬,

㈨ 單片機定時器中斷程序,C語言程序設計

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar keyval;
uchar led1=0xfe,led2=0x55,led3=0x0f;
sbit key=P1^0;
void t0isr() interrupt 1
{
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
switch(keyval)
{
case 1:
P0=led1;
led1=_crol_(led1,1)
break;
case 2:
P0=led2;
led2=~led2;
break;
case 3:
P0=led3;
led3=~led3;
break;
default:break;
}
}
main()
{
TMOD=0x01;
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(key==0)
{
while(key==0);
keyval++;
keyval%=4;
}
}
}

㈩ 單片機定時器應用實驗

完全一樣的題目呀,真幸運,看我的吧(我的是8052的,沒關系的):

匯編程序:

S1EQU30H

S2EQU31H

ORG0000H

AJMPMAIN

ORG001BH

AJMPINTT1

ORG0100H

MAIN:ANLTMOD,#0FH

ORLTMOD,#10H

MOVTH1,#3CH

MOVTL1,#0B0H

SETBEA

SETBET1

SETBTR1

MOVDPTR,#TABLE

MOVS1,#00H

MOVS2,#00H

LP:MOVA,S2

MOVCA,@A+DPTR

MOVP1,A

AJMPLP

INTT1:PUSHACC

INCS1

MOVA,S1

CJNEA,#20,NEXTT1

MOVS1,#00H

INCS2

ANLS2,#07H

NEXTT1:POPACC

RETI

TABLE:DB05H,0AH,50H,0A0H,55H,0AAH,0FFH,00H

C語言程序:

#include<reg52.h>

unsignedchars1=0,s2=0;

unsignedcharcodetable[]=

{

0x05,0x0A,0x50,0xA0,0x55,0xAA,0xFF,0x00

};

voidmain()

{

TMOD=(TMOD&0X0F)|0X10;

TH1=0X3C;

TL1=0XB0;

EA=1;

ET1=1;

TR1=1;

while(1)

{

P1=table[s2];

}

}

voidt1(void)interrupt3using0

{

s1++;

if(s1==20)

{

s1=0;

s2++;

s2=s2&0x07;

}

}