P89LPC952的亮点之一是有2个串口。最近我在试验第一个串口UART0很顺利地通过了。但在试验第二个串口UART1时间很不顺利。网上搜索发现也有人无法使UART1正常工作。经过对952进行模拟调试,发现NXP公司的数据手册中UART1的控制寄存器S1CON的地址和PCONA地址相同都是0B5H,而S1CON的正确地址是0B6H,改正之后UART1即可正常工作。另外要注意S1CON的各位不能位寻址,这和S0CON不同。下面是通过UART1发送一组数据的小程序,下载到952能够正确运行。<br />$NOMOD51<br />$INCLUDE (REG952.INC)<br /> RCOUNT EQU 40H<br /> ADDR EQU 41H<br /> T_BUFF EQU 70H<br /> RCV_FLAG BIT 01H<br /> LEDCON BIT P1.6<br /> ORG 0000H<br /> AJMP MAIN<br /> ORG 0023H<br /> ;LJMP SVC_SCI ; 接收中断入口<br /><br /> ORG 0100H<br />;*****************************************************<br />MAIN: MOV R7,#20H<br /> DJNZ R7,$<br /> MOV P1M1,#00H <br /> MOV P1M2,#40H<br /> MOV DPTR,#P4M1<br /> MOV A,#00H<br /> MOVX @DPTR,A<br /> MOV DPTR,#P4M2<br /> MOV A,#00H<br /> MOVX @DPTR,A;设置P4.2(TXD1),P4.3(RXD1)为准双向口<br /> MOV P4,#0FFH<br /> CLR LEDCON<br /> LCALL D1S<br /> SETB LEDCON<br /> MOV S1CON,#50H;设置串口为工作方式1,允许串口接收 MOV DPTR,#BRGCON_1 ;设置串口波特率:Fosc / ((BRGR1,BRGR0)+16)<br /> MOV A,#00H<br /> MOVX @DPTR,A ;关波特率发生器<br /> MOV DPTR,#BRG1_1<br /> MOV A,#02H<br /> MOVX @DPTR,A ;内部RC振荡器,波特率9600<br /> MOV DPTR,#BRG0_1<br /> MOV A,#0E0H<br /> MOVX @DPTR,A <br /> MOV DPTR,#BRGCON_1<br /> MOV A,#03H<br /> MOVX @DPTR,A ;打开串口波特率发生器,使用串口波特率发生器<br /> MOV IEN2,#00H ; 禁止UART1接收中断<br /> MOV ADDR,#60H<br /> MOV RCOUNT,#0DH<br /> LCALL TRANSA<br /> SJMP $<br />TRANSA: <br /> MOV T_BUFF,#01H<br /> MOV T_BUFF+1,#04H<br /> MOV T_BUFF+2,#00H<br /> MOV T_BUFF+3,#00H<br /> MOV T_BUFF+4,#00H<br /> MOV T_BUFF+5,#00H<br /> MOV T_BUFF+6,#0F0H<br /> MOV T_BUFF+7,#0AH ;发送数据子程序010400000000F00A<br /> MOV R3,#08H<br /> MOV R0,#T_BUFF<br />TRANSA1: MOV A,@R0<br /> MOV DPTR,#S1BUF<br /> MOVX @DPTR,A<br />WAITHA: MOV A,S1CON<br /> JNB ACC.1,WAITHA ;取TI_1位,判断是否为1<br /> ANL S1CON,#0FDH ;TI_1=1,则该位清零(S1CON不能位寻址)<br /> INC R0<br /> DJNZ R3,TRANSA1<br /> MOV RCOUNT,#0DH<br /> MOV ADDR,#60H<br /> MOV S1CON,#50H<br /> MOV IEN2,#04H ;开放UART1接收中断<br /> SETB EA ;开放总中断,等待接收测量数据<br /> RET<br /><br />上面是我的试验程序的发送程序片段,供还在走弯路的朋友参考。另外请周立功公司应该立即更正数据手册。952的初始化程序REG952.INC我在周立功网的论坛上发过,只要把其中的S1CON的地址改为0B6H即可。
|