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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2873|回復: 1
打印 上一主題 下一主題
收起左側

stm32串口不夠用,求GPIO模擬串口程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:396134 發表于 2018-9-10 17:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本人最近在做一個項目,串口不夠用,想用倆個io口進行模擬一個串口的功能
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:387733 發表于 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
                                }
                        }
                }
        }
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人一级 | 免费观看一级毛片视频 | 亚洲精品视频导航 | 九九九精品视频 | 天堂在线网 | www.久久| 欧美一极视频 | 国产视频精品在线观看 | 亚洲精品视频一区 | 五月婷婷视频 | 黄色网址免费在线观看 | 久久精品国产一区二区电影 | 蜜桃精品在线 | 成人在线中文字幕 | 欧美中文字幕 | 欧美久久一区 | 成人深夜福利 | 亚洲欧美成人影院 | 欧美激情精品久久久久久 | 中文字幕久久精品 | 在线免费国产 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | h视频在线观看免费 | 欧美精品首页 | 成人毛片视频免费 | 免费黄色的视频 | 99福利视频导航 | 色香婷婷 | 亚洲国产精品日韩av不卡在线 | 韩日精品一区 | 亚洲一区二区三 | 在线观看av网站永久 | 中文字幕av在线一二三区 | 欧美精品一区二区三区四区 在线 | 国产欧美精品 | 成人中文字幕av | 欧美精品久久久久 | 亚洲美女在线一区 | 欧美日韩1区2区3区 欧美久久一区 | 翔田千里一区二区 | 51ⅴ精品国产91久久久久久 |