cktamcu 发表于 2013-10-7 13:11:40

stc89c52中如何定时器做波特率发生器的问题


这个是说如果串口打开,定时器一打开,定时器一 的所有模式都可以做波特率发生模式吗,如果让定时器2做波特率发生器,定时器1做定时器该如何配置呢。哪个寄存器是配置哪个定时器做波特率发生器的,

中断为何不能打断?中断中一个长程序,为何中断打开后就一直运行,直到运行完,如何配置让它只在有中断脉冲的时候运行。

cxning 发表于 2013-10-7 13:32:56

LZ的问题一大堆又乱!

jj632856828 发表于 2013-10-7 14:07:22

建议楼主找点成熟的示例程序分析学习,效果很好

cktamcu 发表于 2013-10-7 17:04:21

cxning 发表于 2013-10-7 13:32 static/image/common/back.gif
LZ的问题一大堆又乱!

就是那个定时器的问题吧,当定时1,2同时开启的时候,如何配置,才可以区分波特率发生器和普通定时器

cxning 发表于 2013-10-7 21:54:09

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。

cktamcu 发表于 2013-10-8 00:01:30

cxning 发表于 2013-10-7 21:54 static/image/common/back.gif
PCON = 0x80;               
        SCON = 0x70;               
        TMOD = 0x21;            //TMOD = 0 ...

如果定时器一做了波特率发生器,定时器一的中断还会触发吗,打开串口必须打开串口中断吗,这个是定时器一的,如果定时器1和2同时运行,如何配置哪个是波特率发生器?

cxning 发表于 2013-10-8 08:10:55

cktamcu 发表于 2013-10-8 00:01 static/image/common/back.gif
如果定时器一做了波特率发生器,定时器一的中断还会触发吗,打开串口必须打开串口中断吗,这个是定时器一 ...

配成波特率发生器,不用打开定时器中断.定时器应该也不能进入中断,这我我没试过.
请查一下串口硬件图,能设置成波特率发生器的定时器会与串口相联,一般单片机同一串口已经定死一个定时器做波特率发生器,至于52是不是两个定时器都可以做同一串口发生器我就不知道了,若是,那它肯定有选择控制器,控制那个做波特率发生器.

zpxa001 发表于 2013-10-25 15:21:25

cktamcu 发表于 2013-10-8 00:01 static/image/common/back.gif
如果定时器一做了波特率发生器,定时器一的中断还会触发吗,打开串口必须打开串口中断吗,这个是定时器一 ...

对于89C52单片机,串口波特率可有三种来源:
一是定时器1:模式2(8位自动重装载),此时不能打开定时器1中断;
二是定时器2:波特率发生器模式;
定时器1或是定时器2做波特率发生器由T2CON寄存器的RCLK和TCLK位决定。
三是内部波特率发生器:由BDRCON的BRR位使能。

tsj1992 发表于 2013-11-1 19:33:19

#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:34:01

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

liampo 发表于 2013-11-1 20:17:43

我补充一点,51里的中断是不能嵌套的,只能等待一个中断完了,才可以进其他中断,所以中断里面不要进行费时间的操作,一般只设置一些标志和快速完成的操作,然后快速返回,这样才可以实时响应

宇宙浪子 发表于 2013-11-2 06:49:33

liampo 发表于 2013-11-1 20:17 static/image/common/back.gif
我补充一点,51里的中断是不能嵌套的,只能等待一个中断完了,才可以进其他中断,所以中断里面不要进行费时 ...

51里的中断有两个优先级,可以嵌套,只要管理好堆栈就行了

宇宙浪子 发表于 2013-11-2 07:15:00

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]
查看完整版本: stc89c52中如何定时器做波特率发生器的问题