51單片機各中斷初始化及子程式模板
/************************************************************
*51單片機各中斷初始化及子程式模板,幾乎包括了傳統51單片機的全部中斷
*
*2、定時器中斷0
*3、外部中斷1
*4、定時器中斷1
*5、串列中斷
*6、定時器中斷2---本中斷在52時才有
*以上所有中斷已經在keil軟體環境上經過測試,工作正常
*在使用定時中斷的時候需要根據實際需要重設定時器的初值和工作方式
*在串列通訊中,使用11.0592M晶振,通訊波特率為9600bps
*為了保證檔案的單一和方便保存,本項目只用了一個檔案,
沒有進行模組化處理,在實際套用中不建議這樣做
*本程式在UE11.00b下編輯,在KeilV3.23(C8.01)下編譯調試
*本程式僅供初學者參考使用,細節問題未涉及,在實際項目中請謹慎使用
*Author:大靈通
*昌寧科技,歡迎您提出寶貴意見!
*2006-12-7 15:05,OK!
*************************************************************/
#include //如果是使用51單片機,則應該是reg51.h,
//且不能使用定時器2
#include//以下兩個包含檔案在本代碼中實際不需要,
#include//但經常用到,所以列出
#define uchar unsigned char
#define uint unsigned int
#define TimeDelay 2
//程式所用變數聲明
bit Time0Int;
bit Int0Flag,Int1Flag;
uchar Time0Count,Time1Count,Time2Count;
uchar ReceiveData;
//程式所用函式聲明
void McuInitial(void);
void InitialTime0(void);
void InitialTime1(void);
void InitialTime2(void);
void IntialSerialComm(void);
void SerialSend(uchar SendData);
void delay(uint n);
/************************************************************
*Function: 主函式
*parameter:
*Return:
*Modify:
*************************************************************/
void main(void)
{
uchar i;
McuInitial();
delay(TimeDelay);
while(1)
{
if(1==Int0Flag)//各中斷的具體處理
{
Int0Flag = 0;
}
if(1==Int1Flag)
{
Int1Flag = 0;
}
if(5==Time0Count)
{
Time0Count = 0;
}
if(5==Time1Count)
{
Time1Count = 0;
}
if(5==Time2Count)
{
Time2Count = 0;
}
SerialSend(i);
i++;
if(i>=0xff)
i=0;
}
}
/************************************************************
*Function: 單片機初始化處理
*parameter:
*Return:
*Modify:
*************************************************************/
void McuInitial(void)
{
//外部中斷0初始化
IT0 = 1;
EX0 = 1;
//外部中斷1初始化
IT1 = 1;
EX1 = 1;
InitialTime0();//定時器0初始化
// InitialTime1();//定時器1初始化
InitialTime2();//定時器2初始化
IntialSerialComm();//串列中斷初始化,占用定時器1,
//如果用串列中斷,定時器1不能用於定時
EA = 1;//打開中斷
}
/************************************************************
*Function: 定時器1初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void InitialTime0 (void) //定時器0初始化
{
TMOD |= 0x01;//16位定時器
TH0 = 0x06;//8ms
TL0 = 0xed;
ET0 = 1;//使能中斷
TR0 = 1;//打開定時器
}
/************************************************************
*Function: 定時器1初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void InitialTime1 (void) //定時器1初始化
{
TMOD |= 0x10;//16位定時器
TH1 = 0x06;//8ms
TL1 = 0xed;
ET1 = 1;//使能中斷
TR1 = 1;//打開定時器
}
/************************************************************
*Function: 定時器2初始化,本中斷僅在52時才有
*parameter:
*Return:
*Modify:
*************************************************************/
void InitialTime2 (void)
{
T2CON=0x04;
RCAP2H=0x04;
RCAP2L=0x00;
ET2 = 1;
}
/************************************************************
*Function: 串列中斷初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void IntialSerialComm(void)// 串列中斷初始化
{
TMOD |= 0x20;
SCon=0xf0;
TH1=0xfd;//fd
TL1=0xfd;//fd
TR1=1;
ES=1;
}
/************************************************************
*Function: 外部中斷0中斷服務子程式
*parameter:
*Return:
*Modify:
*************************************************************/
void Interrupt0 (void) interrupt 0//外部中斷0中斷服務子程式
{
Int0Flag = 1;
}
/************************************************************
*Function: 外部中斷1中斷服務子程式
*parameter:
*Return:
*Modify:
*************************************************************/
void Interrupt1 (void) interrupt 2//外部中斷1中斷服務子程式
{
Int1Flag = 1;
}
/************************************************************
*Function: 定時器0中斷服務子程式
*parameter:
*Return:
*Modify:
*************************************************************/
void InterruptTime0(void) interrupt 1 //定時器0中斷服務子程式
{
TH0 = 0x06;//8ms
TL0 = 0xed;
Time0Count++;
}
/************************************************************
*Function: 定時器1中斷服務子程式
*parameter:
*Return:
*Modify:
*************************************************************/
void InterruptTime1(void) interrupt 3 //定時器1中斷服務子程式
{
TH1 = 0x06;//8ms
TL1 = 0xed;
Time1Count++;
}
/************************************************************
*Function: 定時器2中斷服務子程式
*parameter:
*Return:
*Modify:
*************************************************************/
void InterruptTime2(void) interrupt 5 //定時器2中斷服務子程式
{
TF2=0;
Time2Count++;
}
/************************************************************
*Function: 串列接收中斷服務子程式
*parameter:
*Return:
*Modify:
*************************************************************/
void InterruptSerialComm(void) interrupt 4//串列接收中斷服務子程式
{
if(RI)
{
RI = 0;
ReceiveData = SBUF;
}
}
/************************************************************
*Function: 串列傳送程式
*parameter:
*Return:
*Modify:
*************************************************************/
void SerialSend(uchar SendData)// 串列傳送程式
{
SBUF = SendData;
while(TI==0);
TI = 0;
}
/************************************************************
*Function: 延時
*parameter:
*Return:
*Modify:
*************************************************************/
void delay(uint n)// 延時
{
while(n!=0)
{
n--;
}
}