单片机的C语言中如何实现汇编中的中断程序,写哪里还有org这个伪指令可以在C中实现吗

单片机的C语言中如何实现汇编中的中断程序,写哪里还有org这个伪指令可以在C中实现吗,第1张

如果是用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单片机中断器汇编语言程序解释、单片机汇编的中断问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9289122.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存