久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> 技術中心 >> 單片機入門 >> 三種單片機模擬串口方法介紹

三種單片機模擬串口方法介紹

關鍵字:單片機 模擬串口 方法 作者:admin 來源:不詳 發布時間:2018-05-19  瀏覽:31

三種單片機模擬串口方法介紹

模擬串口就是利用51的兩個輸入輸出引腳如P1.0和P1.1,置1或0分別代表高低電平,也就是串口通信中所說的位,如起始位用低電平,則將其置0,停止位為高電平,則將其置1,各種數據位和校驗位則根據情況置1或置0。至于串口通信的波特率,說到底只是每位電平持續的時間,波特率越高,持續的時間越短。如波特率為9600BPS,即每一位傳送時間為1000ms/9600=0.104ms,即位與位之間的延時為為0.104毫秒。單片機的延時是通過執行若干條指令來達到目的的,因為每條指令為1-3個指令周期,可即是通過若干個指令周期來進行延時的,單片機常用11.0592M的的晶振,現在我要告訴你這個奇怪數字的來歷。用此頻率則每個指令周期的時間為(12/11.0592)us,那么波特率為9600BPS每位要間融多少個指令周期呢?

指令周期s=(1000000/9600)/(12/11.0592)=96,剛好為一整數,如果為4800BPS則為96x2=192,如為19200BPS則為48,別的波特率就不算了,都剛好為整數個指令周期,妙吧。至于

別的晶振頻率大家自已去算吧。

現在就以11.0592M的晶振為例,談談三種模擬串口的方法。

方法一:延時法

通過上述計算大家知道,串口的每位需延時0.104秒,中間可執行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 //讀延時

//往串口寫一個字節

void WByte(uchar input)

{

uchar i=8;

TXD=(bit)0; //發送啟始

Delay2cp(39);

//發送8位數據位

while(i--)

{

TXD=(bit)(input&0x01); //先傳低位

Delay2cp(36);

input=input>>1;

}

//發送校驗位(無)

TXD=(bit)1; //發送結束

Delay2cp(46);

}

//從串口讀一個字節

uchar RByte(void)

{

uchar Output=0;

uchar i=8;

uchar temp=RDDYN;

//發送8位數據位

Delay2cp(RDDYN*1.5); //此處注意,等過起始位

while(i--)

{

Output >>=1;

if(RXD) Output =0x80; //先收低位

Delay2cp(35); //(96-26)/2,循環共

占用26個指令周期

}

while(--temp) //在指定的

時間內搜尋結束位。

{

Delay2cp(1);

if(RXD)break; //收到結束位便退出

}

return Output;

}

//延時程序*

void Delay2cp(unsigned char i)

{

while(--i); //剛好兩個

指令周期。

}

此種方法在接收上存在一定的難度,主要是采樣定位存在需較準確,另外還必須知道

每條語句的指令周期數。此法可能模擬若干個串口,實際中采用它的人也很多,但如果你用Keil

C,本人不建議使用此種方法,上述程序在P89C52、AT89C52、W78E52三種單片機上實驗通過。

方法二:計數法

51的計數器在每指令周期加1,直到溢出,同時硬件置溢出標志位。這樣我們就可以

通過預置初值的方法讓機器每96個指令周期產生一次溢出,程序不斷的查詢溢出標志來決定是否

發送或接收下一位。

//計數器初始化

void S2INI(void)

{

TMOD =0x02; //計數器0,方式2

TH0=0xA0; //預值為256-96=140,十六進制A0

TL0=TH0;

TR0=1; //開始計數

TF0=0;

}

void WByte(uchar input)

{

//發送啟始位

uchar i=8;

TR0=1;

TXD=(bit)0;

WaitTF0();

//發送8位數據位

while(i--)

{

TXD=(bit)(input&0x01); //先傳低位

WaitTF0();

input=input>>1;

}

//發送校驗位(無)

//發送結束位

TXD=(bit)1;

WaitTF0();

TR0=0;

}

//查詢計數器溢出標志位

void WaitTF0( void )

{

while(!TF0);

TF0=0;

}

接收的程序,可以參考下一種方法,不再寫出。這種辦法個人感覺不錯,接收和發送

都很準確,另外不需要計算每條語句的指令周期數。

方法三:中斷法

中斷的方法和計數器的方法差不多,只是當計算器溢出時便產生一次中斷,用戶可以

在中斷程序中置標志,程序不斷的查詢該標志來決定是否發送或接收下一位,當然程序中需對中

斷進行初始化,同時編寫中斷程序。本程序使用Timer0中斷。

#define TM0_FLAG P1_2 //設傳輸標志位

//計數器及中斷初始化

void S2INI(void)

{

TMOD =0x02; //計數器0,方式2

TH0=0xA0; //預值為256-96=140,十六進制A0

TL0=TH0;

TR0=0; //在發送或

接收才開始使用

TF0=0;

ET0=1; //允許定時

器0中斷

EA=1; //中斷允許

總開關

}

//接收一個字符

uchar RByte()

{

uchar Output=0;

uchar i=8;

TR0=1; //啟動Timer0

TL0=TH0;

WaitTF0(); //等過起始

//發送8位數據位

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; //設置標志位。

}

//查詢傳輸標志位

void WaitTF0( void )

{

while(!TM0_FLAG);

TM0_FLAG=0; //清標志位

}

中斷法也是我推薦的方法,和計數法大同小異。發送程序參考計數法,相信是件很容

易的事。

另外還需注明的是本文所說的串口就是通常的三線制異步通信串口(UART),只用RXD、TXD、GND。

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

三種單片機模擬串口方法介紹

模擬串口就是利用51的兩個輸入輸出引腳如P1.0和P1.1,置1或0分別代表高低電平,也就是串口通信中所說的位,如起始位用低電平,則將其置0,停止位為高電平,則將其置1,各種數據位和校驗位則根據情況置1或置0。至于串口通信的波特率,說到底只是每位電平持續的時間,波特率越高,持續的時間越短。如波特率為9600BPS,即每一位傳送時間為1000ms/9600=0.104ms,即位與位之間的延時為為0.104毫秒。單片機的延時是通過執行若干條指令來達到目的的,因為每條指令為1-3個指令周期,可即是通過若干個指令周期來進行延時的,單片機常用11.0592M的的晶振,現在我要告訴你這個奇怪數字的來歷。用此頻率則每個指令周期的時間為(12/11.0592)us,那么波特率為9600BPS每位要間融多少個指令周期呢?

指令周期s=(1000000/9600)/(12/11.0592)=96,剛好為一整數,如果為4800BPS則為96x2=192,如為19200BPS則為48,別的波特率就不算了,都剛好為整數個指令周期,妙吧。至于

別的晶振頻率大家自已去算吧。

現在就以11.0592M的晶振為例,談談三種模擬串口的方法。

方法一:延時法

通過上述計算大家知道,串口的每位需延時0.104秒,中間可執行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 //讀延時

//往串口寫一個字節

void WByte(uchar input)

{

uchar i=8;

TXD=(bit)0; //發送啟始

Delay2cp(39);

//發送8位數據位

while(i--)

{

TXD=(bit)(input&0x01); //先傳低位

Delay2cp(36);

input=input>>1;

}

//發送校驗位(無)

TXD=(bit)1; //發送結束

Delay2cp(46);

}

//從串口讀一個字節

uchar RByte(void)

{

uchar Output=0;

uchar i=8;

uchar temp=RDDYN;

//發送8位數據位

Delay2cp(RDDYN*1.5); //此處注意,等過起始位

while(i--)

{

Output >>=1;

if(RXD) Output =0x80; //先收低位

Delay2cp(35); //(96-26)/2,循環共

占用26個指令周期

}

while(--temp) //在指定的

時間內搜尋結束位。

{

Delay2cp(1);

if(RXD)break; //收到結束位便退出

}

return Output;

}

//延時程序*

void Delay2cp(unsigned char i)

{

while(--i); //剛好兩個

指令周期。

}

此種方法在接收上存在一定的難度,主要是采樣定位存在需較準確,另外還必須知道

每條語句的指令周期數。此法可能模擬若干個串口,實際中采用它的人也很多,但如果你用Keil

C,本人不建議使用此種方法,上述程序在P89C52、AT89C52、W78E52三種單片機上實驗通過。

方法二:計數法

51的計數器在每指令周期加1,直到溢出,同時硬件置溢出標志位。這樣我們就可以

通過預置初值的方法讓機器每96個指令周期產生一次溢出,程序不斷的查詢溢出標志來決定是否

發送或接收下一位。

//計數器初始化

void S2INI(void)

{

TMOD =0x02; //計數器0,方式2

TH0=0xA0; //預值為256-96=140,十六進制A0

TL0=TH0;

TR0=1; //開始計數

TF0=0;

}

void WByte(uchar input)

{

//發送啟始位

uchar i=8;

TR0=1;

TXD=(bit)0;

WaitTF0();

//發送8位數據位

while(i--)

{

TXD=(bit)(input&0x01); //先傳低位

WaitTF0();

input=input>>1;

}

//發送校驗位(無)

//發送結束位

TXD=(bit)1;

WaitTF0();

TR0=0;

}

//查詢計數器溢出標志位

void WaitTF0( void )

{

while(!TF0);

TF0=0;

}

接收的程序,可以參考下一種方法,不再寫出。這種辦法個人感覺不錯,接收和發送

都很準確,另外不需要計算每條語句的指令周期數。

方法三:中斷法

中斷的方法和計數器的方法差不多,只是當計算器溢出時便產生一次中斷,用戶可以

在中斷程序中置標志,程序不斷的查詢該標志來決定是否發送或接收下一位,當然程序中需對中

斷進行初始化,同時編寫中斷程序。本程序使用Timer0中斷。

#define TM0_FLAG P1_2 //設傳輸標志位

//計數器及中斷初始化

void S2INI(void)

{

TMOD =0x02; //計數器0,方式2

TH0=0xA0; //預值為256-96=140,十六進制A0

TL0=TH0;

TR0=0; //在發送或

接收才開始使用

TF0=0;

ET0=1; //允許定時

器0中斷

EA=1; //中斷允許

總開關

}

//接收一個字符

uchar RByte()

{

uchar Output=0;

uchar i=8;

TR0=1; //啟動Timer0

TL0=TH0;

WaitTF0(); //等過起始

//發送8位數據位

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; //設置標志位。

}

//查詢傳輸標志位

void WaitTF0( void )

{

while(!TM0_FLAG);

TM0_FLAG=0; //清標志位

}

中斷法也是我推薦的方法,和計數法大同小異。發送程序參考計數法,相信是件很容

易的事。

另外還需注明的是本文所說的串口就是通常的三線制異步通信串口(UART),只用RXD、TXD、GND。

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

【更多資源】

編輯:admin  最后修改時間:2018-05-19

聯系方式

0755-82591179

郵箱:ivy@yingtexin.net

地址:深圳市南山區桃源街道平山社區平山一路2號南山云谷創業園二期11棟410-411

Copyright © 2014-2026 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网
干日本少妇首页| 成年人免费大片| wwwxxx黄色片| 亚洲精品少妇一区二区| 日韩一级免费片| 久久精品99国产| 男人日女人视频网站| 三级在线免费观看| 一级黄色大片儿| 日韩欧美亚洲另类| 国产成人黄色网址| 国产精品欧美激情在线观看| 日韩精品综合在线| 青青草综合在线| 免费cad大片在线观看| 懂色av粉嫩av蜜臀av| 樱花草www在线| 欧美亚洲视频一区| 亚洲小说欧美另类激情| 一二三级黄色片| 欧美亚洲视频一区| 亚洲爆乳无码精品aaa片蜜桃| 麻豆一区二区三区在线观看| 777久久精品一区二区三区无码| 亚洲黄色av片| 中文字幕超清在线免费观看| 最新视频 - x88av| 大伊香蕉精品视频在线| 99精品在线免费视频| 北条麻妃69av| 在线免费视频a| 日本黄色的视频| 懂色av一区二区三区四区五区| 中文字幕の友人北条麻妃| 欧美极品少妇无套实战| www黄色日本| 亚洲激情在线观看视频| 成人不卡免费视频| 精品无码国产一区二区三区av| 国产精品999视频| 一本色道无码道dvd在线观看| 国产视频一区二区视频| 香蕉视频xxxx| 免费欧美一级视频| 婷婷激情5月天| 成人性生活视频免费看| 中文字幕第80页| 热久久最新地址| 人妻无码视频一区二区三区| 在线一区二区不卡| 国产极品尤物在线| 午夜免费视频网站| 无罩大乳的熟妇正在播放| 岛国av在线免费| 免费超爽大片黄| 久热精品在线播放| 国产精品久久久久久久乖乖| 免费国产成人av| 久草视频这里只有精品| 在线免费观看视频黄| 日韩一区二区高清视频| 中文字幕网av| 欧美一区二区中文字幕| www.成人黄色| 青青青国产在线视频| 日本欧美视频在线观看| 天天综合天天添夜夜添狠狠添| 日韩中文字幕三区| 欧美日韩dvd| 一级黄色免费在线观看| 欧美日韩在线成人| 国产h视频在线播放| 黄色www在线观看| 毛片av免费在线观看| 欧美成人高潮一二区在线看| 一二三在线视频| 91制片厂免费观看| 亚洲一二三av| 午夜视频在线网站| 女同激情久久av久久| 国产91色在线观看| 国产成人精品无码播放| 国产一线二线三线女| 欧美交换配乱吟粗大25p| 永久免费黄色片| 在线一区二区不卡| 精品国产鲁一鲁一区二区三区| 亚洲一区在线不卡| 日本人视频jizz页码69| 黄色手机在线视频| 日本成人中文字幕在线| 国内自拍视频一区| 日韩大片一区二区| 九九九九九九九九| 亚洲色图欧美自拍| 三年中文高清在线观看第6集| 日韩va在线观看| 国产精品无码乱伦| 大陆极品少妇内射aaaaaa| 992tv快乐视频| 800av在线免费观看| 亚欧无线一线二线三线区别| 久久精品香蕉视频| 日韩av在线中文| av电影一区二区三区| 777av视频| 手机在线免费观看毛片| 亚洲精品成人在线播放| 99热这里只有精品免费| av免费观看国产| 免费看污黄网站| 色呦呦网站入口| 少妇无码av无码专区在线观看| 欧美成人xxxxx| 超碰在线97免费| 日韩在线视频在线| 国产av无码专区亚洲精品| 在线观看免费视频高清游戏推荐| www.久久com| 欧洲av无码放荡人妇网站| 欧美丝袜在线观看| 自慰无码一区二区三区| 一二三av在线| 国产91在线视频观看| 中文字幕在线视频精品| 欧美精品久久久久久久自慰| 色多多视频在线播放| av日韩在线看| 亚洲精品午夜在线观看| 久久国产精品视频在线观看| 亚洲综合欧美在线| 伊人成色综合网| 久久久久久久久久久久久国产| 91精品91久久久中77777老牛| 蜜臀一区二区三区精品免费视频| 欧美成人三级在线视频| 特级黄色片视频| 亚洲第一中文av| 国产日韩欧美精品在线观看| 亚欧精品在线视频| 亚洲综合在线网站| 日韩精品视频久久| 欧美亚洲黄色片| 亚洲自拍偷拍一区二区三区| 亚洲中文字幕久久精品无码喷水| 成年人深夜视频| av磁力番号网| 超碰91在线播放| 欧洲美女亚洲激情| 999精彩视频| 国产精品第12页| 欧美亚洲一二三区| 热99这里只有精品| 国产视频九色蝌蚪| 久久国产精品视频在线观看| 性一交一乱一伧国产女士spa| 看全色黄大色大片| youjizz.com亚洲| 四虎永久免费网站| 久久av秘一区二区三区| 欧美国产日韩在线视频| 亚洲色图偷拍视频| xxx中文字幕| 黄色一级视频播放| 成人手机在线播放| 无码人妻少妇伦在线电影| www.男人天堂网| 欧美日韩性生活片| 国产一区视频免费观看| 人妻无码视频一区二区三区| 91热这里只有精品| 久久久精品高清| 99热这里只有精品7| 久久av高潮av| 欧美亚洲日本一区二区三区| 国产熟女高潮视频| 天天爽夜夜爽一区二区三区| 激情五月俺来也| 免费看污污视频| 国产成人艳妇aa视频在线 | 日本a√在线观看| 中文字幕久久av| 中文字幕の友人北条麻妃| 国产精品igao激情视频| 欧美成人三级在线视频| 九色91popny| 香蕉视频xxxx| 91免费视频网站在线观看| 中文字幕成人在线视频| 国产欧美123| 国内自拍在线观看| 日日干日日操日日射| 99在线免费视频观看| 欧美日韩亚洲自拍| 国产又粗又爽又黄的视频| 久久精品免费一区二区| 亚洲一区二区中文字幕在线观看| 国产av人人夜夜澡人人爽麻豆 | 日本中文字幕高清| 日本福利视频网站|