<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 使用51的定時(shí)器模擬串口

使用51的定時(shí)器模擬串口

作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò ) 收藏
對于一部分坑爹的51單片機來(lái)說(shuō),壓根就米有串口?。?!特別是用來(lái)做小東西的利器:STC15F100系列的,坑爹到串口都米有的地步。當然,我們可以使用軟件來(lái)模擬串口??上?,軟件模擬的串口速度那個(gè)慢(12T單片機),誤碼率比硬件串口那個(gè)高……但是總比沒(méi)有的好。這個(gè)玩意不像硬件一樣能支持全雙工(12T的。1T的可以,畢竟12T的定時(shí)器中斷頻率快了主程序直接會(huì )被阻塞了……)。

另外STC的手冊上面說(shuō)的8位自動(dòng)重載定時(shí)器竟然TMOD等于6!導致我搞了一下午都調不通,沒(méi)想到老妖寫(xiě)錯了……定時(shí)器重載模式應該是=2.我現在想把TMOD寄存器的O去掉,再用這個(gè)詞問(wèn)候他們全家??!

本文引用地址:http://dyxdggzs.com/article/201611/323424.htm

順便說(shuō)一句,1T的51單片機足夠在定時(shí)器里實(shí)現全雙工,這就是為什么老妖說(shuō)真實(shí)波特率要/3的原因。有RCNT=3這個(gè)語(yǔ)句在,所以可以實(shí)現同時(shí)接收發(fā)送……老妖寫(xiě)程序不寫(xiě)注釋是出了名的……但是至于普通的12T單片機。如果也用老妖得的程序,要注意定時(shí)器模式?jīng)]有16位自動(dòng)重裝模式。如果/3的話(huà),9600就成3200的波特率了……還是非標準的,這個(gè)程序在89C52上最高波特率只能到9600,繼續往上加就嚴重誤碼……所以模擬串口還是用1T單片機或者12T降3倍速吧,(但是速度能卡的可怕,我感覺(jué)9600都卡)。要不然誤碼率能搞死人。

對了,順便說(shuō)明一下,這個(gè)程序在keil c51上通不過(guò),因為Keil內置putchar……會(huì )提示重復定義。能過(guò)keil的程序請參考http://www.51hei.com/mcu/1541.html,而且似乎keil的printf函數有毛病……

#include #include #include void WaitTF0(){while(!TF0);TF0=0;}void WByte(BYTE out){//發(fā)送啟始位BYTE i=8;BYTE tmp=out;TR0=1;//開(kāi)定時(shí)器TX1=0;WaitTF0();//發(fā)送8位數據位while(i--){TX1=(tmp&0x01);     //先傳低位tmp=tmp>>1;WaitTF0();}//發(fā)送校驗位(無(wú))//發(fā)送結束位TX1=1;WaitTF0();TR0=0;}    void putchar(char ch){WByte(ch);}BYTE RByte(){BYTE in=0;BYTE cnt;while(RX1==1);//等待RXD變低,啟動(dòng)定時(shí)器,這個(gè)是阻塞模式TR0=1;//同步開(kāi)定時(shí)器WaitTF0();//等到周期過(guò)去for(cnt=0;cnt<8;cnt++){in=in >>1;//從高移到低if(RX1==1) in = in | 0x80;//如果RXD=1,則最高置位WaitTF0();//等待一位過(guò)去}//等待停止位//WaitTF0();TR0=0;//關(guān)閉定時(shí)器return in;}void Init_VSer(){//指令周期=(1000000/Baud)/(12/SysClock)//定時(shí)器值=0x100-指令周期TMOD |=0x02;  //計數器0,方式2TH0=0xa0;                    TL0=0xa0;        TR0=0;       //停止計數//TF0=0;	//ET0=0;		//T1中斷關(guān)//EA=0;		//總中斷關(guān)}void main(){BYTE a;Init_VSer();printf("Hello,world!");while(1){a=RByte();//阻塞模式putchar(a);}}

順便附上老妖的減掉三倍速的1T單片機模擬串口程序。穩定得多,當然效率也低的多。那個(gè)是靠定時(shí)器中斷實(shí)現的。不過(guò)至少不會(huì )象在12T上到主程序幾乎跑不動(dòng)的地步。強烈要求老妖出有串口的C版本!

/*----------------------------------------------------*//* --- STC MCU International Limited -----------------*//* --- 演示STC 15 系列單片機利用定時(shí)器1實(shí)現模擬串口功能-----*//* --- Mobile: (86)13922809991 -----------------------*//* --- Fax: 86-755-82905966 --------------------------*//* --- Tel: 86-755-82948412 --------------------------*//* --- Web: www.STCMCU.com ---------------------------*//* 如果要在程序中使用或在文章中引用該程序, -----------------*//* 請在程序中或文章中注明使用了STC的資料及程序 -------------*//*----------------------------------------------------*/#include "reg51.h"http://define baudrate const//BAUD = 256 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)//NOTE: (SYSclk/3/BAUDRATE) must be greater than 98, (RECOMMEND GREATER THAN 110)//開(kāi)始一直看不懂為什么要除三//#define BAUD	 0xF400 	 // 1200bps @ 11.0592MHz//#define BAUD	 0xFA00 	// 2400bps @ 11.0592MHz//#define BAUD	 0xFD00 	// 4800bps @ 11.0592MHz//#define BAUD	 0xFE80 	// 9600bps @ 11.0592MHz//#define BAUD	 0xFF40 	 //19200bps @ 11.0592MHz//#define BAUD	 0xFFA0		 //38400bps @ 11.0592MHz//#define BAUD	 0xEC00 	// 1200bps @ 18.432MHz//#define BAUD	 0xF600 	 // 2400bps @ 18.432MHz//#define BAUD	 0xFB00 	// 4800bps @ 18.432MHz//#define BAUD	 0xFD80 	// 9600bps @ 18.432MHz//#define BAUD	 0xFEC0 	//19200bps @ 18.432MHz#define BAUD	 0xFF60 	 //38400bps @ 18.432MHz//#define BAUD	 0xE800 	 // 1200bps @ 22.1184MHz//#define BAUD	 0xF400 	 // 2400bps @ 22.1184MHz//#define BAUD	 0xFA00 	// 4800bps @ 22.1184MHz//#define BAUD	 0xFD00 	// 9600bps @ 22.1184MHz//#define BAUD	 0xFE80 	//19200bps @ 22.1184MHz//#define BAUD	 0xFF40 	 //38400bps @ 22.1184MHz//#define BAUD	 0xFF80 	 //57600bps @ 22.1184MHz//define UART TX/RX porttypedef bit BOOL;typedef unsigned char BYTE;typedef unsigned int WORD;BYTE TBUF,RBUF;BYTE TDAT,RDAT;BYTE TCNT,RCNT;BYTE TBIT,RBIT;BOOL TING,RING;BOOL TEND,REND;void UART_INIT();BYTE t, r;BYTE buf[16];void main(){TMOD = 0x00;//timer1 in 16-bit auto reload modeAUXR = 0x40;//timer1 working at 1T modeTL1 = BAUD;//initial timer1 and set reload valueTH1 = BAUD>>8;TR1 = 1;//timer1 start running[原文有錯誤],感覺(jué)這個(gè)代碼不像老妖寫(xiě)的。注釋都英文……ET1 = 1;//enable timer1 interruptPT1 = 1;//improve timer1 interrupt priorityEA = 1;//open global interrupt switchUART_INIT();while (1){//users functionif (REND){REND = 0;buf[r++ & 0x0f] = RBUF;}if (TEND){if (t != r){TEND = 0;TBUF = buf[t++ & 0x0f];TING = 1;}}}}				   
				
            
                
			
							
上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 51定時(shí)器模擬串

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>