久久久久久久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
|
丁香六月伊人
|
亚洲综合色视频在线观看
|
第一区在线观看免费国语入口
|
亚洲综合视频一区
|
久久亚洲高清
|
免费国产一区二区视频
|
亚洲资源在线
|