我正在尝试发明以下使用更少时钟周期运行的代码的版本。这是因为我正在为两个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,$