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

QQ登錄

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

搜索
查看: 2373|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

自學(xué)單片機(jī)遇到一些程序問(wèn)題,求分析解決

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 90 黑幣 回復(fù)本帖可獲得 5 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
最近在自學(xué)STC89C52單片機(jī),也看了許多的老師的講解,有些問(wèn)題沒(méi)有弄明白,向大家求教一下。

外部中斷,我明白有兩種觸發(fā)方式,一種電平觸發(fā),一種下降沿觸發(fā),也看了單片機(jī)的原理圖。

我理解的外部中斷,電平觸發(fā)就是一個(gè)按鍵或是什么東西,在單片機(jī)引腳上輸入了一個(gè)電平,這個(gè)電平一直存在使其一直保持中斷,松開(kāi)按鍵就外部中斷停止了,
下沿觸發(fā)像是在引腳上輸入一個(gè)電平的信號(hào),就像一個(gè)波形一樣,觸發(fā)不需要保持住,單片機(jī)檢測(cè)到這個(gè)波形了就觸發(fā)外部中斷。

就一點(diǎn)不明白,外部中斷一定要接在INT0,INT1引腳上才可以嗎?別的端口不可以嗎?那如果需要用傳感器控制的外部中斷多幾個(gè),好像局限性很大
我在想,
比如用P2.0引腳
讓單片機(jī)一直掃描P2.0引腳的狀態(tài),有電平變化了就停止程序,沒(méi)變化繼續(xù)執(zhí)行程序。這樣好像也和INT0,INT1這些引腳功能一樣!
不知道我說(shuō)的對(duì)不對(duì),剛剛接觸單片機(jī),以前的知識(shí)早忘完了。

還有定時(shí)器,感覺(jué)怎么這么復(fù)雜,可以一會(huì)語(yǔ)句循環(huán),一會(huì)定時(shí)器控制,都不知道到底該用哪種了。
到現(xiàn)在定時(shí)器都沒(méi)弄懂。

程序方面,看了許多的例程,里面的代碼,最后感覺(jué)有很多的相似,就好像有固定的框框,寫(xiě)程序的時(shí)候只需要朝里面套自己的東西一樣。
但還是許多代碼看不明白,有的頭文件我抄上來(lái),編譯直接出錯(cuò),把它刪掉就行了,單片機(jī)也照樣的執(zhí)行,搞不明白是為什么。

最后希望各位大佬幫個(gè)忙,這兩天在做個(gè)小車(chē),程序老是寫(xiě)不好。不是這里出錯(cuò)就是那里出錯(cuò)。希望有大佬幫幫忙,幫我寫(xiě)一下,這樣我能根據(jù)我自己的情況,明白的更快一點(diǎn)。

我自己寫(xiě)的哪個(gè)錯(cuò)漏百出的程序就不貼上來(lái)給大家獻(xiàn)丑了

下邊是我定義的一些引腳,如果有不對(duì)的請(qǐng)大佬們幫忙指出來(lái),謝謝

我按照我想要的程序的流程寫(xiě)出來(lái),請(qǐng)大佬們幫忙填充一下,如果可能請(qǐng)釋義一下,越詳細(xì)越好,以給我們這些小白一些啟示,謝謝。

單片機(jī)源程序如下:
  1. #include<reg52.h>       //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  2. #define uchar unsigned char    //這兩句的具體意思還沒(méi)有搞懂,但知道是有關(guān)函數(shù)的
  3. #define uint  unsigned int
  4. sbit YB = P2^5;        //   定義遙控器 B 鍵的引腳,B鍵為-正啟動(dòng)-按鍵,輸入高電平
  5. sbit YC = P2^6;       //    定義遙控器 C 鍵的引腳, C鍵為-倒啟動(dòng)-按鍵,輸入高電平
  6. sbit YD = P3^2;       //    定義遙控器 D 鍵的引腳, D鍵為-緊急停止,     輸入高電平
  7.                              //     遙控器為自鎖模式,按下按鍵之后,遙控器接收板持續(xù)輸出高電平
  8.                             //      再次按下遙控器相應(yīng)按鍵,停止輸出高電平
  9.                                     
  10.              //這個(gè)遙控器接收板只能輸出高電平,                                                 //如果這幾個(gè)引腳的位置不行那么應(yīng)該用哪幾個(gè)引腳?                     
  11.          //或者有什么辦法能夠轉(zhuǎn)換一下這個(gè)電平信號(hào),把它從高轉(zhuǎn)到低

  12. sbit JDQ1 = P1^1; //  定義繼電器 1號(hào) 的引腳。   |  低電平  觸發(fā)
  13. sbit JDQ2 = P1^2;  //  定義繼電器 2號(hào) 的引腳。  |
  14. sbit JDQ3 = P1^3;  //  定義繼電器 3號(hào) 的引腳。  
  15. sbit JDQ4 = P1^4   //  定義繼電器 4號(hào) 的引腳。   
  16. sbit JDQ5 = P1^5;  //  定義繼電器 5號(hào) 的引腳。
  17. sbit JDQ6 = P1^6;  //   定義繼電器 6號(hào) 的引腳。
  18. sbit JDQ7 = P2^0;   //  定義繼電器 7號(hào) 的引腳。
  19. sbit JDQ8 = P2^1;   //  定義繼電器 8號(hào) 的引腳。
  20. sbit NPN1 = P2^2;      //定義NPN開(kāi)關(guān) 1號(hào) 的信號(hào)輸入引腳。輸入低電平有效
  21. sbit NPN2 = P2^3;    //定義NPN開(kāi)關(guān) 2號(hào) 的信號(hào)輸入引腳。輸入低電平有效
  22.                               //NPN開(kāi)關(guān)為 常開(kāi),
  23.                               //NPN接近傳感器---無(wú)障礙物--無(wú)檢測(cè)信號(hào)時(shí)輸出高電平,
  24.                              //NPN接近傳感器---有障礙物--有檢測(cè)信號(hào)時(shí)輸出低電平。
  25. sbit HW = P2^4;          //定義紅外避障開(kāi)關(guān)的信號(hào)輸入引腳。
  26.                                  //紅外避障開(kāi)關(guān)--無(wú)障礙物---無(wú)檢測(cè)信號(hào)時(shí)輸出高電平,
  27.                                 //紅外避障開(kāi)關(guān)--有障礙物---有檢測(cè)信號(hào)時(shí)輸出低電平。
  28.                               //      首先我想應(yīng)該是將各個(gè)引腳的初始狀態(tài)置高或低吧?
  29.                              //       這樣以便引腳輸出相應(yīng)的狀態(tài)
  30.                              //                            程序流程       正序
  31.                            //   1               P2^5    接收    高電平    信號(hào)輸入,開(kāi)始進(jìn)入程序      
  32.                          //   2                P1^1  , P1^4  輸出低電平信號(hào)--小車(chē)跑4秒 --停止,
  33.                              //                      停頓2秒
  34.                        //    3                P1^2  , P1^3  輸出低電平信號(hào) --小車(chē)跑18秒---停止,
  35.                           //                         停頓2秒
  36.                     //     4                 P1^2  , P1^4 , P1^5 輸出低電平信號(hào)--小車(chē)跑2秒--停止,
  37.                         //                          停頓2秒
  38.                    //     5                   P1^2 ,  P1^3 輸出低電平信號(hào)---小車(chē)跑10秒---停止,
  39.                       //                          停頓2秒
  40.                 //     6                   P2^0 輸出低電平信號(hào)-------P2^2  NPN輸入低電平--停止。
  41.                      //                           停頓2秒
  42.                //     7       P1^2  , P1^3  輸出低電平信號(hào)-----P2^4紅外避障輸入低電平,停止。
  43.              //                                 完
  44.                                 
  45.              //這里邊的P3^2起到中斷的作用,按下遙控器D,P3^2引腳接收高電平
  46.              //程序暫停,因?yàn)榻邮瞻鍨樽枣i,所以會(huì)持續(xù)的輸出高電平,直到再次按下,                                                        //P3^2不再輸入高電平,程序從暫停之前那一步繼續(xù)執(zhí)行下去.
  47.                            
  48.            //           程序流程         倒序    按下C鍵 P2^6  倒序
  49.            //因?yàn)槭浅绦蚬潭ǖ乃缘剐蛞簿褪前殉绦虻箓(gè)方向,不知道這個(gè)算不算兩個(gè)程序,
復(fù)制代碼

     這個(gè)小車(chē)的效果,就是按下遙控器B ,小車(chē)會(huì)沿著固定的一條框框道路行走,然后小車(chē)上邊的一個(gè)小電機(jī)會(huì)做一些動(dòng)作。按下遙控器C小車(chē)就會(huì)倒著走回來(lái),這個(gè)對(duì)于各位大佬應(yīng)該非常容易,請(qǐng)幫幫我,最好能給我釋義一下,你們是怎么定的時(shí)間,時(shí)間是怎么樣計(jì)算出來(lái)的   ,  怎么外部中斷的,特別是這兩個(gè),非常重要,希望能夠在大佬們的幫助下弄懂這兩個(gè)的用法

萬(wàn)分感謝,

從上個(gè)月才開(kāi)始自己學(xué)習(xí)單片機(jī),因?yàn)闀r(shí)間的關(guān)系,之前學(xué)習(xí)過(guò)的一些知識(shí)都已經(jīng)忘記完了,但現(xiàn)在慢慢的看一些視頻,各位老師的講解。各位大佬的發(fā)帖,回復(fù),給了我很多的啟發(fā)和幫助。也開(kāi)始覺(jué)的單片機(jī)挺有趣,這幾天老是想著程序該怎么設(shè)計(jì),需要哪些東西,等等,感覺(jué)有點(diǎn)入迷了,不知道快入門(mén)了吧。

非常感謝有51黑這樣一個(gè)大平臺(tái),讓大家能夠互相幫助著在自己喜歡或者賴(lài)以生活的道路上走著。
愿大家永遠(yuǎn)不忘初心,繼續(xù)前行。

設(shè)置有回復(fù)獎(jiǎng)勵(lì)喲,希望各位大佬們贈(zèng)人玫瑰,手有余香。

附上我用的89C52RC單片機(jī)單片機(jī)的原理圖

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:310519 發(fā)表于 2019-4-16 20:49 | 只看該作者
中斷和定時(shí)正是單片機(jī)的“精要”啊。

回復(fù)

使用道具 舉報(bào)

板凳
ID:164602 發(fā)表于 2019-4-17 08:12 | 只看該作者
只說(shuō)一點(diǎn):外部中斷的IO口

外部中斷的IO口,只能是P32、P33,不能是其它的。因?yàn)檫@是由單片機(jī)的內(nèi)部硬件電路決定的,不是由軟件可以決定的。
如果你使用中斷,就只能是對(duì)應(yīng)的IO口。
另外,中斷源也是由單片機(jī)電路決定的,看手冊(cè)就知道。
回復(fù)

使用道具 舉報(bào)

地板
ID:451718 發(fā)表于 2019-4-17 08:51 | 只看該作者
定時(shí)器是單片機(jī)內(nèi)部的硬件,而中斷只是單片機(jī)的一種機(jī)制,在使用計(jì)時(shí)器的時(shí)候,你可以用中斷機(jī)制,也可以不用。 有個(gè)教程推薦給你, 用一天的時(shí)間就可以讀完這個(gè)教程,一定對(duì)你有很大的幫助。
下載地址:http://www.torrancerestoration.com/bbs/dpj-26246-1.html
回復(fù)

使用道具 舉報(bào)

5#
ID:149799 發(fā)表于 2019-4-17 09:41 | 只看該作者
總工講解的很詳細(xì)了
回復(fù)

使用道具 舉報(bào)

6#
ID:123289 發(fā)表于 2019-4-17 11:02 | 只看該作者
“我理解的外部中斷,電平觸發(fā)就是一個(gè)按鍵或是什么東西,在單片機(jī)引腳上輸入了一個(gè)電平,這個(gè)電平一直存在使其一直保持中斷,松開(kāi)按鍵就外部中斷停止了,
下沿觸發(fā)像是在引腳上輸入一個(gè)電平的信號(hào),就像一個(gè)波形一樣,觸發(fā)不需要保持住,單片機(jī)檢測(cè)到這個(gè)波形了就觸發(fā)外部中斷!
你說(shuō)對(duì)了一半:準(zhǔn)確地說(shuō),不是“就中斷了”,而是產(chǎn)生中斷申請(qǐng)標(biāo)記位了,離中斷還差一步:你讓不讓它中斷!
回復(fù)

使用道具 舉報(bào)

7#
ID:123289 發(fā)表于 2019-4-17 11:05 | 只看該作者
“就一點(diǎn)不明白,外部中斷一定要接在INT0,INT1引腳上才可以嗎?別的端口不可以嗎?那如果需要用傳感器控制的外部中斷多幾個(gè),好像局限性很大”
你的想法,設(shè)計(jì)大師們已經(jīng)考慮到了:后期改進(jìn)型51計(jì)算機(jī)的確可以在別的端口中斷,如P2.0。STC的機(jī)型就是你想像的。傳統(tǒng)51沒(méi)有。
回復(fù)

使用道具 舉報(bào)

8#
ID:505803 發(fā)表于 2019-4-17 11:18 | 只看該作者
那想是有3 個(gè)4個(gè)的中斷源怎么辦?換板子嗎?
回復(fù)

使用道具 舉報(bào)

9#
ID:505803 發(fā)表于 2019-4-17 11:25 | 只看該作者
robinsonlin 發(fā)表于 2019-4-17 08:51
定時(shí)器是單片機(jī)內(nèi)部的硬件,而中斷只是單片機(jī)的一種機(jī)制,在使用計(jì)時(shí)器的時(shí)候,你可以用中斷機(jī)制,也可以不 ...

這個(gè)視頻就是我正在看的,宋老師講的很好,我也在認(rèn)真學(xué)習(xí),有的視頻會(huì)反反復(fù)復(fù)的看,了解他講的一些知識(shí)點(diǎn)。
另外,大哥我想問(wèn)一下,我想一步一步的把我上邊的這個(gè)程序給推敲出來(lái),這樣更能加深我的理解,
就是單片機(jī)怎么接受高電平的輸入,現(xiàn)在這個(gè)遙控接收表只能輸出高電平,有什么辦法在程序上調(diào)整或者是硬件上加什么東西,
謝謝大哥的回復(fù)
回復(fù)

使用道具 舉報(bào)

10#
ID:123289 發(fā)表于 2019-4-17 11:29 | 只看該作者
“還有定時(shí)器,感覺(jué)怎么這么復(fù)雜,可以一會(huì)語(yǔ)句循環(huán),一會(huì)定時(shí)器控制,都不知道到底該用哪種了。
到現(xiàn)在定時(shí)器都沒(méi)弄懂!
它就是個(gè)計(jì)數(shù)器,即然是計(jì)數(shù)器就有以下:
1、輸入時(shí)鐘脈沖CLK,來(lái)一個(gè)計(jì)一次。如果CLK間隔很準(zhǔn)時(shí)(來(lái)自晶振),自然就可以用來(lái)“定時(shí)”,這時(shí)可以美其名曰“定時(shí)器”了;如果間隔很隨機(jī)(來(lái)自引腳的外接脈沖),就只能數(shù)數(shù)脈沖的個(gè)數(shù),就只能是“計(jì)數(shù)器”了。如果切斷(TR=0)它,當(dāng)然就停止計(jì)數(shù)了;如果接通它(TR=1),就又計(jì)數(shù)了。這樣說(shuō)不就知道“定時(shí)”、“計(jì)數(shù)”、“起動(dòng)”、“停止”了嗎。
2、是計(jì)數(shù)器就有位數(shù)限制,計(jì)滿會(huì)發(fā)生什么?會(huì)輸出一個(gè)脈沖至中斷標(biāo)記位。這就是“定時(shí)器中斷”的道理。
3、這個(gè)計(jì)數(shù)器是可以預(yù)置轉(zhuǎn)數(shù)的,在任何時(shí)候你都可以預(yù)置數(shù),你瞎置它就瞎數(shù),為了有規(guī)律,你通常會(huì)選擇一個(gè)特定的時(shí)刻置數(shù),當(dāng)然最有特點(diǎn)的時(shí)刻就是它計(jì)滿的時(shí)候!例如:65536計(jì)滿,計(jì)滿后你置數(shù)據(jù)60000,這樣它就每計(jì)5536次發(fā)出一次中斷申請(qǐng)。如果你不置數(shù),它就每65536次發(fā)出一次中斷申請(qǐng)。
4、中斷申請(qǐng)發(fā)出后,如果沒(méi)有被清除(用其它方式清除),那么再次申請(qǐng)就沒(méi)有意義了。這就是中斷響應(yīng)后為什么要復(fù)位中斷標(biāo)記的道理,當(dāng)然有些機(jī)型是硬件復(fù)位的,即一響應(yīng)就自動(dòng)清除它,也就不要你操心了。
回復(fù)

使用道具 舉報(bào)

11#
ID:286252 發(fā)表于 2019-4-17 11:32 | 只看該作者
51單片機(jī)就是這樣,它只有兩個(gè)外部中斷輸入口,如果你中斷輸入口不夠,你可以使用與非門(mén)連接(將普通的IO口連接在門(mén)電路的輸入口,門(mén)電路的輸出口接單片機(jī)中斷口)。
回復(fù)

使用道具 舉報(bào)

12#
ID:123289 發(fā)表于 2019-4-17 11:35 | 只看該作者
“程序方面,看了許多的例程,里面的代碼,最后感覺(jué)有很多的相似,就好像有固定的框框,寫(xiě)程序的時(shí)候只需要朝里面套自己的東西一樣。”
寫(xiě)程序很容易,就那么幾個(gè)句子抄抄。但架構(gòu)程序,是需要相當(dāng)?shù)闹腔郏。!腦子不太好使用的,不好學(xué)這一行。你必須學(xué)會(huì)構(gòu)建程序,第一步就是必須會(huì)畫(huà)流程圖,流程圖說(shuō)得通道理,達(dá)得成目的。再依流程圖寫(xiě)程序,余下的就是抄抄句子了。
看別人的程序,要點(diǎn)是了解它的構(gòu)思、目的、達(dá)成目的所采用的方式。語(yǔ)句不重要!
回復(fù)

使用道具 舉報(bào)

13#
ID:123289 發(fā)表于 2019-4-17 11:39 | 只看該作者
你留的不是程序,只是定義接口接的是什么東西。
回復(fù)

使用道具 舉報(bào)

14#
ID:123289 發(fā)表于 2019-4-17 11:41 | 只看該作者
我的分很多,你就留著用吧,不別給我了。不夠用我可以贊助你一點(diǎn)。
回復(fù)

使用道具 舉報(bào)

15#
ID:123289 發(fā)表于 2019-4-17 11:49 | 只看該作者
你的原理圖上可以省去四個(gè)元件:D1、C3、C7、Y1。
D1省去后:短接。
C3、C7、Y1省去后,從U2-8引一條線至OSCIN。不過(guò)CPU的主頻就統(tǒng)一成12M了,這一點(diǎn)軟件上是可以克服的(相關(guān)時(shí)序的參數(shù)調(diào)整一下)。
回復(fù)

使用道具 舉報(bào)

16#
ID:123289 發(fā)表于 2019-4-17 11:50 | 只看該作者
如果離我近,不出一周教會(huì)你單片機(jī)。
回復(fù)

使用道具 舉報(bào)

17#
ID:505803 發(fā)表于 2019-4-17 15:05 | 只看該作者
yzwzfyz 發(fā)表于 2019-4-17 11:29
“還有定時(shí)器,感覺(jué)怎么這么復(fù)雜,可以一會(huì)語(yǔ)句循環(huán),一會(huì)定時(shí)器控制,都不知道到底該用哪種了。
到現(xiàn)在定 ...

大哥您好
這個(gè)定時(shí)器,聽(tīng)了一些視頻資料的講解,大概知道它是什么原理,但就是具體的該怎么用還不太清楚。
程序方面流程圖畫(huà)的有,都說(shuō)的通。就是不知道該如何下手。
看一些例程,自己分析,就是先,頭文件,定義引腳,然后程序的流程。引用的函數(shù)。等。自己寫(xiě)的時(shí)候就完全不知道該怎么寫(xiě)了。之前也按照流程寫(xiě)過(guò)了,當(dāng)時(shí)想的是。我需要的程序就和點(diǎn)亮LED燈一樣,不過(guò)是時(shí)間不一樣,但就是時(shí)間不知道該如何計(jì)算,怎么樣才能一會(huì)定時(shí)4秒 一會(huì)定時(shí)10秒,
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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