首页 > 解决方案 > 使用定时器在正确的时间发送和接收保证位 - 8051

问题描述

不知道如何写标题,但这是我的问题。

我正在制作激光标签,目前每件背心都有多个生命值。在代码中,我称之为流。

我想做的是在玩游戏时:

  1. 每件背心都会扫描其流或命中点,以查看是否即将开始尝试射击。一旦检测到镜头的第一位,则暂停流扫描,直到镜头的所有位都已到达。然后用另一个常数值扫描该值,以确定镜头是否合法,或者是否有一些噪音进入系统,在这种情况下,镜头无效并被忽略。

  2. 每件背心都会有一个功能,从 1 到最大玩家数量不断地遍历每个数字。就我个人而言,我不在乎数字是前进还是后退或以任何方式,只要每个球员的数字都得到持续处理。

  3. 外部引脚将定义玩家何时准备好投篮。在函数将号码设置为同一玩家之前,不会发生击球(传输)。然后所有数据一次全部传输出去,然后拍摄完成。

到目前为止,这是我的代码:

  TXDP equ P3.1 ;pin to output data on
  LCTR equ 30h ;data selector counter
  MYDATA equ 31h ;data to send out
  LI1 equ P3.5 ;bit to select data
  LI2 equ P3.5 ;bit to select data

  timer_interrupt:
    ;Save registers
    push ACC
    push PSW
    ;R7 = player# from 1 to MAX
    djnz R7,notstart
      mov R7,#MAX
    notstart:
    ;Send out my data one bit at a time
    ;if current player number is me
    cjne R7,#ME,notme
      mov A,MYDATA
        jz nodato 
          ;As data is sent, 0's fill in and MYDATA eventually becomes 0.
          clr C
          rrc A
          mov MYDATA,A
          mov TXDP,C
        nodato:
    notme:
    ;Start the receiving process if flag is set
    jnb STARTB,rcvst
      ;?? something needs to go here ??
      clr STARTB
      ;?? and here ??
      sjmp exittimer
    rcvst:
    ;At this point we move on to the next stream
    acall selectnextstream  
    ;And see if there is incoming data
    jb RCVP,norcv
      ;there is, so set the flag
      setb STARTB
    norcv:
    exittimer:
    ;restore registers
    pop PSW
    pop ACC
  reti

  selectnextstream:
    inc LCTR
    mov A,LCTR
    rrc A
    mov LI1,C
    rrc A
    mov LI2,C
  ret

我最大的问题是让#3 成功工作。

问题是不能在球员号码匹配时开始射门,然后在系统设置下一个球员号码时结束射门,因为如果每个人都想射门,就会同时发生两次射门。

我不能同时发生两个或多个镜头,因为它会搞砸接收器。

此外,我使用大量位进行数据 I/O 的原因是因为我想创建数据保证。定义它的最佳方法更像是键去抖动(如果您按下按钮,该值直到很长时间后才会被识别)。

因此,我正在考虑创建一个这样的字节来不断发送,而不是位:

01111110

对于接收方,期望这些值中的任何一个都有资格获得有效的击球:

00011000
00111100
01111110

但这些都是例子。

另外,由于激光的速度限制,我不能使用 UART 进行数据交换。

我可以在我的代码中做些什么来解决这个问题?

标签: assemblybytesignals8051debouncing

解决方案


推荐阅读