stc89c52中如何定时器做波特率发生器的问题
这个是说如果串口打开,定时器一打开,定时器一 的所有模式都可以做波特率发生模式吗,如果让定时器2做波特率发生器,定时器1做定时器该如何配置呢。哪个寄存器是配置哪个定时器做波特率发生器的,
中断为何不能打断?中断中一个长程序,为何中断打开后就一直运行,直到运行完,如何配置让它只在有中断脉冲的时候运行。 LZ的问题一大堆又乱! 建议楼主找点成熟的示例程序分析学习,效果很好 cxning 发表于 2013-10-7 13:32 static/image/common/back.gif
LZ的问题一大堆又乱!
就是那个定时器的问题吧,当定时1,2同时开启的时候,如何配置,才可以区分波特率发生器和普通定时器 cktamcu 发表于 2013-10-7 17:04 static/image/common/back.gif
就是那个定时器的问题吧,当定时1,2同时开启的时候,如何配置,才可以区分波特率发生器和普通定时器 ...
PCON = 0x80;
SCON = 0x70;
TMOD = 0x21; //TMOD = 0x22;
TH1= BAUD_9600;
TL1= TH1;
TR1= TRUE; // 波特率发生器
ES = TRUE;
EA = TRUE;
这是用T1的,不知道T2能不能设置COM0的波特率,一般51只有T0和T1,没T2。 cxning 发表于 2013-10-7 21:54 static/image/common/back.gif
PCON = 0x80;
SCON = 0x70;
TMOD = 0x21; //TMOD = 0 ...
如果定时器一做了波特率发生器,定时器一的中断还会触发吗,打开串口必须打开串口中断吗,这个是定时器一的,如果定时器1和2同时运行,如何配置哪个是波特率发生器? cktamcu 发表于 2013-10-8 00:01 static/image/common/back.gif
如果定时器一做了波特率发生器,定时器一的中断还会触发吗,打开串口必须打开串口中断吗,这个是定时器一 ...
配成波特率发生器,不用打开定时器中断.定时器应该也不能进入中断,这我我没试过.
请查一下串口硬件图,能设置成波特率发生器的定时器会与串口相联,一般单片机同一串口已经定死一个定时器做波特率发生器,至于52是不是两个定时器都可以做同一串口发生器我就不知道了,若是,那它肯定有选择控制器,控制那个做波特率发生器. cktamcu 发表于 2013-10-8 00:01 static/image/common/back.gif
如果定时器一做了波特率发生器,定时器一的中断还会触发吗,打开串口必须打开串口中断吗,这个是定时器一 ...
对于89C52单片机,串口波特率可有三种来源:
一是定时器1:模式2(8位自动重装载),此时不能打开定时器1中断;
二是定时器2:波特率发生器模式;
定时器1或是定时器2做波特率发生器由T2CON寄存器的RCLK和TCLK位决定。
三是内部波特率发生器:由BDRCON的BRR位使能。 #include <reg51.h>
//晶振11.0592M定时器T1 方式29600bps 允许接收启用串口中断
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void main(void)
{
InitUART();
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
//add your code here!
}
else
TI = 0;
}
tsj1992 发表于 2013-11-1 19:33 static/image/common/back.gif
#include
//晶振11.0592M定时器T1 方式29600bps 允许接收启用串口中断
void InitUART(void)
ORG 0000H
LJMP START
ORG 0023H
LJMP UARTInterrupt
START:
MOV SP,#60H
LCALL InitUART
LOOP:
;add your code here!
LJMP LOOP
InitUART:
MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0FDH
MOV TL1,TH1
MOV PCON,#00H
SETB EA
SETB ES
SETB TR1
RET
UARTInterrupt:
JB RI,IsUART_Receive
CLR TI
RETI
IsUART_Receive:
CLR RI
PUSH ACC
MOV A,SBUF
;========================
;add your code here!
;========================
POP ACC
RETI
SendOneByte:
CLR ES
CLR TI
MOV SBUF,A
WaitSendFinish:
JNB TI,WaitSendFinish
CLR TI
SETB ES
RET
END
我补充一点,51里的中断是不能嵌套的,只能等待一个中断完了,才可以进其他中断,所以中断里面不要进行费时间的操作,一般只设置一些标志和快速完成的操作,然后快速返回,这样才可以实时响应 liampo 发表于 2013-11-1 20:17 static/image/common/back.gif
我补充一点,51里的中断是不能嵌套的,只能等待一个中断完了,才可以进其他中断,所以中断里面不要进行费时 ...
51里的中断有两个优先级,可以嵌套,只要管理好堆栈就行了 1."这个是说如果串口打开,定时器一打开,定时器一 的所有模式都可以做波特率发生模式吗,"
这个问题8楼回答的已经很清楚了
2.如果让定时器2做波特率发生器,定时器1做定时器该如何配置呢。哪个寄存器是配置哪个定时器做波特率发生器的,
给楼主一个寄存器说明的PDF,还有89S52的数据手册里面有如何定时器2做波特率发生器的寄存器(89S51就没有这功能,不过STC89C52应该有)
定时器2做波特率发生器附上例程
T2CON DATA 0C8H
RCAP2LDATA 0CAH
RCAP2HDATA 0CBH
TL2 DATA 0CCH
TH2 DATA 0CDH
TF2 BIT 0CFH
EXF2 BIT 0CEH
RCLK BIT 0CDH
TCLK BIT 0CCH
EXEN2 BIT 0CBH
TR2 BIT 0CAH
C_T2 BIT 0C9H
CP_RL2BIT 0C8H
ORG 0000H
LJMP MAIN
ORG 0200H
MAIN: MOV SCON,#50H ;串口的工作方式,设置为方式2
MOV TH2,#0FFH ;115200波特率的初值,板子使用11.0592M晶振
MOV TL2,#0FDH ;
MOV RCAP2H,#0FFH;
MOV RCAP2L,#0FDH;
SETB TCLK
SETB RCLK
CLR C_T2
CLR EXEN2
SETB TR2 ;启动波特率发生
…………………………………以下省略……………………………………………………………
3.中断为何不能打断?中断中一个长程序,为何中断打开后就一直运行,直到运行完,如何配置让它只在有中断脉冲的时候运行。
高优先级中断可以打断低优先级中断寄存器IP设置中断优先级,你所说断的脉冲是上升沿或者下降沿中断,TCON寄存器设置触发方式,51支持低电平或者下降沿
最后补充一点儿,按照例程自己调试一下就明白了,这个实践型很强
页:
[1]