我編寫了一個串口中斷匯編程序,不復雜,調試也沒有出現問題,但是就是工作不了,我想和大家討論下究竟是什么錯誤導致它運行出錯~請大家幫忙...
T2CON EQU 0C8H
T2MOD EQU 0C9H
TR2 BIT T2CON.2
RCAP2L EQU 0CAH
RCAP2H EQU 0CBH
TH2 EQU 0CDH
TL2 EQU 0CCH
ET2 BIT IE.5 ;以上為定義
ORG 0000H ;MAIN入口地址
LJMP MAIN
ORG 0023H ;串口中斷地址
LJMP CHECKIT
ORG 30H
MAIN:
MOV SCON,#01010000B ;串口工作在方式1,允許串口接受(REN=1)
MOV R0,#10H
MOV T2CON,#00010100B
MOV T2MOD,#00000000B
MOV RCAP2H,#0FFH
MOV RCAP2L,#0D9H
MOV TH2,RCAP2H
MOV TL2,RCAP2L ;以上為利用T2作為串口波特率發生器的設置,波特率為9600
SETB EA ;開總中斷
SETB ES ;開串口中斷
SJMP $ ;循環等待
ORG 100H
CHECKIT: ;串口中斷轉入的中斷子程序
JNB RI,$ ;查詢接收完畢沒有,當RI=1時向下執行
CLR RI ;清除RI(接收中斷標志位)
SJMP SEND ;轉入到發送子程序
SEND:
MOV SBUF,R0 ;把R0=10H由串口發送出去
JNB TI,$ ;等待發送完成
CLR TI ;清除發送中斷標志位
SJMP SEND ;轉回到SAND子程序繼續執行,目的是不斷地從串口輸出數據
END ;結束
以上就是我的程序和注解,調試方面已經通過,燒到單片機里面發現,當我從用串口調試軟件從串口輸出一個數后,單片機進入不了中斷子程序CHECKIT,因為我嘗試在子程序中加上一個CPL P1.2發現P1.2腳的電壓沒有改變,這到底是什么回事,大家有沒有看出我的程序到底哪里漏了什么或者錯了什么,請告訴我謝謝!@!!!!
你說是定時器2嗎?這個是沒有問題的。我之前嘗試把這個程序改成了沒有中斷,只有一個main,然后初始化之后直接進入send循環輸出10H,這樣串口調試軟件是能夠接受這個數據的。所以應該是不用啟動t2(setb et2)的;況且我也嘗試過機上setb t2這句,但是效果仍然是那樣,應該是其他地方出了問題。請再看看
首先我先說一下,那個定時器2是作為波特率發生器來用,而那幾段初始化t2的語句我之前所說的一樣,在另外一個程序可以很好的運行,那么證明了作為波特率發生器是沒有問題的;所以定時器2的工作方式我想,是我想,應該沒有問題;還有中斷返回所用的ret/reti,我這段程序是準備這樣的,如果單片機通過串口接收到一個字符,那么就從單片機的串行輸出不斷地輸出一個字符10H,因為是通過不斷的循環輸出,所以我并不準備使用中斷返回,所以就沒有加;現在問題是我從計算機串口輸出一個字符給單片機,它接收完了之后并不進入0023h這個串口中斷地址里面去執行checkit這段子程序,這就是問題的關鍵所在!
不知你用的是不适51系列的单片机,不过我还是觉得应该启动t2,setb tr2
我使用的是89s52單片機,可以呀,可以把t2啟動了也沒有關系,但是我是說加上setb tr2對整個程序也沒有多大幫忙,還是照樣不能進入中斷服務程序...但我會把setb tr2加上去。試試,謝謝
我问题解决了,呵呵谢谢大家
原来是
MOV T2CON,#00010100B
这里出了问题,应该改为00110100B才对,结贴...
晕哈
你说在别处能通信上,就没怀疑你的配置了...
51 的中断服务程序一定要用 RETI 返回的, 否则只有第一次可以响应, 后来的中断不会响应.
.......好像你的程序也没有什么逻辑......