单片机中断实验 EX0

单片机实验1

实验内容

利用I/O口连接8个流水灯、1个按键和1个指示灯,流水灯循环闪烁,当按下按键后,指示灯闪烁3次,然后流水灯按原来的顺序接着闪烁

单片机型号为AT89C51、用proteus8.9、keil5软件 汇编语言编写

代码

ORG 0000H
AJMP MAIN
ORG 0003H  //EX0中断地址
AJMP INSER
ORG 0030H
MOV SP,#60H   //堆栈指针

MAIN:
	SETB EX0   //开中断INT0
	SETB IT0   //触发方式 :边沿式
	SETB EA		//开总中断
	MOV A , #0FEH 	//循环标志位,低电平触发
	
LEDLOOP:
	MOV P1 , A
	LCALL DELAY //调用延迟函数,让灯亮一段时间
	//因为代码执行很快,如果不加延迟人眼看不见是否执行完毕
	//下面如果DELAY的延迟时间很短,你按下按键后会发生一些毛病,代码本身没有错误,就是延迟给少了,可以自己试一试,不演示效果了
	RL A	//左移累加器A
	AJMP LEDLOOP  //循环
	
INSER:
//保护现场
//此处保护现场主要是终端调用了DELAY函数和LEDLOOP里的DELAY发生冲突,所以要保存DELAY里的寄存器R1,R2,R3
	INC SP
	//PUSH POP 只能存放地址
	PUSH 02H
	INC SP
	PUSH 01H
	//保护现场完毕
	//执行中断内容
	CPL P0.0
	LCALL DELAY
	CPL P0.0
	LCALL DELAY
	CPL P0.0
	LCALL DELAY
	CPL P0.0
	LCALL DELAY
	CPL P0.0
	LCALL DELAY
	CPL P0.0
	LCALL DELAY 
	//执行中断程序完毕
	//恢复现场
	POP 01H
	DEC SP
	POP 02H
	DEC SP
	RETI
//延迟函数  三重循环,R1,R2,R3 
DELAY:
	MOV R1, #03H
LOOP:
	MOV R2, #0FFH 
LOOP1:
	MOV R3,#0FFH
	DJNZ  R3,$
	DJNZ R2, LOOP1   
	DJNZ R1, LOOP
	RET
// DJNZ R* ,$     $含义原地跳转   DJNZ  R*不能于0,跳转、等于0,顺序执行
END

示意图

在这里插入图片描述
开始
在这里插入图片描述
进入中断
在这里插入图片描述

  • 本人小白一枚,初次接触单片机,如有错误,请指出谢谢
  • 请勿抄袭,希望自己写的这些能够帮助到初学单片机课程的一些帮助。
未经本人允许,请勿转载!
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
org 0000h sjmp main org 000bh ljmp t0int org 0030h main: mov sp,#60h mov tmod,#01h mov th0, #3ch ;5000微秒 mov tl0,#0b0h setb et0 ;允许t0中断 setb tr0 ;显示t0 setb ex0 ;允许外部中断0 setb ex1 ;允许外部中断1 setb ea ;开总中断 mov R0,#20 mov 26h,#59 mov 27h,#50 mov 28h,#23 re: call disp sjmp re disp: mov A ,26h mov B,#10 div AB ;取余 mov 20h,B ;秒个位 mov 21h,A ;秒十位 mov A,20h mov dptr,#tab movc A,@A+dptr setb p2.5 mov p1,A ;显示秒个位 call del ;延时 clr p2.5 mov A,21h mov dptr,#tab movc A,@A+dptr setb p2.4 mov p1,A ;显示秒十位 call del ;延时 clr p2.4 mov A ,27h mov B,#10 div AB ;取余 mov 22h,B ;分个位 mov 23h,A ;分十位 mov A,22h mov dptr,#tab movc A,@A+dptr setb p2.3 ;选数码管 mov p1,A ;显示分个位 call del ;延时 clr p2.3 mov A,23h mov dptr,#tab movc A,@A+dptr setb p2.2 ;选数码管 mov p1,A ;显示分十位 call del ;延时 clr p2.2 mov A ,28h mov B,#10 div AB ;取余 mov 24h,B ;时个位 mov 25h,A ;时十位 mov A,24h mov dptr,#tab movc A,@A+dptr setb p2.1 ;选数码管 mov p1,A ;显示时个位 call del ;延时 clr p2.1 mov A,25h mov dptr,#tab movc A,@A+dptr setb p2.0 ;选数码管 mov p1,A ;显示时十位 call del ;延时 clr p2.0 ret t0int: mov th0,#3ch mov tl0,#0b0h ;5000us djnz R0,rere mov R0,#20 ;1s inc 26h mov A,26h cjne A,#60,rere ;秒满60跳 mov 26h,#0 ;;清零 inc 27h mov A,27h cjne A,#60,rere ;分满六十跳 mov 27h,#0 ;清零 inc 28h mov A ,28h cjne A,#24,rere ;时满24跳 24小时制 mov 28h,#0 ;清零 rere: reti tab:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h DEL:MOV R7,#0AH ;延时子程序 AA:DJNZ R7,AA ret end
C51单片机中断单片机应用中的重要部分,可以提高程序的响应速度和实时性。下面是C51单片机中断实验的总结: 1. 中断的概念和作用 中断是指在程序执行过程中,由硬件或软件发起的一种特殊事件。中断可以打断程序的正常执行,转而执行中断服务程序(ISR),处理该事件后返回到原来的程序执行位置。中断可以提高程序的实时性和响应速度。 2. 中断的分类 C51单片机中断可以分为外部中断和定时器中断两种。外部中断是由外部设备(如按键、传感器等)产生的中断信号,而定时器中断则是由定时器模块产生的中断信号。 3. 中断的使用方法 在C51单片机中,中断的使用需要注册中断服务程序,并设置中断优先级和中断向量。具体步骤如下: (1)编写中断服务程序,命名为“中断向量号+中断服务程序名”,例如“INT0_ISR”。 (2)在主程序中设置中断优先级和中断向量,如下所示: ```c EA = 1; // 允许中断 EX0 = 1; // 允许外部中断0 IT0 = 1; // 设置外部中断0为下降沿触发 ``` (3)在中断服务程序中处理相应的中断事件,如下所示: ```c void INT0_ISR(void) interrupt 0 { // 处理外部中断0事件 } ``` 4. 中断实验的设计 中断实验可选用外部中断或定时器中断。例如,设计一个按键控制LED的实验,当按下按键时,LED亮起;松开按键时,LED熄灭。实验过程如下: (1)连接电路,将按键和LED分别连接到P3.2和P1.0口。 (2)编写中断服务程序,处理外部中断0事件: ```c void INT0_ISR(void) interrupt 0 { if (P3_2 == 0) // 检测按键是否按下 { P1_0 = 1; // 点亮LED } else { P1_0 = 0; // 熄灭LED } } ``` (3)在主程序中设置中断优先级和中断向量,如下所示: ```c EA = 1; // 允许中断 EX0 = 1; // 允许外部中断0 IT0 = 1; // 设置外部中断0为下降沿触发 ``` (4)启动程序,按下按键时,LED亮起;松开按键时,LED熄灭。 5. 中断实验的注意事项 (1)中断服务程序中应尽量避免使用延时函数和循环语句,以免影响程序的实时性。 (2)在编写中断服务程序时,应注意保存现场和恢复现场,以保证程序的正确执行。 (3)在使用多个中断时,应注意设置中断优先级,以保证高优先级中断能够及时响应。 6. 总结 C51单片机中断是提高程序实时性和响应速度的重要手段,掌握中断的使用方法和注意事项对于单片机应用开发具有重要意义。在实际应用中,应根据具体情况选择合适的中断类型并合理设置中断优先级,以确保程序的正确执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值