单片机中断:51单片机中断应用(全)

/*****一直想把51的中断做一个总结,总是没有什么时间或被什么事给中断,现在终于弄好了^_^*****/
/*******最近一直做32位的,8位的都快忘记得差不多了,写在这里也好想用的时候有个地方查*******/
/************************************************************
*51单片机各中断初始化及子程序模板,几乎包括了传统51单片机的全部中断
*1、外部中断0
*2、定时器中断0
*3、外部中断1
*4、定时器中断1
*5、串行中断
*6、定时器中断2---本中断在52时才有
*在使用定时中断的时候需要根据实际需要重设定时器的初值和工作方式
*在串行通讯中,使用11.0592M晶振,通讯波特率为9600bps
*为了保证文件的单一和方便保存,本项目只用了一个文件,
*************************************************************/
#include<reg52.h>/*如果是使用51单片机,则应该是reg51.h,且不能使用定时器2*/
#include<intrins.h>/*以下两个包含文件在本代码中实际不需要,但经常用到,所以列出*/
#include<absacc.h>

typedef unsigned char uchar;
typedef unsigned int uint;
#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: 主函数
*************************************************************/
void main(void)
{
uchar i;
McuInitial();
delay(TimeDelay);
while(1)
{
if(Int0Flag==1)/*各中断的具体处理*/
{
Int0Flag = 0;
}
if(Int1Flag==1)
{
Int1Flag = 0;
}
if(Time0Count==5)
{
Time0Count = 0;
}
if(Time1Count==5)
{
Time1Count = 0;
}
if(Time2Count==5)
{
Time2Count = 0;
}
SerialSend(i++);
if(i>=0xff)
i=0;
}
}

/************************************************************
*Function: 单片机初始化处理
*************************************************************/
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: 定时器0初始化
*************************************************************/
void InitialTime0 (void)
{
TMOD |= 0x01;//16位定时器

TH0 = 0x06;//8ms
TL0 = 0xed;
ET0 = 1;//使能中断
TR0 = 1;//打开定时器
}

/************************************************************
*Function: 定时器1初始化
*************************************************************/
void InitialTime1 (void)
{
TMOD |= 0x10;//16位定时器

TH1 = 0x06;//8ms
TL1 = 0xed;
ET1 = 1;//使能中断
TR1 = 1;//打开定时器
}

/************************************************************
*Function: 定时器2初始化,本中断仅在52时才有
*************************************************************/
void InitialTime2 (void)
{
T2CON=0x04;
RCAP2H=0x04;
RCAP2L=0x00;
ET2 = 1;
}

/************************************************************
*Function: 串行中断初始化
*************************************************************/
void IntialSerialComm(void)
{
TMOD |= 0x20;
SCON=0xf0;
TH1=0xfd;//fd
TL1=0xfd;//fd
TR1=1;
ES=1;
}

/************************************************************
*Function: 外部中断0中断服务子程序
*************************************************************/
void Interrupt0 (void) interrupt 0
{
Int0Flag = 1;
}

/************************************************************
*Function: 外部中断1中断服务子程序
*************************************************************/
void Interrupt1 (void) interrupt 2
{
Int1Flag = 1;
}

/************************************************************
*Function: 定时器0中断服务子程序
*************************************************************/
void InterruptTime0(void) interrupt 1
{
TH0 = 0x06;//8ms
TL0 = 0xed;
Time0Count++;
}

/************************************************************
*Function: 定时器1中断服务子程序
*************************************************************/
void InterruptTime1(void) interrupt 3
{
TH1 = 0x06;//8ms
TL1 = 0xed;
Time1Count++;
}

/************************************************************
*Function: 定时器2中断服务子程序
*************************************************************/
void InterruptTime2(void) interrupt 5
{
TF2=0;
Time2Count++;
}

/************************************************************
*Function: 串行接收中断服务子程序
*************************************************************/
void InterruptSerialComm(void) interrupt 4
{
if(RI)
{
RI = 0;
ReceiveData = SBUF;
}
}

/************************************************************
*Function: 串行发送程序
*************************************************************/
void SerialSend(uchar SendData)
{
SBUF = SendData;
while(TI==0);
TI = 0;
}

/************************************************************
*Function: 延时
*************************************************************/
void delay(uint n)
{
while((n--)!=0);
}
Tags:  单片机的中断 单片机外部中断 单片机中断程序 单片机中断

延伸阅读

最新评论

发表评论