C8051f300_UART0串口發(fā)送初始化
1、C8051f的UART0是異步、全雙工串口。其波特率發(fā)生器規(guī)定由定時(shí)器1定時(shí)器提供。可配置為8位UART或9位UART(多機(jī)通訊第九位用于片選作用)。SYSCLK=24.5MHZ(我的板子采用內(nèi)部晶振頻率作為系統(tǒng)時(shí)鐘) BAUDRATE=115200(波特率)
2、初值TH1 Tl1配置
由上述公式可計(jì)算初值:TH1 = 256-(SYSCLK/BAUDRATE/2)而程序內(nèi)是TH1 = -(SYSCLK/BAUDRATE/2),這兩種是相同的。第一種是以正數(shù)的二進(jìn)制形式保存在計(jì)算機(jī)內(nèi)。第二種是負(fù)數(shù),取反加1求得補(bǔ)碼保存在計(jì)算機(jī)中。結(jié)果是相同的。每當(dāng)TL1中的值溢出后 TH1存儲(chǔ)的重裝載值裝載到TL1中開始計(jì)數(shù)。
3、初始化程序(以后使用可直接調(diào)用此初始化函數(shù))。SYSCLK與BAUDRATE參數(shù)修改即可
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is
// 使能RX接收
// ninth bits are zeros
// 清除接收和發(fā)送中斷
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON |= 0x10; // T1M = 1; SCA1:0 = xx
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON |= 0x01; // T1M = 0; SCA1:0 = 01
CKCON &= ~0x12;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x13; // T1M = 0; SCA1:0 = 00
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON |= 0x02; // T1M = 0; SCA1:0 = 10
CKCON &= ~0x11;
}
TL1 = 0xff; // 定時(shí)器1加1 TL1溢出 此時(shí)TH1中的重裝載值加載 //到TL1中
TMOD |= 0x20; //定時(shí)器1設(shè)置為8位自動(dòng)重裝載模式
TMOD &= ~0xD0;
TR1 = 1; //開啟定時(shí)器1
TI0 = 1; // 發(fā)送結(jié)束 此發(fā)送中斷位置1
}