新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 模擬串口自動測量波特率的單片機程序

        模擬串口自動測量波特率的單片機程序

        作者: 時間:2012-08-02 來源:網絡 收藏

        void WByte(BYTE out)
        {
        //發送啟始位
        BYTE i=8;
        BYTE tmp=out;
        TR1=1;//開定時器
        TX1=0;
        WaitTF1();
        //發送8位數據位
        while(i--)
        {
        TX1=(tmp0x01); //先傳低位
        tmp=tmp>>1;
        WaitTF1();
        }
        //發送校驗位(無)
        //發送結束位
        TX1=1;
        WaitTF1();
        TR1=0;
        }
        void putchar(char ch)
        {
        WByte(ch);
        }
        BYTE RByte()
        {
        BYTE in=0;
        BYTE cnt;
        while(RX1==1);//等待RXD變低,啟動定時器,這個是阻塞模式
        TR1=1;//同步開定時器//這里……
        //while(!TF1);
        //TF1=0;
        WaitTF1();
        if(min_mode !=0)
        {
        while(!TF1);//注意這里的周期稍微長。要補償
        TF1=0;
        }
        for(cnt=0;cnt8;cnt++)
        {
        in=in >>1;//從高移到低
        if(RX1==1) in = in | 0x80;//如果RXD=1,則最高置位
        WaitTF1();//等待一位過去
        }
        while(!TF1);//注意這里的周期稍微長。要補償
        TF1=0;
        TR1=0;//關閉定時器
        return in;
        }

        UINT f_Test(void)//測試脈寬
        {
        TMOD=0x10;//設置計數器1為方式一計數器模式
        TH1=0;
        TL1=0;//定時器CLR
        while(!RX1);//等待頻率腳變高,這個是測低電平的
        while(RX1);//等待腳變低,更換符號可以測正脈沖
        TR1=1;//開啟定時器
        while(!RX1);//等待變高
        TR1=0;//停止計數
        //cyc=TH08;
        //cyc=cyc+TL0;
        return (TH18)+TL1;
        }
        void baud_t()
        {
        BYTE k;//復用變量
        ULONG frq=0; //周期變量
        for(k=0;k5;k++)// 變量復用大法
        {
        frq=frq+f_Test();//測試
        }//測量5次取平均
        frq=frq/5;
        if(frq0xff)
        {
        k=0x100-(frq0xff);
        min_mode=MIS_0;
        }
        else
        {
        if(frq / 2 0xff)
        {//2400baud
        k=0x100-((frq/2)0xff); //2分頻
        min_mode=MIS_2;
        }
        else if(frq / 4 0xff)
        {//1200baud
        k=0x100-((frq/4)0xff);//4分頻
        min_mode=MIS_4;
        }
        else if(frq / 8 0xff)
        {//1200baud
        k=0x100-((frq/8)0xff);//8分頻
        min_mode=MIS_8;
        }
        else if(frq / 16 0xff)
        {//1200baud
        k=0x100-((frq/16)0xff);//16分頻
        min_mode=MIS_16;
        }
        }
        if(k > 0x50)
        {
        k=k+6;//加補償,因為if語句讓機器周期加長
        //如果對于STC的新MCU,這里要按照情況調整
        }
        TMOD=0x20;//設置定時器1為自動裝載模式
        TH1=k;//載入新
        TL1=k;
        }
        void main()
        {
        while(1)
        {
        baud_t();//測量,阻塞模式
        printf("Hello world!n");
        printf("Here:mode=%d,T1=0x%Xrn",min_mode,TH1);//這里如果你要使用keil請自己寫字符串發送函數,和sprintf配合使用
        printf("Could you please test another baudrate?rn");
        printf("But I think that I couldn't to do.....rn");
        }
        }


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 屏边| 容城县| 赤水市| 土默特右旗| 阳曲县| 绿春县| 韶关市| 江口县| 左权县| 沁阳市| 宜都市| 昭觉县| 揭东县| 常宁市| 华宁县| 绵阳市| 鄂州市| 茶陵县| 电白县| 绍兴市| 木兰县| 双江| 桂林市| 温州市| 额济纳旗| 延边| 洪湖市| 油尖旺区| 井研县| 武乡县| 开江县| 松桃| 同江市| 南充市| 泾川县| 台安县| 神农架林区| 嘉义县| 香港 | 县级市| 鹤庆县|