单片机的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中有此中断源)

好了,以上是我找的一个实例,希望对你有帮助!

interrupt 后面的数字简单的说就是中断服务函数的代号

0代表外中断0

1代表定时计数器0中断

2代表外中断1

3代表定时计数器1中断

4代表串行口中断

所以interrupt 1代表定时计数器产生中断后就转到这个函数里面执行

using 后面的数字是个工作寄存器的代号,也就是R0—R7。如果不写的话由系统自动分配,一般不用去理会

晕,你不会这样设计你的程序吧你不会在中断中停留1S的时间吧

教你个方法,你的中断应该是设置的20ms吧即T0的溢出时间设置为20ms,在T0中断程序里设一个计数器,从1自增到50后归0,也就是用设计标记的方法来计时1S,到了1S就执行你要的内容就行了

中断程序不用你设置退出,执行完了它自己退出的

#include<stch>

sbit

d1=P2^0;

sbit

p1=P2^1;

void

main()

{

方式一;

}

void

main()

{

EA=1;

EX0=1;

IT0=1;

方式二;

}

void

main()

{

EA=1;

EX1=1;

IT0=1;

方式三;

}

void

zd0()

interrupt

0

{

d1=0;

}

void

zd1()

interrupt

1

{

p1=0;

}

用的是外部中断0和1,程序很简单,注释就不写了。如果有错误的话,还请指正。

void functionName() interrupt 1 //using 2

类型固定为void即无返回值

中断函数名functionName只要是合法标识,不与已有的函数重名即可,且函数固定无参数

interrupt为关键字,表明当前是一个中断函数,不需要被主函数直接或间接调用,也会编译连接进程序中,一般的非中断函数如果未被主函数直接或间接调用,也不被中断函数直接或间接调用,则不会链接进程序最终代码

interrupt后的数字表明是中断号几,单片机中 51系列的有0 1 2 3 4 等几个中断, 52系列的中断可能到了7或8 中断号与中断事件是绑定的,不能随便设置,对应的中断向量会指向这个函数入口地址

可选的using N 表示中断中使用第几个寄存器组

以上就是关于单片机的C语言中如何实现汇编中的中断程序,写哪里还有org这个伪指令可以在C中实现吗全部的内容,包括:单片机的C语言中如何实现汇编中的中断程序,写哪里还有org这个伪指令可以在C中实现吗、用keil51编译器编写的单片机C语言中断程序void Time0(void) interrupt 1 using 0中各个数字代表什么含义、在单片机C语言编程中断中如何退出中断等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存