新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用單片機實現遠程電源控制

        利用單片機實現遠程電源控制

        作者: 時間:2012-11-27 來源:網絡 收藏

        山下控制板的程序如下:
        #include "atmelAT89X51.H"
        #define SYN 0x7E //山頂控制板發來數據幀的同步字符

        char countdown; //時鐘計數
        char TTL; //通信中斷的時間門坎值,設置為3秒
        bit link_error; //通信中斷標志
        bit power_on; //山上設備是否加電的標志
        bit km; //按鍵消抖動標志
        bit kp; //按鍵操作已處理標志
        char TTW; //發送指令前的時間計數

        char TX_buf[3]; //發送緩沖區
        char TX_len; //發送指令長度
        char TX_num; //當前發送的字符序號

        char RX_buf[3]; //接收緩沖區
        char RX_len; //接收指令長度
        char RX_num; //當前接收的字符序號

        char CRC(char *buf,char len) //校驗碼生成函數
        {char i,temp;
        temp=0;
        for(i=0;ilen;i++) temp=temp^buf[i];
        return(temp);
        }

        void timer0_int() interrupt 1 //定時器0的中斷服務函數
        { bit key1,key2;

        TL0=0x00; TH0=0x0A6;
        countdown--;
        if(countdown==0 || countdown==20)
        { P1_6=!P1_6; //CPU運行指示燈秒閃
        if(link_error)
        P1_5=!P1_5; //通信中斷,斷電指示燈秒閃
        else
        { if(power_on) P1_5=1; //設備加電,斷電指示燈滅
        else P1_5=0; //設備關電,斷電指示燈亮
        }
        }

        if(power_on !link_error) //當設備加電且通信正常
        P1_3=0; //關閉蜂鳴器
        else //當設備斷電或通信中斷
        { if(countdown==0) P1_3=0; //蜂鳴器告警
        if(countdown==5) P1_3=1;
        if(countdown==10) P1_3=0;
        if(countdown==15) P1_3=1;
        }

        key1=P3_4; key2=P3_5;
        if(key1==1 key2==1) { km=0;kp=0; } //兩個按鍵均沒有按下
        else
        { if(km==0) km=1; //設消抖動標志
        else
        { if(kp==0)
        { kp=1;
        if(key1==0) //按鍵K1被按下
        TTW=(TTW+1)%4; //計算K1連續按下的次數
        if(key2==0) //按鍵K2被按下
        { if(TTW==3) //如果K1已被連續按了三次
        { if(P1_7) TX_buf[1]=0x13; //發加電指令
        else TX_buf[1]=0x31; //發關電指令
        TX_buf[2]=CRC(TX_buf,2);
        TX_num=0; SBUF=TX_buf[0];
        }
        TTW=0; //不管K1已按下幾次,K2按下后復位TTW計數器
        }
        }
        }
        }

        if(countdown!=0) return;
        countdown=40;

        if(TTL==0) link_error=1; //TTL減到0,表示通信中斷
        else TTL--; //每隔1秒對TTL作減1操作
        }

        void serial_int() interrupt 4 //串口中斷服務程序
        { if(TI)
        { TI=0; TX_num++;
        if(TX_numTX_len) SBUF=TX_buf[TX_num];
        }
        else
        { RI=0; RX_buf[RX_num]=SBUF;
        if(RX_num==0 RX_buf[RX_num]!=SYN)
        return; //在接收到的數據中搜索同步字符

        RX_num++;
        if(RX_num==RX_len) //接收到一完成指令
        { RX_num=0;
        if(RX_buf[RX_len-1]==CRC(RX_buf,RX_len-1)) //檢查校驗
        { if(RX_buf[1]==0x13) power_on=1; //加電狀態
        if(RX_buf[1]==0x31) power_on=0; //斷電狀態
        TTL=3; link_error=0; //通信正常,重置TTL值
        }
        }
        }
        }

        void main()
        { IE=0x92;
        TMOD=0x21; //定時器1:模式2,定時器0:模式1
        TL1=253; TH1=253; //9600波特率
        TR1=1; //啟動定時器1
        SCON=0x50; //串口:模式1

        TL0=0x00; TH0=0x0A6; //定時器0定時0.025秒
        TR0=1; //啟動定時器0
        countdown=40; //1秒=0.025秒*40

        TTL=3; //連續3秒收不到報告,表示通信中斷
        TTW=0;
        km=0; kp=0;
        link_error=1; power_on=1;
        TX_buf[0]='Z'; TX_len=3;
        RX_num=0; RX_len=3;

        while(1)
        { if(TTW==0) { P3_7=1; P1_0=1; P1_1=1; }
        if(TTW==1) P3_7=0;
        if(TTW==2) P1_0=0;
        if(TTW==3) P1_1=0;
        }
        }

        四、MODEM通信線制作
        2051與MODEM之間的串口通信電纜只用RX、TX、GND三根線,其他的握手信號均沒有使用,但在制作MODEM一端的接頭時應要按下圖制作:
        利用單片機實現遠程電源控制

        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理


        上拉電阻相關文章:上拉電阻原理

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 浏阳市| 德昌县| 天祝| 宁蒗| 乐平市| 抚宁县| 鄄城县| 南江县| 西贡区| 河西区| 宁武县| 依兰县| 龙井市| 莆田市| 会昌县| 辽阳县| 五原县| 九龙城区| 图木舒克市| 泰宁县| 报价| 肃北| 永城市| 新竹市| 莱芜市| 高邑县| 隆回县| 肇源县| 城口县| 汾阳市| 渝中区| 晋中市| 泰宁县| 兴文县| 彰化市| 岱山县| 栖霞市| 西华县| 高密市| 隆昌县| 个旧市|