近日在嘗試用軟件方式來實現STC15W408AS的自動燒寫,結果被戲弄了。開始按慣性思路,使用T1作為串口1波特率發生器,結果毫無動靜,檢查了源碼,沒有發現什么問題。后來查看了手冊,才發現這芯片沒有T1(其實以前使用過這芯片,知道沒有T1,只是時間太久給忘了)。后來根據手冊,使用T2作波特率發生器,并將波特率設置為2400,成功實現了軟件方式自動燒寫。
T2是一個16位自動重裝的定時器,只要設置一次初值即可。
具體的單片機程序如下:
sfr T2H=0xD6; // T2高八位
sfr T2L=0xD7; // T2代八位
sfr IE2=0xDF; //第2位為T2中斷允許位,只用串口通訊可以不用使用中斷
sfr AUXR=0x8E; //輔助寄存器
sfr IAP_CONTR = 0xc7; //IAP控制寄存器
uchar ge,ckval;
#define T2_temp_H 0xFF//2400bps
#define T2_temp_L 0xA0//
void main()
{
AUXR &= 0xFB; //定時器2時鐘為Fosc/12,即12T
AUXR |= 0x01; //選擇定時器2為波特率發生器
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數據,可變波特率
T2L=T2_temp_L; //T2為16位自動重裝定時器
T2H=T2_temp_H; //
AUXR |= 0x10; //啟動定時器2
ES=1; //打開串口中斷
PS=1; //串口中斷優先
EA=1; //打開總中斷
while(1)
{
//其他程序
if(ge>10)IAP_CONTR= 0x60; //重啟并自動下載
}
}
void UARTInterrupt( ) interrupt 4 //using 0
{
ckval=SBUF;//接收到的串口數據
RI=0;
if(ckval==0x7f) {ge++;}
}
|