想和單片機高手一起討論下這個簡單串口中斷程序的問題所在!!!

lbf_78   2007-1-7 22:21 楼主
我編寫了一個串口中斷匯編程序,不復雜,調試也沒有出現問題,但是就是工作不了,我想和大家討論下究竟是什么錯誤導致它運行出錯~請大家幫忙...

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腳的電壓沒有改變,這到底是什么回事,大家有沒有看出我的程序到底哪里漏了什么或者錯了什么,請告訴我謝謝!@!!!!

回复评论 (12)

好像的你定时器没启动

#-_-
点赞  2007-1-8 08:52
你說是定時器2嗎?這個是沒有問題的。我之前嘗試把這個程序改成了沒有中斷,只有一個main,然后初始化之后直接進入send循環輸出10H,這樣串口調試軟件是能夠接受這個數據的。所以應該是不用啟動t2(setb et2)的;況且我也嘗試過機上setb t2這句,但是效果仍然是那樣,應該是其他地方出了問題。請再看看
点赞  2007-1-8 09:05
没加中断返回用的:RET/RETI
点赞  2007-1-8 09:07
另外就是你的定时器的工作方式了...
点赞  2007-1-8 09:14
首先我先說一下,那個定時器2是作為波特率發生器來用,而那幾段初始化t2的語句我之前所說的一樣,在另外一個程序可以很好的運行,那么證明了作為波特率發生器是沒有問題的;所以定時器2的工作方式我想,是我想,應該沒有問題;還有中斷返回所用的ret/reti,我這段程序是準備這樣的,如果單片機通過串口接收到一個字符,那么就從單片機的串行輸出不斷地輸出一個字符10H,因為是通過不斷的循環輸出,所以我并不準備使用中斷返回,所以就沒有加;現在問題是我從計算機串口輸出一個字符給單片機,它接收完了之后并不進入0023h這個串口中斷地址里面去執行checkit這段子程序,這就是問題的關鍵所在!
点赞  2007-1-8 09:28
不知你用的是不适51系列的单片机,不过我还是觉得应该启动t2,setb tr2
点赞  2007-1-8 09:47
我使用的是89s52單片機,可以呀,可以把t2啟動了也沒有關系,但是我是說加上setb tr2對整個程序也沒有多大幫忙,還是照樣不能進入中斷服務程序...但我會把setb tr2加上去。試試,謝謝
点赞  2007-1-8 10:26
会不会是进了别的中断,你没做处理,飞在那了...
点赞  2007-1-8 13:00
我问题解决了,呵呵谢谢大家
原来是
MOV T2CON,#00010100B
这里出了问题,应该改为00110100B才对,结贴...
点赞  2007-1-8 16:08
晕哈

你说在别处能通信上,就没怀疑你的配置了...
点赞  2007-1-8 17:10
进入死循环了
点赞  2010-5-25 11:59
51 的中断服务程序一定要用 RETI 返回的, 否则只有第一次可以响应, 后来的中断不会响应.

.......好像你的程序也没有什么逻辑......
点赞  2010-5-25 14:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复