<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

        作者:寒竹子   來源:本站原創   點擊數:  更新時間:2014年03月18日   【字體:

        本程序的完整原理圖下載: http://www.thefapper.com/f/ks51.pdf 

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

        #include <reg52.h>

        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
        }
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮