<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        AVR單片機學習(四)C語言的流水燈驗證

        作者:zww 1988   來源:本站原創   點擊數:  更新時間:2014年04月18日   【字體:
        AVR 的IO口簡介與寄存器的概念

         一、何謂“寄存器”

            寄存器就是RAM中的一些特殊單元,映射片上外設的特殊功能

        二、何謂“IO口”

            可以將"0"與1轉換為電壓信號的端口

            單片機中最常用的TTL電平:0V代表“0”,+5V 代表“1”

            Mega16有4個IO口,PA,PB,PC,PD

        三、IO口的性能指標

           灌電流能力:能夠流入IO口的最大電流

           拉電流能力:能夠從IO口流出的最大電流

           上拉電阻與下拉電阻

           最大輸入電壓

        IO口的兩種狀態




        如上圖(有個選擇開關實際電路中不存在的為了好理解才給出的)輸出就是 要么給個5V 要么給個地 0V  就是輸出0  和 1

         

        上圖輸入模型  理想的輸入IO口相當于一個懸空的導線,就是輸入這個對VCC 與對地的等效阻抗都必須為無窮大,實際單片機現在一般都做到10M歐姆以上。

        IO口的輸出性能指標

        1/AVR 的IO口灌電流能力與拉電流能力均達30mA

        2/51的拉電流能力<100uA,灌電流能力10mA

        拉電流能力:

        能夠從IO口流出的最大電流

         下圖是只管的看出電流時從IO口流出,相當于內部開關達到VCC 隨著外面阻值改變電流改變 最大電流30mA Imax



        灌電流能力:

        能夠流入IO口的最大電流

        下圖同理 IO口的輸入


        IO口的輸入性能指標

        一、AVR的IO口輸入狀態時可配置上拉電阻,值為100K 數量級

        二、最大輸入電壓范圍:-0.5V~VCC+0.5V



         AVR 輸入IO是可以配置上拉電阻的是一個比較弱上拉 大概100K -- 200K 、為什么要配置一個上拉電阻呢?對于輸入口,因為配置為輸入的時候,它的等效一個懸空的一個點,如果在輸入口上真的是一個懸空的話,這樣一個懸空的導線的電平會是多少呢?單片機內部會認為是輸入一個0 還是1呢/答案就是不確定的,可能受外部一些靜電或一些比較強的電磁場一些影響或者0或者是1,但是如果我們將配置一個上拉電阻,當這個IO口懸空的時候,這個電平就不再是不確定的了,被確定為上拉為1.上拉電阻具體的作用將在下一講,將這個按鍵程序設計時候大家會有更深的體會。承受最大輸入電壓看下圖:輸入做小低電壓電壓 -0.5  最大0.2VCC   輸入高電壓  做小0.7VCC 最大VCC+0.5V  就是說最小-0.5  最大 5.5V

         


        除了ATmega16之外其他的AVR芯片跟m16也差不多

        一、IO口語IO寄存器的映射(x代表A~D)\

        方向寄存器:DDRx

        數據寄存器:PORTx

        輸入寄存器:Pinx

        二、C語言變量與寄存器的映射

        io.h這個文件中將所有寄存器映射為同名的變量,對這些變量的讀寫相當于對寄存器的讀寫

        三、輸出狀態IO寄存器設置

        DDRx某一位置1,相應位的IO口被設置為輸出

        PORTx某一位置1或0,對應IO口相應位的電平高低

         

         

         

         

         

         

        下面是一些映射關系

         


        第一個:C語言通過AVR Studio/WinAVR 等編譯成目標代碼,然后通過下載線編程器(現在個人一般不用了)、JATG口到硬件單片機

        第二個:說的是寄存器到寄存器的映射 通過同名變量 、單片機一般多數為8位定時器當然也有16位計數器、然后映射到寄存器內的數據0 1 雖然在RAM存的是0或1 相當于內部高低電平的一種形式進行存儲最后通過IO口 UART  SPI   IIC  轉化為 +5v  0v 或LVTTL +3.3V 0V .

        第三個、其他的變量 其實就是RAM中的數據也就是占用RAM中的存儲單元當然這個RAM不能直接跟外界直接進行接觸的。

        第四個、函數表示的就是各個函數之間的一些運算還有就是互動的關系,表現到單片機內部就是各個寄存器還有RAM的互動關系,最后轉化為硬件模塊之間的關系。

        • C語言的流水燈驗證

        循環語句、

        8位流水燈可用于指示8位二進制

        對IO寄存器進行移位運算,即可實現流水燈效果

        循環語句

          1、while語句

          2、for 語句

        各種運算符的流水燈驗證

        賦值=  加+  減-  乘*  除/ 括號()  求余%

        與& 或| 取反 ~  異或^ 左移 <<  右移>>

        邏輯與 && 邏輯或||  邏輯非!

        while(表達式)//表達式不為0 即為真    (1)死循環

        {

           

         



        如何設置斷點 
        toggle breakpoint F9

        斷點就是全速運行時候當運行到斷點位置就停下來如下圖

        Run  F5



        去除斷點就是把光標定位到斷點處再次點擊小手或F9 斷點就去除了。

        再次按全速運行結果如下圖燈全亮了

        原因是因為運行循環速度太快應該加個延時AVR CPU 主頻能跑到16MHZ 一個1到2微秒的時間。1百萬沒秒循環幾十萬次,然人眼分辨加延時。

        for (賦值初始值只做一次;條件(真進入內容);執行完內容后執行此條語句){};來回判斷 第2條與第3條語句

        for 循環大括號沒有是只執行 第二條與第三條 判斷 加加動作。


        位運算

        1. 將某一位置1、置0、取反
        2. 置1、

            相應位與1 進行位或|運算

          3.置0

            相應位與0進行按位與&運算

          4.取反

            相應位與1進行按位異或^ 運算    相同為0  相異為1

          5.移位運算符:左邊為最高位,右邊為最低位

            左移<<:

          左移n位相當于乘2^n運算,左側n丟棄,右側n個0

          6.右移

          右移n位相當于乘2^n運算,右側n位丟棄,左側補n個0

        注意:在32位操作系統中 是補符號位  我在嵌入式32位操作系統試過

        如果自制的仿真器缺點如果濾波做不好會出現跑飛的現象。

         

        (引用百度說辭:程序跑飛

        程序跑飛是指系統受到某種干擾后,程序計數器PC的值偏離了給定的唯一變化歷程,導致程序運行偏離正常的運行路徑.程序跑飛因素及后果往往是不可預計的.在很多情況下,程序跑飛后系統會進入死循環而導致死機

         

        任何數與1 進行^ 異或就取反了。

        PORTB = PORTB ^ 0b11111111;//利用異或可以實現閃爍燈

         

        IO口設置為輸出狀態

        • 蜂鳴器

        一、有源蜂鳴器

        加上電源電壓即可發出鳴叫聲,消耗電流20mA左右

        傳統的蜂鳴器驅動電路

        三極管驅動(如下圖)

        AVR的蜂鳴器驅動電路

        IO口直接驅動(如圖)

         




        編一段程序進行驗證(buzzer 蜂鳴器)

         





        可看到PORTA 變化  蜂鳴器叫了

        好了總結下

        第一步:IO設置為輸出

        DDRB = 0XFF;

        DDRB |= 0b00100000//第五位輸出高電平

        第二步:對應位輸出數據

        輸出1:PORTB |= 0b00100000;//第五位輸出高電平

        輸出0:PORTB &= ~0b00100000;//第五位輸出低電平

        輸出1:PORTB |= (1<<5);//第五位輸出高電平

        輸出0:PORTB &= ~(1<<5);//第五位輸出低電平

        對應位取反:PORTB^ = (1<<5);//第五位輸出高電平

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮