标题:
没有T1的STC15W408AS,只能用定时器T2作波特率发生器来实现自动烧写
[打印本页]
作者:
lmn2005
时间:
2021-11-4 09:29
标题:
没有T1的STC15W408AS,只能用定时器T2作波特率发生器来实现自动烧写
近日在尝试用软件方式来实现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++;}
}
作者:
heicad
时间:
2021-11-5 05:48
好资料,51黑有你更精彩!!!
作者:
perseverance51
时间:
2021-11-7 15:08
测试了并没有实现所描述的免冷启动,软件复位自动下载功能。
作者:
188610329
时间:
2021-11-7 16:42
perseverance51 发表于 2021-11-7 15:08
测试了并没有实现所描述的免冷启动,软件复位自动下载功能。
他这个,波特率必须 2400, 就是说你ISP上面,下载波特率 最高,最低,都必须2400(当然,单片机也要设置2400波特率),不然,是不可能收到连续10次 0x7F的。
所以,用起来是比较麻烦的,相比起来,如果调试过程中不需要用到串口(其实看他波特率2400应该也没有用到串口),那么,直接开INT4中断,然后如果要防止误触,INT4可以设置成需要累加10次,超过10次就 IAP_CONTR = 0x60; 会更简单省力,因为对波特率完全没有要求。
作者:
lmn2005
时间:
2021-11-8 06:58
是的,我的程序没有用到串口,所以将其设置为2400的波特率用来实现自动烧写,平时使用,串口一般都设置为9600。
作者:
zmc419
时间:
2021-12-6 21:13
很好,自动下载,做成个头文件更好。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1