日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀] 隨著單片機的使用日益頻繁,用其作前置機進行采集和通信也常見于各種應用,一般是利用前置機采集各種終端數(shù)據(jù)后進行處理、存儲,再主動或被動上報給管理站。這種情況下下,采集會需要一個串口,上報又需

隨著單片機的使用日益頻繁,用其作前置機進行采集和通信也常見于各種應用,一般是利用前置機采集各種終端數(shù)據(jù)后進行處理、存儲,再主動或被動上報給管理站。這種情況下下,采集會需要一個串口,上報又需要另一個串口,這就要求單片機具有雙串口的功能,但我們知道一般的51系列只提供一個串口,那么另一個串口只能靠程序模擬。

本文所說的模擬串口, 就是利用51的兩個輸入輸出引腳如P1.0和P1.1,置1或0分別代表高低電平,也就是串口通信中所說的位,如起始位用低電平,則將其置0,停止位為高電平,則將其置1,各種數(shù)據(jù)位和校驗位則根據(jù)情況置1或置0。至于串口通信的波特率,說到底只是每位電平持續(xù)的時間,波特率越高,持續(xù)的時間越短。如波特率為9600BPS,即每一位傳送時間為1000ms/9600=0.104ms,即位與位之間的延時為為0.104毫秒。單片機的延時是通過執(zhí)行若干條指令來達到目的的,因為每條指令為1-3個指令周期,可即是通過若干個指令周期來進行延時的,單片機常用11.0592M的的晶振,現(xiàn)在我要告訴你這個奇怪數(shù)字的來歷。用此頻率則每個指令周期的時間為(12/11.0592)us,那么波特率為9600BPS每位要間融多少個指令周期呢?指令周期s=(1000000/9600)/(12/11.0592)=96,剛好為一整數(shù),如果為4800BPS則為96x2=192,如為19200BPS則為48,別的波特率就不算了,都剛好為整數(shù)個指令周期,妙吧。至于別的晶振頻率大家自已去算吧?,F(xiàn)在就以11.0592M的晶振為例,談談三種模擬串口的方法。

方法一:延時法

通過上述計算大家知道,串口的每位需延時0.104秒,中間可執(zhí)行96個指令周期。

#define uchar unsigned char
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
#define RXD P1_0
#define TXD P1_1
#define WRDYN 44 //寫延時
#define RDDYN 43 //讀延時

//往串口寫一個字節(jié)
void WByte(uchar input)
{
uchar i=8;
TXD=(bit)0; //發(fā)送啟始位
Delay2cp(39);
//發(fā)送8位數(shù)據(jù)位
while(i--)
{
TXD=(bit)(input&0x01); //先傳低位
Delay2cp(36);
input=input>>1;
}
//發(fā)送校驗位(無)
TXD=(bit)1; //發(fā)送結(jié)束位
Delay2cp(46);
}

//從串口讀一個字節(jié)
uchar RByte(void)
{
uchar Output=0;
uchar i=8;
uchar
temp=RDDYN; //發(fā)送8位數(shù)據(jù)位
Delay2cp(RDDYN*1.5); //此處注意,等過起始位
while(i--)
{
Output >>=1;
if(RXD) Output |=0x80; //先收低位
Delay2cp(35); //(96-26)/2,循環(huán)共占用26個指令周期
}
while(--temp) //在指定的時間內(nèi)搜尋結(jié)束位。
{
Delay2cp(1);
if(RXD)break; //收到結(jié)束位便退出
}
return Output;
}

//延時程序*
void Delay2cp(unsigned char i)
{
while(--i); //剛好兩個指令周期。
}

此種方法在接收上存在一定的難度,主要是采樣定位存在需較準確,另外還必須知道每條語句的指令周期數(shù)。此法可能模擬若干個串口,實際中采用它的人也很多,但如果你用Keil C,本人不建議使用此種方法,上述程序在P89C52、AT89C52、W78E52三種單片機上實驗通過。

方法二:計數(shù)法

51的計數(shù)器在每指令周期加1,直到溢出,同時硬件置溢出標志位。這樣我們就可以通過預置初值的方法讓機器每96個指令周期產(chǎn)生一次溢出,程序不斷的查詢溢出標志來決定是否發(fā)送或接收下一位。

//計數(shù)器初始化
void S2INI(void)
{
TMOD |=0x02; //計數(shù)器0,方式2
TH0=0xA0; //預值為256-96=140,十六進制A0
TL0=TH0;
TR0=1; //開始計數(shù)
TF0=0;
}

void WByte(uchar input)
{
//發(fā)送啟始位
uchar i=8;
TR0=1;
TXD=(bit)0;
WaitTF0();
//發(fā)送8位數(shù)據(jù)位
while(i--)
{
TXD=(bit)(input&0x01); //先傳低位
WaitTF0();
input=input>>1;
}
//發(fā)送校驗位(無)
//發(fā)送結(jié)束位
TXD=(bit)1;
WaitTF0();
TR0=0;
}
//查詢計數(shù)器溢出標志位
void WaitTF0( void )
{
while(!TF0);
TF0=0;
}

接收的程序,可以參考下一種方法,不再寫出。這種辦法個人感覺不錯,接收和發(fā)送都很準確,另外不需要計算每條語句的指令周期數(shù)。

方法三:中斷法

中斷的方法和計數(shù)器的方法差不多,只是當計算器溢出時便產(chǎn)生一次中斷,用戶可以在中斷程序中置標志,程序不斷的查詢該標志來決定是否發(fā)送或接收下一位,當然程序中需對中斷進行初始化,同時編寫中斷程序。本程序使用Timer0中斷。

#define TM0_FLAG P1_2 //設(shè)傳輸標志位
//計數(shù)器及中斷初始化
void S2INI(void)
{
TMOD |=0x02; //計數(shù)器0,方式2
TH0=0xA0; //預值為256-96=140,十六進制A0
TL0=TH0;
TR0=0; //在發(fā)送或接收才開始使用
TF0=0;
ET0=1; //允許定時器0中斷
EA=1; //中斷允許總開關(guān)
}

//接收一個字符
uchar RByte()
{
uchar Output=0;
uchar i=8;
TR0=1; //啟動Timer0
TL0=TH0;
WaitTF0(); //等過起始位
//發(fā)送8位數(shù)據(jù)位
while(i--)
{
Output >>=1;
if(RXD) Output |=0x80; //先收低位
WaitTF0(); //位間延時
}
while(!TM0_FLAG) if(RXD) break;
TR0=0; //停止Timer0
return Output;
}
//中斷1處理程序
void IntTimer0() interrupt 1
{
TM0_FLAG=1; //設(shè)置標志位。
}
//查詢傳輸標志位
void WaitTF0( void )
{
while(!TM0_FLAG);
TM0_FLAG=0; //清標志位
}

中斷法也是我推薦的方法,和計數(shù)法大同小異。發(fā)送程序參考計數(shù)法,相信是件很容易的事。另外還需注明的是本文所說的串口就是通常的三線制異步通信串口(UART),只用RXD、TXD、GND。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在單片機的世界里,“字節(jié)”(Byte)是一個貫穿始終的核心概念。從存儲數(shù)據(jù)到執(zhí)行指令,從變量定義到外設(shè)通信,字節(jié)無處不在。很多初學者在學習單片機時,往往更關(guān)注復雜的程序邏輯和外設(shè)驅(qū)動,卻忽略了字節(jié)這個基礎(chǔ)知識點,導致在后...

關(guān)鍵字: 單片機 字節(jié)

在單片機的數(shù)字邏輯中,我們通常最關(guān)注的是高電平和低電平兩種狀態(tài),它們構(gòu)成了二進制數(shù)字世界的基礎(chǔ)。然而,除了這兩種狀態(tài)之外,還有一種至關(guān)重要但常常被忽視的狀態(tài)——高阻態(tài)(High Impedance State)。高阻態(tài)就...

關(guān)鍵字: 單片機 高阻態(tài)

對于PIC入門者來說,不需要盲目追求高端開發(fā)板,一塊功能均衡、資料豐富的入門款就能滿足需求。比如Microchip官方推出的PIC16F84A開發(fā)板,它搭載經(jīng)典的8位PIC內(nèi)核,引腳布局清晰,自帶LED、按鍵等基礎(chǔ)外設(shè),...

關(guān)鍵字: PIC 單片機

該低功耗器件支持5V運行,在實現(xiàn)高性能的同時,能有效保障系統(tǒng)簡潔性與成本效益

關(guān)鍵字: MCU 單片機 工業(yè)自動化

在資源受限的嵌入式系統(tǒng)中,傳統(tǒng)調(diào)試工具(如JTAG)往往成本高昂且占用引腳資源。本文介紹一種基于串口的低成本調(diào)試方案,通過自定義協(xié)議實現(xiàn)內(nèi)存數(shù)據(jù)的實時監(jiān)控,硬件成本可降低80%以上,特別適用于8/16位MCU開發(fā)場景。

關(guān)鍵字: 嵌入式 串口 內(nèi)存數(shù)據(jù)

CH558T 采用 BASIC-52 系統(tǒng),并具備藍牙連接功能。CH558T 的運行頻率為 48 MHz,擁有 4KB 的 xRAM,足以滿足常規(guī)應用需求。

關(guān)鍵字: 單片機 BASIC-52 系統(tǒng) CH558T

RGB顯示屏憑借高分辨率、真彩色顯示優(yōu)勢,在工業(yè)控制、智能終端、消費電子等領(lǐng)域應用廣泛。裸屏RGB顯示屏無內(nèi)置驅(qū)動電路,需搭配專用LCD驅(qū)動芯片才能與單片機協(xié)同工作,其核心作用是將單片機輸出的圖像數(shù)據(jù)轉(zhuǎn)換為屏幕可識別的R...

關(guān)鍵字: 顯示屏 驅(qū)動芯片 單片機

在嵌入式系統(tǒng)開發(fā)中,單片機(MCU)作為控制核心,廣泛應用于工業(yè)自動化、智能家居等領(lǐng)域。然而,當需要控制繼電器或電磁閥等大功率負載時,直接連接單片機引腳往往會導致系統(tǒng)故障甚至硬件損壞。

關(guān)鍵字: 單片機 MCU

在嵌入式系統(tǒng)領(lǐng)域,單片機作為核心控制單元,其軟硬件結(jié)合機制是理解電子設(shè)備運行邏輯的關(guān)鍵。

關(guān)鍵字: 單片機 CPU?

物聯(lián)網(wǎng)與智能控制蓬勃發(fā)展,溫度傳感器作為感知環(huán)境溫度變化的關(guān)鍵元件,廣泛應用于工業(yè)生產(chǎn)、智能家居、醫(yī)療設(shè)備等眾多領(lǐng)域。而單片機憑借其強大的控制能力和靈活的編程特性,成為處理溫度傳感器數(shù)據(jù)的理想平臺。下面將深入剖析單片機程...

關(guān)鍵字: 單片機 溫度傳感器
關(guān)閉