![]() |
發(fā)布時間: 2022-4-25 08:30
正文摘要:現(xiàn)象是從機不開中斷,發(fā)送應(yīng)答信號給主機就能顯示。從機開中斷情況下不知道是不 顯示還是亂碼 單片機主機程序如下: //*主機程序 //主機中斷初始化   ... |
Y_G_G 發(fā)表于 2022-4-29 10:09 我自己焊了一塊板子,用到兩片51。用p1口兩機傳數(shù)據(jù),本來想單用p1口不用中斷,后來又用上了,急于測試板子是否可行,所以寫了單向傳數(shù)據(jù)的程序,沒想到顯現(xiàn)自己的不足。板子最后一項就是ps2口鍵盤,已經(jīng)整了好幾天,到現(xiàn)在還沒有想到好的方法。 |
lyonkon 發(fā)表于 2022-4-28 23:48 我搞了幾年的8051匯編,竟然不知道"P3端口第二功能",我這幾年白學(xué)了? 不是我打擊你,不帶任何個人感情,只說明一個情況:你匯編基礎(chǔ)根本不行,所有基于你這個匯編的折騰,都是白折騰 除非你家有光刻機,你自己造單片機 |
lyonkon 發(fā)表于 2022-4-28 23:48 我不知道你從哪里聽來的"第二功能"這個說法,IE0的標志位,本來就是硬件上就和 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 發(fā)表于 2022-4-27 18:26 是看P3口不開第二功能的情況下P3.2引腳低電平 看88H,TCON的值,R0,R2 值是 0x02 ,就是說IE0=1 |
lyonkon 發(fā)表于 2022-4-27 01:00 那么幾行代碼,你竟然要看匯編編譯后的匯編代碼?意義何在? |
188610329 發(fā)表于 2022-4-26 11:44 我一直以為開中斷的情況下外部中斷信號TCON值是有效的,沒想到P3口不開第二功能的情況下外部電平依然可影響TCON。我程序中撤銷了中斷設(shè)置,程序依然可以跑。并且做了仿真測試,結(jié)果如是 |
不要氣餒,認真看手冊。 先了解CPU從上電開始是如果運行的,從何處取指令,如何執(zhí)行,再取指令,再執(zhí)行,它會不會結(jié)束?會不會在哪里停下來?一共有多少種指令,每種指令的含義是什么? CPU何種情況下不按地址順序取指令? 中斷有何好處?CPU是如何處理中斷的? 這樣你就大大地進步了。清楚了,漸漸地就成為高手了。 匯編精通后后,C幾乎秒會,C中沒有任何難倒你的東東了。 要想成為頂尖的高手,匯編是必須的。 |
Y_G_G 發(fā)表于 2022-4-25 20:42 面向Bug編程 |
lyonkon 發(fā)表于 2022-4-26 02:02 先給你科普一下, 當 SETB IT0 ;外部中斷下降沿觸發(fā) CLR EX0 ;關(guān)閉外部中斷0 的情況下, P3.2產(chǎn)生下降沿 后 , IE0 是會被置1的, 換言之是否可以讀取 IE0狀態(tài), 和是否 SETB EX0 無關(guān)。所以,你為了讀IE0標志, SETB EX0 毫無道理。 但是,當你SETB EX0 之后,一旦IE0 被置1,PC指針一定會跳轉(zhuǎn)到: 0003H,并且,隱藏標志“低級中斷被觸發(fā),禁止被同等級中斷打斷” 被置位,在沒有執(zhí)行 RETI 之前,此標志不會請除, 這也是為什么你程序,表面上看起來,能正常運行的原因,因為,你程序,后來一直在MCU以為的“低級中斷”觸發(fā)狀態(tài)下運行。你現(xiàn)在程序簡單,恰好又查詢標志位,貌似可以達到你的目的,但是,實際是錯誤的。 其他的,Y_G_G 的回復(fù)里說的夠多了,我就不再復(fù)述了。 |
lyonkon 發(fā)表于 2022-4-26 02:02 你單片機是跟體育老師學(xué)的嗎?(體育老師對不起) SETB EX0 SETB EA 你知道這兩個指令是干嘛的嗎?這是打開中斷的意思,一旦EX0中斷補觸發(fā),必然就是進入中斷向量區(qū)執(zhí)行中斷 你怎么就認為沒有進入中斷子程序呢?你以為一定要寫一個中斷子程序才算是進入中斷嗎? 但凡是有這兩個指令,而且,EX0是可以被觸發(fā)的,那么,代碼中是一定一定一定要有RETI返回的,不要你覺得,你認為什么什么,這是8051單片機的基礎(chǔ),它不是說這個是我說的它就這樣,我不過是把這個東西說出來而已 在你的代碼中,中斷入口都沒有用ORG指定出來,我覺得,你應(yīng)該是沒有了解中斷向量地址的 連單片機最基本的中斷你都沒有學(xué)好,你覺得后面的大制作能成功?你先把基礎(chǔ)學(xué)好吧 ![]() |
Y_G_G 發(fā)表于 2022-4-25 20:42 因為聽從你和樓上的建議,我把主程序放到30H后面,從機和主機數(shù)據(jù)就傳成功了。只是主機還是從0000H開始的。主機應(yīng)該是碰巧能跑 |
Y_G_G 發(fā)表于 2022-4-25 20:42 是這樣的,在開中斷沒有中斷子程序情況下,觸發(fā)中斷,只改變中斷標志位。在4到8個狀態(tài)周期后自動返回。外部中斷以電平方式觸發(fā)需要程序清除標志位。 你說的方法是寫中斷子程序的返回要寫RETI 上面的程序是標志位查詢的方法,因為沒有進入中斷子程序所以不用寫RETI 流程是:主機發(fā)送中斷申請然后發(fā)數(shù)據(jù) 從機判斷IE為1后讀數(shù)據(jù),然后發(fā)送應(yīng)答中斷信號給主機表示數(shù)據(jù)讀成功,主機收到信號判斷IE為1后 申請從機中斷(p3.5引腳)撤銷。 就是一次發(fā)送數(shù)據(jù)的流程 |
lyonkon 發(fā)表于 2022-4-25 14:01 大哥你就別再折騰這玩意了,我看著都累,但我無聊,也就跟著看看熱鬧 但凡是有中斷的,必須要用到RETI執(zhí)行中斷返回,這是8051單片機基礎(chǔ)知識 你已經(jīng)開了中斷了,中斷被觸發(fā)之后,程序必然是要進行中斷子程序的,之后是一定要用到RETI執(zhí)行返回的 你連這都不知道,還玩什么匯編呀 雖然并不是你不用RETI的話,你的程序就一定不能執(zhí)行,它有一定有概率是可以正常執(zhí)行的 但你把一個程序成功運行寄托于"有時候是可以的",你覺得這是一個搞電子的人應(yīng)該有的態(tài)度嗎? |
如樓上二位所說,是從機程序占用了中斷地址。主機沒有占用到所以能跑 從機程序開頭加上ORG 0000H ORG 0030H LJMP MAIN 從機也跑起來了。謝謝兩位老師 因為是中斷標志位查詢,中斷電平是程序撤銷的,沒有用到中斷子程序,所以沒有使用RETI |
不是打擊你 這個代碼簡單是亂得像個什么一樣,單片機基礎(chǔ)差得太多了,你還要多看一下單片機基礎(chǔ),再來玩這種東西吧 1,整個程序沒有一個ORG指令,匯編代碼直接就在復(fù)位的000H開始執(zhí)行了,接下來就直接進入中斷 2,整個程序沒有一個RETI指令,進入中斷之后沒有一個中斷返回指令,不知道你是分不清RET和RETI的區(qū)別,還是真的就不知道中斷是怎么執(zhí)行的? 3,中斷沒有一個現(xiàn)場保護,PSW寄存器都沒有出現(xiàn)過,8051匯編中,PSW是一個很重要寄存器 要行萬里,你得始于足下,走路都還不走不順,竟然一天到晚研究著在天上怎么飛 |
1、寫程序要養(yǎng)成一個好的習(xí)慣,畫出邏輯框圖。你試試看。 2、電平觸發(fā)中斷,有個特點:當有效觸發(fā)電平成立時,比它低級的中斷,是無法得到響應(yīng)的。 3、RET與RETI是有區(qū)別的。 在指令的執(zhí)行上你看不出來,兩者都能返回到程序的斷點處。 區(qū)別是,RETI會交出中斷控制權(quán),進行下一個中斷的識別! 而你的程序中沒有RETI,所以中斷中能響應(yīng)一次最高級的(低級的會被高級的搶到),然會就被它一直霸占住中斷資源。導(dǎo)致不再中斷。 4、檢查程序、即中斷入口是否正確(編譯完成后,看一下地址:RESET、INT0、INT1)。 |
Powered by 單片機教程網(wǎng)