代码之家  ›  专栏  ›  技术社区  ›  Mike -- No longer here

使用定时器-8051在正确的时间发送和接收保证位

  •  0
  • Mike -- No longer here  · 技术社区  · 6 年前

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

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

    2. 每件背心都有一个功能,可以不断地通过从1到最大玩家数的每个数字。就我个人而言,我不在乎数字是向前还是向后,或者以任何方式,只要每个球员的数字是在一个恒定的基础上处理的。

    3. 一个外部pin将定义玩家何时准备好投篮。只有在函数将数字设置为同一玩家时,才能进行放炮(传输)。然后所有数据一次全部传输出去,然后拍摄完成。

      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进行数据交换。

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

    0 回复  |  直到 6 年前