近日在尝试用软件方式来实现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++;}
}
|