定時(shí)器溢出中斷:
象州網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
#includereg51.h
void timer0(void); //函數(shù)聲明
void main()
{
P1^1 = 0;
TMOD = 0x01; //定時(shí)模式
THO = 0xEE;
TL0 = 0xFF; //定時(shí)時(shí)間
ET0 = 1; //中斷允許
EA = 1; //總中斷使能
TR0 = 1; //開始計(jì)時(shí)
while(1); //等待中斷
}
void timer0(void) interrupt 1 using 0 //定時(shí)器0溢出中斷
{
TR0 = 0; //停止計(jì)時(shí)
P1^1 = ~P1^1; //取反輸出
THO = 0xEE;
TL0 = 0xFF; //重載定時(shí)時(shí)間
TR0 = 1; //開始計(jì)時(shí)
}
外部中斷:
#includereg51.h
void it0(void)
void main()
{
P^1.1 = 0;
IT0 = 0; //觸發(fā)方式
EX0 =1; //中斷允許
EA = 1; //中斷使能
while(1); //等待中斷
}
void it0(void) interrupt 0 using 1 //外部中斷0中斷處理程序
{
P1^1 = ~P1^1; //取反輸出
}
串口中斷:
#includereg51.h
void suart(void);
void main()
{
P1 = 0xAA;
TMOD = 0x20; //設(shè)置定時(shí)器1為自動(dòng)重載模式,作為波特率發(fā)生器
TH1 = 0xXX; //由波特率計(jì)算出來(lái)的定時(shí)值
TL1 = 0xXX; //
SCON = 0x50; //串口模式
ES = 1; //開放串口中斷
EA = 1; //總中斷使能
TR1 = 1; //
while(1) //等待中斷
{
if(XXXX)
{
SBUF = 0xAA; //發(fā)送
}
}
}
void suart(void) interrupt 4 using 0
{
if(RI) //接受完臂
{
XXXXX;
}
if(TI) //發(fā)送完畢
{
XXXXX;
}
}
中斷矢量程序入口: void 函數(shù)名(形參) interrupt 中斷矢量 [using 寄存器]
形式如下:
void 中斷名(void) inerrupt 中斷號(hào) using 工作寄存器組
比如外部中斷0
void ext0(void) interrupt 0 using 1 //后面的using 1可以省略,缺省為0
定時(shí)器1
void t1isr() interrupt 3
擴(kuò)展資料:
單片機(jī)內(nèi)部結(jié)構(gòu)
1、CPU
它的名字沒(méi)有改,還是稱為CPU(Central Processing Unit)。它是單片機(jī)的核心部件,包括運(yùn)算器和控制器。
運(yùn)算器既是算術(shù)邏輯單元ALU(Arithmetic logic Unit),其功能是進(jìn)行算術(shù)運(yùn)算和邏輯運(yùn)算。
控制器一般由指令寄存器、指令譯碼器、時(shí)序電路和控制電路組成。其作用是完成取指令、將指令譯碼形成各種微操作并執(zhí)行指令,同時(shí)控制計(jì)算機(jī)的各個(gè)部件有條不紊地工作。
2、單片機(jī)內(nèi)部結(jié)構(gòu)之一ROM
“硬盤”,改了名字,稱為程序存儲(chǔ)器,也叫只讀存儲(chǔ)器。用ROM(Read only memery)表示。其作用和計(jì)算機(jī)的硬盤差不多,用來(lái)存放用戶編寫的程序。特點(diǎn)是:掉電后不會(huì)丟失數(shù)據(jù)(程序)。
給你上個(gè)較完整的程序,可以直接在KEIL中運(yùn)行并觀察輸出
/******************************************************************************
功能:
本程序在12M晶振模式下,通過(guò)定時(shí)器中斷精確實(shí)現(xiàn)數(shù)字時(shí)鐘計(jì)時(shí)操作,并在KEIL
中實(shí)現(xiàn)輸出。時(shí)、分、秒的變化在定時(shí)中斷里處理。
說(shuō)明:
因采用工作方式2,自動(dòng)裝入初值,所以此程序計(jì)時(shí)很精確,只是在KEIL中模擬輸
出顯示的變化速度很快,這點(diǎn)可不理會(huì)
******************************************************************************/
#include
#include
#define
TEST
//此行用于KEIL輸出顯示,如果不需要顯示可將其刪除
typedef
unsigned
char
uchar;
typedef
unsigned
int
uint;
#define
TH0TL0_INIT
(256-250)
//定時(shí)器8位自動(dòng)裝入模式下寄存器初值,0.25ms中斷一次
char
cHour;
//時(shí)
char
cMin;
//分
char
cSec;
//秒
uint
iCount;
//秒計(jì)數(shù),計(jì)數(shù)達(dá)到4000時(shí)1s,4000*0.25ms
=1000ms
=
1s
bit
bSecChanged;
//秒發(fā)生變化標(biāo)志,每秒送一次輸出顯示,送顯完成后清0,提高主程序效率
//==============================================================================
//T0定時(shí)器中斷服務(wù)程序,12M晶振下每0.25ms產(chǎn)生中斷,本程序執(zhí)行一次
//==============================================================================
void
Timer0()
interrupt
1
{
iCount++;
//秒計(jì)數(shù)值+1
if(iCount==4000)
{//時(shí)間計(jì)數(shù)達(dá)到1S
iCount
=
0;
//重新開始下一秒計(jì)數(shù)
cSec++;
//時(shí)鐘:秒+1
bSecChanged
=
1;
//置秒發(fā)生變化標(biāo)志
if(cSec==60)
{//計(jì)夠60s
cSec
=
0;
//重新開始下一分計(jì)數(shù)
cMin++;
//時(shí)鐘:分+1
}
if(cMin==60)
{//計(jì)夠60分鐘
cMin
=
0;
//重新開始下一小時(shí)計(jì)數(shù)
cHour++;
//時(shí)鐘:小時(shí)+1
}
if(cHour==24)
{//計(jì)夠24小時(shí)
cHour
=
0;
//重新開始第二天計(jì)數(shù)
}
}
}
//==============================================================================
//主程序
//==============================================================================
void
main()
{
uchar
outstr[10];
//輸出字符串,我的編譯器可能有問(wèn)題,直接輸出有錯(cuò)
TMOD
=
0X02;//工作方式2,8位自動(dòng)重裝計(jì)時(shí)模式
TH0
=
TH0TL0_INIT;
//0.25ms中斷一次
TL0
=
TH0TL0_INIT;
//0.25ms中斷一次
#ifdef
TEST
SCON
=
0x50;
/*
SCON:
mode
1,
8-bit
UART,
enable
rcvr
*/
TMOD
|=
0x20;
/*
TMOD:
timer
1,
mode
2,
8-bit
reload
*/
TH1
=
221;
/*
TH1:
reload
value
for
1200
baud
@
16MHz
*/
TR1
=
1;
/*
TR1:
timer
1
run
*/
TI
=
1;
/*
TI:
set
TI
to
send
first
char
of
UART
*/
#endif
cHour
=
0;
//時(shí)
cMin
=
0;
//分
cSec
=
0;
//秒
iCount
=
0;
//秒計(jì)數(shù)
bSecChanged
=
0;
outstr[2]
=
':';
//時(shí)分分隔符
outstr[5]
=
':';
//分秒分隔符
outstr[8]
=
0;
//字符串結(jié)束符
EA=1;
//開總中斷
ET0=1;
//允許T0中斷
TR0=1;
//啟動(dòng)T0
while(1)
{
if(bSecChanged==1)
{//秒發(fā)生變化,將時(shí)間值轉(zhuǎn)換為可顯示字符串準(zhǔn)備送顯示
bSecChanged
=
0;//清除標(biāo)志,節(jié)省CPU資源
outstr[0]
=
cHour/10
+
0x30;
//將秒轉(zhuǎn)換為ASCII碼
outstr[1]
=
cHour%10
+
0x30;
outstr[3]
=
cMin/10
+
0x30;
//將分轉(zhuǎn)換為ASCII碼
outstr[4]
=
cMin%10
+
0x30;
outstr[6]
=
cSec/10
+
0x30;
//將小時(shí)轉(zhuǎn)換為ASCII碼
outstr[7]
=
cSec%10
+
0x30;
#ifdef
TEST
printf("
%s\r",outstr);
//在KEIL中顯示時(shí)鐘
#endif
}
}
}