void init0()
{
CLKCON = 0x00; //时钟设置
RCAP2H=0xFF; //9600
RCAP2L=0xCC;
TH2=0xFF;
TL2=0xCC;
T2CON=0x34; //定时器2产生接收和发送波特率,开启定时器,工作在定时器方式,自动重装载
SCON=0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI
//工作在方式1(8位异步方式,可变波特率),允许接收,清0发送接收标志位
ES0 = 1; //打开串口中断 有时为 ES=1;
EA = 1; //开启总中断
}
这个是官方串口0例程的设置,用16M时钟算是对的,实际用电脑测试是不对的,但用逻辑分析仪测数据又是对的。后面用16.6M时钟算,RCAP2L=0xCa;TL2=0xCa;后,电脑测试是才对。
同样的串口1用例程的设置,用16M时钟算是对的,加了232IC转换,电脑测试数据是对的。
void init()
{
CLKCON = 0x00; //时钟设置 系统时钟=晶振频率 Fsys=16MHz
SADDR1 = 0x55; //多机通讯时的从机地址设置=0x55
SADEN1 = 0xFF; //从机地址屏蔽设置
SCON1 = 0x50; //工作在方式3 0xF0 ,多机通讯模式
SBRT1 = 0xFF; //工作在方式1,3时,BAUDRATE=(1/16)*Fsys/(32768-SBRT[1:0]) Fsys=16MHz
SBRT0 = 0x98; //BAUDRATE=9600时, SBRT[1:0]=0x7F98, SBRT1.7=1 --> SBRT1=0xFF, SBRT0 = 0x98;
IEN1 = 0x04; //ES1=1,不可位寻址
EA = 1; //开启总中断
}
目前两个串口用官方例程时,串口0用16.6M时钟去算才对,而串口1是用16M去算的。有点郁闷。 |