实验4 基于51单片机的中断系统控制

目录

一、实验项目

二、实验目的

三、实验器材

四、实验原理(含硬件电路图)

五、实验步骤

六、程序代码

1.C语言代码:

2.汇编语言代码:


一、实验项目: 中断控制系统设计

二、实验目的

        本系统设计的目的是使学生掌握单片机的中断技术。深刻理解单片机中断系统的功能和运行原理,掌握单片机软硬件系统开发的技巧。具体要求用单片机的外部中断0接收外接按键的输入,按键每按下一次, 就由单片机负 责改变外接LED的量灭状态一次 。要求在Proteus中设计出仿真硬件电路,在keil uvision中分别设计出汇编语言和C语言的源程序,然后用Proteus来进行整体系统仿真运行。

三、实验器材

        电脑,Keil uVision编译器、Proteus电路仿真软件。

        实验模拟的各器件:AT89C51单片机、 CAP电容、 CAP-ELEC锁存器 CRYSTAL震荡器、灯泡、 RES电阻。

四、实验原理(含硬件电路图)

        本实验主要涉及单片机的中断技术。中断是指在程序执行过程中,由外部设备或内部事件发起的一种异步事件,可以中断正在执行的程序,转而执行预先定义好的中断服务程序,处理中断事件。

        在本实验中,我们使用单片机的外部中断0来接收外接按键的输入,当按键被按下时,就会触发外部中断0,通过中断处理程序来改变外接LED的状态,实现LED的闪烁效果。

        具体的实现步骤如下:

        1. 初始化外部中断0,设置触发方式和优先级等参数。

        2. 初始化LED的状态,设置初始状态为亮或灭。

        3. 启动外部中断0,开始监听按键事件。

        4. 当按键被按下时,触发外部中断0,进入中断处理程序。

        5. 中断处理程序中改变LED的状态,实现LED的闪烁效果。

        6. 回到主程序,继续监听按键事件,等待下一次触发。

        通过这样的实现方式,就可以控制外接LED的状态,并且可以通过按下按键来改变LED的状态,实现LED的闪烁效果。同时,也可以通过设计不同的中断触发方式和优先级等参数来实现不同的应用场景。

硬件电路图:

0a1de847965945e48b5c8be65566aa25.png

五、实验步骤

        1、在Proteus软件中设计出仿真硬件电路,进行AT89C51单片机的搭载,完成单片机的电源部分的引入,利用单片机的P0.5口来进行灯的中断,利用单片机的P3.2口来进行按键控制灯的高低电平的输入

        2、在keil uvision中分别设计出汇编语言和C语言的源程序,其中要注意的是,对于中断的代码设计,要打开中断的控制开关,同时进行电平的初始化,保证中断的正确进行。

        3、使用汇编语言编写程序,实现外部中断0接收外接按键的输入,按键每按下一次,就由单片机负责改变外接LED的量灭状态一次。使用C语言编写程序,实现外部中断0接收外接按键的输入,按键每按下一次,就由单片机负责改变外接LED的量灭状态一次。

        4、在Proteus中运行仿真,验证源程序的正确性,将程序烧录到单片机中,利用Proteus来进行仿真运行,并进行代码的修改,以达到实验的具体要求。

六、程序代码

1.C语言代码:

#include <reg51.h>   

 sbit a = P0^5;   //定义一个位变量a,表示P0口的P0.5引脚。

//定义一个名为zhongduan的函数,它是一个中断服务程序,它会在外部中断0(INT0)发生时自动执行。

//中断服务程序必须使用interrupt关键字进行声明,而0表示中断号为0(即INT0)。

 void zhongduan(void) interrupt 0   

 {

  a = ~a; //每次执行中断程序,将P0.5取反一次

 }

 void main()

 {

  a = 1;  // 将P0.5引脚初始化为高电平。

EA = 1; //打开总中断开关。

EX0 = 1; //打开外部中断0(INT0)的开关。

IT0 = 1;   //设置外部中断0(INT0)为下降沿触发方式。

while(1)   // 程序进入死循环,等待外部中断0的触发。

{};  }

2.汇编语言代码:

ORG 0000H     ; 程序的起始地址。

LJMP MAIN0     ;跳转到MAIN标签处执行程序。

ORG 0003H      ;MAIN_INT0中断的地址。

LJMP MAIN_INT0 ;跳转到MAIN_INT0标签处执行中断服务程序

ORG 00BH    ;程序的结束地址

MAIN0:

       SETB P0.5  ;将P0.5引脚置1,即初始化为高电平,灯不亮,共阴极接法。

   SETB EA   ;打开总中断开关。

   SETB EX0    ; 打开外部中断0(INT0)的开关。

   SETB IT0   ; 设置外部中断0(INT0)为下降沿触发方式。

MAIN1:   AJMP $    ; 程序进入死循环,等待外部中断0的触发。

MAIN_INT0:

   PUSH ACC    ;将ACC寄存器的值压入堆栈

   CPL P0.5 ;将P0.5引脚的状态取反

   POP ACC      ; 从堆栈中弹出ACC寄存器的值

   RETI        ; 中断服务程序结束并返回到主程序, RETI专门用于中断服务程序

   END        ; 结束

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三小只程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值