STC12C2052のシリアル通信について挑戦してみました。
シリアル通信は簡単にできそうと思ったのですが、ちょっと苦戦してしまいました。
ボーレートを簡単に設定するためには、水晶発振子をぴったしの分周発振周波数にすることですが、まず、水晶発振に切り替えすることができませんでした。
RC内部発振から外付け水晶発振にするには、前回使用しているダウンロードソフトstcgalでは、デバイスが対象外になっておりコマンドでの変更ができません。メーカーからのダウンロードソフトSTC-ISPですが、うわさどうり、セキュリティーソフトで疑わしいソフトとして警告を受けてしまいました^^;
ちょっとリスクをあるのでためらってしまいます^^;
STC-ISPがセキュリティーソフトではじかれるので、外部水晶発振は断念しました^^
RC内部発振 で行くことにします。
RC内部発振では、発振周波数が、stcgalを実行すると Target frequency: 5.762MHzと表示がでています。
この周波数から最適なボーレートを探す必要があります。
8051オリジナルでは、原発振の12クロックを1マシンサイクルとしてタイマ回路につなぎます。STC12C2052では、レジスタを設定することにより1クロックを1マシンサイクルとみなしてタイマ回路に送ることができます。
この設定は、AUXRレジスタ(0x8e)のB7(T0x12)及びB6(T1x12)で切り替えます。シリアル通信では T1タイマーを使用するのでB6 (T1x12) の設定を変えればいいことになります。
0:12クロック 1:1クロックです。
今回は T0,T1とも 1クロック設定としました。
AUXR .equ 0x8e
mov AUXR, #0xc0 ;SYSCLK/1 timer0 or timer1 clock souce
タイマーはシリアル通信では8bitAuto-Reload機能を使うことが一番簡単といことで、この機能を使用します。この機能はモード2という設定になります。
タイマーのモード設定は、TMODレジスタ(0x89)で上位4ビットがタイマ1、下位4ビットがタイマ0の設定になります。タイマ1を使用するのでモード2に設定します。
mov TMOD, #0x20 ;Set Timer 1 as mode2(8bit auto reload)
シリアル回路ではタイマーからのクロックをさらに16分周して、ボーレートとしています。さらにデフォルトでは1/2の設定になっているので結果的に32分周することになります。デフォルトの1/2を1/1に設定するにはPCONレジスタ(0x87)のSMOD(B7)を1に設定することで、DoubleBandの1/1となり 16分周で済みます。今回は PCON の設定はデフォルトのままですので32分周となります。
以上の情報からいろいろ計算した結果2400bpsが一番近い分周比になりました。タイマの分周値の計算は次の通りです。
タイマーの分周値=5762000/32/2400=75.026となり ほぼ75分周になります。
タイマーはカウントアップしてオーバーフローすれば、カウント値を再読み込みしカウントアップを繰り返します。
したがって、タイマーの設定は256-75=181 となり、16進では 0xb5となります。
実際のカウント値の設定は、TH1及びTL1に設定します。
mov a, #0xb5
mov TH1, a
mov TL1, a
シリアル回路の動作モードは4種類あり。今回は8ビットUARTを選択しました。モード1の選択となります。モード設定はSCONレジスタ(0x98)で設定します。 モード1設定はSM0(B7)=0,SM1(B6)=1をセットします。 また、シリアル回路の受信を有効にするために、REN(B4)を1にセットします。
mov SCON, #0x50 ;set UART as mode1 or Receive activity
送受信方式は、ポーリング方式で、受信フラグ(RI=SCON(B0))及び送信フラグ(TI=SCON(B1))を常にチェックする方式です。
なお、チェックフラグ RI,TIは手動でクリアする必要があります。
入出力するデータは、SBUF(0x99)にセットされます。
1文字入力、1文字出力は次ようになりました。
getchar:
clr ri
jnb ri, .
mov a, SBUF
ret
putchar:
clr ti
mov SBUF, a
jnb ti, .
ret
なお、 jmp ri, . は loop: jmp ri, loop と同じです
回路は、リセット回路をデータシートに記載された回路にしました。
また、P1.0とP1.1のジョンパーは1Kに変更しました。

下記のプログラムは、シリアル端末にメッセージを出力したのち、>の後、入力された文字をエコーバックします。
ボーレートは2400bps、8N1設定です。
; STC12C2052 Serial communication by Pinecone 2019/11/18
;
; STC12C2052 cpu
; Flash ROM 2Kbyte
; RAM 256byte
; External clock -
; assembler
; program start 000H 0000H-07ffH
; main 100H
;
; assemblers ASxxxx and ASlink V5.31
; file name 2052_serial01.asm
; $ as8051 -l -s -o 2052_serial01.asm
; $ aslink -i 2052_serial01
; $ program download stcgl 2052_serial01.ixh
;
AUXR .equ 0x8e
.area TEST(ABS)
.org 0x0000
ljmp main
.org 0x0100
main:
mov sp, #0x3f
mov AUXR, #0xc0 ;SYSCLK/1 timer0 or timer1 clock souce
mov SCON, #0x50 ;set UART as mode1 or Receive activity
mov TMOD, #0x20 ;Set Timer 1 as mode2(8bit auto reload)
mov a, #0xb5 ;Timer 1 count set (256-75=181:0xb5)
mov TH1, a
mov TL1, a
setb TR1 ;Timer 1 start running
mov DPTR, #start_msg
lcall msgout
mov a, #'>
lcall putchar
loop:
lcall getchar
lcall putchar
sjmp loop
msgout:
clr a
movc a, @A+DPTR
jz msgout_end
inc DPTR
lcall putchar
sjmp msgout
msgout_end:
ret
getchar:
clr ri
jnb ri, .
mov a, SBUF
ret
putchar:
clr ti
mov SBUF, a
jnb ti, .
ret
start_msg:
.str "STC12C2052 Uart communication Test !"
.db 0x0d,0x0a,0x00
.end