參考資訊:
http://plit.de/asem-51/
http://www.stcisp.com/stcisp620_off.html
https://sourceforge.net/projects/mcu8051ide/
https://www.solitontech.com/uart-protocol-validation-service/
由於STC15W104沒有UART功能,因此,司徒只好先使用I/O Toggle的方式製作UART TX,TX比較簡單,只要把時間算好,基本上沒有太大問題,唯一要注意的是,最好不要超過3%的誤差,加上STC15W104的石英震盪器是使用內部RC元件,難免會有誤差,建議不要用太快的RC頻率,目前司徒使用RC 11.0592MHz,UART Baudrate則是57600bps,格式為N,8,1,過程說明如下
UART傳輸協定
57600bps每個bit時間為:1/57600 = 17.361us
main.s
uart_tx .equ p3.1 .org 0h jmp _start .org 100h _start: setb uart_tx main: mov a, #55h call uart_send_byte call delay_1s jmp main ; 57600,N,8,1 uart_send_byte: mov r6, #8 clr uart_tx call delay_16us u0: rrc a jc u1 clr uart_tx sjmp u2 u1: setb uart_tx u2: call delay_16us djnz r6, u0 setb uart_tx call delay_16us ret ; 1t + ((1t + (4t * 250) + 4t) * 200t) + 4t = 201005t ; 11.0592MHz = 0.09042us ; 201005t * 0.09042us = 18175us delay_18ms: mov r7, #200 d0: mov r6, #250 d1: djnz r6, d1 djnz r7, d0 ret ; 1t + ((4t + 201005t + 4t) * 55) + 4t = 11055720t ; 11055720t * 0.09042us = 999658us ~= 1s delay_1s: mov r5, #55 d2: call delay_18ms djnz r5, d2 ret ; 1t + (4t * 44) = 177t ; 11.0592MHz = 0.09042us ; 177t * 0.09042 = 16.00434us ; uart_send_byte body ~= 1.62756us ; ; 57600bps = 17.361us (16.00434+1.62756 = 17.63190us) delay_16us: mov r5, #44 d3: djnz r5, d3 ret .end
編譯
$ mcu8051ide --compile main.s
完成