搜索
bottom↓
回复: 6

51单片机各中断初始化及子程序模板

[复制链接]

出0入0汤圆

发表于 2012-5-22 12:45:47 | 显示全部楼层 |阅读模式
本帖最后由 xulong20006 于 2012-5-22 12:49 编辑

51单片机各中断初始化及子程序模板

/************************************************************
*51单片机各中断初始化及子程序模板,几乎包括了传统51单片机的全部中断
  *1、外部中断0
*2、定时器中断0
*3、外部中断1
*4、定时器中断1
*5、串行中断
*6、定时器中断2---本中断在52时才有

*以上所有中断已经在Keil软件环境上经过测试,工作正常
*在使用定时中断的时候需要根据实际需要重设定时器的初值和工作方式
*在串行通讯中,使用11.0592M晶振,通讯波特率为9600bps
*为了保证文件的单一和方便保存,本项目只用了一个文件,
没有进行模块化处理,在实际应用中不建议这样做
*本程序在UE11.00b下编辑,在KeilV3.23(C8.01)下编译调试
*本程序仅供初学者参考使用,细节问题未涉及,在实际项目中请谨慎使用

*************************************************************/

#include<reg52.h>//如果是使用51单片机,则应该是reg51.h,
         //且不能使用定时器2
#include<intrins.h>//以下两个包含文件在本代码中实际不需要,
#include<absacc.h>//但经常用到,所以列出

#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(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);
   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)
{
TMOD |= 0x01;//16位定时器

TH0 = 0x06;//8ms
TL0 = 0xed;
ET0 = 1;//使能中断
TR0 = 1;//打开定时器
}
/************************************************************
*Function: 定时器1初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void InitialTime1 (void)
{
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
{
Int0Flag = 1;
}
/************************************************************
*Function: 外部中断1中断服务子程序
*parameter:
*Return:
*Modify:
*************************************************************/
void Interrupt1 (void) interrupt 2
{
Int1Flag = 1;
}
/************************************************************
*Function: 定时器0中断服务子程序
*parameter:
*Return:
*Modify:
*************************************************************/
void InterruptTime0(void) interrupt 1
{
TH0 = 0x06;//8ms
TL0 = 0xed;
Time0Count++;
}
/************************************************************
*Function: 定时器1中断服务子程序
*parameter:
*Return:
*Modify:
*************************************************************/
void InterruptTime1(void) interrupt 3
{
TH1 = 0x06;//8ms
TL1 = 0xed;
Time1Count++;
}
/************************************************************
*Function: 定时器2中断服务子程序
*parameter:
*Return:
*Modify:
*************************************************************/
void InterruptTime2(void) interrupt 5
{
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--;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-5-22 14:14:52 | 显示全部楼层
学习了  顶

出0入0汤圆

发表于 2012-5-22 16:38:26 | 显示全部楼层
不错,挺全面的。。。

出0入0汤圆

发表于 2012-7-22 20:01:12 | 显示全部楼层
这个正是我要的,感谢!

出0入0汤圆

发表于 2012-7-22 23:38:54 | 显示全部楼层
挺好的……谢谢了啊

出0入0汤圆

发表于 2012-8-4 19:09:26 | 显示全部楼层
我也学习下。谢了。

出0入0汤圆

发表于 2012-8-30 11:47:24 | 显示全部楼层
mark!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表