新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機與電腦的全雙工串口通信

        51單片機與電腦的全雙工串口通信

        作者: 時間:2016-11-22 來源:網絡 收藏
        程序功能:4*4鍵盤按鍵數值和電腦按鍵數值顯示在單片機數碼管上和串口大師上(0~F)全雙工

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

        說明:P2數碼管段選,只選一個數碼管,P1接鍵盤,P3.1=TXDP3.0=RXD 經過max232轉換電平之后接電腦,打開串口大師9600bps 1位校驗位 8位數據位。借用請留言! 作者QQ:305659935 超

        C文件包括兩個.h文件

        C語言程序如下:

        #include
        #include
        #include<uart9600.h>
        #include<44jianpan.h>

        void main()
        {

        uchar key=0;
        P2 = 0x7f;//數碼管顯示"-"
        inituart9600();

        TR1 = 1;// 啟動定時器1

        while(1)
        {
        receive_char();

        keydown();

        };

        }

        4*4鍵盤.h文件如下:

        /
        void delayms(uchar ms)
        {
        uchar t;
        while(ms--)
        {
        for(t = 0; t < 120; t++);
        }
        }


        void delay0(uchar x)
        {
        uchar i;
        while(x--)
        {
        for (i = 0; i<13; i++) {;}
        }
        }


        void beep()
        {
        uchar i;
        for (i=0;i<180;i++)
        {
        delay0(5);
        BEEP=!BEEP; //BEEP取反
        }
        BEEP=1; //關閉蜂鳴器
        delayms(250); //延時
        }


        uchar keyscan()
        {
        uchar scan1,scan2,keycode,j;

        JP=0xf0;
        scan1=JP;
        if((scan1&0xf0)!=0xf0) //判鍵是否按下
        {
        delayms(30); //延時30ms
        scan1=JP;
        if((scan1&0xf0)!=0xf0) //二次判鍵是否按下
        {
        JP=0x0f;
        scan2=JP;
        keycode=scan1|scan2; //組合成鍵編碼

        for(j=0;j<=15;j++)
        {
        if(keycode== key_code[j]) //查表得鍵值
        {
        key=j;

        return(key);

        }
        }
        }
        }
        else JP=0xff;

        return (16);
        }



        void keydown()
        {
        JP=0xf0;
        if((JP&0xf0)!=0xf0)
        {
        keyscan();
        P0=disp_code[key];
        send_char(key);
        beep();
        }
        }

        #endif

        uart(串口)協議程序如下:


        #ifndef __UART9600_H__
        #define __UART9600_H__
        unsigned char code disp_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
        unsigned char tmp;
        void send_char(unsigned char txd);
        void inituart9600() //初始化計時器,裝入值,設定參數 9600bps 1位校驗位
        {
        TMOD = 0x20;// 定時器1工作于8位自動重載模式, 用于產生波特率
        TH1 = 0xFD;// 波特率9600
        TL1 = 0xFD;

        SCON = 0x50;// 設定串行口工作方式
        PCON =0x00;// 波特率不倍增

        }

        void receive_char() //接受1個字符,8位
        {



        if(RI)// 是否有數據到來
        {
        RI = 0;
        tmp = SBUF;// 暫存接收到的數據,保存數據
        P0=disp_code[tmp];
        send_char(tmp);////////////////////////////////發回數據

        }

        }

        void send_char(unsigned char txd) //// 傳送一個字符,發射1byte,8位

        {
        SBUF = txd;
        while(!TI);// 等特數據傳送
        TI = 0;// 清除數據傳送標志
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 福海县| 聊城市| 漯河市| 镇远县| 平远县| 天峻县| 南昌市| 汉川市| 永年县| 信丰县| 新丰县| 卢龙县| 莆田市| 灵璧县| 平原县| 太和县| 芜湖县| 通化市| 河津市| 民丰县| 双桥区| 陆川县| 仪征市| 墨玉县| 建德市| 保山市| 保靖县| 苏尼特右旗| 许昌县| 若羌县| 东乡县| 年辖:市辖区| 监利县| 昌江| 沅陵县| 赫章县| 介休市| 化德县| 宁河县| 锡林郭勒盟| 广饶县|