新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機—8255A詳細介紹(全!)—04

        51單片機—8255A詳細介紹(全!)—04

        作者: 時間:2016-11-25 來源:網絡 收藏


















        9、就是應用了唄



        最后來個程序就哦了,里面帶有注釋~~
        //------------------------------------------------------------------------------
        //實現由8255的PA、PB、PC作為輸出口的可控流水燈的設計,采用灌電流的方法
        //c語言部分
        #include"reg52.h"
        #include"delay.h"
        #include"macroandconst.h"
        #include"foot.h"
        //------------------------------------------------------------------------------
        uchar pdatain_reg; //定義片外存儲空間
        uchar temp,temp1; //用于寫數據的臨時數值
        bit flag=1; //定義標志位
        //------------------------------------------------------------------------------
        //定時器0初始化函數
        void timer0_init()
        {
        TMOD=0x02; //定時器0,8位自動裝初值
        TH0=(256-50)/256; //50us定時
        TL0=TH0;
        ET0=1;
        TR0=1;
        IT1=0; //外部中斷1控制為電平觸發方式
        EX1=1; //外部中斷1中斷允許位
        EA=1;
        }
        //------------------------------------------------------------------------------
        //main
        void main()
        {
        uchar i;
        timer0_init();
        reset=0;
        reset=1; //復位
        reset=0;
        a0=1;
        a1=1;//選擇8255控制寄存器
        in_reg=0x82;//寫入控制寄存器,PA、PC作為輸出口,PB口作為輸入口,并寫入控制寄存器
        //這里可能不是很明白吧,呵呵,其實很簡單,這個是51系列單片機的特有功能,反正我用AVR單片機沒用到過
        //,呵呵,相信都知道51系列單片機的PA口是個A/D口,那就對了,這里還省去了控制WR和RD了,而且還省去了
        //用上拉電阻,要是別的I/O口就得按照WR和RD的協議辦~~~ (從根本來說就是單片機自己控制WR和RD,其實
        //這個東西用的最多的就是擴展了~~~呵呵,不說了,因為我當時擴展也給失敗了~~哭
        while(1)
        {
        a0=0;
        a1=0;//選中PA口的寄存器
        if(flag==0)//標志位為0,流水燈從上向下循環
        {
        temp=0xfe;
        i=0;
        while(i<8)//循環移動8位
        {
        in_reg=temp;
        temp=~temp;
        temp=temp<<1;
        temp=~temp;
        delay(100);
        i++;
        //if(flag!=0) //可以加或者不加,加上后就是從當前亮的地方轉向開頭或者結尾
        //break;
        }
        }
        else //標志位為1,流水燈從上向下循環
        {
        temp=0x7f;
        i=0;
        while(i<8) //循環移動8位
        {
        in_reg=temp;
        temp=~temp;
        temp=temp>>1;
        temp=~temp;
        delay(100);
        i++;
        //if(flag!=1) //同理就哦了
        //break;
        }
        }
        }
        }
        //------------------------------------------------------------------------------
        //定時器0中斷函數,由于用的Proteus仿真,我看著它進入中斷有時間長的,有時間短的,所以所以這個
        void timer0()interrupt 1
        {
        EA=0; //關閉總中斷
        a0=1;
        a1=0;//選中PB口寄存器
        temp1=in_reg;//讀取PB口的數據
        if(((~temp1)&0x01)==1)//按鍵檢測(由于這里的8255當設置為輸入的時候都是輸入高電平~~,所以還是取個反
        {
        //delay(5);//這里就是按鍵檢測的一個延時防抖動的,但是我加上跟不加,差別真的好大啊~~暈了~~
        if(((~temp1)&0x01)==1)
        {
        flag=~flag; //取反標志位,讓它的循環方向改變,下面就不加按鍵松手檢測了~~因為加不上~~呵呵
        }
        }
        a0=0;
        a1=0;
        EA=1;
        }
        //------------------------------------------------------------------------------
        //外部中斷1,這個是我另加上去的,真的要累死了,我用的外部中斷1,它和上面的按鍵檢測是一樣的,看來我是對的,Proteus仿真的時候,定時器還是有問題的,有時候根本不執行中斷!!!
        void int1() interrupt 2
        {
        flag=~flag;
        }


        上一頁 1 2 下一頁

        關鍵詞: 51單片機8255

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 哈尔滨市| 东城区| 阆中市| 岱山县| 闻喜县| 嘉荫县| 肇庆市| 普兰县| 贡山| 马边| 黄山市| 大邑县| 毕节市| 双桥区| 麟游县| 丰原市| 海晏县| 大邑县| 寻乌县| 双鸭山市| 天镇县| 油尖旺区| 新乐市| 自贡市| 平和县| 察哈| 全南县| 海兴县| 临沂市| 崇信县| 海城市| 阿克苏市| 苍山县| 常德市| 鹿泉市| 石台县| 大方县| 横山县| 乌鲁木齐市| 耒阳市| 乐至县|