久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: stm32串口不夠用,求GPIO模擬串口程序 [打印本頁]

作者: lxjcyj    時間: 2018-9-10 17:37
標題: stm32串口不夠用,求GPIO模擬串口程序
本人最近在做一個項目,串口不夠用,想用倆個io口進行模擬一個串口的功能

作者: sxhwdz    時間: 2018-9-11 08:16
下面是很詳細的51系列模擬串口的程序,可供參考或移植


/*************        本程序功能說明        **************

                                測試說明

        本例程是使用STC系列MCU做的模擬串口。用戶根據自己的時鐘和波特率自行設置后編譯下載。
       
        使用串口助手向MCU發送數據,MCU收到后原樣返回給PC。
       
        本例程使用資源: Timer0中斷.

*/

#include "config.h"


/***************************************************************************/

typedef bit BOOL;
typedef unsigned char         uchar;
typedef unsigned int         uint;

#define Timer0_Reload                (65536 - MAIN_Fosc / BaudRate / 3)
#define D_RxBitLenth        9                //9: 8 + 1 stop
#define D_TxBitLenth        9                //9: 1 stop bit

sbit RXB = P3^0;                //define UART TX/RX port
sbit TXB = P3^1;

uchar  data TBUF,RBUF;
uchar  data TDAT,RDAT;
uchar  data TCNT,RCNT;        //發送和接收檢測 計數器(3倍速率檢測)
uchar  data TBIT,RBIT;        //發送和接收的數據計數器
uchar  data t, r;
uchar  data buf[16];

bit  TING,RING;        //正在發送或接收一個字節
bit  REND;                 //接收完的標志位

#define        RxBitLenth        9        //8個數據位+1個停止位
#define        TxBitLenth        9        //8個數據位+1個停止位

//-----------------------------------------
//UART模塊的初始變量        initial UART module variable
void UART_INIT()
{
      TING = 0;
      RING = 0;
      REND = 0;
      TCNT = 0;
      RCNT = 0;
}

void main()
{
        InternalRAM_enable();
//        ExternalRAM_enable();

        Timer0_1T();
        Timer0_AsTimer();
        Timer0_16bitAutoReload();
        Timer0_Load(Timer0_Reload);
        Timer0_InterruptEnable();
        Timer0_Run();
        EA = 1;                                        //打開總中斷                                       

        UART_INIT();                                //UART模塊的初始變量

        while (1)
        {
                if (REND)                                //如果接收完,把接收到的值存入接收buff
                {
                        REND = 0;
                        buf[r++ & 0x0f] = RBUF;
                }

                if(!TING)                //發送空閑
                {
                        if (t != r)        //有要發送的數據
                        {
                                TBUF = buf[t++ & 0x0f];
                                TING = 1;
                        }
                }
        }
}


//-----------------------------------------
//定時器0中斷程序for UART 以波特率3倍的速度采樣判斷 開始位               

void tm0(void) interrupt 1
{

        if (RING)
        {
                if (--RCNT == 0)                                  //接收數據以定時器的1/3來接收
                {
                        RCNT = 3;                                 //重置接收計數器  接收數據以定時器的1/3來接收
                                
                        if (--RBIT == 0)                          //接收完一幀數據
                        {
                                RBUF = RDAT;            //存儲數據到緩沖區       
                                RING = 0;               //停止接收                       
                                REND = 1;               //接收完成標志設置       
                        }
                        else
                        {
                                RDAT >>= 1;                          //把接收的單b數據 暫存到 RDAT(接收緩沖)
                                if (RXB) RDAT |= 0x80;       //shift RX data to RX buffer
                        }
                }
        }

        else if (!RXB)                //判斷是不是開始位 RXB=0;
        {
                RING = 1;       //如果是則設置開始接收標志位         set start receive flag
                RCNT = 4;       //初始化接收波特率計數器               initial receive baudrate counter
                RBIT = RxBitLenth;       //初始化接收的數據位數(8個數據位+1個停止位)   
        }

        if (TING)                        //發送開始標志位   judge whether sending
        {
                if (--TCNT == 0)                        //發送數據以定時器的1/3來發送
                {
                        TCNT = 3;                                //重置發送計數器   reset send baudrate counter
                        if (TBIT == 0)                        //發送計數器為0 表明單字節發送還沒開始
                        {
                                TXB = 0;                        //發送開始位                                             send start bit
                                TDAT = TBUF;                //把緩沖的數據放到發送的buff               
                                TBIT = TxBitLenth;        //發送數據位數 (8數據位+1停止位)       
                        }
                        else                                        //發送計數器為非0 正在發送數據
                        {
                                if (--TBIT == 0)        //發送計數器減為0 表明單字節發送結束
                                {
                                        TXB = 1;                //送停止位數據
                                        TING = 0;                //發送停止位                            stop send
                                }
                                else
                                {
                                        TDAT >>= 1;                //把最低位送到 CY(益處標志位) shift data to CY
                                        TXB = CY;                //發送單b數據                                write CY to TX port
                                }
                        }
                }
        }
}




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 婷婷色在线| aaaaaaa片毛片免费观看 | 日本精品久久久久久久 | 精品久久影院 | 日韩精品一区二区三区久久 | 免费网站国产 | 欧美久久久久久 | 日韩不卡视频在线观看 | 欧美一区二区三区四区五区无卡码 | 日韩亚洲视频 | 国产精品久久久久久久久久久久冷 | 国产1区| 欧美成人免费在线 | 成人污污视频 | 午夜精品久久久久久久久久久久久 | 99久久精品国产毛片 | 91毛片在线看 | 乱一性一乱一交一视频a∨ 色爱av | 久久一二 | 人人做人人澡人人爽欧美 | 午夜在线视频一区二区三区 | 日日操夜夜干 | 国产成人99久久亚洲综合精品 | 色婷婷久久久久swag精品 | 中文字幕在线一区二区三区 | 亚洲欧美一区二区在线观看 | 亚洲精品9999| 91一区二区三区在线观看 | 亚洲一区二区三区视频免费观看 | 毛片免费观看视频 | 懂色av色香蕉一区二区蜜桃 | 免费看91| 毛片综合 | 日韩在线91 | 丁香六月伊人 | 亚洲综合色视频在线观看 | 第一区在线观看免费国语入口 | 亚洲综合视频一区 | 久久亚洲高清 | 免费国产一区二区视频 | 亚洲资源在线 |