找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索

51單片機(jī)P1并口通訊,中斷問(wèn)題,匯編程序問(wèn)題請(qǐng)教

查看數(shù): 2281 | 評(píng)論數(shù): 17 | 收藏 0
關(guān)燈 | 提示:支持鍵盤(pán)翻頁(yè)<-左 右->
    組圖打開(kāi)中,請(qǐng)稍候......
發(fā)布時(shí)間: 2022-4-25 08:30

正文摘要:

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

回復(fù)

ID:73992 發(fā)表于 2022-4-30 22:44
Y_G_G 發(fā)表于 2022-4-29 10:09
我搞了幾年的8051匯編,竟然不知道"P3端口第二功能",我這幾年白學(xué)了?
不是我打擊你,不帶任何個(gè)人感情,只 ...

我自己焊了一塊板子,用到兩片51。用p1口兩機(jī)傳數(shù)據(jù),本來(lái)想單用p1口不用中斷,后來(lái)又用上了,急于測(cè)試板子是否可行,所以寫(xiě)了單向傳數(shù)據(jù)的程序,沒(méi)想到顯現(xiàn)自己的不足。板子最后一項(xiàng)就是ps2口鍵盤(pán),已經(jīng)整了好幾天,到現(xiàn)在還沒(méi)有想到好的方法。
ID:401564 發(fā)表于 2022-4-29 10:09
lyonkon 發(fā)表于 2022-4-28 23:48
是看P3口不開(kāi)第二功能的情況下P3.2引腳低電平    看88H,TCON的值,R0,R2 值是 0x02 ,就是說(shuō)IE0=1

我搞了幾年的8051匯編,竟然不知道"P3端口第二功能",我這幾年白學(xué)了?
不是我打擊你,不帶任何個(gè)人感情,只說(shuō)明一個(gè)情況:你匯編基礎(chǔ)根本不行,所有基于你這個(gè)匯編的折騰,都是白折騰
除非你家有光刻機(jī),你自己造單片機(jī)
ID:624769 發(fā)表于 2022-4-29 00:12
lyonkon 發(fā)表于 2022-4-28 23:48
是看P3口不開(kāi)第二功能的情況下P3.2引腳低電平    看88H,TCON的值,R0,R2 值是 0x02 ,就是說(shuō)IE0=1

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

既然學(xué)會(huì)編,你這些基礎(chǔ)硬件知識(shí)怎么都要知道吧?
再說(shuō)編成習(xí)慣,雖然直接寫(xiě)代碼基本也是從 0000 開(kāi)始,但是,一般ORG 0000H 這個(gè)習(xí)慣總該有吧?
即便不喜歡用ORG,  用 CSEG 也行啊,你這些都沒(méi)有,要是一開(kāi)始不養(yǎng)成習(xí)慣,后面越學(xué)代碼會(huì)寫(xiě)得越糟。希望你能看幾個(gè)人家的 范例,改進(jìn)一下代碼的書(shū)寫(xiě)模式。
ID:73992 發(fā)表于 2022-4-28 23:48
Y_G_G 發(fā)表于 2022-4-27 18:26
那么幾行代碼,你竟然要看匯編編譯后的匯編代碼?意義何在?

是看P3口不開(kāi)第二功能的情況下P3.2引腳低電平    看88H,TCON的值,R0,R2 值是 0x02 ,就是說(shuō)IE0=1
ID:401564 發(fā)表于 2022-4-27 18:26
lyonkon 發(fā)表于 2022-4-27 01:00
P3口不開(kāi)第二功能,INT0引腳接低電平,TCON 中IE0標(biāo)志位測(cè)試謝謝樓上幾位朋友,怕刷屏的原故不一 一感謝了
...

那么幾行代碼,你竟然要看匯編編譯后的匯編代碼?意義何在?
ID:73992 發(fā)表于 2022-4-27 00:45
188610329 發(fā)表于 2022-4-26 11:44
先給你科普一下, 當(dāng)
SETB IT0     ;外部中斷下降沿觸發(fā)
CLR   EX0    ;關(guān)閉外部中斷0

我一直以為開(kāi)中斷的情況下外部中斷信號(hào)TCON值是有效的,沒(méi)想到P3口不開(kāi)第二功能的情況下外部電平依然可影響TCON。我程序中撤銷了中斷設(shè)置,程序依然可以跑。并且做了仿真測(cè)試,結(jié)果如是
ID:123289 發(fā)表于 2022-4-26 13:34
不要?dú)怵H,認(rèn)真看手冊(cè)。
先了解CPU從上電開(kāi)始是如果運(yùn)行的,從何處取指令,如何執(zhí)行,再取指令,再執(zhí)行,它會(huì)不會(huì)結(jié)束?會(huì)不會(huì)在哪里停下來(lái)?一共有多少種指令,每種指令的含義是什么?
CPU何種情況下不按地址順序取指令?
中斷有何好處?CPU是如何處理中斷的?
這樣你就大大地進(jìn)步了。清楚了,漸漸地就成為高手了。
匯編精通后后,C幾乎秒會(huì),C中沒(méi)有任何難倒你的東東了。
要想成為頂尖的高手,匯編是必須的。
ID:828160 發(fā)表于 2022-4-26 13:20
Y_G_G 發(fā)表于 2022-4-25 20:42
大哥你就別再折騰這玩意了,我看著都累,但我無(wú)聊,也就跟著看看熱鬧
但凡是有中斷的,必須要用到RETI執(zhí)行中 ...

面向Bug編程
ID:624769 發(fā)表于 2022-4-26 11:44
lyonkon 發(fā)表于 2022-4-26 02:02
是這樣的,在開(kāi)中斷沒(méi)有中斷子程序情況下,觸發(fā)中斷,只改變中斷標(biāo)志位。在4到8個(gè)狀態(tài)周期后自動(dòng)返回。外 ...

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

其他的,Y_G_G 的回復(fù)里說(shuō)的夠多了,我就不再?gòu)?fù)述了。
ID:401564 發(fā)表于 2022-4-26 10:47
lyonkon 發(fā)表于 2022-4-26 02:02
是這樣的,在開(kāi)中斷沒(méi)有中斷子程序情況下,觸發(fā)中斷,只改變中斷標(biāo)志位。在4到8個(gè)狀態(tài)周期后自動(dòng)返回。外 ...

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


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

因?yàn)槁?tīng)從你和樓上的建議,我把主程序放到30H后面,從機(jī)和主機(jī)數(shù)據(jù)就傳成功了。只是主機(jī)還是從0000H開(kāi)始的。主機(jī)應(yīng)該是碰巧能跑
ID:73992 發(fā)表于 2022-4-26 02:02
Y_G_G 發(fā)表于 2022-4-25 20:42
大哥你就別再折騰這玩意了,我看著都累,但我無(wú)聊,也就跟著看看熱鬧
但凡是有中斷的,必須要用到RETI執(zhí)行中 ...

是這樣的,在開(kāi)中斷沒(méi)有中斷子程序情況下,觸發(fā)中斷,只改變中斷標(biāo)志位。在4到8個(gè)狀態(tài)周期后自動(dòng)返回。外部中斷以電平方式觸發(fā)需要程序清除標(biāo)志位。
你說(shuō)的方法是寫(xiě)中斷子程序的返回要寫(xiě)RETI
上面的程序是標(biāo)志位查詢的方法,因?yàn)闆](méi)有進(jìn)入中斷子程序所以不用寫(xiě)RETI
流程是:主機(jī)發(fā)送中斷申請(qǐng)然后發(fā)數(shù)據(jù)  從機(jī)判斷IE為1后讀數(shù)據(jù),然后發(fā)送應(yīng)答中斷信號(hào)給主機(jī)表示數(shù)據(jù)讀成功,主機(jī)收到信號(hào)判斷IE為1后 申請(qǐng)從機(jī)中斷(p3.5引腳)撤銷。 就是一次發(fā)送數(shù)據(jù)的流程
ID:401564 發(fā)表于 2022-4-25 20:42
lyonkon 發(fā)表于 2022-4-25 14:01
如樓上二位所說(shuō),是從機(jī)程序占用了中斷地址。主機(jī)沒(méi)有占用到所以能跑
從機(jī)程序開(kāi)頭加上ORG 0000H
        ...

大哥你就別再折騰這玩意了,我看著都累,但我無(wú)聊,也就跟著看看熱鬧
但凡是有中斷的,必須要用到RETI執(zhí)行中斷返回,這是8051單片機(jī)基礎(chǔ)知識(shí)
你已經(jīng)開(kāi)了中斷了,中斷被觸發(fā)之后,程序必然是要進(jìn)行中斷子程序的,之后是一定要用到RETI執(zhí)行返回的
你連這都不知道,還玩什么匯編呀
雖然并不是你不用RETI的話,你的程序就一定不能執(zhí)行,它有一定有概率是可以正常執(zhí)行的
但你把一個(gè)程序成功運(yùn)行寄托于"有時(shí)候是可以的",你覺(jué)得這是一個(gè)搞電子的人應(yīng)該有的態(tài)度嗎?
ID:73992 發(fā)表于 2022-4-25 14:01
如樓上二位所說(shuō),是從機(jī)程序占用了中斷地址。主機(jī)沒(méi)有占用到所以能跑
從機(jī)程序開(kāi)頭加上ORG 0000H
                          ORG 0030H
                          LJMP MAIN
從機(jī)也跑起來(lái)了。謝謝兩位老師
因?yàn)槭侵袛鄻?biāo)志位查詢,中斷電平是程序撤銷的,沒(méi)有用到中斷子程序,所以沒(méi)有使用RETI
ID:401564 發(fā)表于 2022-4-25 12:11
不是打擊你
這個(gè)代碼簡(jiǎn)單是亂得像個(gè)什么一樣,單片機(jī)基礎(chǔ)差得太多了,你還要多看一下單片機(jī)基礎(chǔ),再來(lái)玩這種東西吧
1,整個(gè)程序沒(méi)有一個(gè)ORG指令,匯編代碼直接就在復(fù)位的000H開(kāi)始執(zhí)行了,接下來(lái)就直接進(jìn)入中斷
2,整個(gè)程序沒(méi)有一個(gè)RETI指令,進(jìn)入中斷之后沒(méi)有一個(gè)中斷返回指令,不知道你是分不清RET和RETI的區(qū)別,還是真的就不知道中斷是怎么執(zhí)行的?
3,中斷沒(méi)有一個(gè)現(xiàn)場(chǎng)保護(hù),PSW寄存器都沒(méi)有出現(xiàn)過(guò),8051匯編中,PSW是一個(gè)很重要寄存器
要行萬(wàn)里,你得始于足下,走路都還不走不順,竟然一天到晚研究著在天上怎么飛
ID:123289 發(fā)表于 2022-4-25 09:04
1、寫(xiě)程序要養(yǎng)成一個(gè)好的習(xí)慣,畫(huà)出邏輯框圖。你試試看。
2、電平觸發(fā)中斷,有個(gè)特點(diǎn):當(dāng)有效觸發(fā)電平成立時(shí),比它低級(jí)的中斷,是無(wú)法得到響應(yīng)的。
3、RET與RETI是有區(qū)別的。
在指令的執(zhí)行上你看不出來(lái),兩者都能返回到程序的斷點(diǎn)處。
區(qū)別是,RETI會(huì)交出中斷控制權(quán),進(jìn)行下一個(gè)中斷的識(shí)別!
而你的程序中沒(méi)有RETI,所以中斷中能響應(yīng)一次最高級(jí)的(低級(jí)的會(huì)被高級(jí)的搶到),然會(huì)就被它一直霸占住中斷資源。導(dǎo)致不再中斷。
4、檢查程序、即中斷入口是否正確(編譯完成后,看一下地址:RESET、INT0、INT1)。

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

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

快速回復(fù) 返回頂部 返回列表