新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR學習心得(三)

        AVR學習心得(三)

        作者: 時間:2016-11-10 來源:網絡 收藏
        AVR mega128 SPI 控制HC595

        經過多天的努力,終于對AVR控制HC595驅動數碼管,有了全面的認識和了解。下面我將把AVR控制HC595的設計經驗寫在下面:

        本文引用地址:http://www.104case.com/article/201611/317325.htm

        AVR控制HC595控制有兩種方法:

        一種:利用AVR自帶的SPI接口控制;

        一種:利用AVR端口模擬SPI方式控制。

        原理圖:

        說明:

        1。用AVR自帶的SPI總線接口控制時,要注意幾個SPI寄存器的使用:

        • 設置SPI的管腳狀態:

        DDRB|=(1<

        • SPI控制寄存器SPCR:

        SPCR=(1<

        • SPI數據寄存器SPDR:

        SPDR = Data; /* 啟動數據傳輸 */

        • SPI狀態寄存器SPSR:

        while(!(SPSR & (1<

        而對于HC595來說,只要注意時序就可以了。對于用SPI接口方式,移位寄存器的時序有AVR自動產生,不用去管它,只有存儲寄存器的時序有軟件控制。

        #define SS 0
        #define SCK 1
        #define MOSI 2
        #define MISO 3

        #define SS_H() PORTB|=(1<#define SS_L() PORTB&=~(1<

        把數據從HC595送入存儲寄存器

        void SPI_MasterTransmit(char Data)
        {
        /* 啟動數據傳輸 */
        SPDR = Data;
        /* 等待傳輸結束 */
        while(!(SPSR & (1< ;
        }

        數據從595的并行口輸出

        void HC_595_OUT(unsigned char data)
        {
        SS_L(); //拉低存儲寄存器時鐘
        SPI_MasterTransmit(data); //傳送數據到HC595
        SS_H(); //拉高存儲寄存器時鐘
        }

        2。AVR模擬SPI總線控制HC595:

        對于這種方法,要求對單片機的了解要少一些。把AVR與HC595相接的口都設置為輸出,然后按595的時序控制595 即可。

        //存儲寄存器時鐘輸入
        #define SS_H() PORTB|=(1<#define SS_L() PORTB&=~(1<//移位寄存器時鐘輸入
        #define SCK_H() PORTB|=(1<#define SCK_L() PORTB&=~(1<//串行數據輸入
        #define MOSI_H() PORTB|=(1<#define MOSI_L() PORTB&=~(1<

        把數據從HC595送入存儲寄存器

        void HC_595_input(unsigned char data)
        {
        unsigned char i;
        for(i=0;i<8;i++)
        {
        SCK_L();//移位寄存器時鐘拉低時鐘
        if(data&0x80) //最高位判斷
        {
        MOSI_H(); //最高位為1,則寫1到DS口
        }
        else
        {
        MOSI_L(); //最高位為0,則寫0到DS口
        }
        SCK_H();//移位寄存器時鐘拉高時鐘
        delay_1us();
        data<<=1;
        }
        }

        數據從595的并行口輸出

        void HC_595_output(unsigned char data)
        {
        SS_L();//存儲寄存器時鐘拉低時鐘
        HC_595_input(data);
        SS_H();//存儲寄存器時鐘拉高時鐘
        }

        總結:

        由上面的函數可以看出,這兩種方法,僅僅該變的是《把數據從HC595送入存儲寄存器》函數,下面的《數據從595的并行口輸出》函數完全是一樣的。而用第一種方法函數要簡單些,但是設置要復雜,要懂得AVR的寄存器的功能和設置方法。用第二種方法不需要太多的設置,可以在不了解單片機內部寄存器的情況下進行控制,函數復雜些。但只需要了解595的時序就可以控制,并于移植。

        /*SPI接口初始化*/

        void SPI_MasterInit(void) {

        DDRB |= (1<

        PORTB=~((1<

        //配置拉電阻

        SPCR = (1<

        | (1<

        }



        關鍵詞: AVR學習心

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 巴彦县| 张家界市| 灌阳县| 三亚市| 驻马店市| 宜阳县| 泸西县| 淮安市| 河源市| 江口县| 西藏| 新源县| 麦盖提县| 定远县| 安徽省| 丰镇市| 繁昌县| 新巴尔虎左旗| 柳江县| 青川县| 洛阳市| 七台河市| 通州区| 房山区| 东莞市| 海城市| 保山市| 商水县| 中阳县| 潮州市| 霍州市| 巫溪县| 沿河| 夏津县| 尖扎县| 新巴尔虎右旗| 新丰县| 紫云| 杭锦后旗| 即墨市| 津市市|