音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

老有人在問(wèn)51單片機(jī)串行口的問(wèn)題,現(xiàn)在我發(fā)一個(gè)通用的程序供參考

作者:LPC900 欄目:單片機(jī)
老有人在問(wèn)51單片機(jī)串行口的問(wèn)題,現(xiàn)在我發(fā)一個(gè)通用的程序供參考
/*
程序名稱(chēng):
    標(biāo)準(zhǔn)80C51單片機(jī)串行口通用收發(fā)程序
文件名:
    Uart.h
作者:
    21ICBBS LPC900,2005年6月
說(shuō)明:
    RXD = P3.0
    TXD = P3.1
    晶振:11.0592MHZ(缺省值)
    用定時(shí)器T1作為波特率發(fā)生器
    波特率:9600(缺省值)
    起始位:1
    數(shù)據(jù)位:8
    停止位:1
    校驗(yàn)位:無(wú)
用法:
    1、根據(jù)實(shí)際情況,修改參數(shù)配置
    2、在主程序中包含本頭文件
    3、在main()函數(shù)開(kāi)始處執(zhí)行串行口初始化函數(shù)UartInit()
    4、發(fā)送數(shù)據(jù)時(shí)直接用函數(shù)UartSendChar()和UartSendString()
    5、數(shù)據(jù)接收部分的程序框架已經(jīng)寫(xiě)好,只需根據(jù)實(shí)際情況添加具體的處理代碼
*/



#ifndef _UART_H_
#define _UART_H_


#include <reg52.h>


//參數(shù)配置
#define MCLK        11059200L    //定義CPU主頻(Hz)
#define BAUD_RATE    9600L        //設(shè)置波特率


//定義發(fā)送中斷輔助標(biāo)志(僅用于發(fā)送)
static volatile bit _TI_;


//串行口初始化
extern void UartInit()
{
    CHAR t;
    EA = 0;
    RXD = 1;
    TXD = 1;
    _TI_ = 1;
    SCON = 0x50;    //串口方式1
    PCON |= 0x80;    //波特率加倍
    t = TMOD;
    t &= 0x0F;
    t |= 0x20;
    TMOD = t;
    TH1 = 256 - ( MCLK / 12 ) / ( 16 * BAUD_RATE );
    TL1 = TH1;
    TR1 = 1;
    ES = 1;            //允許串行口中斷
    EA = 1;            //允許中斷
}


//串行口中斷服務(wù)程序
static void UartINTSVC() interrupt 4
{
    CHAR c;
    if ( RI )    //接收中斷
    {
        c = SBUF;
        RI = 0;
        //在這里添加其它代碼
    }
    if ( TI )    //發(fā)送中斷
    {
        TI = 0;
        _TI_ = 1;
    }
}


/*
功能:
    通過(guò)串行口發(fā)送單個(gè)字節(jié)
參數(shù):
    c:被發(fā)送的字節(jié)數(shù)據(jù),取值0x00~0xFF
*/

extern void UartSendChar(CHAR c)
{
    while ( !_TI_ );
    _TI_ = 0;
    SBUF = c;
}


/*
功能:
    通過(guò)串行口發(fā)送字符串
參數(shù):
    *s:被發(fā)送的字符串
說(shuō)明:
    字符串應(yīng)當(dāng)以'\0'結(jié)尾,而'\0'本身不會(huì)被發(fā)送出去
*/

extern void UartSendString(CHAR *s)
{
    CHAR c;
    for (;;)
    {
        c = *s;
        if ( c == '\0' ) break;
        s++;
        UartSendChar(c);
    }
}


#endif    //_UART_H_

* - 本貼最后修改時(shí)間:2005-6-18 9:25:56 修改者:LPC900

2樓: >>參與討論
一丁久久
用匯編的更好用
我用的時(shí)候常把主時(shí)鐘T0暫時(shí)屏蔽掉,然后再開(kāi)T1.
完全用匯編命令更簡(jiǎn)潔.

3樓: >>參與討論
hiberhe
這個(gè)是查詢方式發(fā)送的嘛~~~~
不錯(cuò)不錯(cuò),不過(guò)實(shí)際發(fā)送也用中斷吧,開(kāi)個(gè)緩沖區(qū).

4樓: >>參與討論
liaozhihua
ding
 
5樓: >>參與討論
LPC900
用查詢方式簡(jiǎn)單易用 中斷方式效率較高 但較復(fù)雜
 
6樓: >>參與討論
農(nóng)民講習(xí)所
錯(cuò)
 
7樓: >>參與討論
LPC900
錯(cuò)在哪里?
請(qǐng)賜教。

8樓: >>參與討論
農(nóng)民講習(xí)所
串口 有且只有 使用中斷方式
 
9樓: >>參與討論
gbchang
哈哈,同意,不過(guò)“老有人在問(wèn)...”,給他們這個(gè)讓他去發(fā)現(xiàn)問(wèn)題.
哈哈,同意,
不過(guò)“老有人在問(wèn)...”,給他們這個(gè)讓他去發(fā)現(xiàn)問(wèn)題,這樣也許才更有教肓意義:P
當(dāng)他自己發(fā)現(xiàn)了這樣用的弊端后,他就會(huì)改用中斷了,
那句話怎么說(shuō)來(lái)著?:“告訴你印象不深”嘛!

不過(guò)話說(shuō)回來(lái),還是直接給個(gè)中斷形式的例程好點(diǎn)。

10樓: >>參與討論
12864
支持所長(zhǎng)
從系統(tǒng)角度看,只有中斷才能和其他任務(wù)融會(huì)起來(lái)。

11樓: >>參與討論
LPC900
好,改天我寫(xiě)個(gè)高效的中斷方式工作的收發(fā)程序
 
12樓: >>參與討論
xc214043
:)
不過(guò)在某些情況下,如我只用發(fā)送模式的話

那僅采用查詢方式,也未嘗不可

所長(zhǎng) 所說(shuō)也未嘗不武斷


13樓: >>參與討論
農(nóng)民講習(xí)所
指串口接收。
 
14樓: >>參與討論
dengm
接收/發(fā)送單個(gè)byte是沒(méi)多大用圖的,一般都是“數(shù)據(jù)包”方式,
在中斷中計(jì)算crc/sum, 數(shù)據(jù)包封裝等,最好用asm寫(xiě)中斷部分。

15樓: >>參與討論
hiberhe
"最好用asm寫(xiě)中斷部分"倒也未必
呵呵,用C寫(xiě),效率也還可以的,除非有其它特殊的考慮

16樓: >>參與討論
hotpower
同意樓上觀點(diǎn),只要寫(xiě)得好C和ASM效率差不多
另: 同意所長(zhǎng)的教導(dǎo)!!!

* - 本貼最后修改時(shí)間:2005-6-18 0:49:52 修改者:hotpower

17樓: >>參與討論
liming6430
可以詳細(xì)說(shuō)明嗎?
    我記得在定時(shí)器/計(jì)數(shù)器那部分講過(guò)查詢方式和中斷方式,那么串口為什么只有用中斷方式呢?高手能不能詳細(xì)說(shuō)明啊,或者給一些參考資料讓我這個(gè)新手學(xué)習(xí)一下啊。小弟目前正在搞單片機(jī)串口的一些簡(jiǎn)單編程。謝謝!

18樓: >>參與討論
肖敏鋒
用中斷方式才能是系統(tǒng)運(yùn)行效率高
總不能讓系統(tǒng)有事沒(méi)事都去查詢吧!

都什么時(shí)代了,辦事要將效率,對(duì)吧!

這樣就可以把查詢的時(shí)間省下來(lái)做點(diǎn)其他的事情了,

不知道這樣說(shuō)對(duì)不

19樓: >>參與討論
LPC900
這個(gè)程序本來(lái)就是給老提串行口問(wèn)題的新手參考的
高效的全中斷模式運(yùn)作的串行口程序我也有,程序要復(fù)雜一些,而且要求系統(tǒng)至少擴(kuò)展有2KB的XRAM。

20樓: >>參與討論
isoar
為什么類(lèi)型都用CHAR而不是unsigned CHAR?
 
21樓: >>參與討論
南方的老樹(shù)
關(guān)鍵是不用中斷肯定要丟數(shù)據(jù)!除非這個(gè)單片機(jī)不干別的
 
22樓: >>參與討論
cheng8760
講清楚些啊
各位高手請(qǐng)講詳細(xì)全面一些啊,我也是個(gè)新手哦,不過(guò)我的愚見(jiàn)是要是沒(méi)有其它作用的話,用查詢的也沒(méi)有問(wèn)題吧?
還有樓上說(shuō)的,CHAR默認(rèn)是是不是就是unsigned CHAR?

23樓: >>參與討論
sgb123
單片機(jī)綜合應(yīng)用???
關(guān)于單片機(jī)的開(kāi)發(fā)應(yīng)用,望高手推薦資料或總體概括,讓小輩有個(gè)大概的了解和認(rèn)識(shí),感激不盡。單片機(jī)愛(ài)好者的心聲

24樓: >>參與討論
LPC900
Re:isoar
    80C51是8位機(jī),對(duì)有符號(hào)數(shù)的支持不好。所以u(píng)nsigned CHAR型變量的效率最高。但這只是體現(xiàn)在算術(shù)運(yùn)算方面。對(duì)于邏輯運(yùn)算,CHAR與unsigned CHAR的效率相當(dāng)。CHAR還有一層意義是表示字符,通常不參與算術(shù)邏輯運(yùn)算。所以在我的程序中,如果是字符用途(串行收發(fā))的話選擇CHAR,用unsigned CHAR也可以,但是顯得太長(zhǎng),也沒(méi)必要;對(duì)于計(jì)數(shù)等算術(shù)運(yùn)算則采用unsigned CHAR。
    總之,對(duì)于字符用途,我就選擇CHAR;對(duì)于算術(shù)運(yùn)算采用unsigned CHAR,以獲得最高效率。

25樓: >>參與討論
cqwangsf
我主張?jiān)诰幾g時(shí)把時(shí)間參數(shù)算好!
#define MCLK        11059200L    //定義CPU主頻(Hz)
#define BAUD_RATE    9600L        //設(shè)置波特率
#define T_X         256 - ( MCLK / 12 ) / ( 16 * BAUD_RATE )
......
TH1=T_X;
TL1=T_X;
......

26樓: >>參與討論
LPC900
哈哈,一樣的
我的那段程序,計(jì)算定時(shí)器初值也是在編譯階段完成的。cqwangsf的方法也不錯(cuò),是等效的。

27樓: >>參與討論
dcp
用中斷方式并且要加上緩沖區(qū)
 
28樓: >>參與討論
fsaok
個(gè)人意見(jiàn)
使用中斷方式寫(xiě)串口是 51 中編程的最基本的技能之一,

當(dāng)然,你喜歡用查詢法的話,也沒(méi)有人會(huì)去禁止的。

29樓: >>參與討論
isoar
中間這行我不這么寫(xiě)
#define T_X         256 - ( MCLK / 12 ) / ( 16 * BAUD_RATE )
我也認(rèn)為應(yīng)該在編譯預(yù)處理階段把常數(shù)先算好,不過(guò)這行我不這么寫(xiě),而是:
#define T_X         256 - (unsigned CHAR)(( MCLK / 12 ) / ( 16 * BAUD_RATE ))

因?yàn)槲医?jīng)常用12MHZ的晶振,而不是11。0592

* - 本貼最后修改時(shí)間:2005-6-19 14:17:57 修改者:isoar

30樓: >>參與討論
LPC900
這樣寫(xiě)才對(duì)嘛
#define T_X    ( 256 - (unsigned CHAR)( ( MCLK / 12 ) / ( 16 * BAUD_RATE ) ) )

* - 本貼最后修改時(shí)間:2005-6-19 14:23:51 修改者:LPC900

參與討論
昵稱(chēng):
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)問(wèn)電機(jī)缺相保護(hù)怎么做?
MOTORALAGP32控制LMB-018C液晶的問(wèn)題!
請(qǐng)教AT89c52的P口問(wèn)題,謝謝
有人做過(guò)嵌入式 WEB服務(wù)器么?
請(qǐng)教雙CPU的接口電路!~!~
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)