
如果是用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 000BH
AJMP PIT0 t0中断入口
ORG 001BH
AJMP PIT1 t1中断入口
MAIN: MOV SP, #60H 设置堆栈
MOV TMOD, #03H 定时器方式 T0T1都是方式1
MOV TL0, #9CH T0初始值
MOV TH0, #38H
MOV TCOM, #50H ;TR0=1 TR1=1 启动定时器
MOV IE, #8AH 开启定时器中断
HERE: AJMP HERE
PIT0: MOV TL0, #9CH T0 时间到 重新送初值
CPL P10 取反P10 生成方波
RETI
PIT1: MOV TH0, #38H T1时间到 重新送初值
CPL P11 取反p11 生成方波
RETI
END
我用c语言给你表示
int flag = 0;//标志位
int main()
{
//
while(1)
{
if(flag==1)
{
//handle your proc
flag = 0;
}
}
}
#pragme interrupt ISR()
{
flag = 1
}
下列程序,已经经过实验,可以满足题目要求
ORG 0000H
SJMP MAIN
ORG 000BH
SJMP T0_INT
MAIN:
MOV TMOD, #01H ;T0定时方式1
MOV TH0, #(65536-50000) / 256 ;定时50ms@12MHz
MOV TL0, #(65536-50000) MOD 256 ;
SETB TR0 ;启动T0
MOV IE, #82H ;开中断
;第一秒钟L0,L2亮,第二秒钟L1,L3亮,第三秒L4,L6亮,第四秒钟L5,L7亮,
;第五秒L0,L2,L4,L6亮,第六秒钟,L1,L3,L5,L7亮,第七秒钟八个二极管全亮,第八秒钟全灭
MOV 30H, #11111010B
MOV 31H, #11110101B
MOV 32H, #10101111B
MOV 33H, #01011111B
MOV 34H, #10101010B
MOV 35H, #01010101B
MOV 36H, #00000000B
MOV 37H, #11111111B
MOV R0, #30H
MOV R7, #20
M_LOOP:
SJMP M_LOOP ;无限循环
T0_INT:
MOV TL0, #(65536-50000) MOD 256 ;
MOV TH0, #(65536-50000) / 256 ;定时50ms@12MHz
DJNZ R7, T0_END
MOV R7, #20
MOV P1, @R0
INC R0
CJNE R0, #38H, T0_END
MOV R0, #30H
T0_END:
RETI
END ;完
TCOUNT EQU 30H
ORG 0000H
LJMP START
ORG 000BH
LJMP T0INT
ORG 0050H
START:
CLR EA
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
MOV 30H,#0
SETB ET0
CLR 00H
SETB P10
LOOP:
JNB 00H,NOLED
SETB TR0
SJMP KEY
NOLED:
CLR TR0
SETB P10 ;灯灭
KEY:
MOV A,#01H
MOV P2,A
LCALL DELAY
MOV A,P2
ANL A,#10H
JNB ACC4,LOOP ;有键按下
CPL 00H
SJMP LOOP
DELAY:
MOV R0,#250
DJNZ R0,$
RET
T0INT:
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,T0INTE ;1秒亮灭
CPL P10
MOV TCOUNT,#0
T0INTE:
RETI
END
不知道你要显示几位,我写了个1位显示的。前提是共阴数码LED且一端已接地,由P1口控制。
ORG 0000H
LJMP START
ORG 0003H
LJMP INTT0
ORG 0600H
START: SETB EA
SETB EX0 ; 打开外部中断0
CLR IT0 ; 令中断0为电平触发
MOV @R0,#00H
DISPLAY: MOV DPTR,#TAB;给字形表的初地址
MOV A,R0; 将要显示的数给A
MOVC A,@A+DPTR ;在字形表中取数放到A
MOV P1,A; 假设是P1口输出要显示的数据把A放到P1中
SJMP DISPLAY ;循环显示等待中断
INTT0:INC @R0; ;中断中有按键着加1
RETI
TAB:DB 3FH,06H,5BH,4FH,66H ;字形表
DB 6DH,7DH,07H,7FH,6FH
DB 77H,7CH,39H,5EH,79H
END
这个问题有很多种解决方法,各种方法如下:
1扩展外部中断,但成本会很高;
2简化程序,将字符移动作为系统主资源程序,中断程序只进行按键读入,字符每移动一个点格就判断一次是否有新的按键按下,没有则继续执行此程序,有则跳转到相应程序,当然响应程序每隔一定语块也要加上按键判断语句,可以用循环完成,判断语句在循环末尾。
还有很多种用软件模拟扩展中断的方法,但都十分复杂。
问题是:一个程序暂停,还有其它程序在执行吗?主循环程序也暂停吗?
那就设置一个标志位,中断后,标志为1,再次中断,又恢复为0。
回主循环程序,如果标志位为1,就进入一个循环中,循环中只查这个标志位,为1就始终循环,相当于暂停一个程序。不为1,即为0就跳出循环,进入正常的程序,即继续那个程序。
当再次中断,标志位为0,主程序就继续了。
以上就是关于单片机的C语言中如何实现汇编中的中断程序,写哪里还有org这个伪指令可以在C中实现吗全部的内容,包括:单片机的C语言中如何实现汇编中的中断程序,写哪里还有org这个伪指令可以在C中实现吗、51单片机中断器汇编语言程序解释、单片机汇编的中断问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)