?? at89c2051.asm
字號:
;模擬串行通訊程序
io_rxd equ p3.2 ;模擬rxd,中斷接收
io_txd equ p1.0 ;模擬txd
ar_sbuf equ 7eh ;模擬串行接收存儲單元
at_sbuf equ 7fh ;模擬串行發送存儲單元
a_ri bit 0 ;模擬串行接收標志位,a_ri="1",表示已接收新數據
a_ti bit 1 ;模擬串行發送標志位,a_ti="1",表示已發送新數據
org 0000h
ljmp start ;復位入口
org 0003h
ljmp a_asi ;模擬串行接收中斷入口
org 0030h
start: mov sp,#30h
setb px0 ;置模擬串行接收(int0)最高級中斷
setb ex0 ;允許int0中斷
setb ea ;總中斷允許
;......
main:
;......
mov at_sbuf,#0 ;將要發送的數據存入at_sbuf
lcall a_aso ;調模擬串行發送子程序
;......
ljmp main
;模擬串行接收中斷程序
a_asi: push psw ;psw保護入棧
push acc ;acc保護入棧
setb rs0 ;更換工作寄存器組
setb rs1 ;或使用其它未被使用的工作寄存器組
mov r7,#8 ;接收8位數據位
;接收起始位
lcall a_delay05t ;調1/2位周期延時子程序
lcall a_test_bit ;調邏輯檢測子程序
jnc a_asi2 ;起始位正確轉a_asi2,起始位邏輯應為“0”
;程序返回出口
a_asi1: pop acc ;acc保護出棧
pop psw ;psw保護出棧
reti ;開中斷返回
;接收8位數據位
a_asi2: lcall a_delay10t ;調位周期延時子程序
lcall a_test_bit ;調邏輯檢測子程序
rrc a ;數據位暫存于累加器中
djnz r7,a_asi2 ;8位數據未接收完循環至a_asi2
;接收終止位
lcall a_delay10t ;調位周期延時子程序
lcall a_test_bit ;調邏輯檢測子程序
jnc a_asi1 ;終止位不正確轉a_asi1
setb a_ri ;模擬串行接收標志位a_ri置位
mov ar_sbuf,a ;8位接收數據存入模擬串行接收存儲器ar_sbuf
sjmp a_asi1 ;轉中斷出口返回
;模擬串行發送子程序
a_aso: clr ea ;禁止所有中斷
a_aso1: mov r4,#9 ;8位數據+1位終止位
clr io_txd ;模擬串口輸出邏輯"0",輸出起始位
nop
mov a,at_sbuf ;模擬發送數據存儲器內容送累加器
setb c ;終止位在c中,置終止位
a_aso2: lcall a_delay10t1 ;調位周期延時子程序
rrc a ;取發送邏輯至c中
mov io_txd,c ;由模擬串行口發送
djnz r4,a_aso2 ;未發送完循環至a_aso2
lcall a_delay10t1 ;調位周期延時子程序
setb a_ti ;模擬串新接收標志位置位
setb ea ;開中斷
ret ;返回
;模擬串行接收邏輯檢測子程序,三取二
a_test_bit: jb io_rxd,a_test_bit1 ;第1次檢測為“1”,轉a_test_bit1
jnb io_rxd,a_test_bitl ;兩次檢測都為“0”,轉a_test_bitl
jb io_rxd,a_test_bith ;第3次檢測為"1",轉a_test_bith
a_test_bitl:clr c ;檢測邏輯在c中,c清零
ret ;返回
a_test_bit1:jb io_rxd,a_test_bith ;兩次檢測都為“1”,轉a_test_bith
jnb io_rxd,a_test_bitl ;第3次檢測為"0",轉a_test_bitl
a_test_bith:setb c ;檢測邏輯在c中,c置位
ret ;返回
;模擬串行通訊程序延時子程序
;時鐘頻率=11.0592MHz,波特率=9600pbs
A_DELAY05T: MOV R5,#12
A_DELAY05T1:DJNZ R5,$
RET
A_DELAY10T: MOV R5,#38
NOP
SJMP A_DELAY05T1
A_DELAY10T1:MOV R5,#42
SJMP A_DELAY05T1
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -