Proteus仿真:外部中断应用实例

实现目标

        因仿真库中无74LS348仿真元件,仿真电路使用74HC148和74HC245模拟74LS348,8路外部中断输入全部为低有效,对应的中断发生时,使用printf函数从串口输出“extended interput x happened”,x为对应的中断编号。

Proteus仿真图

在这里插入图片描述

C51代码

#include <REG52.H>    /* special function register declarations */
#include <stdio.h>    /* prototype declarations for I/O functions */
#include <intrins.h>
#include<Absacc.h>

#define byte unsigned char
#define uchar unsigned char
#define word unsigned int
#define uint unsigned int
#define ulong unsigned long
#define BYTE 	unsigned char
#define WORD 	unsigned int

#define TRUE  1
#define FALSE 0

#define INT0_PORT  XBYTE[0x0000] /*外部中断74LS348地址*/

uchar int0_status;  /*中断状态*/
bit   int0_flag; 	/*中断标记*/

void initUart(void);

/******** main 函数 *********/
void main (void) {	
	initUart(); /* 初始化串口 */
	int0_flag=0;/*设置中断0标记*/
	TCON=0x55;  /* 电平触发外部中断 */
	IE=0x81;    /*打开外中断int0*/
	do {
    	if (int0_flag) { /*如果有中断*/
        	switch (int0_status){ /*根据中断源分支*/
	     		case 0:
					printf ("extended interrupt 0 happened\n");					
					/* 可在此处插入扩展中断0服务程序 */
				break;
	     		case 1:
					printf ("extended interrupt 1 happened\n");					
					/* 可在此处插入扩展中断1服务程序 */
				break;
	     		case 2:
					printf ("extended interrupt 2 happened\n");					
					/* 可在此处插入扩展中断2服务程序 */
				break;
	     		case 3:
					printf ("extended interrupt 3 happened\n");					
					/* 可在此处插入扩展中断2服务程序 */
				break;
	     		case 4:
					printf ("extended interrupt 4 happened\n");					
					/* 可在此处插入扩展中断4服务程序 */
				break;
	     		case 5:
					printf ("extended interrupt 5 happened\n");					
					/* 可在此处插入扩展中断5服务程序 */
				break;
	     		case 6:
					printf ("extended interrupt 6 happened\n");
					/* 可在此处插入扩展中断6服务程序 */
				break;
	     		case 7:
					printf ("extended interrupt 7 happened\n");
					/* 可在此处插入扩展中断7服务程序 */
				break;
			    default:break;
			}
			int0_flag=0;	/*清中断0标记*/			 
		 }
    }while(TRUE);
}
/***********  中断0服务程序***************/
void exint0(void) interrupt 0
{
	EA=0;/* 关总中断 */
    int0_flag=1; /*设置中断0标记*/
	/*读取外部中断源输入,并屏蔽高5位*/
    int0_status=~INT0_PORT & 0x07;
	EA=1;/* 开总中断 */
}
/********** 初始化串口波特率 ************/
void initUart(void)/*初始化串口波特率,使用定时器2*/
{
/* Setup the serial port for 9600 baud at 11.0592MHz */
	SCON = 0x50;  //串口工作在方式1
	RCAP2H=(65536-(3456/96))>>8;
	RCAP2L=(65536-(3456/96))%256;
  	T2CON=0x34;
    TI  = 1;     /* 置位TI*/
}

运行结果

在这里插入图片描述
注:若直接在Proteus中仿真,则会出现
在这里插入图片描述
而正确的显示则需要使用uVision2与Proteus VSM联调,具体啥原因海轰也没有弄懂

本文Proteus仿真图及源程序获取见:
在这里插入图片描述

说明

参考课本:单片机原理与嵌入式系统设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

海轰Pro

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

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

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

打赏作者

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

抵扣说明:

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

余额充值