要求:通过检测一个脉冲信号的间隔时间(例如300秒)来给电路做一个通断的电子信号。
如脉冲为0101010101.......时,电路处于通路状态;
当脉冲为0000000000...或者111111111...时,程序给出一个中断信号实现电路断开。
问题补充:单片机使用C51,脉冲周期240/分
悬赏分:20 - 解决时间:2009-11-16 18:15
;--------------------------------------------------------
最佳答案:
通过“百度Hi”与提问者进行交流,了解到一些细节如下:
1. 脉冲信号是大约每隔 200ms 来一个,基本上是方波。
2. 信号0、1、0、1不停的变化,说明是“通”,一旦不变,就是“断”。
3.“断”持续了约300秒,再输出“断”的信号。
4. 一旦检测到脉冲的变化,就立即取反“断”的信号。
设计思路:
1. 每隔200ms检测一次,每秒约5次,如果持续1500次没有发现脉冲信号的变化,就应该输出“断”的信号。
2. 1500次的计数,可以使用DPTR。
3. 一旦收到脉冲信号,立即输出“通”的信号,并将计数清零。
;----------------------
程序如下:
ORG 0000H
SJMP START
ORG 0050H
START:
SETB P1.0 ;准备输入脉冲
SETB P1.1 ;1: 代表关断
MOV DPTR, #0 ;用DPTR 统计, 是否1500次
CLR PSW.5 ;上次输入暂时存放值
MOV 20H, #0 ;20H.0, 上次输入的脉冲值
LOOP:
CALL DELAY100MS ;延时200ms
CALL DELAY100MS
MOV C, PSW.5 ;把上次的脉冲值
MOV 20H.0, C ;送到20H
CLR A
MOV C, P1.0 ;输入新脉冲
MOV PSW.5, C ;暂存
MOV ACC.0, C ;并送到A
XRL A, 20H ;和上次数据相 异或
JNZ TONG ;非0, 即两者不同, 转移到"通"
DUAN:
INC DPTR ;发现了一次"断",计数值加一
CLR C
MOV A, #0DBH ;用1499去减次数
SUBB A, DPL
MOV A, #05H
SUBB A, DPH
JNC TONG_2 ;无借位, 就是不到1500次
SETB P1.1 ;否则输出"断"的信号
MOV DPTR, #1500 ;并令DPTR定格为1500
SJMP LOOP ;继续去检测
TONG:
MOV DPTR, #0 ;从0开始统计
TONG_2:
CLR P1.1 ;输出"通"的信号
SJMP LOOP ;继续去检测
;----------------------
DELAY100MS: ;延时100605T, 约为
MOV R7, #200 ;1T
MOV R6, #250 ;1T
DJNZ R6, $ ;2T, 原地转移250遍, 共用500T
DJNZ R7, $ - 4 ;2T, (1+500+2)*200=100600T
RET ;2T, 1+100600+2=100603T
END
;--------------------------------------------------------
回答者: 做而论道 - 十级 2009-11-16 18:13
原文网址:http://zhidao.baidu.com/question/125766059.html
;--------------------------------------------------------
后记:
后来通过“百度Hi”与提问者进行交流,对方又提出了一些改进意见。
经过修改,本博文现在发表的程序可以正常使用。