找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3599|回复: 0
打印 上一主题 下一主题
收起左侧

AT89C51单片机外部中断与应用设计 Proteus仿真代码

[复制链接]
跳转到指定楼层
楼主
一、设计目的
1、学习并掌握中断系统工作原理;
2、学习并掌握中断程序编写方法;
3、学习并掌握中断嵌套原理;
4、学习并掌握中断优先级设置方法;
二、实验设备
1、计算机;
2、单片机开发板;
3、Keil C51编程软件;
4、Proteus仿真软件;
三、设计内容
1、功能
功能1:中断不嵌套
(1)K1和K2都未按下时,P1口8只LED呈流水灯显示
(2)K1(P3.2)按下再松开时,P1口的4只LED交替闪烁5次,然后再回到流水灯显示。
(3)K2(P3.3)按下再松开时,P1口的8只LED全部闪烁5次,然后再回到流水灯显示。
(4)若K1按下4只LED交替闪烁5次期间,按下K2则等交替闪烁之后,8只LED全部闪烁5次
(5)以上延时时间均为500ms。
功能2:中断嵌套
若K1按下4只LED交替闪烁5次期间,按下K2则马上8只LED全部闪烁5次,然后回来继续4只LED交替闪烁
功能3:K3按下一次,切换上述两种功能。
2、硬件电路原理图

3、设计程序
#include <reg52.h>
#include <intrins.h>
//宏定义
#define uchar unsigned char
#define FOSC 11059200L //晶振设置,使用11.0592M Hz

//IO接口定义
sbit Trans = P3^4;//转换功能一与功能二开关,为key3

/*******************************************************************************
* 函 数 名 :Delayms
* 函数功能 :实现 ms级的延时
* 输   入 :ms
* 输   出 :无
*******************************************************************************/
void Delayms(unsigned int ms)
{
    unsigned int i,j;
    for(i=0;i<ms;i++)
    #if FOSC == 11059200L
        for(j=0;j<114;j++);
    #elif FOSC == 12000000L
     for(j=0;j<123;j++);
    #elif FOSC == 24000000L
        for(j=0;j<249;j++);
    #else
        for(j=0;j<114;j++);
    #endif
}
/*******************************************************************************
* 函 数 名 :EX_Init
* 函数功能 :外部中断初始化程序
* 输   入 :无
* 输   出 :无
*******************************************************************************/
void EX_Init()
{
        EA=1;   //开总中断
        //允许 INT0 INT1 外部中断
        EX0=1;
        EX1=1;
        //触发方式为脉冲负边沿触发
        IT0=1;
        IT1=1;

        PX0=0;
        PX1=0;
}
/*******************************************************************************
* 函 数 名 : LED
* 函数功能 :流水灯及key3检测
* 输   入 :无
* 输   出 :无
*******************************************************************************/
void LED()
{
    unsigned char k;
    k=0xfe;
    while(1)
    {
        //按键检测
        if(Trans == 0)
        {
            Delayms(30);//按键消抖
            if(Trans == 0)
                PX1 = ~PX1;//中断优先级切换
            while(!Trans);//松手检测
        }
        //流水灯
        P1=k;      
        Delayms(500);   
        k=_crol_(k,1);  
    }
}
/*******************************************************************************
* 函 数 名 :main
* 函数功能 :主函数
* 输   入 :无
* 输   出 :无
*******************************************************************************/
void main( )
{
        EX_Init();//外部中断初始化:允许 INT0 、INT1 外部中断、触发方式为脉冲负边沿触发、开总中断
        LED();//流水灯
}

/*******************************************************************************
* 函 数 名 :int0_isr
* 函数功能 :外部中断0中断服务函数 ISR
* 输   入 :无
* 输   出 :无
*******************************************************************************/
void int0_isr(void) interrupt 0

{
    uchar i;
     //四个灯闪烁5次
    for(i=0;i<5;i++)
    {
         P1=0x0f;
         Delayms(500);
         P1=0xf0;
         Delayms(500);
    }

}

/*******************************************************************************
* 函 数 名 :int1_isr
* 函数功能 :外部中断2中断服务函数 ISR
* 输   入 :无
* 输   出 :无
*******************************************************************************/
void int1_isr(void) interrupt 2
{

  uchar j;
  //八个灯闪烁5次
    for (j=0;j<5;j++)
    {
            P1=0x00;
            Delayms(500);
            P1=0xff;
            Delayms(500);
    }
}


四、本任务中的几个功能如何实现?(说明设计思路)
设计思路:①功能二和功能一中的(4)都要以功能一中的前三点做基础、故先实现上述三点基础功能。②功能二与功能一中的(4)区别就是中断优先级、通过对中断初始化函数配置中、分别实现两个功能。③功能三依托第②步中,分析两个功能差别,使用按键检测来实现切换。
设计过程:先定义文件名,然后定义宏变量,定义Delayms函数,定义两个中断函数,中断一和中断二,定义中断初始化函数,定义流水灯函数。主函数中运行中断初始化函数、流水灯程序当按键一按下时,中断一发生,执行中断一中的程序,当按键二按下时执行中断二中的程序。功能一与功能二的实现依托两个中断函数,其中功能一要求两个优先级相同,功能二要求外部中断1的优先级要大于外部中断0,功能三依托LED函数中的按键检测功能,检测到key3按下时、重新配置外部中断1的优先级,实现两个功能的切换。


全部资料51hei下载地址:
外部中断与应用设计keil5工程.rar (5.3 MB, 下载次数: 30)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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