单片机定时器中断实验 程序(汇编语言)不要c语言的

单片机定时器中断实验 程序(汇编语言)不要c语言的,第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 ;完

以单片机,51系列,外中断0为例

BZHI BIT 00H ;中断标志

JISHU EQU 30H ;计数器

ORG 0000H

START: AJMP MAIN

ORG 0003H

AJMP WZD0 ;转移到真正外中断服务程序入口

ORG 0040H

MAIN: MOV SP,#5FH ;预置栈指针

MOV IE,#81H ;开外中断0允许

DENGD: JNB BZHI,$ ;未见到外中断,等待

CLR BZHI ;清除标志,为下次准备

MOV A,JISHU ;取计数值

ACALL DISPL ;将A值送显示,具体内容由你所使用的硬件决定

AJMP DENGD ;返回等待

;==== 外中断0服务程序

WZD0: SETB BZHI ;设标志

INC JISHU ;计数器加一

RETI ;退出中断服务程序

;==== 将计数值(即中断次数)送显示,完成所定任务

DISPL:

;具体指令由所用硬件决定

RET

你的意思是不是怎么用C语言实现汇编中的中断?

汇编中的中断是通过在中断向量表中对应位置的一条跳转指令跳到中断程序来实现中断的;而C语言也是差不多,只不过C语言的中断函数要用一个特殊的关键字去标明它,比如“#pragma

interrupt_handler

int_function()",当然,每一种编译器可能都不一样;这是中断函数与普通函数的区别。当然编译器碰到一个有这样关键字的函数时就知道它是中断函数,就会把这个函数的入口地址放到中断向量表中对应的位置去。当中断来的时候,这样就能跳到中断里面执行中断程序了。

在Windows下开关中断指令属于特权指令,就算内嵌了也不会被执行的。

DOS下的话CLI是关中断,STI是开中断要实模式下的DOS,虚拟的DOS(就是Windows下的那个DOS窗口)还是会被Windows屏蔽掉。

#include<stdioh>

void main()

{

int a=2;

__asm{

lea eax,a

shl [eax],2

}

printf("a=%d\n",a);

}

扩展资料:

嵌 入式系统是基于特定用途的 , 以计算机技术为基础 ,其软硬件具备良好可裁剪性的专用计算机系统,适用于对功能、可靠性、成本、体积、 功耗有严格要 求的场合。它一般由嵌入式微处理器、 外围硬件设备、嵌入式 *** 作系统以及用户应用程序四个部分组成。从 20 世纪 60年代中期集成电路诞生至今,嵌入式系统应用已经有接近 40 年的发展历史。

通常来说,嵌入式系统具备以下特点:

(1)体积小,重量轻。

(2)结构简单、功耗低、可靠性高。

(3)便于规模化生产、价格相对低廉。

(4)模块化、芯片化。

(5)强调量身定做的原则。

参考资料来源:百度百科-嵌入式编译程序

INT_0: MOV P0,#11111111B

ACALL T05S

MOV P0,#11111110B

ACALL T05S

MOV P0,#11111111B

ACALL T05S

MOV P0,#11111110B

ACALL T05S

MOV P0,#11111111B

CLR A

PUSH ACC

PUSH ACC

RETI

这里你用了两个push,然后没有pop,每次经过这里sp都会增加2,那么reti就无法根据sp指向的ram地址保存的值返回到原来的位置了。一般push是在一进入中断时将acc和psw压栈保护现场,reti之前出栈还原现场的,你在reti之前用两个push是完全不需要的。

以上就是关于单片机定时器中断实验 程序(汇编语言)不要c语言的全部的内容,包括:单片机定时器中断实验 程序(汇编语言)不要c语言的、汇编编程,中断程序,并显示中断次数!、汇编中的中断c语言用什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9340664.html

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

发表评论

登录后才能评论

评论列表(0条)

保存