在汇编程序--8051代码中基于偏移量设置值的更简单方法

时间:2017-10-19 04:11:38

标签: assembly microcontroller uart 8051 baud-rate

我正在尝试发明以下使用更少时钟周期运行的代码的版本。这是因为我正在为两个8051芯片制作一个可靠的UART到数据转换器,因为它们都采用了串行端口。

理想情况下,我希望串口以38400bps或更高的速度运行,并且我计划以下列格式将数据作为每个传输16个字节:

Byte 1: x0h 
Byte 2: xrh
Byte 3: xrh
Byte 4: xsh
Byte 5: xsh
Byte 6: x5h
Byte 7: x6h
Byte 8: x7h
....
Byte 15: xEh
Byte 16: xFh

所以基本上每个字节中的高半字节是用户数据,低半字节是数据偏移,或者如果偏移足够低(但是高于0),那么它将包含发送器和接收器地址的半字节。最后,地址为1个字节(最多256个发送者和256个接收者)。

这是我到目前为止的代码,但运行它至少需要24个时钟周期,这可能会阻止我达到38400bps的速度。这是因为在8051上我使用了22.1184Mhz晶体(根据https://www.8051projects.net/wiki/8051_Software_UART_Tutorial),结果是根据计算结果:

1 bit time = (((crystal/baud)/12) - 5) / 2
= ((22118400/38400/12) - 5) / 2
= 21.5

但是,如果我删除等式中的-5部分,则数字为24.我想尝试使用更少的时钟周期来使用此代码。谁知道我能在这做什么?

  D equ P2 ;(high nibble is data)
  TXCT equ 30h ;transmit nibble counter
  ADDR1 equ 31h ;receiver address low nibble
  ADDR2 equ 32h ;receiver address high nibble
  ADDR3 equ 33h ;sender address low nibble
  ADDR4 equ 34h ;sender address high nibble

  orl D,#0F0h     ;allow incoming data
  mov A,D         ;and check it
  mov R5,TXCT     ;save count and use it as low nibble by default
  cjne R5,#1h,xt1
mov R5,ADDR1  ;replace low nibble of 2nd byte of data with ADDR1 nibble
sjmp xt4
  xt1:
  cjne R5,#2h,xt2
mov R5,ADDR2  ;replace low nibble of 3rd byte of data with ADDR2 nibble
  sjmp xt4
  xt2:
  cjne R5,#3h,xt3
    mov R5,ADDR3  ;replace low nibble of 4th byte of data with ADDR3 nibble
    sjmp xt4
  xt3:
  cjne R5,#4h,xt4
mov R5,ADDR4  ;replace low nibble of 5th byte of data with ADDR4 nibble
  xt4:
  anl A,#0F0h ;discard low nibble from port (we want user data)
  orl A,R5 ;add nibble
  CLR TI
  mov SBUF,A ;send to serial
  inc TXCT ;increment counter
  anl TXCT,#0Fh ;and set to 0 if it goes past 15
  jnb TI,$

0 个答案:

没有答案