|
|||||||||||
| 技術(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 |
模擬UART程序 |
| 作者:zlg900 欄目:MCU技術(shù) |
//********************************************************************************** //File: uart2.c //Funtion: Use the time0 and two general IO pins as a UART //BuadRate is 9600bps. //Author: Ziyi Li //Date: 14/03/2005 //********************************************************************************* #include "reg932.h" #define uCHAR unsigned CHAR sbit uart2txd=P0^0; //pin of the UART2 TxD sbit uart2rxd=P1^3; //pin of the UART2 RxD uCHAR num; uCHAR uart2s; //ie. SBUF2 uCHAR uart2f=0; //0:disable 1:read 2:send 3: read completed 4:send completed //********************************************************************************* void timer0_isr(void) interrupt 1 { TH0=0xFE; TL0=0x95; if(uart2f==2) { if(num==1) { uart2txd=1; uart2f=4; TR0=0; } if(num>1&&num<10) { if(uart2s&(0x01<<(9-num))) uart2txd=1; else uart2txd=0; } num--; } if(uart2f==1) { if(num>1) { if(uart2rxd) uart2s=uart2s|(0x01<<(9-num)); else uart2s=uart2s&~(0x01<<(9-num)); num--; } else { uart2f=3; TR0=0; } } } //********************************************************* void InitIO(void) { P0M1=0x00; P0M2=0xff; P1M1=0x00; P1M2=0x00; uart2txd=1; } //********************************************************* void InitTimer0(void) { // configure timer 0 AS MODE 1 TMOD &= 0xF0; TMOD |= 0x01; TAMOD &= 0xFE; // values of timer0 TH0 = 0xFE; TL0 = 0x95; //config interrupts ET0=1; EA=1; } //********************************************************* void uart2send(uCHAR s) { num=9; uart2s=s; uart2f=2; uart2txd=0; TR0=1; } //********************************************************* void uart2read(void) //read a byte from UART2 { //result is stored in uart2s while(uart2rxd); //wait start bit num=9; uart2f=1; TH0=0xFd; TL0=0xc5; TR0=1; } //********************************************************* void main(void) { InitIO(); InitTimer0(); while(1) { uart2read(); while(uart2f!=3); //wait till read completed uart2send(uart2s); } } * - 本貼最后修改時(shí)間:2005-6-23 15:33:45 修改者:zlg900 |
| 2樓: | >>參與討論 |
| 作者: zlg900 于 2005/3/15 9:27:00 發(fā)布:
供有興趣的網(wǎng)友使用. 功能不完善,請(qǐng)?zhí)岢鲂薷慕ㄗh完善程序.要保證連續(xù)通信可靠,請(qǐng)用2個(gè)停止位. * - 本貼最后修改時(shí)間:2005-3-15 9:39:39 修改者:zlg900 |
|
| 3樓: | >>參與討論 |
| 作者: wuyawen 于 2005/3/15 20:55:00 發(fā)布:
疑問! if(num>1&&num<10) { if(uart2s&(0x01<<(9-num))) uart2txd=1; else//為什么當(dāng)發(fā)送位是0,就不發(fā)送了?? uart2txd=0; } while(1) { uart2read();//這里如果我是先發(fā)送過數(shù)據(jù)來的話,是不會(huì)處理的!在這個(gè)函數(shù)里加個(gè)跳出語句好不好! while(uart2f!=3); //wait till read completed uart2send(uart2s); } |
|
| 4樓: | >>參與討論 |
| 作者: wuyawen 于 2005/3/15 21:00:00 發(fā)布:
請(qǐng)多多指導(dǎo) |
|
| 5樓: | >>參與討論 |
| 作者: zlg900 于 2005/3/16 8:33:00 發(fā)布:
最后一位為1.可以先送數(shù)據(jù)的. 1.當(dāng)NUM==1時(shí),程序會(huì)置位TXD的. 2. void uart2read(void) //read a byte from UART2 { //result is stored in uart2s while(uart2rxd); //wait start bit num=9; uart2f=1; TH0=0xFd; TL0=0xc5; TR0=1; } 這個(gè)讀函數(shù)是用等待方法的,在有外部INT的型號(hào),也可以改為中斷觸發(fā),也可以把RXD信號(hào)接到鍵盤中斷,也可實(shí)現(xiàn)中斷觸發(fā).但程序要作適當(dāng)改動(dòng).這樣發(fā)送和接收都是全中斷控制了. 此外,這個(gè)程序不是全雙工的.但只要適當(dāng)改動(dòng),也可實(shí)現(xiàn).具體是TXD和RXD用不同TIMER控制,且緩沖也設(shè)為不同,現(xiàn)在同是uart2s.那么這個(gè)就是全雙工雙緩沖的UART了 * - 本貼最后修改時(shí)間:2005-3-16 8:42:17 修改者:zlg900 |
|
| 6樓: | >>參與討論 |
| 作者: wuyawen 于 2005/3/16 10:00:00 發(fā)布:
謝謝 我知道NUM=9~2的時(shí)候發(fā)送的是8位數(shù)據(jù) 當(dāng)NUM=1時(shí)候,uart2txd=1發(fā)送停止位 只是在NUM=9~2中的任何一位的時(shí)候,當(dāng)這一位為零,程序就令uart2txd=0 假如我傳的數(shù)據(jù)是0xc0 那么NUM=9,8,7,6的時(shí)候,uart2txd=0;能夠保準(zhǔn)接收到的數(shù)據(jù)還是0xc0嗎。 會(huì)不會(huì)是0xc?呢! 目前手頭沒有硬件,不能夠?qū)嶋H測(cè)試一下! 盼告知 |
|
| 7樓: | >>參與討論 |
| 作者: zlg900 于 2005/3/16 10:06:00 發(fā)布:
不會(huì)的. 你了解了UART的通信格式后,就知道這是正確的.這個(gè)程序是測(cè)試過的,放心. |
|
| 8樓: | >>參與討論 |
| 作者: wuyawen 于 2005/3/16 11:53:00 發(fā)布:
弄明白啦! void send(void) { emuTXD=0; //start bit delay(BAUD); emuTXD=emuBit0; delay(BAUD); emuTXD=emuBit1; delay(BAUD); emuTXD=emuBit2; delay(BAUD); emuTXD=emuBit3; delay(BAUD); emuTXD=emuBit4; delay(BAUD); emuTXD=emuBit5; delay(BAUD); emuTXD=emuBit6; delay(BAUD); emuTXD=emuBit7; delay(BAUD); if(PARITY) {emuTXD=1; //parity bit delay(BAUD); } emuTXD=1; //stop bit delay(BAUD); } 剛剛弄了一個(gè),只要DELAY正常,也可以! 繼續(xù)努力去啦! |
|
| 9樓: | >>參與討論 |
| 作者: zlg900 于 2005/3/17 14:18:00 發(fā)布:
但你給的程序不是中斷方式實(shí)驗(yàn)的. |
|
| 10樓: | >>參與討論 |
| 作者: ploto 于 2005/10/4 23:32:00 發(fā)布:
抄的周工說明上的,應(yīng)該說明,這才是科學(xué)的態(tài)度 |
|
| 11樓: | >>參與討論 |
| 作者: 131452099 于 2006/1/5 14:40:00 發(fā)布:
一個(gè)模擬串口的問題 各位大哥: 我要用一個(gè)普通的I/O口去模擬一個(gè)能夠傳送數(shù)據(jù)的串口應(yīng)該怎么弄呀,有什么好的建議請(qǐng)給我告訴我,如果你有樣板程序的劃請(qǐng)發(fā)到我的郵箱,我的郵箱是yanghuiqing131@126.com,謝謝!! |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |