51单片机外部中断编程实例2

发布者:HeavenlyWonder最新更新时间:2016-09-27 来源: eefocus关键字:51单片机  外部中断  编程实例 手机看文章 扫描二维码
随时随地手机看文章

1、51单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;
2、中断源的编号: 串行口中断为4、定时中断1为3、外部中断1为2、定时中断0为1、外部中断0为0;
3、中断源的优先级:按以上顺序排列,串行口中断最低、外部中断0最高;
4、使用外部中断0和1,必须TCON寄存器设置其触发方式是低电平触发(0)还是下降沿触发(1);
5、使用前必须通过IE寄存器打开总中断和自己的中断;

一、外部中断基本例程(未使用中断,键盘扫描为一般端口扫描)
#include .h>
sbit k1=P3^2;
sbit led=P2^7;
void delay_ms(unsigned int xms); //ms级延时子程序
void key_scan();   //声明键盘扫描子函数
void main()
{
led=1; //上电初始化,led灯不亮
while(1)
{
key_scan();
delay_ms(3000);
}
}
void delay_ms(unsigned int xms) //ms级延时子程序
{ unsigned int x,y; 
for(x=xms;x>0;x--)
for(y=130;y>0;y--);}
void key_scan() //键盘扫描子函数
{ if(k1==0) //有键按下吗?(k1=0 ?)
{ delay_ms(10); //延时消抖
if(k1==0)     //确实是有键按下,则:
{led=!led; //翻转灯的状态
    while(!k1);} //等待按键放开

}

二、外部中断基本例程 (单个键盘的外部中断0扫描处理)
//用一个按键控制一个灯的亮灭
#include
sbit k1=P3^2;
sbit led=P2^7;
void delay_ms(unsigned int xms); //ms级延时子程序
void key_scan() interrupt 0 //使用了外部中断0的键盘扫描子函数。也可放在主函数而不需要预先声明
{ if(k1==0) //有键按下吗?(k1=0 ?)
{ delay_ms(10); //延时消抖
if(k1==0)     //确实是有键按下,则:
{led=!led; //翻转灯的状态
    while(!k1);} //等待按键放开

}
void main()
{
led=1;    //上电初始化,led灯不亮
TCON=0x01; //打开外部中断0,并设置为下降沿触发
IE=0x81; //开总中断
while(1)
{
delay_ms(3000); //注意主函数这里没有键盘扫描程序了
}
}
void delay_ms(unsigned int xms) //ms级延时子程序
{ unsigned int x,y; 
for(x=xms;x>0;x--)
for(y=130;y>0;y--);

}

三、外部中断基本例程 (单个键盘的外部中断1扫描处理)

作者:江苏科技大学 机械工程学院 CJoy
//功能跟上例一样,都是用一个按键控制一个灯的亮灭,但是使用的是外部中断1
#include
sbit k2=P3^3;  
sbit led=P2^7;
void delay_ms(unsigned int xms); //ms级延时子程序
void main()
{
led=1;    //上电初始化,led灯不亮
TCON=0x04; //打开外部中断1,并设置为下降沿触发
IE=0x84; //开总中断和外部中断1
while(1)
{
delay_ms(3000);
}
}
void delay_ms(unsigned int xms) //ms级延时子程序
{ unsigned int x,y; 
for(x=xms;x>0;x--)
for(y=130;y>0;y--);}
void key_scan() interrupt 2 //使用了外部中断1的键盘扫描子函数
{ if(k2==0) //有键按下吗?(k1=0 ?)
{ delay_ms(10); //延时消抖
if(k2==0)     //确实是有键按下,则:
{led=!led; //翻转灯的状态
    while(!k2);} //等待按键放开

}

 四、外部中断基本例程(同时使用外部中断0和外部中断1)
//用一个键控制接在P0口的八个灯的亮灭,另外一个按键控制一个灯的亮灭
#include
sbit k1=P3^2;
sbit k2=P3^3; 
sbit led=P2^7;
void delay_ms(unsigned int xms); //ms级延时子程序
void main()
{
P0=0xff; //上电初始化,P0全灭
led=1;    //上电初始化,led灯不亮
TCON=0x05; //打开外部中断1、2,并设置为下降沿触发
IE=0x85; //开总中断和外部中断1、2

while(1)
{
delay_ms(3000);
}
}
void delay_ms(unsigned int xms) //ms级延时子程序
{ unsigned int x,y; 
for(x=xms;x>0;x--)
for(y=130;y>0;y--);}
void key_scan_1() interrupt 0 //使用了外部中断0的键盘扫描子函数
{ if(k1==0) //有键按下吗?(k1=0 ?)
{ delay_ms(10); //延时消抖
if(k1==0)     //确实是有键按下,则:
{P0=~P0; //翻转8个灯的状态
    while(!k1);} //等待按键放开

}
void key_scan_2() interrupt 2 //使用了外部中断1的键盘扫描子函数
{ if(k2==0) //有键按下吗?(k1=0 ?)
{ delay_ms(10); //延时消抖
if(k2==0)     //确实是有键按下,则:
{led=!led; //翻转单个灯的状态
    while(!k2);} //等待按键放开

}

五、外部中断扩展应用例程(8个按钮分别去控制8个灯的亮灭)


//八个按钮通过8个二极管接到外部中断0脚进行中断扩展,从而解决外部中断口不够用的问题
#include
sbit k0=P2^0; //八个按键分别接到P2口各个脚上,
sbit k1=P2^1; //同时还通过二极管连接到外部中断0脚(P3.2)
sbit k2=P2^2;
sbit k3=P2^3;
sbit k4=P2^4;
sbit k5=P2^5;
sbit k6=P2^6;
sbit k7=P2^7;

sbit led0=P0^0; //接在P0脚上的8个LED灯,分别受控于上述8个按键
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;

void delay_ms(unsigned int xms); //ms级延时子程序
void main()
{
   //上电初始化,led灯不亮
TCON=0x01; //打开外部中断0,并设置为下降沿触发
IE=0x81; //开总中断
while(1)
{
delay_ms(3000);
}
}
void delay_ms(unsigned int xms) //ms级延时子程序
{ unsigned int x,y; 
for(x=xms;x>0;x--)
for(y=130;y>0;y--);

}
void key_scan() interrupt 0 //使用了外部中断0的键盘扫描子函数
{ if(k0==0) //有键按下吗?(k0=0 ?)
{ delay_ms(10); //延时消抖
if(k0==0)     //确实是有键按下,则:
{led0=~led0; //翻转灯的状态
    while(!k0);} //等待按键放开
}
if(k1==0) //有键按下吗?(k1=0 ?)
{ delay_ms(10); //延时消抖
if(k1==0)     //确实是有键按下,则:
{led1=!led1; //翻转灯的状态
    while(!k1);} //等待按键放开
}
if(k2==0) //有键按下吗?(k2=0 ?)
{ delay_ms(10); //延时消抖
if(k2==0)     //确实是有键按下,则:
{led2=!led2; //翻转灯的状态
    while(!k2);} //等待按键放开
}
if(k3==0) //有键按下吗?(k3=0 ?)
{ delay_ms(10); //延时消抖
if(k3==0)     //确实是有键按下,则:
{led3=!led3; //翻转灯的状态
    while(!k3);} //等待按键放开
}
if(k4==0) //有键按下吗?(k4=0 ?)
{ delay_ms(10); //延时消抖
if(k4==0)     //确实是有键按下,则:
{led4=!led4; //翻转灯的状态
    while(!k4);} //等待按键放开
}
if(k5==0) //有键按下吗?(k5=0 ?)
{ delay_ms(10); //延时消抖
if(k5==0)     //确实是有键按下,则:
{led5=!led5; //翻转灯的状态
    while(!k5);} //等待按键放开
}
if(k6==0) //有键按下吗?(k6=0 ?)
{ delay_ms(10); //延时消抖
if(k6==0)     //确实是有键按下,则:
{led6=!led6; //翻转灯的状态
    while(!k6);} //等待按键放开
}
if(k7==0) //有键按下吗?(k7=0 ?)
{ delay_ms(10); //延时消抖
if(k7==0)     //确实是有键按下,则:
{led7=!led7; //翻转灯的状态
    while(!k7);} //等待按键放开


关键字:51单片机  外部中断  编程实例 引用地址:51单片机外部中断编程实例2

上一篇:单片机控制GPS/GSM原理(虚拟串口)
下一篇:基于AT89C51SND1C单片机的MP3播放器设计

推荐阅读最新更新时间:2024-03-16 15:12

51单片机编程 第四节:数码管驱动
第四节:数码管驱动 显示 12345678 P1端口接8联共阴数码管SLED8的段极:P1.7接段h, ,P1.0接段a P2端口接8联共阴数码管SLED8的段极:P2.7接左边的共阴极, ,P2.0接右边的共阴极 方案说明:晶振频率fosc=12MHz,数码管采用动态刷新方式显示,在1ms定时断服务程序中实现 代码 1. #include at89x92.h 2. unsigned char DisBuf ; //全局显示缓冲区,DisBuf 对应右SLED,DisBuf 对应左SLED, 3. void DisplayBrush( void ) 4. { code unsigned
[单片机]
51单片机学习笔记:可对时电子钟
本篇是对上一篇的改进,昨天学习了第4章 中的独立键盘的使用 独立键盘拥有自己独有的IO口,所以比较简单,我上一篇写的电子钟程序只能烧程序对时, 不能手动按键对时,这肯定是最差劲的做法,所以学习了按键之后,就立马动手改进我的电子钟了 同时改进了数码管小数点的显示,消除了叠影 使用芯片STC89C52RC, 2个锁存器 6个带小数点共阴极数码管显示一个24时制时钟 没有时钟芯片,所以掉电后时间会复位 原理图为TX-1C开发板 ============================== 最终显示的 时.分.秒 是 16.31.37 形式 使用3个按键, S2 S3 S5 其中S2和S3是加减数值,S5是切换对时状态,
[单片机]
<font color='red'>51单片机</font>学习笔记:可对时电子钟
51单片机用PID算法温度控制器毕业设计
毕业设计任务 设计并制作一个水温自动控制系统,控制对象为纯净水(容量大于等于1升),容器为瓷器皿。水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。 基本功能及要求 1.温度设定范围为40~90℃,最小区分度为1℃,标定温度≤1℃。 2.环境温度降低时(例如用电风扇降温)温度控制的静态误差≤1℃。 3.在硬件中显示水的实际温度。 4.采用适当的控制方法,当设定温度突变(由40℃提高到60℃)时,减小系统的调节时间和超调量。 5.温度控制的静态误差≤0.2℃。 6.在设定温度发生突变(由40℃提高到60℃)时,用上位机显示温度变化曲线。 实物图 电路原理图 功能框图 PI
[单片机]
<font color='red'>51单片机</font>用PID算法温度控制器毕业设计
51单片机的复位电路
1、基本复位电路 复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后, 撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号, 以防电源开关或电源插头分-合过程中引起的抖动而影响复位。图1所示的 RC复位电路可以实现上述基本功能,图3为其输入-输出特性。但解决不了 电源毛刺(A点)和电源缓慢下降(电池电压不足)等问题 而且调整 RC 常数改变延时会令驱动能力变差。左边的电路为高电平复位有效 右边为低电平Sm为手动复位开关 Ch可避免高频谐波对电路的干扰 图1 RC复位电路 图2所示的复位电路增加了二极管,在电源电压瞬间下降时使电容迅速放电, 一定宽度的电源毛刺也可令系统可靠复位。 图3所示复位电
[单片机]
51单片机~串口通信
(一)计算机串行通信原理: 综上:所以在设置的时候,经常将SCON设置为0X50==0101 0000 ,使用方式1. (二)工作: 中断控制 led灯,每发送一条指令灯亮或灭(反转一下) #include reg52.h typedef signed char int8; typedef signed int int16; typedef signed long int32; typedef unsigned char uint8; //字符型 typedef unsigned int uint16; typedef unsigned long
[单片机]
<font color='red'>51单片机</font>~串口通信
基于51单片机的低成本心电监护系统设计
1 引言 虚拟医学仪器充分利用计算机丰富的软硬件资源,仅增设少量专用软、硬件模块,便可实现传统仪器的全部功能及一些传统仪器无法实现的功能,同时缩短了研发 周期 。本系统由两部分组成:以C8051F320 单片机 为核心的数据采集装置和以PC机为平台的分析处理系统。设计中充分考虑数据采集装置体积小、功耗低、操作快捷的要求,因此全部采用SMT封装的元器件。PC监护终端通过USB接口接收数据,传输速率高;采用图形编程语言LabVIEW编写显示、存储、分析处理等功能程序。该系统可实时监护并提供心动周期,心率等参数,也可进行数据的存储回放,为心血管疾病的诊断提供依据。系统的软件开发和硬件与上位机软件的集成测试表明,系统运行稳定
[单片机]
基于<font color='red'>51单片机</font>的低成本心电监护系统设计
如何使用Keil3开发51单片机程序
1.双击图标打开Keil软件 2.单击菜单栏 - 3.将新工程保存到一个文件夹 4.选择一款 CPU 芯片,这里STC89C52RC对应着Philips的P89V51RD2 5.提示是否复制8051的启动代码到文件夹,这里选择“否” 6.完成后,在Project Workspace中可以看到Source Group1 7.新建一个代码文件 8.以“*.c”作为后缀名保存 9.将刚刚保存的文件 led .c添加到工程中来 10.选中源代码文件,添加 11.可以看到led.c已经在Source Group1中 12.添加代码如下 13.单击 工具 栏上的“Op
[单片机]
如何使用Keil3开发<font color='red'>51单片机</font>程序
AT89C51单片机在无线数据传输中的应用
摘要:介绍无线数据传输系统的组成、AT89C51单片机串行口的工作方式及其与无线数字电台接口的软硬件设计与实现方法。 关键词:AT89C51 串行口 无线数字电台 串行通信 一般的数字采集系统,是通过传感器将捕捉的现场信号转换为电信号,经模/数转换器ADC采样、量化、编码后,为成数字信号,存入数据存储器,或送给微处理器,或通过无线方式将数据发送给接收端进行处理。无线数据传输系统就是 样一套利用无线手段,将采集的数据由测量站发送到主控站的设备。 1 系统组成 系统组成如图1、图2所示。 系统由测量站和主控站两部分组成。测量站主要完成对现场信号的采集、存储,接收遥控指令并发送数据。主控站的主要工作是发送遥控指令、
[网络通信]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved