怎样使用单片机 中断函数中断

STC51单片机实例之14外部中断的使用-电子产品世界论坛
STC51单片机实例之14外部中断的使用
/*****************************外部中断0的电平触发**************************
外部中断,是单片机最基本也是最重要的功能。
P3.2单片机外部中断0的引脚和外部中断0。
每当按下S19端口的时候,数码管的值会加1.
***********************************************************************/
#include&reg52.h&
#define uchar unsigned char
#define uint
unsigned int
sbit KEY1 = P3^2;
uchar Count = 100;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
for(i=0; i& i++)
for(j=0; j&1827; j++)
/********************************************************************
* 名称 : Outside_Init()
* 功能 : 外部中断0,1 的初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Init(void)
//开外部中断0
//电平触发
//开总中断
/********************************************************************
* 名称 : Outside_Int1()
* 功能 : 外部中断0 的中断处理
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Int1(void) interrupt 0 using 1
if(KEY1 == 0)
Delay(30);
/********************************************************************
* 名称 : Main()
* 功能 : 外部中断试验主程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
Outside_Init();
P0 = table[Count % 10];
/****************************外部中断0的负边沿触发*******************************
外部中断,是单片机最基本也是最重要的功能。
P3.2单片机外部中断0的引脚和外部中断0。
每当按下S19端口的时候,数码管的值会加1.
***********************************************************************/
#include&reg52.h&
#define uchar unsigned char
#define uint
unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
uchar Count = 100;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
for(i=0; i& i++)
for(j=0; j&1827; j++)
/********************************************************************
* 名称 : Outside_Init()
* 功能 : 外部中断0,1 的初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Init(void)
//开外部中断0
//负边沿触发
//开总中断
/********************************************************************
* 名称 : Outside_Int1()
* 功能 : 外部中断0 的中断处理
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Int1(void) interrupt 0 using 1
if(KEY1 == 0)
Delay(30);
/********************************************************************
* 名称 : Main()
* 功能 : 外部中断试验主程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
Outside_Init();
P0 = table[Count % 10];
&外部中断1的电平触发
/********************************************************************
外部中断,是单片机最基本也是最重要的功能。
P3.3单片机外部中断1的引脚。
每当按下S18端口的时候,数码管的值会减1.
***********************************************************************/
#include&reg52.h&
#define uchar unsigned char
#define uint
unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
uchar Count = 100;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
for(i=0; i& i++)
for(j=0; j&1827; j++)
/********************************************************************
* 名称 : Outside_Init()
* 功能 : 外部中断0,1 的初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Init(void)
//开外部中断1
//电平触发
//开总中断
/********************************************************************
* 名称 : Outside_Int2()
* 功能 : 外部中断1 的中断处理
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Int2(void) interrupt 2 using 1
if(KEY2 == 0)
Delay(30);
/********************************************************************
* 名称 : Main()
* 功能 : 外部中断试验主程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
Outside_Init();
P0 = table[Count % 10];
外部中断0的负边沿触发
/********************************************************************
外部中断,是单片机最基本也是最重要的功能。
P3.3单片机外部中断1的引脚。
每当按下S20端口的时候,数码管的值会减1.
***********************************************************************/
#include&reg52.h&
#define uchar unsigned char
#define uint
unsigned int
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
uchar Count = 100;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
for(i=0; i& i++)
for(j=0; j&1827; j++)
/********************************************************************
* 名称 : Outside_Init()
* 功能 : 外部中断0,1 的初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Init(void)
//开外部中断1
//负边沿触发
//开总中断
/********************************************************************
* 名称 : Outside_Int2()
* 功能 : 外部中断1 的中断处理
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Outside_Int2(void) interrupt 2 using 1
if(KEY2 == 0)
Delay(30);
/********************************************************************
* 名称 : Main()
* 功能 : 外部中断试验主程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
Outside_Init();
P0 = table[Count % 10];
/********************************************************************
这个代码中,我们用外部中断0来作为一个信号捕捉的端口。
当在P3.2端口采集到下降沿的时候,会在数码管上加1.
(P1.0连接到P3.2)在程序代码中,我们给了P1.0端口,进行 一个赋值,让它电平交替变化。
每变化一次,数码管的值就会加1。
***********************************************************************/
#include&reg52.h&
#define uchar unsigned char
#define uint
unsigned int
unsigned long i = 0;
sbit OUT = P1^0;
uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
for(j=0;j&i;j++)
for(x=0;x&=148;x++);
void Outside_Int1(void) interrupt 0 using 1
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
unsigned long tabPL[8]={0};
//开外部中断0
//负边沿触发
//开总中断
tabPL[0] = i % 10;
tabPL[1] = (i /10)%10;
tabPL[2] = (i /100)%10;
tabPL[3] = (i /1000)%10;
tabPL[4] = (i /10000)%10;
tabPL[5] = (i /;
tabPL[6] = (i /;
tabPL[7] = (i /;
for(j=0;j&8;j++)
P0 = table[tabPL[j]];
//取 i 的个位
OUT = ~OUT;
中断是单片机的精华啊
归到一个帖子中,做好link
看样子 传说中51单片机 并没有毛刺处理
中断就是要快速响应啊,进入中断之后,正在响应中断的时候就不再响应新中断了,所以可以不担心毛刺
终端服务接口里面的变量不要用【i】,以免编程时候造成错误!i作为一般的子函数临时变量即可!
i是作为局部变量的啊,内存使用完毕就被释放掉了
新手,求AVR单片机外部中断的使用!!!!!!!
稍后发布AVR有关资料
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有查看: 277|回复: 11
怎样利用stm32103系列的单片机产生一个万分之一秒的中断啊?急!!
主题帖子精华
新手上路, 积分 32, 距离下一级还需 18 积分
在线时间4 小时
随便找个定时器设置一下就好了
void timer6_init(7200,0); 万分之一秒的中断
void timer6_init(u16 arr,u16 psc)
TIM_TimeBaseInitTypeDef TIM_TimeBaseS
NVIC_InitTypeDef NVIC_InitS
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
TIM_TimeBaseStructure.TIM_Period =
TIM_TimeBaseStructure.TIM_Prescaler =
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CK ...
主题帖子精华
高级会员, 积分 745, 距离下一级还需 255 积分
在线时间87 小时
100us&&随便找个定时器设置一下就好了&&void timer6_init(7200,0); 万分之一秒的中断
void timer6_init(u16 arr,u16 psc)
& & & & TIM_TimeBaseInitTypeDef& & & & TIM_TimeBaseS
& & & & NVIC_InitTypeDef NVIC_InitS
& & & & RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
& & & & TIM_TimeBaseStructure.TIM_Period =
& & & & TIM_TimeBaseStructure.TIM_Prescaler =
& & & & TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
& & & & TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
& & & & TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
& & & & TIM_ITConfig(TIM6,TIM_IT_Update | TIM_IT_Trigger,ENABLE);
& & & & NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
& & & & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;&&//ÏèÕ¼óÅÏ輶2¼¶
& & & & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;&&//′óóÅÏ輶3¼¶
& & & & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQê1Äü
& & & & NVIC_Init(&NVIC_InitStructure);& & & & //Ö¸¶¨2Îêy3õê¼»ˉ
& & & & TIM_Cmd(TIM6,ENABLE);
主题帖子精华
金牌会员, 积分 1648, 距离下一级还需 1352 积分
在线时间174 小时
0.6US ? 有点难度啊,想了一下,好像真的想不出好的方法
主题帖子精华
初级会员, 积分 181, 距离下一级还需 19 积分
在线时间27 小时
100uS的中断随便用一个定时器就可以做啊。一次性的还好,如果是频繁中断那么就没多少时间处理其他任务了,资源占用大。
主题帖子精华
在线时间488 小时
0.6US ? 有点难度啊,想了一下,好像真的想不出好的方法
讲解一下计算过程吧
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
0.6US ? 有点难度啊,想了一下,好像真的想不出好的方法
为啥是0.6US?
主题帖子精华
高级会员, 积分 973, 距离下一级还需 27 积分
在线时间115 小时
0.6是什么鬼
主题帖子精华
在线时间690 小时
中断没有时间长度的概念,
问题究竟是什么?
LZ自己想清楚吧。
-----抵制A莫这个烂货!-----
主题帖子精华
金牌会员, 积分 1648, 距离下一级还需 1352 积分
在线时间174 小时
为啥是0.6US?
算错了! 不好意思
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间109 小时
主题帖子精华
金牌会员, 积分 1237, 距离下一级还需 1763 积分
在线时间116 小时
F1系列的最高频率72MH,1/72000 = 0.0000139s = 13.9us,这是一个指令周期需要的时间。100us所以没问题啦
主题帖子精华
新手上路, 积分 32, 距离下一级还需 18 积分
在线时间4 小时
怎样将其输出呢
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
查看: 2160|回复: 13
单片机中断程序运行时间的疑惑
&&已结帖(20)
主题帖子积分
初级技术员, 积分 51, 距离下一级还需 49 积分
初级技术员, 积分 51, 距离下一级还需 49 积分
主题帖子积分
专家等级:结帖率:80%
主题帖子积分
初级技术员, 积分 51, 距离下一级还需 49 积分
初级技术员, 积分 51, 距离下一级还需 49 积分
小弟最近看一个MP3的源代码程序,我有一个很大的疑惑:
该程序中有多个中断,其中主要的中断是Timer1,Timer1_isr里面要处理很多任务(按键扫描,显示,设备检测,灯闪烁,等等)1ms中断一次(系统时钟频率是24MHZ),我想问的是
先不管其他中断,就这个Timer1中断1ms之内能处理得了这么多任务吗?(当然还有其他如Timer2中断,UART中断)
希望能人异士能帮小弟解惑,谢谢
主题帖子积分
技术达人, 积分 8539, 距离下一级还需 1461 积分
技术达人, 积分 8539, 距离下一级还需 1461 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
技术达人, 积分 8539, 距离下一级还需 1461 积分
技术达人, 积分 8539, 距离下一级还需 1461 积分
如果1MS处理不完,那么就是中断一次程序还没执行完,又来一次中断,堆栈就会溢出,程序就会乱掉。
如果程序运行正常,那么就是说1MS可以处理完。
为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
主题帖子积分
高级技术员, 积分 840, 距离下一级还需 160 积分
高级技术员, 积分 840, 距离下一级还需 160 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 840, 距离下一级还需 160 积分
高级技术员, 积分 840, 距离下一级还需 160 积分
中断里面有标志位的。每次进入中断,判断标志位。比如8件事情。用变量n,每次进入,n++;判断N来决定处理不同的任务:lol
主题帖子积分
技术总监, 积分 39859, 距离下一级还需 10141 积分
技术总监, 积分 39859, 距离下一级还需 10141 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 39859, 距离下一级还需 10141 积分
技术总监, 积分 39859, 距离下一级还需 10141 积分
这点任务应该是没有问题的,1MS一般只处理其中一个状态而已
主题帖子积分
高级技术员, 积分 877, 距离下一级还需 123 积分
高级技术员, 积分 877, 距离下一级还需 123 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:3.00
主题帖子积分
高级技术员, 积分 877, 距离下一级还需 123 积分
高级技术员, 积分 877, 距离下一级还需 123 积分
估算一下中断函数的指令执行最大时间不久可以解决疑问?
主题帖子积分
初级技术员, 积分 51, 距离下一级还需 49 积分
初级技术员, 积分 51, 距离下一级还需 49 积分
主题帖子积分
专家等级:结帖率:80%
主题帖子积分
初级技术员, 积分 51, 距离下一级还需 49 积分
初级技术员, 积分 51, 距离下一级还需 49 积分
各位大哥,中断函数里面做的任务不是设标志位这么简单,我看起来都大概有上千行代码了(以往的程序是在主循环里面处理任务,这个程序是把任务处理放在了中服务里面了
主题帖子积分
中级工程师, 积分 3629, 距离下一级还需 1371 积分
中级工程师, 积分 3629, 距离下一级还需 1371 积分
主题帖子积分
专家等级:结帖率:58%
主题帖子积分
中级工程师, 积分 3629, 距离下一级还需 1371 积分
中级工程师, 积分 3629, 距离下一级还需 1371 积分
lyj317 发表于
各位大哥,中断函数里面做的任务不是设标志位这么简单,我看起来都大概有上千行代码了(以往的程序是在主循 ...
ls不是有人说了么,这几千行代码不一定每次都要执行,总有些判断之类的吧。这是51么?要是单指令周期的MCU,1ms够24000条指令的了。
主题帖子积分
主题帖子积分
专家等级:结帖率:97%打赏:0.30受赏:91.00
主题帖子积分
lyj317 发表于
各位大哥,中断函数里面做的任务不是设标志位这么简单,我看起来都大概有上千行代码了(以往的程序是在主循 ...
不是每次中断都把上千行都执行一遍的...
天降大任于斯国也,必先霾其头,灰其脸,黄其皮肤,自一头雾水而出,方知其堪当大任也!
主题帖子积分
资深工程师, 积分 10634, 距离下一级还需 9366 积分
资深工程师, 积分 10634, 距离下一级还需 9366 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:0.10
主题帖子积分
资深工程师, 积分 10634, 距离下一级还需 9366 积分
资深工程师, 积分 10634, 距离下一级还需 9366 积分
wangch_sh 发表于
如果1MS处理不完,那么就是中断一次程序还没执行完,又来一次中断,堆栈就会溢出,程序就会乱掉。
如果程序 ...
中断执行不完也不会乱的,就是丢失中断而已。
主题帖子积分
中级技术员, 积分 229, 距离下一级还需 71 积分
中级技术员, 积分 229, 距离下一级还需 71 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 229, 距离下一级还需 71 积分
中级技术员, 积分 229, 距离下一级还需 71 积分
搞不懂,为什么在中断中处理这些“任务”呢?
我认为的基本原则是:中断isr必须短小精悍!
主题帖子积分
技术达人, 积分 9528, 距离下一级还需 472 积分
技术达人, 积分 9528, 距离下一级还需 472 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:7.36
主题帖子积分
技术达人, 积分 9528, 距离下一级还需 472 积分
技术达人, 积分 9528, 距离下一级还需 472 积分
crazyfool 发表于
搞不懂,为什么在中断中处理这些“任务”呢?
我认为的基本原则是:中断isr必须短小精悍! ...
嗯,楼主列举的那几样没一个非得放中断里处理,都是一些不要紧的任务
主题帖子积分
高级工程师, 积分 6903, 距离下一级还需 1097 积分
高级工程师, 积分 6903, 距离下一级还需 1097 积分
主题帖子积分
专家等级:结帖率:100%打赏:1.00受赏:3.00
主题帖子积分
高级工程师, 积分 6903, 距离下一级还需 1097 积分
高级工程师, 积分 6903, 距离下一级还需 1097 积分
用中断是对的。这个程序的精髓就是用好定时器。不要学人家到处delay,玩不转的。程序一大,就哭了
本人求职:求什么の,算求~ |&&深圳 &&&广州 | 大哥大号 :OO
主题帖子积分
初级技术员, 积分 51, 距离下一级还需 49 积分
初级技术员, 积分 51, 距离下一级还需 49 积分
主题帖子积分
专家等级:结帖率:80%
主题帖子积分
初级技术员, 积分 51, 距离下一级还需 49 积分
初级技术员, 积分 51, 距离下一级还需 49 积分
谢谢各位大哥的指导,今天小弟在中断开始出在空闲IO口输出高电平,结束处输出低电平,然后用示波器看了一下,发现每次中断运行的时间最多不超过0.2ms,所以这中断是没问题的,我真是吃精啊,一个中断服务里面有上千行代码,运行起来竟然只需要零点毫秒,这跟教材上说的中断服务尽量短小背道而驰啊,不过这种程序构架,在能正常运行的情况下还是不错的
主题帖子积分
高级技术员, 积分 618, 距离下一级还需 382 积分
高级技术员, 积分 618, 距离下一级还需 382 积分
主题帖子积分
专家等级:结帖率:60%
主题帖子积分
高级技术员, 积分 618, 距离下一级还需 382 积分
高级技术员, 积分 618, 距离下一级还需 382 积分
江枫渔火 发表于
用中断是对的。这个程序的精髓就是用好定时器。不要学人家到处delay,玩不转的。程序一大,就哭了 ...
dj的世界一直很好
河池学院-msOS重点实验室
技术奇才奖章
人才类勋章
时间类勋章
奔腾之江水
发帖类勋章
精英会员奖章
等级类勋章
涓涓之细流
发帖类勋章
时间类勋章
技术高手奖章
人才类勋章
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
技术领袖奖章
人才类勋章
突出贡献奖章
等级类勋章
时间类勋章
湍急之河流
发帖类勋章
核心会员奖章
等级类勋章
时间类勋章
沉静之湖泊
发帖类勋章
技术导师奖章
人才类勋章
无冕之王奖章
等级类勋章
技术新星奖章
人才类勋章
时间类勋章
热门推荐 /5单片机的P4口中断怎么应用不了-中国学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
单片机的P4口中断怎么应用不了
来源:互联网 发表时间: 11:36:52 责任编辑:李志喜字体:
为了帮助网友解决“单片机的P4口中断怎么应用不了”相关的问题,中国学网通过互联网对“单片机的P4口中断怎么应用不了”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:单片机的P4口中断怎么应用不了,具体解决方案如下:解决方案1:
订功斥嘉俪黄筹萎船联1:检查P4口地址是否设置为E8H2:检查xicon寄存器是否设置为C0H,且程序中是否正确赋值3:优先级是否设置过低,而被屏蔽如果设置正确,不应该存在问题
解决方案2:
你的头文件对了没有。还有你定义中断的时候有没有错呢。
解决方案3:
这个单片机我不懂,不过我用MSP430是这样:P1、P2口有中断功能,P3订功斥嘉俪黄筹萎船联往后是没有的,要使用中断功能得用P1或者P2里面的I/O口,不知道你这个是不是I/O口也是只有部分才有中断功能。
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号

我要回帖

更多关于 单片机 中断函数 的文章

 

随机推荐