娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年01月21日(星期二)

正在發生

2020年01月21日 | 51單片機IO口模擬UART串口通信

發布者:RadiantDusk 來源: eefocus關鍵字:51單片機  IO口  模擬UART  串口通信 手機看文章 掃描二維碼
隨時隨地手機看文章

#include
#include "main.h"
#include "smartcard.h"
#include "stdio.h"

typedef enum { false, true }bool;

#if 0
sbit PIN_RXD = P1^0; //接收發送同一個引腳定義
sbit PIN_TXD = P1^0; //接收發送同一個發送引腳定義
sbit PIN_CLK = P3^1; //智能卡時鐘引腳定義
sbit PIN_3v5v = P3^2; //智能卡3v_5v引腳定義
sbit PIN_RST = P3^3; //智能卡復位引腳定義
sbit PIN_CMDVCC = P3^4; //智能卡CMD引腳定義
#else
// test Parity
sbit PIN_RXD = P1^0; //接收 腳定義
sbit PIN_TXD = P1^2; //發送 腳定義
sbit PIN_CLK = P3^5; //智能卡時鐘引腳定義
sbit PIN_3v5v = P3^2; //智能卡3v_5v引腳定義
sbit PIN_RST = P3^3; //智能卡復位引腳定義
sbit PIN_CMDVCC = P3^4; //智能卡CMD引腳定義

sbit Test_CLK = P0^3; //接收 腳定義

 

#endif

bit RxdOrTxd = 0; //指示當前狀態為接收還是發送
bit RxdEnd = 0; //接收結束標志
bit TxdEnd = 0; //發送結束標志
uint8_t RxdBuf = 0; //接收緩沖器
uint8_t TxdBuf = 0; //發送緩沖器
void ConfigUART(unsigned int baud);
void StartTXD(unsigned char dat);
void StartRXD();
void test_IO();

//通過嵌套宏定義,制作一張包括0~255各個數字中包含1的個數,其中包含偶數個1,則ParityTable256[i]=0,否則ParityTable256[i]=1;


static const bool ParityTable256[256] = 
{
#define P2(n) n, n^1, n^1, n
#define P4(n) P2(n), P2(n^1), P2(n^1), P2(n)
#define P6(n) P4(n), P4(n^1), P4(n^1), P4(n)
P6(0), P6(1), P6(1), P6(0)
};


void mainb(){
EA = 1; //開總中斷
ConfigUART(9600);//配置波特率為 9600
while (1){ 
while (PIN_RXD); //等待接收引腳出現低電平,即起始位
StartRXD(); //啟動接收
while (!RxdEnd); //等待接收完成
StartTXD(RxdBuf+1); //接收到的數據+1 后,發送回去
while (!TxdEnd); //等待發送完成
}
return;
}

void SET_3v5v()
{
PIN_3v5v=1;
}
void RESET_3v5v()
{
PIN_3v5v=0;
}

void RST_SET(BitAction ResetState)
{

PIN_RST = ResetState;
}

void SET_CMVCC()
{
PIN_CMDVCC =1;
}
void RESET_CMVCC()
{
PIN_CMDVCC =0;
}

/* 串口配置函數,baud-通信波特率 */
void ConfigUART(unsigned int baud){
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x02; //配置 T0 為模式 2
// TH0 = 256 - (11059200/6)/baud; //計算 T0 重載值
TH0 = 256 - (FOSC/12)/baud; //計算 T0 重載值

}
/* 啟動串行接收 */
void StartRXD(){


while (PIN_RXD);
//printf("PIN_RXD2=0x%02Xrn", (int)PIN_RXD);
TL0 = 256 - ((256-TH0)>>1); //接收啟動時的 T0 定時為半個波特率周期
ET0 = 1; //使能 T0 中斷
TR0 = 1; //啟動 T0
RxdEnd = 0; //清零接收結束標志
RxdOrTxd = 0; //設置當前狀態為接收

}
/* 啟動串行發送,dat-待發送字節數據 */
void StartTXD(uint8_t dat){
TxdBuf = dat; //待發送數據保存到發送緩沖器
TL0 = TH0; //T0 計數初值為重載值
ET0 = 1; //使能 T0 中斷
TR0 = 1; //啟動 T0
PIN_TXD = 0; //發送起始位
TxdEnd = 0; //清零發送結束標志
RxdOrTxd = 1; //設置當前狀態為發送
}

uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
/* Check the parameters */
// assert_param(IS_USART_ALL_PERIPH(USARTx));

/* Receive Data */
#if 0
uint16_t tt= USARTx->SR ;
USARTx->SR = tt & (uint16_t)0x3df; //wuhh add ,remove later

return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
#endif
return (uint16_t) RxdBuf;

}
void USART_SendData(USART_TypeDef* USARTx, uint8_t Data)
{
StartTXD(Data);
}
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
FlagStatus bitstatus = RESET; 
if (USART_FLAG== USART_FLAG_TC)
if (TxdEnd)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}

if (USART_FLAG== USART_FLAG_RXNE)
if (RxdEnd)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
static bit polarity = 0; //輸出智能卡時鐘極性

#if 1

/* T0 中斷服務函數,處理串行發送和接收 */
void InterruptTimer0() interrupt 1{

static unsigned char cnt = 0; //位接收或發送計數
Test_CLK = !Test_CLK;

if (RxdOrTxd)
{ //串行發送處理
cnt++;
if (cnt <= 8){ //低位在先依次發送 8bit 數據位
PIN_TXD = TxdBuf & 0x01;
TxdBuf >>= 1;
}else
if (cnt == 9)
{ //發送停止位
PIN_TXD = 1;
}
else{ //發送結束
cnt = 0; //復位 bit 計數器
TR0 = 0; //關閉 T0
TxdEnd = 1; //置發送結束標志
}
}
else{ //串行接收處理
if (cnt == 0){ //處理起始位
if (!PIN_RXD){ //起始位為 0 時,清零接收緩沖器,準備接收數據位
RxdBuf = 0;
cnt++;
}
else{ //起始位不為 0 時,中止接收
TR0 = 0; //關閉 T0
}
}else if (cnt <= 8){ //處理 8 位數據位
RxdBuf >>= 1; //低位在先,所以將之前接收的位向右移
//接收腳為 1 時,緩沖器最高位置 1,
//而為 0 時不處理即仍保持移位后的 0
if (PIN_RXD){
RxdBuf |= 0x80;
}
cnt++;
}else{ //停止位處理
cnt = 0; //復位 bit 計數器
TR0 = 0; //關閉 T0
if (PIN_RXD){ //停止位為 1 時,方能認為數據有效
RxdEnd = 1; //置接收結束標志
}
}
}
}

#else
/* T0 中斷服務函數,處理串行發送和接收 */

void InterruptTimer0() interrupt 1{

static unsigned char cnt = 0; //位接收或發送計數 
//test_IO();
#if 0
PIN_TXD = !PIN_TXD;
#else

if (RxdOrTxd){ //串行發送處理
cnt++;
if (cnt <= 8){ //低位在先依次發送 8bit 數據位
PIN_TXD = TxdBuf & 0x01;
TxdBuf >>= 1;
}else if (cnt == 9){ //奇偶位
PIN_TXD=ParityTable256[TxdBuf]; 
}else if (cnt == 10){ //發送停止位1 智能卡協議共兩個停止位
PIN_TXD = 1;
}else if (cnt == 11){ //發送停止位2 
PIN_TXD = 1;
}else{ //發送結束
cnt = 0; //復位 bit 計數器
TR0 = 0; //關閉 T0
TxdEnd = 1; //置發送結束標志
}
}else{ //串行接收處理
if (cnt == 0){ //處理起始位
if (!PIN_RXD){ //起始位為 0 時,清零接收緩沖器,準備接收數據位
RxdBuf = 0;
cnt++; 
//printf("InterruptTimer 0n");
} else{ //起始位不為 0 時,中止接收
TR0 = 0; //關閉 T0
printf("InterruptTimer closen");
}
}
else if (cnt <= 8){ //處理 8 位數據位
RxdBuf >>= 1; //低位在先,所以將之前接收的位向右移
//接收腳為 1 時,緩沖器最高位置 1,
//而為 0 時不處理即仍保持移位后的 0
if (PIN_RXD){
RxdBuf |= 0x80;
}
printf("RxdBuf=0x%02Xrn", (int)RxdBuf);
cnt++;
}else{ //停止位處理
cnt = 0; //復位 bit 計數器
TR0 = 0; //關閉 T0
if (PIN_RXD){ //停止位為 1 時,方能認為數據有效
RxdEnd = 1; //置接收結束標志
}
}
}
#endif
}
#endif

關鍵字:51單片機  IO口  模擬UART  串口通信 引用地址:51單片機IO口模擬UART串口通信

上一篇:軟件模擬串行通信——UART協議實現
下一篇:基于STC15單片機芯片的直流電機PID控制轉速源碼

推薦閱讀

紫光控股去年12月底落鑊高見6.6元后,股價反復回吐,昨天一度低見4.07元,跌穿廿天線(約4.181元)后,突再現炒風,現炒高18%,報4.84元,終盤報收4.44元,上漲8.29%。紫光控股宣布,公司董事會已知悉公司股價及成交量于公告日有所上升事宜,經合理查詢后,董事會確認,概不知悉導致價格及成交量波動的任何原因,或任何必須公布以避免公司證券出現虛假市場...
全球領先的半導體解決方案供應商瑞薩電子株式會社宣布,推出針對家用電器電機控制的 e-AI 故障檢測解決方案。該方案采用瑞薩電子 RX66T 32位微控制器(MCU),基于嵌入式人工智能(e-AI),可檢測冰箱、空調、洗衣機等家電因電機異常而發生的故障。直接利用可顯示電機狀態的屬性數據(如電流或轉速),無需增加傳感器,即可用單個 MCU 實現電機控制...
學單片機那么久了,感覺想要深入,還得看匯編語言,至少得了解單片機內部結構。下面就以ATmega16為例,介紹一下AVR單片機結構和匯編語言。AVR單片機的CPU內核結構 如上兩圖,左圖是虛線框內AVR CPU的內核結構,右圖是AVR單片機內核結構的方框圖,可以看出AVR單片機的數據總線(CPU字長)是8位的,也就說它是8位單片機。AVR采用了Harvard結構,具有獨立的...
1月20日,據路透社消息,瑞典電信運營商計劃在電信監管機構PTS進行頻譜拍賣之后的兩到三年內,用5G覆蓋整個國家大多數地區。此次拍賣被推遲了兩次,第一次是因為安全審查,第二次是由于華為提起的訴訟,拍賣于周二開始,并于當天結束。據報道,參與競拍的有Telia,Tele2,Telenor和Tre等電信運營商的單位或合資企業,拍賣總收益達2.747億美元。當地時間1月...

史海拾趣

問答坊 | AI 解惑

疑問

在MODELSIM 6如何進行testbench…

查看全部問答∨

求助:西門子MC75啟動不了

   手頭上有2個西門子MC75通信模塊。但無法啟動。設計的原理圖在附件。     現象是:其中一個模塊,如果不插sim卡,可以正常啟動,串口中也可以看到啟動信息,發AT指令沒有問題。但是如果插上SIM卡,則串口沒有任何信息,AT指 ...…

查看全部問答∨

SD CMD

貼一段代碼出來,對上面的6,7,12,28...等數字不理解,請大家幫忙解釋下.謝謝 int IssueCommand_CH0( U16 uCmd, U32 uArg, U32 uIsAcmd) {         U32 uSfr;         while ((rHM0_PRNSTS&0x1)); // C ...…

查看全部問答∨

DDS+PLL是目前實用的頻率合成方式么?

目前在無線電收發方面常用的頻率合成方式有哪些呢?希望在該領域有經驗的大蝦推薦一些?!?

查看全部問答∨

急:listview 中背景圖片怎么能不平鋪?

listview (ownerdraw)中背景圖片怎么能不平鋪? 我這邊設置的背景圖片,再拉動滾動條的時候,背景也滾動的,背景圖片是平鋪的? 有沒有辦法不平鋪,改成固定背景? 謝謝?!?

查看全部問答∨

推送全國的報告怎么寫,有人會么

本帖最后由 paulhyde 于 2014-9-15 03:54 編輯 RT…………  …

查看全部問答∨

AT89C51與三菱D700變頻器通訊

哪位高手有AT89C51與三菱D700變頻器通訊的匯編程序.......…

查看全部問答∨

序列檢碼器 狀態機 的一點小疑問

    序列檢測器的邏輯功能描述:10010 的序列檢碼器,狀態轉移圖如下圖所示:     我我有一點不明白, 在狀態B的情況下要是輸入1的話,直接進入A狀態不行么?G狀態下如果輸入1的話也可以直接進入A狀態啊,我就是這樣做 ...…

查看全部問答∨

【設計工具】ISE使用指導,適合初學者

初學者的ISE使用指導,希望對大家有所幫助.   …

查看全部問答∨

matlab 和CCS 安裝要求先后順序嗎

最近折騰 matlab 和c28通訊,程序下進DSP后一直出現跑飛的現象。 經過N次的折騰,終于在裝了另一個版本的ccs3.3后成功了。 不知有大俠也碰到過這樣的問題不。 .matlab 和ccs 是否有安裝先后的問題。我實在是懶得再去試了,已經試的吐血了,裝了 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 宜丰县| 吉木萨尔县| 稷山县| 武功县| 古浪县| 永安市| 肇州县| 凭祥市| 龙岩市| 安丘市| 喀喇沁旗| 横峰县| 高尔夫| 普格县| 丰县| 泽普县| 临沂市| 孟津县| 德化县| 辽中县| 铜陵市| 淮北市| 镇原县| 青川县| 武穴市| 寿光市| 灵武市| 遂宁市| 敖汉旗| 城步| 都江堰市| 恩施市| 台南县| 贵州省| 高阳县| 江达县| 莱西市| 玉溪市| 利辛县| 田阳县| 抚顺县|