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