|
|||||||||||
| 技術(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ī) |
/* 程序名稱(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樓: | >>參與討論 |
| 作者: 一丁久久 于 2005/6/16 16:56:00 發(fā)布:
用匯編的更好用 我用的時(shí)候常把主時(shí)鐘T0暫時(shí)屏蔽掉,然后再開(kāi)T1. 完全用匯編命令更簡(jiǎn)潔. |
|
| 3樓: | >>參與討論 |
| 作者: hiberhe 于 2005/6/16 17:32:00 發(fā)布:
這個(gè)是查詢方式發(fā)送的嘛~~~~ 不錯(cuò)不錯(cuò),不過(guò)實(shí)際發(fā)送也用中斷吧,開(kāi)個(gè)緩沖區(qū). |
|
| 4樓: | >>參與討論 |
| 作者: liaozhihua 于 2005/6/16 17:54:00 發(fā)布:
ding |
|
| 5樓: | >>參與討論 |
| 作者: LPC900 于 2005/6/17 8:14:00 發(fā)布:
用查詢方式簡(jiǎn)單易用 中斷方式效率較高 但較復(fù)雜 |
|
| 6樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/6/17 8:53:00 發(fā)布:
錯(cuò) |
|
| 7樓: | >>參與討論 |
| 作者: LPC900 于 2005/6/17 14:37:00 發(fā)布:
錯(cuò)在哪里? 請(qǐng)賜教。 |
|
| 8樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/6/17 14:41:00 發(fā)布:
串口 有且只有 使用中斷方式 |
|
| 9樓: | >>參與討論 |
| 作者: gbchang 于 2005/6/17 14:53:00 發(fā)布:
哈哈,同意,不過(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 于 2005/6/17 14:55:00 發(fā)布:
支持所長(zhǎng) 從系統(tǒng)角度看,只有中斷才能和其他任務(wù)融會(huì)起來(lái)。 |
|
| 11樓: | >>參與討論 |
| 作者: LPC900 于 2005/6/17 15:00:00 發(fā)布:
好,改天我寫(xiě)個(gè)高效的中斷方式工作的收發(fā)程序 |
|
| 12樓: | >>參與討論 |
| 作者: xc214043 于 2005/6/17 15:15:00 發(fā)布:
:) 不過(guò)在某些情況下,如我只用發(fā)送模式的話 那僅采用查詢方式,也未嘗不可 所長(zhǎng) 所說(shuō)也未嘗不武斷 |
|
| 13樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/6/17 16:45:00 發(fā)布:
指串口接收。 |
|
| 14樓: | >>參與討論 |
| 作者: dengm 于 2005/6/17 21:30:00 發(fā)布:
接收/發(fā)送單個(gè)byte是沒(méi)多大用圖的,一般都是“數(shù)據(jù)包”方式, 在中斷中計(jì)算crc/sum, 數(shù)據(jù)包封裝等,最好用asm寫(xiě)中斷部分。 |
|
| 15樓: | >>參與討論 |
| 作者: hiberhe 于 2005/6/17 23:58:00 發(fā)布:
"最好用asm寫(xiě)中斷部分"倒也未必 呵呵,用C寫(xiě),效率也還可以的,除非有其它特殊的考慮 |
|
| 16樓: | >>參與討論 |
| 作者: hotpower 于 2005/6/18 0:08:00 發(fā)布:
同意樓上觀點(diǎn),只要寫(xiě)得好C和ASM效率差不多 另: 同意所長(zhǎng)的教導(dǎo)!!! * - 本貼最后修改時(shí)間:2005-6-18 0:49:52 修改者:hotpower |
|
| 17樓: | >>參與討論 |
| 作者: liming6430 于 2005/6/18 8:53:00 發(fā)布:
可以詳細(xì)說(shuō)明嗎? 我記得在定時(shí)器/計(jì)數(shù)器那部分講過(guò)查詢方式和中斷方式,那么串口為什么只有用中斷方式呢?高手能不能詳細(xì)說(shuō)明啊,或者給一些參考資料讓我這個(gè)新手學(xué)習(xí)一下啊。小弟目前正在搞單片機(jī)串口的一些簡(jiǎn)單編程。謝謝! |
|
| 18樓: | >>參與討論 |
| 作者: 肖敏鋒 于 2005/6/18 9:47:00 發(fā)布:
用中斷方式才能是系統(tǒng)運(yùn)行效率高 總不能讓系統(tǒng)有事沒(méi)事都去查詢吧! 都什么時(shí)代了,辦事要將效率,對(duì)吧! 這樣就可以把查詢的時(shí)間省下來(lái)做點(diǎn)其他的事情了, 不知道這樣說(shuō)對(duì)不 |
|
| 19樓: | >>參與討論 |
| 作者: LPC900 于 2005/6/18 10:00:00 發(fā)布:
這個(gè)程序本來(lái)就是給老提串行口問(wèn)題的新手參考的 高效的全中斷模式運(yùn)作的串行口程序我也有,程序要復(fù)雜一些,而且要求系統(tǒng)至少擴(kuò)展有2KB的XRAM。 |
|
| 20樓: | >>參與討論 |
| 作者: isoar 于 2005/6/18 10:36:00 發(fā)布:
為什么類(lèi)型都用CHAR而不是unsigned CHAR? |
|
| 21樓: | >>參與討論 |
| 作者: 南方的老樹(shù) 于 2005/6/18 10:52:00 發(fā)布:
關(guān)鍵是不用中斷肯定要丟數(shù)據(jù)!除非這個(gè)單片機(jī)不干別的 |
|
| 22樓: | >>參與討論 |
| 作者: cheng8760 于 2005/6/18 10:55:00 發(fā)布:
講清楚些啊 各位高手請(qǐng)講詳細(xì)全面一些啊,我也是個(gè)新手哦,不過(guò)我的愚見(jiàn)是要是沒(méi)有其它作用的話,用查詢的也沒(méi)有問(wèn)題吧? 還有樓上說(shuō)的,CHAR默認(rèn)是是不是就是unsigned CHAR? |
|
| 23樓: | >>參與討論 |
| 作者: sgb123 于 2005/6/18 10:57:00 發(fā)布:
單片機(jī)綜合應(yīng)用??? 關(guān)于單片機(jī)的開(kāi)發(fā)應(yīng)用,望高手推薦資料或總體概括,讓小輩有個(gè)大概的了解和認(rèn)識(shí),感激不盡。單片機(jī)愛(ài)好者的心聲 |
|
| 24樓: | >>參與討論 |
| 作者: LPC900 于 2005/6/18 11:47:00 發(fā)布:
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 于 2005/6/18 13:58:00 發(fā)布:
我主張?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 于 2005/6/18 14:07:00 發(fā)布:
哈哈,一樣的 我的那段程序,計(jì)算定時(shí)器初值也是在編譯階段完成的。cqwangsf的方法也不錯(cuò),是等效的。 |
|
| 27樓: | >>參與討論 |
| 作者: dcp 于 2005/6/18 15:05:00 發(fā)布:
用中斷方式并且要加上緩沖區(qū) |
|
| 28樓: | >>參與討論 |
| 作者: fsaok 于 2005/6/18 15:34:00 發(fā)布:
個(gè)人意見(jiàn) 使用中斷方式寫(xiě)串口是 51 中編程的最基本的技能之一, 當(dāng)然,你喜歡用查詢法的話,也沒(méi)有人會(huì)去禁止的。 |
|
| 29樓: | >>參與討論 |
| 作者: isoar 于 2005/6/19 14:15:00 發(fā)布:
中間這行我不這么寫(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 于 2005/6/19 14:20:00 發(fā)布:
這樣寫(xiě)才對(duì)嘛 #define T_X ( 256 - (unsigned CHAR)( ( MCLK / 12 ) / ( 16 * BAUD_RATE ) ) ) * - 本貼最后修改時(shí)間:2005-6-19 14:23:51 修改者:LPC900 |
|
|
|
| 免費(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) |