我是靠谱客的博主 无心大雁,最近开发中收集的这篇文章主要介绍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 happenedn");					
					/* 可在此处插入扩展中断0服务程序 */
				break;
	     		case 1:
					printf ("extended interrupt 1 happenedn");					
					/* 可在此处插入扩展中断1服务程序 */
				break;
	     		case 2:
					printf ("extended interrupt 2 happenedn");					
					/* 可在此处插入扩展中断2服务程序 */
				break;
	     		case 3:
					printf ("extended interrupt 3 happenedn");					
					/* 可在此处插入扩展中断2服务程序 */
				break;
	     		case 4:
					printf ("extended interrupt 4 happenedn");					
					/* 可在此处插入扩展中断4服务程序 */
				break;
	     		case 5:
					printf ("extended interrupt 5 happenedn");					
					/* 可在此处插入扩展中断5服务程序 */
				break;
	     		case 6:
					printf ("extended interrupt 6 happenedn");
					/* 可在此处插入扩展中断6服务程序 */
				break;
	     		case 7:
					printf ("extended interrupt 7 happenedn");
					/* 可在此处插入扩展中断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仿真图及源程序获取见:
在这里插入图片描述

说明

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

最后

以上就是无心大雁为你收集整理的Proteus仿真:外部中断应用实例的全部内容,希望文章能够帮你解决Proteus仿真:外部中断应用实例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部