
问题是:一个程序暂停,还有其它程序在执行吗?主循环程序也暂停吗?
那就设置一个标志位,中断后,标志为1,再次中断,又恢复为0。
回主循环程序,如果标志位为1,就进入一个循环中,循环中只查这个标志位,为1就始终循环,相当于暂停一个程序。不为1,即为0就跳出循环,进入正常的程序,即继续那个程序。
当再次中断,标志位为0,主程序就继续了。
如果是用C去写的话,像汇编一样,开中断就行了。位置一般就在MAIN 之前的。
//晶振频率221184MHz
#include<at89x52h>
#define TIMER0H 0x4c
#define TIMER0L 0x00
#define TIMER0_RUN TR0=1
#define SECOND_OVERFLOW 40
#define SEG_PORT P0
#define DISPLAY_DIG1 P1&=0xf0;P1|=0x01
unsigned char g_CurrentDigit=0; //当前显示的数字
void timer() interrupt 1
{
static unsigned char s_Count = 0;
TH0 = TIMER0H; //重置定时器初值
TL0 = TIMER0L;
//每次进入中断服务程序,TH0和 TL0 的值都
TIMER0_RUN; //定时器运行,开始下一
if(s_Count != SECOND_OVERFLOW)
{ //未到整秒,把 sCount 值加1
s_Count++;
}
else
{ //到整秒,s_Count归 0,更新把当前显示
s_Count = 0;
if(g_CurrentDigit != 9)
{
g_CurrentDigit++;
}
else
{
g_CurrentDigit = 0;
}
}
return;
}
void Initial(void) //初始化
{
IE = 0x82; //仅允许Timer0 中断
TMOD = 0x01; //Timer0 使用工作方式 1(16位) ,定时器
TH0 = TIMER0H; //设置定时器初值
TL0 = TIMER0L;
TIMER0_RUN; //定时器开始运行
DISPLAY_DIG1;
}
void main()
{
unsigned char code SEG_CODE[]
= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
Initial();
while(1)
{
SEG_PORT = SEG_CODE[g_CurrentDigit]; //显示当前的数字
//当timer0溢出时,单片机响应 timer0 中断,调用 timer 函数,
//每40 次调用当前显示的数字加 1
}
}
程序分析:
程序中主程序做的事只是在死循环中反复显示当前的数字,每产生一次中断,程序就跳
转到中断服务函数 timer()中进行相应的更新。
这里中断服务函数 timer()有别于普通 C函数的地方是在声明中多了“interrupt 1” ,说明
这个函数是中断号为 1的中断服务函数。各个中断对应的中断号如表 38所示。
这个程序需要初始化的东西比较多, 我们把这些初始化语句都放在了初始化函数 Initial()
中,这也是程序初始化很常见的做法。我们还第一次用到了静态变量和全局变量。全局变量
是中断处理函数与外界程序进行参数传递的唯一途径,因此在单片机程序中全局变量的使
用频率要比普通的 C 语言程序高。尽管如此,由于全局变量的使用会影响程序的结构化,
所以在可以不使用全局变量的地方,还是要避免使用全局变量。在程序中,为了把全局变
量与静态变量跟普通变量区别开来,我们在变量前分别加了小写 g_和小写 s_以示区别。
IE 寄存器中的使能位和C中的中断号 中断源
0 外部中断0
1 定时器0溢出
2 外部中断1
3 定时器1溢出
4 串行口中断
5
定时器2溢出(仅在S52、
C52中有此中断源)
好了,以上是我找的一个实例,希望对你有帮助!
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXT0
ORG 0030H
MAIN:
SETB EX0
SETB IT0
SETB EA
CLR P10
SJMP $
EXT0:
SETB P10
JNB P32,$
CLR P10
RETI
END
1如果只有一个按键的话,就像teeloon所说的,这个标志在“执行完子程序”后要清0;由于你是使用中断来做的,所以估计你只有一个按键。
2如果你有多个按键并且都是由中断口来检测的话,稍微修改一下 ☆赫赫有名☆ 的建议,用Byte(1~8个按键)或者Word(1~16个按键)来代替,只是不是加1,而是用对应的位来对应每个按键,使用过后就清零。
3考虑到主程序为20ms,有可能在你还没有调用子程序的时候,中断再一次的被响应,所以在中断的入口要判断那个标志有没有被清零,如果仍然为1,则不执行对应的中断程序,只有当子程序清标志了,才允许响应中断;对于“常按键”上述的就又要做处理了。
提醒:中断判断按键要注意“干扰”会不会产生“假信号”,也就是说要有“去抖动”功能;你也可以学习使用扫描端口的方式来做按键,毕竟中断口还是有限的。
单片机汇编语言流水灯,用定时器中断控制,可以初始化设置定时器时间(如50mS注定时器最大定时时间到不了500mS,需要加计数存储,中断10就是500mS),有多种方式实现如作一个流水状态表,定时读取写入IO端口 表加一,,或者用左移太移等方式都可以实现在,网上有很多这种实例。
以上就是关于51单片机汇编语言,用中断实现一个程序的暂停与继续,求大神帮忙,只需要说思路就行了。跪求!!全部的内容,包括:51单片机汇编语言,用中断实现一个程序的暂停与继续,求大神帮忙,只需要说思路就行了。跪求!!、单片机的C语言中如何实现汇编中的中断程序,写哪里还有org这个伪指令可以在C中实现吗、MCS-51单片机中断c语言或汇编编写完整程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)