1)该程序每隔多少时间执行一次检测程序?是怎样安排达到的?
(2)定/计 0 及定/计 1 各在什么情况下溢出?列出您的计算。
(3)为程序作出注释。
0000H LJMP 0030H
;主程序
ORG 0030H
START: CLP T1
MOV TMOD,#51H
MOV IE,#8AH
MOV TH0,#0D8H
MOV TL0,#0F0H
MOV TH1,#0E8H
MOV TL1,#90H
SETB TB0
SETB TR1
…
…
;中断服务程序
ORG 000BH
LJMP 0080H
ORG 0080H
T0OV: SETB T1
MOV TH0,#0DBH
MOV TL0,#0F0H
CLR T1
RETI
ORG 001BH
LJMP 0090H
ORG 0090H
T1OV: MOV TH1,#0E8H
MOV TL1,#90H
…
…
;此起为检测程序
RETI
答案:
你这个程序里面好像有错误吧,CLP T1 什么意思?SETB TB0 什么意思?是不是抄错了?
不过,我看你程序的意思,可能是这样:
ORG 0000H
LJMP START
ORG 0030H
; 主程序
START: SETB P35 ;将P35置1
MOV TMOD,#51H ;设置T0为定时方式,T1为计数方式,都为模式1(16位定时/计数器)
MOV IE,#8AH ;允许中断,允许T0、T1中断
MOV TH0,#0D8H ;设置T0、T1定时和计数初值
MOV TL0,#0F0H
MOV TH1,#0E8H
MOV TL1,#90H
SETB TR0 ;启动T0、T1
SETB TR1
…
…
;中断服务程序
ORG 000BH ;T0溢出中断入口
LJMP T0OV
ORG 0080H
T0OV:
CLR P35 ;将P35清零,产生一个负跳变,T1计数器加1
MOV TH0,#0D8H ;重新载入T0定时初值
MOV TL0,#0F0H
SETB P35 ;恢复P35高电平
RETI ;中断返回
ORG 001BH ;T1溢出中断入口
LJMP T1OV
ORG 0090H
T1OV:
MOV TH1,#0E8H ;重新载入T1计数初值
MOV TL1,#90H
…
…
;此起为检测程序
RETI
需要说明的是:
fosc=12MHz,则一个机器周期=12/fosc=1(us)
T0工作在定时器方式下,每过1个机器周期定时器加1;T1工作在计数器模式下,当T1引脚即P35由1变0时计数器T1加1。
T0的定时初值为0D8F0H,所以定时时间为1us(2^16-0D8F0H)=10ms,每过10ms,T0溢出中断;T1的计数初值为0E890H,所以当T1引脚(P35)负跳变(2^16-0E890H)=6000次的时候,T1溢出中断。
察看整个程序可以得出结论:每当T0溢出中断一次(10ms),T1就计数1次,当T1计数6000次的时候,T1中断执行检测程序,也就是说,每隔10ms6000=1分钟执行一次检测程序。
请参考~~
声明:本试题内容来源于网络投稿,仅做交流使用,侵权必删,举报请发送邮件到
将计数值按二进制数在P1口驱动发光二极管显示出来,到15秒后,计数值清零再从0开始计。
--这些发光二极管,是低电平发光,还是高电平发光?
下面的程序,适合于低电平发光:
ORG 0000H
LJMP START
ORG 000BH
DEC A
MOV P1, A
RETI
ORG 0030H
START:
MOV TMOD, #16H
MOV TH0, #255
MOV TL0, #255
SETB TR0
SETB TR1
MOV IE, #82H
LOOP:
MOV A, #255
MOV P1, A
MOV R2, #240
WAIT:
MOV TH1, #HIGH(65536-62500)
MOV TL1, #LOW(65536-62500)
JNB TF1, $
CLR TF1
DJNZ R2, WAIT
SJMP LOOP
END
如果是高电平发光,可以使用下面的程序:
ORG 0000H
LJMP START
ORG 000BH
INC A
MOV P1, A
RETI
ORG 0030H
START:
MOV TMOD, #16H
MOV TH0, #255
MOV TL0, #255
SETB TR0
SETB TR1
MOV IE, #82H
LOOP:
CLR A
MOV P1, A
MOV R2, #240
WAIT:
MOV TH1, #HIGH(65536-62500)
MOV TL1, #LOW(65536-62500)
JNB TF1, $
CLR TF1
DJNZ R2, WAIT
SJMP LOOP
END
首先,你这样的写法是不对的,
ORG 001BH
AJMP sign0
这两句应该放到LJMP main后面,以免中间的字节占用到001B,那样就会出乱的。
第二、你的定时器0是用做中断吗?没看见你的中断入口。
第三、你的中断处理程序这样写是大忌:LJMP $ ;虚拟主程序,等待中断
中断处理程序不跳出去,除非是中断优先级更高的中断才能进来,而且这样做程序的流程更混乱
第四、你的p10取反在两个地方都写了,最好只在一秒处理里面写。
这是周期为20毫秒的程序,至于你说的频率333Hz,与前者冲突选用前者
#include<reg51h>
unsigned char cnt;
sbit pwm=P2^0;
void t0isr() interrupt 1
{
cnt++;
if(cnt<5)pwm=1;
else pwm=0;
if(cnt>=100)cnt=0;
}
main()
{
TMOD=0x02;
TH0=56;
TL0=56;
TR0=1;
ET0=1;
EA=1;
while(1);
}
回答你的问题之前先向介绍一下介绍两个概念,一个是PLC 一个是 FPGA,分别是可编程逻辑器件和现场可编程逻辑门阵列,这两种器件均能在一瞬间(或者时钟上升或下降沿)完成多个任务,可以说是并行执行的
单片机的运行虽然依靠于时序,但是由于内部集成了很多逻辑门(即有些功能是硬件实现的),所以有的时候可以一个周期完成很多功能。正如人不可以’一心两用‘,但却可以边d钢琴边唱歌,好像不太恰当,你可以体会一下。。。
1、每个机器周期都采样中断源,采样在一瞬间完成(就像译码器一样,输入已知,输出瞬间即可得到)
2、若开启顺序查询5个中断,也是同上在一瞬间完成
其实无论你开启多少个中断,他都是对所有的中断进行扫描,只是有的中断有效有的无效,相当于逻辑门的初始条件不一样而已所以你也可以想象内部的逻辑门阵列是多么的庞大
3、最后想问一个机器周期单片机可以执行多少种 *** 作?
对于51单片机一个机器周期包含12个时钟周期,最多执行一条指令,但是完成的 *** 作,在不同的状态下却是不同的比如定时器开启的时候,在某个机器周期TLx会只加1,如果TLx溢出,会有THx加1,TLx归0;如果THx只加后溢出,会导致定时器中断标志置位,同时THx归0;如果这个时候INT0引脚有个下降沿,也会导致外部中断标志置位。。。所以外设是可以在同一个周期有很多 *** 作(不需要cpu干预),但是cpu却只能应对某一特定情况执行相应的指令
以上就是关于单片机中每隔几小时进行一次检测一般怎么写全部的内容,包括:单片机中每隔几小时进行一次检测一般怎么写、急!51单片机定时计数器实验编程(汇编语言)、关于51单片机的汇编程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)