找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2251|回復: 17
打印 上一主題 下一主題
收起左側

51單片機P1并口通訊,中斷問題,匯編程序問題請教

[復制鏈接]
跳轉到指定樓層
樓主
ID:73992 發(fā)表于 2022-4-25 08:30 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

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


//主機中斷初始化           
//INT0接收從機數(shù)據(jù)中斷申請          標志位IE0                   從機P3.4引腳
//INT1接收從機應答                          標志位IE1                        從機P3.5引腳
//主機P3.4發(fā)送從機數(shù)據(jù)中斷申請          低電平有效
//主機P3.5發(fā)送從機應答                          低電平有效
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準備送IO口
D1:        MOV        P1,A                   //字符A送p1口
        CLR        P3.5                   //申請從機中斷int1
        JNB        IE1,$                   //從機響應信號
        SETB        P3.5
        CLR        IE1                           //IE標志位是否需要手動清除
        INC        A                           //A加1成字符b
        DJNZ        R7,D1
        POP        ACC
        sjmp        $
end


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


//從機中斷初始化           
//INT0接收主機數(shù)據(jù)中斷申請          標志位IE0                 主機P3.4引腳
//INT1接收主機應答                          標志位IE1                 主機P3.5引腳
//P3.4發(fā)送主機數(shù)據(jù)中斷申請          低電平有效
//P3.5發(fā)送主機應答                          低電平有效
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顯示內容數(shù)據(jù)入口,將主機發(fā)送到P1的值傳到R4
                          CLR        P3.5                   //發(fā)送應答信號
                        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      
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:123289 發(fā)表于 2022-4-25 09:04 | 只看該作者
1、寫程序要養(yǎng)成一個好的習慣,畫出邏輯框圖。你試試看。
2、電平觸發(fā)中斷,有個特點:當有效觸發(fā)電平成立時,比它低級的中斷,是無法得到響應的。
3、RET與RETI是有區(qū)別的。
在指令的執(zhí)行上你看不出來,兩者都能返回到程序的斷點處。
區(qū)別是,RETI會交出中斷控制權,進行下一個中斷的識別!
而你的程序中沒有RETI,所以中斷中能響應一次最高級的(低級的會被高級的搶到),然會就被它一直霸占住中斷資源。導致不再中斷。
4、檢查程序、即中斷入口是否正確(編譯完成后,看一下地址:RESET、INT0、INT1)。
回復

使用道具 舉報

板凳
ID:401564 發(fā)表于 2022-4-25 12:11 | 只看該作者
不是打擊你
這個代碼簡單是亂得像個什么一樣,單片機基礎差得太多了,你還要多看一下單片機基礎,再來玩這種東西吧
1,整個程序沒有一個ORG指令,匯編代碼直接就在復位的000H開始執(zhí)行了,接下來就直接進入中斷
2,整個程序沒有一個RETI指令,進入中斷之后沒有一個中斷返回指令,不知道你是分不清RET和RETI的區(qū)別,還是真的就不知道中斷是怎么執(zhí)行的?
3,中斷沒有一個現(xiàn)場保護,PSW寄存器都沒有出現(xiàn)過,8051匯編中,PSW是一個很重要寄存器
要行萬里,你得始于足下,走路都還不走不順,竟然一天到晚研究著在天上怎么飛
回復

使用道具 舉報

地板
ID:73992 發(fā)表于 2022-4-25 14:01 | 只看該作者
如樓上二位所說,是從機程序占用了中斷地址。主機沒有占用到所以能跑
從機程序開頭加上ORG 0000H
                          ORG 0030H
                          LJMP MAIN
從機也跑起來了。謝謝兩位老師
因為是中斷標志位查詢,中斷電平是程序撤銷的,沒有用到中斷子程序,所以沒有使用RETI
回復

使用道具 舉報

5#
ID:401564 發(fā)表于 2022-4-25 20:42 | 只看該作者
lyonkon 發(fā)表于 2022-4-25 14:01
如樓上二位所說,是從機程序占用了中斷地址。主機沒有占用到所以能跑
從機程序開頭加上ORG 0000H
        ...

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

使用道具 舉報

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

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

使用道具 舉報

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

因為聽從你和樓上的建議,我把主程序放到30H后面,從機和主機數(shù)據(jù)就傳成功了。只是主機還是從0000H開始的。主機應該是碰巧能跑
回復

使用道具 舉報

8#
ID:401564 發(fā)表于 2022-4-26 10:47 | 只看該作者
lyonkon 發(fā)表于 2022-4-26 02:02
是這樣的,在開中斷沒有中斷子程序情況下,觸發(fā)中斷,只改變中斷標志位。在4到8個狀態(tài)周期后自動返回。外 ...

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


回復

使用道具 舉報

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

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

其他的,Y_G_G 的回復里說的夠多了,我就不再復述了。
回復

使用道具 舉報

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

面向Bug編程
回復

使用道具 舉報

11#
ID:123289 發(fā)表于 2022-4-26 13:34 | 只看該作者
不要氣餒,認真看手冊。
先了解CPU從上電開始是如果運行的,從何處取指令,如何執(zhí)行,再取指令,再執(zhí)行,它會不會結束?會不會在哪里停下來?一共有多少種指令,每種指令的含義是什么?
CPU何種情況下不按地址順序取指令?
中斷有何好處?CPU是如何處理中斷的?
這樣你就大大地進步了。清楚了,漸漸地就成為高手了。
匯編精通后后,C幾乎秒會,C中沒有任何難倒你的東東了。
要想成為頂尖的高手,匯編是必須的。
回復

使用道具 舉報

12#
ID:73992 發(fā)表于 2022-4-27 00:45 | 只看該作者
188610329 發(fā)表于 2022-4-26 11:44
先給你科普一下, 當
SETB IT0     ;外部中斷下降沿觸發(fā)
CLR   EX0    ;關閉外部中斷0

我一直以為開中斷的情況下外部中斷信號TCON值是有效的,沒想到P3口不開第二功能的情況下外部電平依然可影響TCON。我程序中撤銷了中斷設置,程序依然可以跑。并且做了仿真測試,結果如是
回復

使用道具 舉報

13#
ID:73992 發(fā)表于 2022-4-27 01:00 | 只看該作者
P3口不開第二功能,INT0引腳接低電平,TCON 中IE0標志位測試 謝謝樓上幾位朋友,怕刷屏的原故不一 一感謝了

回復

使用道具 舉報

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

那么幾行代碼,你竟然要看匯編編譯后的匯編代碼?意義何在?
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

既然學會編,你這些基礎硬件知識怎么都要知道吧?
再說編成習慣,雖然直接寫代碼基本也是從 0000 開始,但是,一般ORG 0000H 這個習慣總該有吧?
即便不喜歡用ORG,  用 CSEG 也行啊,你這些都沒有,要是一開始不養(yǎng)成習慣,后面越學代碼會寫得越糟。希望你能看幾個人家的 范例,改進一下代碼的書寫模式。
回復

使用道具 舉報

17#
ID:401564 發(fā)表于 2022-4-29 10:09 | 只看該作者
lyonkon 發(fā)表于 2022-4-28 23:48
是看P3口不開第二功能的情況下P3.2引腳低電平    看88H,TCON的值,R0,R2 值是 0x02 ,就是說IE0=1

我搞了幾年的8051匯編,竟然不知道"P3端口第二功能",我這幾年白學了?
不是我打擊你,不帶任何個人感情,只說明一個情況:你匯編基礎根本不行,所有基于你這個匯編的折騰,都是白折騰
除非你家有光刻機,你自己造單片機
回復

使用道具 舉報

18#
ID:73992 發(fā)表于 2022-4-30 22:44 來自觸屏版 | 只看該作者
Y_G_G 發(fā)表于 2022-4-29 10:09
我搞了幾年的8051匯編,竟然不知道"P3端口第二功能",我這幾年白學了?
不是我打擊你,不帶任何個人感情,只 ...

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表