求89C51单片机外部中断程序,C语言编写。

求89C51单片机外部中断程序,C语言编写。,第1张

方法类似,补写程序如下:

#include<reg51h>

#define uint unsigned int

#define uchar unsigned char

sbit LED=P0^0;

sbit LED1=P0^1;

void delay1ms (uint z)

{

uint x,y;

for (x=z;x>0;x--)

for (y=110;y>0;y--);

}

void exter() interrupt 2

{

delay1ms(600);

LED=0;

delay1ms(200);

LED=1;

}

void exter0() interrupt 0

{

delay1ms(600);

LED1=1;

delay1ms(200);

LED1=0;

}

main()

{

EA=1; //开总中断

EX1=1; //开外部中断1

EX0=1; //开外部中断0

IT1=0; //外部中断边沿触发,下降沿触发

IT0=0; //外部中断0边沿触发,下降沿触发

}

你可以在蜂鸣器子程序中的while(1)内加一个按键扫描程序,如果扫描到撤警键可以跳出这个while(1)死循环,可以用go

to函数(出错的可能性要大一些,但一般也没事)。或者你把while(1)改成while(key);key为一个变量,外界可以将key置1(调用蜂鸣器),当蜂鸣器内部扫描到撤警键后将key置0,这样也可以跳出这个循环。要不你就把程序直接发出来,帮你

改一下

中断服务程序:处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理“急件”的程序被称为——中断服务程序。

当中央处理器正在处理内部数据时,外界发生了紧急情况,要求CPU暂停当前的工作转去处理这个紧急事件。处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程称为中断。实现这一功能的部件称为中断系统,申请CPU中断的请求源称为中断源,单片机的中断系统一般允许多个中断源,当多个中断源同时向CPU请求中断时,就存在一个中断优先权的问题。通常根据中断源的优先级别,优先处理最紧急事件的中断请求源,即最先响应级别最高的中断请求。

中断是为了使时间更精确。使用中断一般要先设置使用哪个定时/计数器的模式几,之后再设置定时器的使能为,再打开总中断使能位,启动定时器。外部中断比定时器的优先级高,如果有更重要的事等着去处理则交给外部中断,当检测到有外部中断时,会去执行外部中断服务,执行完后回到之前未执行的地方接着继续执行;串口用到定时器,因为在串口的模式1和模式3中需要用定时器的溢出率来设置波特率。我说得不怎么详细,这个几句话说不清。这个你可以先把概念搞懂,之后用列子去理解概念会比较好,不懂的就多问问。

这是我在网上看到的一点资料

//任务6 显示按键按下的次数(中断方式)

//任务6 显示按键按下的次数(中断方式)

#include <reg51h> //1 包含特殊功能寄存器定义头文件reg51h

#define ledport P2 //2 宏定义:ledport代表P2(发光二极管接P2口)

#define uchar unsigned char //3 宏定义:uchar代表unsigned char

#define ulong unsigned int //3 宏定义:ulong代表unsigned long

#define unsigned int j;

uchar m=0xef; //5 定义变量m:m用来保存显示控制数据,初值为0xfe

ulong i;

sfr p1=0x90;

sbit led1=P1^0; //led引脚定义

sbit led2=P1^1;

sbit led3=P1^2;

sbit led4=P1^3;

void fun1_int() interrupt 0 using 1//5 定义中断服务函数:中断号为0,用第1组寄存器组

{

while(1) //while循环(永远为真,死循环)

{ //循环体开始

led1=~led1; //发光二级管的显示状态取反

led2=~led2;

led3=~led3;

led4=~led4;

for(j=0;j<12500;j++); //for循环,循环体为空,耗时 //延时500ms

}

} //循环体结束

void fun2_int() interrupt 1 using 2//5 定义中断服务函数:中断号为0,用第1组寄存器组

{

while(1) //7 while循环,条件表达式为1,永远为真,死循环

{ //8 while循环体开始

P1=m; //9 P1口输出当前显示控制数据

m=(m<<1)|(m>>7); //10 显示数据m向左循环移1位,为下次显示输出作准备

for(i=0;i<60000;i++); //11 for循环实现1s延时,循环体为空语句

} //12 while循环体结束

}

//8 中断服务函数结束

void main(void) //9 main函数

{

EA=1;

EX0=0; //12 开外部中断0

EX1=0;

IT1=1;

IT0=1; //11 设置外部中断0的触发方式:下降沿触发。见代码说明

while(1)

; //14 死循环,循环体为空语句

} //15 main函数结束

//任务1 控制1只发光二极管闪烁显示上面的注释可以省略不看,

这个需要设置不同的寄存器,注意依稀俺这里就可以了的,然后查一下数据手册。

以上就是关于求89C51单片机外部中断程序,C语言编写。全部的内容,包括:求89C51单片机外部中断程序,C语言编写。、C语言定时中断程序、什么是C语言的中断程序作用是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9377599.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存