標(biāo)題: 51單片機P1并口通訊,中斷問題,匯編程序問題請教 [打印本頁]

作者: lyonkon    時間: 2022-4-25 08:30
標(biāo)題: 51單片機P1并口通訊,中斷問題,匯編程序問題請教

現(xiàn)象是從機不開中斷,發(fā)送應(yīng)答信號給主機就能顯示。從機開中斷情況下不知道是不 顯示還是亂碼
單片機主機程序如下:
//*主機程序


//主機中斷初始化           
//INT0接收從機數(shù)據(jù)中斷申請          標(biāo)志位IE0                   從機P3.4引腳
//INT1接收從機應(yīng)答                          標(biāo)志位IE1                        從機P3.5引腳
//主機P3.4發(fā)送從機數(shù)據(jù)中斷申請          低電平有效
//主機P3.5發(fā)送從機應(yīng)答                          低電平有效
SETB        EX0                //INT0中斷開
SETB        IT0                //INT0低電平方式觸發(fā)中斷
SETB        PX0                //INT0高優(yōu)先
SETB        EX1                //INT1中斷開
SETB        IT1                //INT1低電平方式觸發(fā)中斷
CLR        PX1                        //INT1低優(yōu)先
SETB        EA                //中斷開
LJMP        MAIN
MAIN:

        PUSH        ACC
        MOV        R7,#0X0F           //D1循環(huán)16次
        MOV        A,#0X41                   //字符A準(zhǔn)備送IO口
D1:        MOV        P1,A                   //字符A送p1口
        CLR        P3.5                   //申請從機中斷int1
        JNB        IE1,$                   //從機響應(yīng)信號
        SETB        P3.5
        CLR        IE1                           //IE標(biāo)志位是否需要手動清除
        INC        A                           //A加1成字符b
        DJNZ        R7,D1
        POP        ACC
        sjmp        $
end


從機程序如下:
//*從機程序


//從機中斷初始化           
//INT0接收主機數(shù)據(jù)中斷申請          標(biāo)志位IE0                 主機P3.4引腳
//INT1接收主機應(yīng)答                          標(biāo)志位IE1                 主機P3.5引腳
//P3.4發(fā)送主機數(shù)據(jù)中斷申請          低電平有效
//P3.5發(fā)送主機應(yīng)答                          低電平有效
SETB        EX0                //INT0中斷開
SETB        IT0                //INT0低電平方式觸發(fā)中斷
SETB        PX0                //INT0高優(yōu)先
SETB        EX1                //INT1中斷開
SETB        IT1                //INT1低電平方式觸發(fā)中斷
CLR        PX1                        //INT1低優(yōu)先
SETB        EA                //中斷開
LJMP        MAIN


WRCMD:                                                                                   //寫指令子程序
push        ACC                    
lcall        READ12864BF
POP        ACC                    
MOV        A,R3
MOV        DPTR,#009000H                  //lcd寫指令地址 9000H
MOVX        @DPTR,A
RET
WRDAT:                                        //寫數(shù)據(jù)子程序      
push        ACC         
lcall        READ12864BF
POP        ACC        
MOV        A,R4
MOV        DPTR,#00B000H                  //lcd寫寫數(shù)據(jù)地址        B000H
MOVX        @DPTR,A               
RET
INIT:                                                                                  //lcd初始化程序
MOV                R3,#0X38               
LCALL        WRCMD
MOV                R3,#0X38                     
LCALL        WRCMD
MOV                R3,#0X0c                       
LCALL        WRCMD            
MOV                R3,#0X06
LCALL        WRCMD              
MOV                R3,#0X01                       
LCALL        WRCMD
RET
MAIN:                                         //主程序                     
            LCALL  INIT
Q1:                MOV R3,#0x80            //R3是lcd1602顯示地址入口
                        MOV        R7,#0X0F             //Q2循環(huán)次數(shù)
Q2:                        
                        JNB        IE1,$                        //接收主機中斷申請
                        MOV        R4,P1                   //R4是lcd1602顯示內(nèi)容數(shù)據(jù)入口,將主機發(fā)送到P1的值傳到R4
                          CLR        P3.5                   //發(fā)送應(yīng)答信號
                        CLR        IE1
                        SETB        P3.5
                        LCALL        WRDAT
                        DJNZ        R7,Q2
                        CLR        EA
                        SJMP        $
READ12864BF:                         //lcd判斷忙子程序
MOV        DPTR,#0XD000           //lcd讀指令地址          D000H
MOVX        A,@DPTR         
JB        ACC.7,READ12864BF
ret
END      

作者: yzwzfyz    時間: 2022-4-25 09:04
1、寫程序要養(yǎng)成一個好的習(xí)慣,畫出邏輯框圖。你試試看。
2、電平觸發(fā)中斷,有個特點:當(dāng)有效觸發(fā)電平成立時,比它低級的中斷,是無法得到響應(yīng)的。
3、RET與RETI是有區(qū)別的。
在指令的執(zhí)行上你看不出來,兩者都能返回到程序的斷點處。
區(qū)別是,RETI會交出中斷控制權(quán),進行下一個中斷的識別!
而你的程序中沒有RETI,所以中斷中能響應(yīng)一次最高級的(低級的會被高級的搶到),然會就被它一直霸占住中斷資源。導(dǎo)致不再中斷。
4、檢查程序、即中斷入口是否正確(編譯完成后,看一下地址:RESET、INT0、INT1)。
作者: Y_G_G    時間: 2022-4-25 12:11
不是打擊你
這個代碼簡單是亂得像個什么一樣,單片機基礎(chǔ)差得太多了,你還要多看一下單片機基礎(chǔ),再來玩這種東西吧
1,整個程序沒有一個ORG指令,匯編代碼直接就在復(fù)位的000H開始執(zhí)行了,接下來就直接進入中斷
2,整個程序沒有一個RETI指令,進入中斷之后沒有一個中斷返回指令,不知道你是分不清RET和RETI的區(qū)別,還是真的就不知道中斷是怎么執(zhí)行的?
3,中斷沒有一個現(xiàn)場保護,PSW寄存器都沒有出現(xiàn)過,8051匯編中,PSW是一個很重要寄存器
要行萬里,你得始于足下,走路都還不走不順,竟然一天到晚研究著在天上怎么飛
作者: lyonkon    時間: 2022-4-25 14:01
如樓上二位所說,是從機程序占用了中斷地址。主機沒有占用到所以能跑
從機程序開頭加上ORG 0000H
                          ORG 0030H
                          LJMP MAIN
從機也跑起來了。謝謝兩位老師
因為是中斷標(biāo)志位查詢,中斷電平是程序撤銷的,沒有用到中斷子程序,所以沒有使用RETI
作者: Y_G_G    時間: 2022-4-25 20:42
lyonkon 發(fā)表于 2022-4-25 14:01
如樓上二位所說,是從機程序占用了中斷地址。主機沒有占用到所以能跑
從機程序開頭加上ORG 0000H
        ...

大哥你就別再折騰這玩意了,我看著都累,但我無聊,也就跟著看看熱鬧
但凡是有中斷的,必須要用到RETI執(zhí)行中斷返回,這是8051單片機基礎(chǔ)知識
你已經(jīng)開了中斷了,中斷被觸發(fā)之后,程序必然是要進行中斷子程序的,之后是一定要用到RETI執(zhí)行返回的
你連這都不知道,還玩什么匯編呀
雖然并不是你不用RETI的話,你的程序就一定不能執(zhí)行,它有一定有概率是可以正常執(zhí)行的
但你把一個程序成功運行寄托于"有時候是可以的",你覺得這是一個搞電子的人應(yīng)該有的態(tài)度嗎?
作者: lyonkon    時間: 2022-4-26 02:02
Y_G_G 發(fā)表于 2022-4-25 20:42
大哥你就別再折騰這玩意了,我看著都累,但我無聊,也就跟著看看熱鬧
但凡是有中斷的,必須要用到RETI執(zhí)行中 ...

是這樣的,在開中斷沒有中斷子程序情況下,觸發(fā)中斷,只改變中斷標(biāo)志位。在4到8個狀態(tài)周期后自動返回。外部中斷以電平方式觸發(fā)需要程序清除標(biāo)志位。
你說的方法是寫中斷子程序的返回要寫RETI
上面的程序是標(biāo)志位查詢的方法,因為沒有進入中斷子程序所以不用寫RETI
流程是:主機發(fā)送中斷申請然后發(fā)數(shù)據(jù)  從機判斷IE為1后讀數(shù)據(jù),然后發(fā)送應(yīng)答中斷信號給主機表示數(shù)據(jù)讀成功,主機收到信號判斷IE為1后 申請從機中斷(p3.5引腳)撤銷。 就是一次發(fā)送數(shù)據(jù)的流程

作者: lyonkon    時間: 2022-4-26 02:12
Y_G_G 發(fā)表于 2022-4-25 20:42
大哥你就別再折騰這玩意了,我看著都累,但我無聊,也就跟著看看熱鬧
但凡是有中斷的,必須要用到RETI執(zhí)行中 ...

因為聽從你和樓上的建議,我把主程序放到30H后面,從機和主機數(shù)據(jù)就傳成功了。只是主機還是從0000H開始的。主機應(yīng)該是碰巧能跑
作者: Y_G_G    時間: 2022-4-26 10:47
lyonkon 發(fā)表于 2022-4-26 02:02
是這樣的,在開中斷沒有中斷子程序情況下,觸發(fā)中斷,只改變中斷標(biāo)志位。在4到8個狀態(tài)周期后自動返回。外 ...

你單片機是跟體育老師學(xué)的嗎?(體育老師對不起)
SETB EX0
SETB EA
你知道這兩個指令是干嘛的嗎?這是打開中斷的意思,一旦EX0中斷補觸發(fā),必然就是進入中斷向量區(qū)執(zhí)行中斷
你怎么就認(rèn)為沒有進入中斷子程序呢?你以為一定要寫一個中斷子程序才算是進入中斷嗎?
但凡是有這兩個指令,而且,EX0是可以被觸發(fā)的,那么,代碼中是一定一定一定要有RETI返回的,不要你覺得,你認(rèn)為什么什么,這是8051單片機的基礎(chǔ),它不是說這個是我說的它就這樣,我不過是把這個東西說出來而已
在你的代碼中,中斷入口都沒有用ORG指定出來,我覺得,你應(yīng)該是沒有了解中斷向量地址的
連單片機最基本的中斷你都沒有學(xué)好,你覺得后面的大制作能成功?你先把基礎(chǔ)學(xué)好吧



作者: 188610329    時間: 2022-4-26 11:44
lyonkon 發(fā)表于 2022-4-26 02:02
是這樣的,在開中斷沒有中斷子程序情況下,觸發(fā)中斷,只改變中斷標(biāo)志位。在4到8個狀態(tài)周期后自動返回。外 ...

先給你科普一下, 當(dāng)
SETB IT0     ;外部中斷下降沿觸發(fā)
CLR   EX0    ;關(guān)閉外部中斷0
的情況下, P3.2產(chǎn)生下降沿 后 ,  IE0 是會被置1的, 換言之是否可以讀取 IE0狀態(tài), 和是否 SETB  EX0 無關(guān)。所以,你為了讀IE0標(biāo)志, SETB EX0 毫無道理。
但是,當(dāng)你SETB   EX0 之后,一旦IE0 被置1,PC指針一定會跳轉(zhuǎn)到: 0003H,并且,隱藏標(biāo)志“低級中斷被觸發(fā),禁止被同等級中斷打斷”  被置位,在沒有執(zhí)行 RETI 之前,此標(biāo)志不會請除,
這也是為什么你程序,表面上看起來,能正常運行的原因,因為,你程序,后來一直在MCU以為的“低級中斷”觸發(fā)狀態(tài)下運行。你現(xiàn)在程序簡單,恰好又查詢標(biāo)志位,貌似可以達到你的目的,但是,實際是錯誤的。

其他的,Y_G_G 的回復(fù)里說的夠多了,我就不再復(fù)述了。
作者: 單片機研究協(xié)會    時間: 2022-4-26 13:20
Y_G_G 發(fā)表于 2022-4-25 20:42
大哥你就別再折騰這玩意了,我看著都累,但我無聊,也就跟著看看熱鬧
但凡是有中斷的,必須要用到RETI執(zhí)行中 ...

面向Bug編程
作者: yzwzfyz    時間: 2022-4-26 13:34
不要氣餒,認(rèn)真看手冊。
先了解CPU從上電開始是如果運行的,從何處取指令,如何執(zhí)行,再取指令,再執(zhí)行,它會不會結(jié)束?會不會在哪里停下來?一共有多少種指令,每種指令的含義是什么?
CPU何種情況下不按地址順序取指令?
中斷有何好處?CPU是如何處理中斷的?
這樣你就大大地進步了。清楚了,漸漸地就成為高手了。
匯編精通后后,C幾乎秒會,C中沒有任何難倒你的東東了。
要想成為頂尖的高手,匯編是必須的。
作者: lyonkon    時間: 2022-4-27 00:45
188610329 發(fā)表于 2022-4-26 11:44
先給你科普一下, 當(dāng)
SETB IT0     ;外部中斷下降沿觸發(fā)
CLR   EX0    ;關(guān)閉外部中斷0

我一直以為開中斷的情況下外部中斷信號TCON值是有效的,沒想到P3口不開第二功能的情況下外部電平依然可影響TCON。我程序中撤銷了中斷設(shè)置,程序依然可以跑。并且做了仿真測試,結(jié)果如是
作者: lyonkon    時間: 2022-4-27 01:00
P3口不開第二功能,INT0引腳接低電平,TCON 中IE0標(biāo)志位測試 謝謝樓上幾位朋友,怕刷屏的原故不一 一感謝了


作者: Y_G_G    時間: 2022-4-27 18:26
lyonkon 發(fā)表于 2022-4-27 01:00
P3口不開第二功能,INT0引腳接低電平,TCON 中IE0標(biāo)志位測試謝謝樓上幾位朋友,怕刷屏的原故不一 一感謝了
...

那么幾行代碼,你竟然要看匯編編譯后的匯編代碼?意義何在?
作者: lyonkon    時間: 2022-4-28 23:48
Y_G_G 發(fā)表于 2022-4-27 18:26
那么幾行代碼,你竟然要看匯編編譯后的匯編代碼?意義何在?

是看P3口不開第二功能的情況下P3.2引腳低電平    看88H,TCON的值,R0,R2 值是 0x02 ,就是說IE0=1

作者: 188610329    時間: 2022-4-29 00:12
lyonkon 發(fā)表于 2022-4-28 23:48
是看P3口不開第二功能的情況下P3.2引腳低電平    看88H,TCON的值,R0,R2 值是 0x02 ,就是說IE0=1

我不知道你從哪里聽來的"第二功能"這個說法,IE0的標(biāo)志位,本來就是硬件上就和 P3.2 的電平掛鉤的,由IT0控制IE0的置位條件, 就和 TF0 有 TR0來決定一個道理。所有的都是由TCON自身內(nèi)部自給自足。
而 IE這個寄存器,控制的全都是 跳轉(zhuǎn),控制滿足條件后跳轉(zhuǎn)到指定的地址,這就是所謂的中斷向量了。

既然學(xué)會編,你這些基礎(chǔ)硬件知識怎么都要知道吧?
再說編成習(xí)慣,雖然直接寫代碼基本也是從 0000 開始,但是,一般ORG 0000H 這個習(xí)慣總該有吧?
即便不喜歡用ORG,  用 CSEG 也行啊,你這些都沒有,要是一開始不養(yǎng)成習(xí)慣,后面越學(xué)代碼會寫得越糟。希望你能看幾個人家的 范例,改進一下代碼的書寫模式。
作者: Y_G_G    時間: 2022-4-29 10:09
lyonkon 發(fā)表于 2022-4-28 23:48
是看P3口不開第二功能的情況下P3.2引腳低電平    看88H,TCON的值,R0,R2 值是 0x02 ,就是說IE0=1

我搞了幾年的8051匯編,竟然不知道"P3端口第二功能",我這幾年白學(xué)了?
不是我打擊你,不帶任何個人感情,只說明一個情況:你匯編基礎(chǔ)根本不行,所有基于你這個匯編的折騰,都是白折騰
除非你家有光刻機,你自己造單片機
作者: lyonkon    時間: 2022-4-30 22:44
Y_G_G 發(fā)表于 2022-4-29 10:09
我搞了幾年的8051匯編,竟然不知道"P3端口第二功能",我這幾年白學(xué)了?
不是我打擊你,不帶任何個人感情,只 ...

我自己焊了一塊板子,用到兩片51。用p1口兩機傳數(shù)據(jù),本來想單用p1口不用中斷,后來又用上了,急于測試板子是否可行,所以寫了單向傳數(shù)據(jù)的程序,沒想到顯現(xiàn)自己的不足。板子最后一項就是ps2口鍵盤,已經(jīng)整了好幾天,到現(xiàn)在還沒有想到好的方法。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1