新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第4課 點亮發光管程序分析

        第4課 點亮發光管程序分析

        作者: 時間:2016-12-01 來源:網絡 收藏
        實際上就本程序來說,我們也可以不包含該頭文件,而加上一句話,“ sfr P1=0x90; ”也是可以的,但如果要用到P0 P1 P2 P3就需要寫四名話,這樣就會顯得很麻煩 ,只要大家能理解這個,相信大家對為什么要在些加一直頭文件的原因應該理解了,總之以后我們寫51的程序時第一句話就直接包含該頭文件就行了。
        2、程序注釋
        在對頭文件進行解釋后,在頭文件后面我們可以看到有“//……”符號。“//……”表示語句注釋,其作用主要是為了以后閱讀程序來方便。“//……”主要是對單句或者比較短的程序進行注釋,但如果是對一整段程序進行注釋時,這種方法就顯得非常麻煩,所以程序注釋還有第二種方法,具體的符號是/*****程序*****/,此時斜杠星號與星號斜杠之間的程序將被整體注釋掉。
        程序被注釋掉后,編譯器在進行編譯時將不會對其進行編譯,此時相當于此處的程序被刪掉一樣。注釋的目的是為了方便他人閱讀程序,同時也方便自己一段時間后再來閱讀程序時能夠快速的理解該程序的含義。
        3、位聲明
        程序的第三行出現了”sbit D1=P1^0;”下面進行說明。
        sbit表示位的意思,它也是非標準C語言的關鍵字,編寫程序時如需操作寄存器的某一位(可位尋址的寄存器才能用)時,需定義一個位變量,此時就要要到sbit,如上面的程序中D1=P1^0,;需要注意的是,位定義時有些特殊,用法有三種:
        第一種方法:sbit 位變量名=寄存器位地址值
        第二種方法:sbit 位變量名=SFR 名稱^寄存器位值(0-7)
        第三種方法:sbit 位變量名=SFR 地址值^寄存器位值
        如:
        sbit IT0=0x88(1)說明:0x88是IT0的位地址值
        sbit D1=P1^2(2)說明:其中P1必須先用sfr定義好
        sbit EA=0xA8^7(3)說明:0xA8就是IE寄存器的地址值
        以上三種定義方法需注意的是 IT0 deng EA可由用戶隨便定義,但必須滿足C語言對變量名的定義規則。除些外其它的則必須按照上面的格式寫,如“名稱^變量位地址值”中“^”,它是由keil軟件的規定的,不能寫成其它的,只能這樣能才編譯通過。
        這里也就是說像操作單片機某個口(如P1口),需要通過頭文件sfr P1 = 0x90對其地址進行聲明,同樣的對寄存器的某一位操作時,也需要對位地址進行聲明,此時我們就采用的是第二種表達法sbit D1=P1^0;程序中對D1的操作就相當于對P1中的位地址0Xaff進行操作。
        4、主函數
        格式:void main()
        特點:無返回值,無參數。
        無返回值,是指函數執行完后不會返回任何值,上面void表示“空”的意思,即不返回任何值,此處也可以省略不寫。當然函數還有帶返回值的,后面具體會講到。
        無參數是指該函數不還有任何參數,即main后面的()沒有任何參數,此時也可以在括號內加上void ,如main(void),但通常省略不寫。后面也會講到還有參數的函數,等后面講到時大家就會理解了。
        函數是能夠實現特定功能的代碼段,需要注意的是,一個C51源程序必須有,且只能有一個主函數main(),它是整個程序開始執行的入口。在void main()后面必須加一對花括號,其內部為一條一條的程序語句。如本例程:
        void main()
        {
        D1=0;
        }
        當然這個主函數相對來說比較簡單,里面只有一條語句。
        5、D1=0
        這條語句位于主函數內,也是這個程序中最重要的部分。D1相當于單片機P1口的第1個引腳。通過前面的知識我們也知道,數字電路中有兩種電平,高電平和低電平,0表示低電平或者說低電壓,1表示高電平或者說高電壓。由于發光管陽極是通過限流電阻接的5V高電壓,而陰極接的P1口的第1個引腳,通過程序D1=0讓其為低電壓,所以此時程序一執行后,該發光二極管就會發光。
        6、利用總線操作法點亮發光二極管
        在例1中,要實現讓一個管發光,我們采用了位操作法,位操作法其實就是對單片機的每一個引腳單獨操作,如例中就是先作位定義sbit D1=P1^0,然后讓D1=0,最終實現了功能。一個燈會點亮,相信大家也會同點多個燈,如要讓1、3、5、7燈亮時,按前面的方法程序應該寫為:
        例2 位操作法實現1、3、5、7燈亮
        #include
        sbit D1=P1^0;
        sbit D3=P1^2;
        sbit D5=P1^4;
        sbit D7=P1^6;
        void main()
        {
        D1=0;
        D3=0;
        D5=0;
        D7=0;
        }
        這種方法當然可以實現1、3、5、7,但這種方法需要定義多個位變量,程序書寫起來相對麻煩。下面給出另一個寫法,如下:
        例3 總線操作法實現1、3、5、7燈亮
        #include
        void main()
        {
        P1=0xaa;
        }
        這個程序同樣可能實現把1、3、5、7燈點亮,也就是說程序的功能和上面位操作法寫的程序是一樣,但卻要簡單得多,這種方法就稱為總線操作法。所謂的總線操作法也就是同時操作單片機P1口的8個引腳(或者說8個I/O口),具體到程序就是通過“P1=0xaa;”實現的, “0x”表示16進制的意思,16進制aa轉化成2進制就是10101010,而10101010正好就是讓單片機P1口的1、3、5、7引腳輸出低電平,2、4、6、8引腳輸出高電平,此時就實現讓第1、3、5、7發光二極管發光。
        把例3的程序下載到實驗板上的現象如圖13所示:
        圖13 總線操作法實現1、3、5、7發光二極管發光
        在上面三個例子中,我們用兩種方法(位操作法和總線操作法)實現點亮發光二極管的目的,目的是達到了,但如若仔細推敲兩個程序,實際上是不完善的的。讓我們看例三,程序第一句為頭文件,是對52單片機一些特殊功能寄存器相關的聲明,然后第二句進入主程序執行“P1=0xaa;”,點亮1、3、5、7發光二極管,但執行完這句后單片機又試干嘛呢?這之后我們沒有寫相關程序讓單片機執行什么事情,所以程序執行到這里有可能出錯(這里只是說有可能,因為每個編譯器不一樣),通過反復的實驗,我們得出keil軟件一般這里會回到主程序的第一句開始執行,也就是說又開始執行“P1=0xaa;”,周而復始,一直這樣的執行下去,1、3、5、7發光二極管就一直會亮下去。但從程序開發角度來說,我們說這里就必須做相應的處理,明確告訴下一步程序要做什么事情。比如說我們就是要讓主程序周而復始,反復的執行,此時我們就可以利用C語言中的while語句來實現,下面先講下while語句。
        格式:
        While(表達式)
        {
        語句(內部也可為空)
        }
        特點:
        先判斷表達式,后執行語句。
        原則:若表達式為不是0,即為真,則執行語句,如為0 ,即為假就跳出while 語句。
        注意:while語句內部的語句可以為空,即什么也沒有,此時就寫成while(1){};此時{}可以不寫,即寫成while(1);意思就是永遠為真,執行空語句,相當于程序永遠停止在這里。
        了解了while語句后,我們就可以把例三的程序進完善了,程序如例四。
        例4:完整點亮發光二極管的程序
        #include
        void main()
        {
        While(1)
        {
        P1=0xaa;
        }
        }
        While語句就介紹到這,下面總結一下,單片機軟件的學習就是通過我們寫程序,控制單片機外部引腳輸出“1”(高電平+5V),和“0”(低電平0V),從而達到對各種外設的控制。單片機學習來并不難,只要大家有信心,肯花功夫,學起來也是很容易的。
        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 安多县| 策勒县| 牟定县| 建宁县| 龙岩市| 临夏县| 桂平市| 济南市| 衡东县| 府谷县| 阿拉尔市| 霍山县| 湘潭市| 聊城市| 桃源县| 鱼台县| 长泰县| 商丘市| 常山县| 基隆市| 称多县| 五指山市| 安溪县| 兴安盟| 尼勒克县| 张家界市| 南汇区| 南投市| 遂昌县| 安多县| 手游| 新建县| 宾阳县| 河北区| 鱼台县| 巴塘县| 永仁县| 杭锦旗| 永丰县| 合肥市| 兴安县|