寄存器配置
PCON電源管理寄存器
位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 SM0 SM1 SM2 REN TB8 RB8 TI RI
– 模式 模式 模式1直接清零 使能串口接收 模式1接收停止位 發送標志位,軟件清零 接受標志位,軟件清0
//不能位尋址
SCON串口控制寄存器
位序號 D7 D6 D5 D4 D3 D2 D1 D0
位符號 SM0 SM1 SM2 REN TB8 RB8 TI RI
– 模式 模式 模式1直接清零 使能串口接收 模式1接收停止位 發送標志位,軟件清零 接受標志位,軟件清0
/* SCON */
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
模式&波特率(宋雪松P183)
SCON主要用模式1,的波特率
對應的,要用定時器T1&T2的模式2
TH1 = TL1 = 256 - 晶振值/12/2/16/波特率
(256是TL1的溢出值,12指12個時鐘周期,16是硬件因素)
SBUF
兩個SBUF寄存器,分別負責接收和發送緩沖
流程
配置串口為模式1
配置定時器T1為模式2
根據波特率計算TH0&TL0的值
配置PCON&SCON寄存器
打開定時器
IO口模擬UART串口通信
UART串口傳送數據示意圖
挖坑:波特率&TH0是怎么算的?
#include sbit PIN_RXD = P3^0; sbit PIN_TXD = P3^1; bit RxdOrTxd = 0; bit RxdEnd = 0; bit TxdEnd = 0; unsigned char RxdBuf = 0; unsigned char TxdBuf = 0; void configUART(unsigned long baud); void startRXD(void); void startTXD(unsigned char dat); void main(void) { EA = 1; configUART(9600); while(1) { while(PIN_RXD); startRXD(); while(!RxdEnd); startTXD(RxdBuf+1); while(!TxdEnd); } } void configUART(unsigned long baud) { TMOD &= ~(0xF<<0); TMOD |= 0x1<<1; TH0 = 256 - (11059200 / 12) / baud; } void startRXD(void) { TL0 = 256 - ((256 - TH0) >> 1); ET0 = 1; TR0 = 1; RxdEnd = 0; RxdOrTxd = 0; } void startTXD(unsigned char dat) { TxdBuf = dat; TL0 = TH0; ET0 = 1; TR0 = 1; PIN_TXD = 0; RxdEnd = 0; RxdOrTxd = 1; } void timer0(void) interrupt 1 { static unsigned char cnt = 0; if(RxdOrTxd) { cnt++; if(cnt<=8) { PIN_TXD = TxdBuf & 0x01; TxdBuf >>= 1; } else if(cnt==9) { PIN_TXD = 1; } else { cnt = 0; TR0 = 0; TxdEnd = 1; } } else { if(cnt==0) { if(!PIN_RXD) { RxdBuf = 0; cnt++; } else { TR0 = 0; } } else if(cnt<=8) { RxdBuf >>= 1; if(PIN_RXD) { RxdBuf |= 0x80; } cnt++; } else { cnt = 0; TR0 = 0; if(PIN_RXD) { RxdEnd = 1; } } } } UART串口通信 教學版 #include void configUART(unsigned long baud); void main(void) { configUART(9600); while(!RI); RI = 0; SBUF = SBUF + 1; while(!TI); TI = 0; } void configUART(unsigned long baud) { SCON = 0x50; TH1 = 256 - (11059200 / 12 / 2 / 16) / baud; TL1 = TH1; TMOD &= ~(0xF<<4); TMOD |= 0x2<<4; ET1 = 0; TR1 = 1; } 工業版 #include void configUART(unsigned long baud); void main(void) { EA = 1; configUART(9600); while(1); } void configUART(unsigned long baud) { SCON = 0x50; TH1 = 256 - (11059200 / 12 / 2 / 16) / baud; TL1 = TH0; TMOD &= ~(0xF<<4); TMOD |= 0x2<<4; ET1 = 0; ES = 1; TR1 = 1; } void UART(void) interrupt 4 { if(RI) { RI = 0; SBUF = SBUF + 1; } if(TI) { TI = 0; } } #include sbit wei = P2^7; sbit duan = P2^6; unsigned char code weitable[6] = { ~0x20,~0x10,~0x08,~0x04,~0x02,~0x01 }; unsigned char code duantable[16] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71 }; unsigned char ledbuff[6] = { 0x00,0x00,0x00,0x00,0x00,0x00 }; unsigned char T0RH = 0,T0RL = 0; unsigned char RxdByte = 0; void configtimer0(unsigned char ms); void configUART(unsigned long baud); void main(void) { EA = 1; configtimer0(1); configUART(9600); while(1) { ledbuff[0] = duantable[RxdByte & 0x0F]; ledbuff[1] = duantable[RxdByte >> 4]; } } void configtimer0(unsigned char ms) { unsigned long tmp; tmp = 11059200 / 12; tmp = (tmp * ms) / 1000; tmp = 65536 - tmp; tmp = tmp + 12; T0RH = (unsigned char)(tmp>>8); T0RL = (unsigned char)tmp; TH0 = T0RH; TL0 = T0RL; TMOD &= ~(0xF<<0); TMOD |= 0x1<<0; ET0 = 1; TR0 = 1; } void configUART(unsigned long baud) { TH1 = 256 - (11059200 / 12 / 2 / 16) / baud; TL1 = TH0; SCON = 0x50; TMOD &= ~(0xF<<4); TMOD |= 0x2<<4; ET1 = 0; ES = 1; TR1 = 1; } void ledscan(void) { static unsigned char i = 0; P0 = 0x00; duan = 1; duan = 0; P0 = weitable[i]; wei = 1; wei = 0; P0 = ledbuff[i]; duan = 1; duan = 0; if(i<5) i++; else i = 0; } void timer0(void) interrupt 1 { TH0 = T0RH; TL0 = T0RL; ledscan(); } void UART(void) interrupt 4 { if(RI) { RI = 0; RxdByte = SBUF; SBUF = RxdByte; } if(TI) { TI = 0; } }
上一篇:51單片機簡單的串口通訊-1
下一篇:51單片機 | 串口通信實驗(模擬串口通信/多機通信實例)
推薦閱讀
史海拾趣
在快速發展的同時,港源公司始終不忘履行社會責任。公司秉承綠色環保、節能減排的理念,在生產經營活動中以預防為主、全員參與為行動綱領,防治污染、節廢減排。港源公司選用綠色環保RoHS材料,嚴格管控生產制造過程,確保生產出的產品符合國際環保標準。此外,公司還積極參與社會公益活動,為社會和諧發展貢獻自己的力量。
在快速發展的過程中,CTC Coils Ltd公司始終注重企業文化建設和團隊建設。公司倡導創新、務實、高效的企業精神,鼓勵員工勇于創新、追求卓越。同時,公司還注重員工的培訓和成長,為員工提供廣闊的發展空間和良好的職業晉升通道。這些舉措使得公司凝聚力不斷增強,為公司的長遠發展奠定了堅實的基礎。
請注意,這些故事是虛構的,旨在展示一個電子行業公司可能經歷的發展路徑和關鍵階段。實際情況可能因公司具體情況和市場環境的不同而有所差異。
CTC Coils Ltd公司早期以生產傳統電感線圈為主,隨著電子技術的飛速發展,公司意識到必須進行技術升級。于是,公司投入大量研發資源,成功開發出一種新型高效能電感線圈,該產品在性能上大幅提升,同時降低了能耗。這一技術突破使CTC Coils Ltd的產品在市場上脫穎而出,公司迅速贏得了大量客戶,并擴大了生產規模。
EUtech公司注重品牌塑造和市場拓展。他們通過參加國際展會、舉辦技術研討會等方式提高品牌知名度。同時,公司積極拓展海外市場,產品已出口到新加坡、香港、韓國等國家和地區。憑借優異的產品質量和良好的市場口碑,EUtech公司逐漸在國際市場上樹立起了品牌形象。
進入21世紀,隨著科技的不斷進步,電子行業對產品的性能和質量要求越來越高。EMI公司意識到,只有不斷創新才能在激烈的市場競爭中立于不敗之地。因此,公司加大了對研發的投入,引進了一批高端技術人才,并建立了完善的研發體系。經過幾年的努力,EMI公司成功研發出了一系列具有自主知識產權的電磁產品,這些產品在性能和質量上均達到了國際先進水平,贏得了客戶的廣泛贊譽。
Deltron Emcon,即現在的DEM Manufacturing,起源于四家英國制造企業的合并。這些企業分別是成立于1946年的Deltron Components,專業音頻連接器和壓鑄盒制造商Roxburgh EMC(成立于1969年),EMC濾波器和組件的制造商Media Products(成立于1990年),以及廣播跳線產品制造商BES Electronics(成立于1982年)。這些公司在各自的領域內都有著豐富的經驗和卓越的技術,合并后,DEM Manufacturing憑借這些優勢,在電子行業中迅速嶄露頭角。
現在在有揚創的一嵌入式開發板做個東西,板子是去年買的,當時用自己寫的一個EVC程序通過GPRS模塊來收發短信都沒問題,不過不知道怎么現在在同樣的板子上用同樣的程序卻總是出現串口問題。 我用之前沒問題的收發短信程序 ...… 查看全部問答∨ |
|
請問IR2136驅動IGBT管這個三極管是什么管子(有圖示)? 想自已DIYG一個簡易的變頻器,拆開單位用到的一種國產變頻器(好象它的返修是最少的), 描下其用IR2136驅動IGBT管的電路,就是看不明白其中的D2,D3是什么管子?那位大蝦可以說說嗎? 我開始以為是PNP三極管,但用數字萬用表測量C腳,B腳之間 ...… 查看全部問答∨ |
1. 如何修改 systick 的優先級2. 我使用的中斷group 2. Io中斷 先占優先級 2 從優先級 1 如何屏蔽比他低的優先級. &nbs ...… 查看全部問答∨ |
單片機MSC-51學習筆記1第二章 CS-51單片機的結構 本章的重點 MCS-51 單片機的內部結構 MCS-51 單片機的引腳功能 MCS-51 單片機CPU的結構特點 MCS-51 單片機的存儲器組織特點及訪問方式 MCS-51 單片機的低功耗方式及應用 一、MCS-5 ...… 查看全部問答∨ |
51MCU中。用編譯器將HEX程序文件載入單片機ROM里的時候,是將其放在MCU的內部存儲器還是外部存儲器呢? 還有,在EA置低的時候為什么單片機最小系統也還是可以工作的? 大神們請為小弟耐心解答!萬分感謝?。 ? 查看全部問答∨ |
Sitara™ ARM® Processors AM335x Starter Kit 搶購Q&A! Sitara™ ARM® Processors AM335x Starter Kit 團購今天下午2點準時開搶,(淘寶開團時間2點05分)你準備好了嗎? 團購頁面:http://www.nncyjs.com/eetuan/20121112/index.php 對于本次團購有什么問題,在下面跟帖吧,maylove為你 ...… 查看全部問答∨ |