新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 串口通信-數據發送到PC加1后接收到單片機在數碼管上顯示

        串口通信-數據發送到PC加1后接收到單片機在數碼管上顯示

        作者: 時間:2016-12-02 來源:網絡 收藏
        本程序的完整原理圖下載:http://www.51hei.com/f/ks51.pdf


        /**
        *功能:串口通信-數據發送到PC加一后接收到單片機數碼管上顯示
        *時間:2014年3月2日10:04:07
        *作者:寒竹子
        *備注:波特率:19200bps
        *總結:串口通信時需要發送和接收數據時可以用到串口中斷,在中斷中進行數據的發送和接收,
        * 數碼管顯示時必須要放在while (1)中,只有這樣才可以正常顯示數字!
        **/

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

        #include

        typedef unsigned int uint;
        typedef unsigned char uchar;

        //數碼管段選和位選聲明
        sbit WELA = P2^7;
        sbit DULA = P2^6;

        //數碼管編碼
        uchar code table[] = {
        0x3F, //"0"
        0x06, //"1"
        0x5B, //"2"
        0x4F, //"3"
        0x66, //"4"
        0x6D, //"5"
        0x7D, //"6"
        0x07, //"7"
        0x7F, //"8"
        0x6F //"9"
        };
        uint num = 254;

        void UART_init();
        void UART_init();
        void display(uint num);

        int main(void)
        {
        UART_init();
        WELA = 1;
        P0 = 0xFF;
        WELA = 0;
        DULA = 1;
        P0 = 0x00;
        DULA = 0;

        while (1)//等待串口發送和接收數據中斷
        {
        //在數碼管上顯示
        display(num);//數碼管顯示是動態顯示的,所以必須要放在while (1)循環中,這樣才可以動態顯示!
        P1 = num;
        }

        return 0;
        }

        //串口通信初始化(定時器T1初始化和串口通信方式的選擇)
        void UART_init()
        {
        //設定T1定時器工作方式2,八位自動重裝,用于設定串口通信波特率
        TMOD = 0x20;//T1: GATE C/!T 0 0 M1 M0:10 T0:0000
        //設定波特率19200bps 初值 X = 2^8 - 11059200 / 19200 / 12 /32; X = 254.5 0xFE
        TH1 = TL1 = 0xFE;
        TR1 = 1;//打開定時器T1
        SCON = 0x50;//設定串口通信方式1,八位異步傳輸波特率可設定
        /*
        SM0 = 0;
        SM1 = 1;//方式1
        REN = 1;//允許接收
        */
        //因為要進行發送和接收,需要用到串口中斷
        EA = 1;//開總中斷
        ES = 1;//開定時器T1中斷
        }

        //延時xms
        void delayms(uint xms)
        {
        uint i, j;

        for (i = 0; i < xms; i++)
        for (j = 0; j < 110; j++);
        }

        //數碼管顯示
        void display(uint num)
        {
        //將num分解
        uchar bai, shi, ge;

        bai = num / 100 % 10;
        shi = num / 10 % 10;
        ge = num % 10;

        //先段選后位選
        DULA = 1;//打開段選鎖存器
        P0 = table[ge];//送入個位
        DULA = 0;//關閉段選鎖存器
        P0 = 0xFF;//先關閉所有數碼管的顯示,避免亂碼
        WELA = 1;//打開位選鎖存器
        P0 = 0xDF;//1101 1111
        WELA = 0;//關閉位選鎖存器
        //延時3毫秒
        delayms(3);
        P0 = 0x00;//消影

        //十位
        DULA = 1;
        P0 = table[shi];
        DULA = 0;
        P0 = 0xFF;
        WELA = 1;
        P0 = 0xEF; //1110 1111
        WELA = 0;
        delayms(3);
        P0 = 0x00;

        //百位
        DULA = 1;
        P0 = table[bai];
        DULA = 0;
        P0 = 0xFF;//關閉所有數碼管,避免段選數據的影響
        WELA = 1;
        P0 = 0xF7; //1111 0111
        WELA = 0;
        delayms(3);
        P0 = 0x00;//消影
        }

        //串口通信中斷
        void UART_sendAndReceive_int() interrupt 4//串口中斷號4
        {
        //判斷發送和接收的完成
        if (TI)//硬件置位,發送數據完成
        {
        TI = 0;//TI清零,等待發送下一位數據
        //允許接收數據
        REN = 1;
        }
        //接收
        if (RI)//接收完成
        {
        RI = 0;//RI清零,等待接收下一位數據
        //取出SBUF中的數據
        num = SBUF;
        //num++
        num++;
        //禁止接收數據
        REN = 0;
        SBUF = num;//發送num
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 西藏| 卓尼县| 玉树县| 江门市| 万全县| 定南县| 沙湾县| 类乌齐县| 巴彦淖尔市| 盐边县| 顺昌县| 秦安县| 涿州市| 芮城县| 吉林省| 玉溪市| 岑溪市| 延长县| 南召县| 隆安县| 随州市| 霞浦县| 武冈市| 勃利县| 永宁县| 贺州市| 兰考县| 安泽县| 沁阳市| 三穗县| 金溪县| 贵定县| 连山| 泗阳县| 洪江市| 马关县| 巴楚县| 买车| 砀山县| 宁陵县| 沅江市|