新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第二部分 與外圍設備的接口實例

        第二部分 與外圍設備的接口實例

        作者: 時間:2016-11-17 來源:網絡 收藏
        這一章,講用程序控制單片機輸出I/O口的電平高低,進而控制外圍設備的實例。需要注意地,51單片機上電后,默認輸出高電平。上一章的很多程序模塊,可直接拿來使用。

        2.1 簡單的控制實例——蜂鳴器

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

        假設蜂鳴器的引腳和單片機的P3.7口相連。現在要讓蜂鳴器大約響500ms,然后關閉。

        程序是:

        #include
        #define uint unsigned int
        #define uchar unsigned char //宏定義
        sbit beep=P3^7;
        void delay() //延時500ms
        {
        uint x,y;
        for(x=100;x>0;x--)
        for(y=580;y>0;y--);
        }
        void main()
        {
        beep=0; //開蜂鳴器
        delay();
        beep=1; // 關蜂鳴器
        while(1);
        }

        2.2 流水燈

        流水燈由八個發光二極管組成,剛好是一個字節,發光二極管共陰極,它們的陽極與單片機的P0相連??梢?,默認流水燈全亮。

        例程1 發光二極管偶數燈和奇數燈交替亮500ms,偶數燈先亮。

        #include
        #define uint unsigned int
        #define uchar unsigned char //宏定義
        void delay() //延時500ms
        {
        uint x,y;
        for(x=100;x>0;x--)
        for(y=580;y>0;y--);
        }
        void main()
        {
        while(1)
        {
        P0=0x55;
        delay();
        P0=~P0; //~表示按位取反
        delay();
        }
        }

        例程2開始時,流水燈只有最底位D0亮,亮燈每隔500ms往高位流動,形成一個循環反復的過程。

        #include
        #include //定義循環左移函數_crol_
        #define uint unsigned int
        #define uchar unsigned char //宏定義
        void delay() //延時500ms
        {
        uint x,y;
        for(x=100;x>0;x--)
        for(y=580;y>0;y--);
        }
        void main()
        {
        uchar temp;
        temp=0x01;
        while(1)
        {
        P0=temp;
        delay();
        temp=_crol_(temp,1); //循環左移一位
        }
        }

        例程3 間隔300ms先奇數亮再偶數亮,循環三次;一個燈上下循環三次;兩個分別從兩邊往中間流動三次;再從中間往兩邊流動三次;8個全部閃爍3次;關閉發光管,程序停止。

        #include
        #include
        #define uint unsigned int
        #define uchar unsigned char
        void delay(uint);
        void main()
        {
        uchar i,j,k,z,n,temp;
        P0=0x00; //燈全熄滅
        for(i=3;i>0;i--)
        {
        P0=0xaa;//a大小寫都可以
        delay(450);
        P0=0x55;
        delay(450);
        }
        temp=0x01;
        for(j=24;j>0;j--)
        {
        P0=temp;
        delay(450);
        temp=_crol_(temp,1); //D0燈亮并上下循環三次
        }
        temp=0x01;
        /*

        for(i=3;i>0;i--)
        {
        for(j=8;j>0;j++)
        {
        P0=temp;
        delay(450);
        temp=_crol_(temp,1);//D0燈亮并上下循環
        }
        }

        */
        P0=0x00;
        for(k=3;k>0;k--)
        {
        P0=0xc3;
        delay(450);
        P0=0x3c;
        delay(450);
        }
        for(z=3;z>0;z--)
        {
        P0=0x3c;
        delay(450);
        P0=0xc3;
        delay(450);
        }
        for(n=3;n>0;n--)
        {
        P0=0xff;
        delay(450);
        P0=0x00;
        delay(450);
        }
        P0=0x00;
        for(n=6;n>0;n--)
        {
        P0=~P0; //~按位取反
        delay(450);
        }
        while(1);
        }
        void delay(uint z)
        {
        uint x,y;
        for(x=100;x>0;x--)
        for(y=z;y>0;y--);
        }

        2.3 數碼管

        在我的實驗板上,單片機通過芯片CH451(參考我寫的CH451的使用總結)來控制數碼管顯示。CH451與八個數碼管連接的原理圖如下所示:

        例程1點亮0、2、4、6號數碼管,讓它們都顯示1。

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        #define CH451_DIG0 0x0800 /*數碼管位0顯示*/
        #define CH451_DIG1 0x0900 /*數碼管位1顯示*/
        #define CH451_DIG2 0x0a00 /*數碼管位2顯示*/
        #define CH451_DIG3 0x0b00 /*數碼管位3顯示*/
        #define CH451_DIG4 0x0c00 /*數碼管位4顯示*/
        #define CH451_DIG5 0x0d00 /*數碼管位5顯示*/
        #define CH451_DIG6 0x0e00 /*數碼管位6顯示*/
        #define CH451_DIG7 0x0f00 /*數碼管位7顯示*/
        sbit ch451_din = P1^0;
        sbit ch451_clk = P1^1;
        sbit ch451_load = P1^2;
        /********************************************************************
        函 數 名:ch451_init()
        功 能:對ch451芯片進行初始化
        ***********************************************************************/
        void ch451_init(void)
        {
        ch451_din = 0; /*先低后高,選擇4線輸入*/
        ch451_din = 1;
        ch451_load = 1;
        ch451_clk = 1;
        }
        /********************************************************************
        函 數 名:ch451_write()
        功 能:把12位的指令或數據寫入ch451
        說 明:12位數據或指令的寫入順序是低位
        入口參數:command
        ***********************************************************************/
        void ch451_write(unsigned int command)
        {
        unsigned char i;
        ch451_load=0; /*命令開始*/
        for(i=0;i<12;i++)
        { /*送入12位數據,低位在前*,&表按位與,如5&7=5,即:0101^0111=5*/
        ch451_din=command&1;
        ch451_clk=0;
        ch451_clk=1;
        command>>=1; /*上升沿有效*/
        }
        ch451_load=1; /*加載數據*/
        }
        void main()
        {

        ch451_init();
        //系統參數設定,參照說明書
        ch451_write(0x401);
        //顯示參數設定,
        ch451_write(0x580);
        //第0位顯示1
        ch451_write(CH451_DIG0|1);
        //第2位顯示1
        ch451_write(CH451_DIG2|1);

        //第4位顯示1
        ch451_write(CH451_DIG4|1);
        //第6位顯示1
        ch451_write(CH451_DIG6|1);

        }

        例程2 數碼管位0位和1同時顯示0、1、2、3、4,且循環顯示這些數值。

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        #define CH451_DIG0 0x0800 /*數碼管位0顯示*/
        #define CH451_DIG1 0x0900 /*數碼管位1顯示*/
        #define CH451_DIG2 0x0a00 /*數碼管位2顯示*/
        #define CH451_DIG3 0x0b00 /*數碼管位3顯示*/
        #define CH451_DIG4 0x0c00 /*數碼管位4顯示*/
        #define CH451_DIG5 0x0d00 /*數碼管位5顯示*/
        #define CH451_DIG6 0x0e00 /*數碼管位6顯示*/
        #define CH451_DIG7 0x0f00 /*數碼管位7顯示*/
        uint table[5][2]={{CH451_DIG0|0,CH451_DIG1|0},{CH451_DIG0|1,CH451_DIG1|1},
        {CH451_DIG0|2,CH451_DIG1|2},{CH451_DIG0|3,CH451_DIG1|3},{CH451_DIG0|4,CH451_DIG1|4}};
        //定義二維數組

        sbit ch451_din=P1^0;
        sbit ch451_clk=P1^1;
        sbit ch451_load=P1^2;
        /********************************************************************
        函 數 名:ch451_init()
        功 能:對ch451芯片進行初始化
        ***********************************************************************/
        void ch451_init(void)
        {
        ch451_din = 0; /*先低后高,選擇4線輸入*/
        ch451_din = 1;
        ch451_load = 1;
        ch451_clk = 1;
        }
        /********************************************************************
        函 數 名:ch451_write()
        功 能:把12位的指令或數據寫入ch451
        說 明:12位數據或指令的寫入順序是低位
        入口參數:command
        ***********************************************************************/
        void ch451_write(unsigned int command)
        {
        unsigned char i;
        ch451_load=0; /*命令開始*/
        for(i=0;i<12;i++)
        { /*送入12位數據,低位在前*,&表按位與,如5&7=5,即:0101^0111=5*/
        ch451_din=command&1;
        ch451_clk=0;
        ch451_clk=1;
        command>>=1; /*上升沿有效*/
        }
        ch451_load=1; /*加載數據*/
        }
        void delay() //延時函數
        {
        uint x,y;
        for(x=100;x>0;x--)
        for(y=580;y>0;y--);
        }
        void main()
        {
        uchar num,tt;
        ch451_init();
        //系統參數設定,參照說明書
        ch451_write(0x401);
        //顯示參數設定,
        ch451_write(0x580);
        while(1)
        {
        for(num=0;num<5;num++)
        {for(tt=0;tt<2;tt++)
        ch451_write(table[num][tt]);
        delay();
        }
        }
        }



        關鍵詞: 外圍設備接口實

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 罗江县| 张家港市| 陆川县| 新安县| 东源县| 凭祥市| 吉安市| 襄垣县| 新邵县| 新巴尔虎左旗| 石台县| 团风县| 浪卡子县| 和顺县| 阳西县| 宁夏| 明水县| 恩施市| 舞阳县| 开平市| 栾川县| 寿宁县| 阳曲县| 曲沃县| 寻甸| 新龙县| 城口县| 逊克县| 北川| 文昌市| 永定县| 巍山| 上高县| 靖远县| 东源县| 富民县| 巴马| 玉屏| 宝坻区| 磴口县| 庆安县|