单片机/MCU论坛
直播中

bobo2021

10年用户 72经验值
擅长:控制/MCU
私信 关注
[问答]

串口接收到数据后,定时器工作不正常,求指导。

#include       
#include

#define         NOP()        _nop_()

//74HC595 IO
***it        HC595_SI  = P1^2;       
***it        HC595_RCK = P1^3;
***it        HC595_SCK = P1^4;
***it        HC595_OE  = P0^0;                //¿ØÖÆ595Ëø´æÆ÷ʹÄܶˣ¬´Ó¶øʵÏÖÄ¿±êÇ°½ø£¬µ«µÆ²»ÁÁµÄ״̬

void Delay1ms(void);
void Delay_ms(unsigned int i);
void HC595SendData(unsigned int Val);       
void Uart_Service(void);
void Uartinit(void);

unsigned int Fly_Val = 0xfffe;                //595³õÖµ
unsigned char Flag_Time0  = 1;                //¶¨Ê±Æ÷0ÑÓʱµ½Î»ºó±êÖ¾±äÁ¿
unsigned char Blink_Times = 0;                //ÉÁ˸´ÎÊý
unsigned int  Delay_Time  = 0;                //¶¨Ê±Æ÷0ÑÓʱÀÛ¼Ó±äÁ¿
unsigned int  COM = 0;                                           //Êý¾ÝºÏ³ÉÓñäÁ¿
unsigned char Uart_Command[7] = {0};        //
unsigned char Uart_Long = 0;                                        //

void main()
{
        UartInit();
        HC595_OE = 0;
        HC595SendData(0x5555);
        Delay_ms(1000);
        HC595SendData(0xaaaa);
       
        while(1)
        {
                if(0 == Flag_Time0)
                {
                        Flag_Time0 = 1;
                        HC595SendData(Fly_Val);
//                        Fly_Val = Fly_Val;
//                        COM = COM*2+1;
                        Fly_Val = (Fly_Val << 1) | (COM*2 + 1);
                }
                Uart_Service();
        }
}
void Uart_Service(void)
{
        if(Uart_Long == 7)
        {
                if((0xaa==Uart_Command[0])&&(0xf1==Uart_Command[1])&&(0xeb==Uart_Command[6]))
                {
                        TR0 = 0;
                }
                if((0xaa==Uart_Command[0])&&(0xf2==Uart_Command[1])&&(0xeb==Uart_Command[6]))
                {
                        TR0 = 1;
                }
                Uart_Long = 0;
               
        }
}
void Ser_int(void) interrupt 4
{

        ES = 0;
        if (RI)
        {
                RI = 0;                 //Çå³ýRIλ
                Uart_Command[Uart_Long++] = SBUF;
                SBUF = Uart_Command[Uart_Long-1];
                while(TI==1)
                {
                        TI = 0;
                }
        }
        ES =  1;
}
void Time0_int(void) interrupt 1
{
        TF0 = 0;
        TR0 = 0;
        Delay_Time ++;
        if(175 == Delay_Time)
        {
                Flag_Time0 = 0;
                Delay_Time = 0;
                Blink_Times ++;
        }
        if(Blink_Times == 16)
        {
                Blink_Times = 0;
                Fly_Val = 0xfffe;
                COM = 0;
        }
        TR0 = 1;
}

void Delay1ms()                //@18.432MHz
{
        unsigned char i, j;

        i = 18;
        j = 235;
        do
        {
                while (--j);
        } while (--i);
}
void Delay_ms(unsigned int i)
{
        while(i--)
        {
                Delay1ms();
        }
}
void HC595SendData(unsigned int Val)
{
        unsigned char i;
        for(i=0;i<16;i++)
        {
                if((Val<                 else HC595_SI = 0;
                HC595_SCK=0;
                NOP();
                NOP();
                HC595_SCK= 1;
        }
        HC595_RCK = 0;
        NOP();
        NOP();
        HC595_RCK = 1;
}
void UartInit(void)                //9600bps@18.432MHz
{
        SCON  = 0x50;                //UART1:8λÊý¾Ý,¿É±ä²¨ÌØÂÊ
        AUXR |= 0x40;                //¶¨Ê±Æ÷1ʱÖÓΪFosc,¼´1T
        AUXR &= 0xFE;                //´®¿Ú1Ñ¡Ôñ¶¨Ê±Æ÷1Ϊ²¨ÌØÂÊ·¢ÉúÆ÷
        TMOD &= 0x0F;                //É趨¶¨Ê±Æ÷1Ϊ16λ×Ô¶¯ÖØ×°·½Ê½
        TL1 = 0x20;                   //É趨¶¨Ê±³õÖµ
        TH1 = 0xFE;                        //É趨¶¨Ê±Æ÷ÖØ×°Öµ
        ET1 = 0;                                //½ûÖ¹¶¨Ê±Æ÷1ÖжÏ
        TR1 = 1;                                //Æô¶¯¶¨Ê±Æ÷1

        S2CON = 0x50;                //UART2:8λÊý¾Ý,¿É±ä²¨ÌØÂÊ
        AUXR |= 0x04;                //¶¨Ê±Æ÷2ʱÖÓΪFosc,¼´1T
        T2L = 0x20;                   //É趨¶¨Ê±³õÖµ
        T2H = 0xFE;                        //É趨¶¨Ê±³õÖµ
        AUXR |= 0x10;                //Æô¶¯¶¨Ê±Æ÷2
       
        AUXR |= 0X80;                //¶¨Ê±Æ÷0¹¤×÷ÔÚ1T
        TMOD &= 0XF0;                //É趨¶¨Ê±Æ÷1Ϊ16λ×Ô¶¯ÖØ×°·½Ê½
        TH0 = 0XF8;                        //¶¨Ê±100΢Ãë
        TL0 = 0XCD;                        //¶¨Ê±100΢Ãë
        ET1 = 1;
        TF0 = 0;                                //Çå³ýTF0±êÖ¾
        TR0 = 1;
       
        IE = 0X82;                        //¿ªÆôÖжÏ
        EA = 1;
        ES = 1;
}


回帖(15)

人中狼

2017-12-27 10:47:09
AUXR |= 0X80;                //¶¨Ê±Æ÷0¹¤×÷ÔÚ1T
        TMOD &= 0XF0;                //É趨¶¨Ê±Æ÷1Ϊ16λ×Ô¶¯ÖØ×°·½Ê½
        TH0 = 0XF8;                        //¶¨Ê±100΢Ãë
        TL0 = 0XCD;                        //¶¨Ê±100΢Ãë
        ET1 = 1;
        TF0 = 0;                                //Çå³ýTF0±êÖ¾
        TR0 = 1;
红色字体部分应该是ET0=1;吧
举报

人中狼

2017-12-27 11:39:35
串口使用的定时器是不能再做其他用途使用的,如果还需要使用定时器,就需要开启其他的定时器
举报

闫旭霞

2017-12-27 17:21:51
引用: 人中狼 发表于 2017-12-27 11:39
串口使用的定时器是不能再做其他用途使用的,如果还需要使用定时器,就需要开启其他的定时器

菜鸟想问一下,串口什么情况下要用定时器呢?
举报

勇哥-lzu

2017-12-28 09:10:38
只要使能串口就需要对应的定时器
举报

bobo2021

2017-12-29 08:08:37
引用: 人中狼 发表于 2017-12-27 11:39
串口使用的定时器是不能再做其他用途使用的,如果还需要使用定时器,就需要开启其他的定时器

串口1用的是定时器1,而我写的是定时器0,应该不冲突才对。
举报

bobo2021

2017-12-29 08:10:12
引用: xuxia 发表于 2017-12-27 17:21
菜鸟想问一下,串口什么情况下要用定时器呢?

用串口就会用到定时器,用来产生波特率的。T1
举报

bobo2021

2017-12-29 08:26:02
引用: 人中狼 发表于 2017-12-27 10:47
AUXR |= 0X80;                //¶¨Ê±Æ÷0¹¤×÷ÔÚ1T
        TMOD &= 0XF0;                //É趨¶¨Ê±Æ÷1Ϊ16λ×Ô¶¯ÖØ×°·½Ê½
        TH0 = 0XF8;                        //¶¨Ê±100΢Ãë

谢谢了,就是这个问题。
举报

bobo2021

2017-12-31 20:16:02
引用: xuxia 发表于 2017-12-27 17:21
菜鸟想问一下,串口什么情况下要用定时器呢?

只要使用串口就会设置一个对应的定时器产生波特率
举报

bobo2021

2017-12-31 20:19:47
引用: 人中狼 发表于 2017-12-27 10:47
AUXR |= 0X80;                //¶¨Ê±Æ÷0¹¤×÷ÔÚ1T
        TMOD &= 0XF0;                //É趨¶¨Ê±Æ÷1Ϊ16λ×Ô¶¯ÖØ×°·½Ê½
        TH0 = 0XF8;                        //¶¨Ê±100΢Ãë

再请教一下,我在初始化里又加了定时器2,但是结果是直接串口1不工作了。
        AUXR |= 0x04;                //1T
        T2L = 0x00;               //初值
        T2H = 0xB8;                //
        IE2 |= 0x04;                //允许T2中断
        AUXR |= 0x10;                //启动T2
举报

bobo2021

2017-12-31 20:23:04
引用: bobo2021 发表于 2017-12-31 20:19
再请教一下,我在初始化里又加了定时器2,但是结果是直接串口1不工作了。
        AUXR |= 0x04;                //1T
        T2L = 0x00;               //初值

void Time2_int (void) interrupt 12
{
        unsigned int i;
        AUXR &= 0xEF;                //停止T2
        Delay_Time2++;
        if(Delay_Time2==3000)
        {
                for(i=0;i<7;i++)
                {
                        SendData(Uart1_Command);
                }
        }
        AUXR |= 0x10;          //启动T2
        IE2  &= 0xFB;                //禁止T2中断
}
举报

人中狼

2017-12-31 22:22:37
你需要好好看看这款芯片的资料,没用过这个芯片,不过你们的程序里T2不象是当定时器用,似乎是做了串口2的定时器,程序里的注释看不到,所以应该是寄存器设置的问题
举报

梁端浪

2018-1-1 19:58:17
有时候这种细微的过程是很容易被人忽略的。
举报

bobo2021

2018-1-1 21:16:04
引用: bobo2021 发表于 2017-12-31 20:19
再请教一下,我在初始化里又加了定时器2,但是结果是直接串口1不工作了。
        AUXR |= 0x04;                //1T
        T2L = 0x00;               //初值

我发现自已搞错了,STC15的串口2用的是T2做发生器,所以又用来做定时器,冲突了。多有打扰,抱欠。
举报

闫旭霞

2018-1-2 09:26:43
引用: bobo2021 发表于 2017-12-29 08:10
用串口就会用到定时器,用来产生波特率的。T1

波特率不是由波特率发生器产生的吗?不是直接选取时钟源吗?还是只有51单片机需要用定时器产生波特率?
举报

bobo2021

2018-4-23 16:58:27
引用: xuxia 发表于 2018-1-2 09:26
波特率不是由波特率发生器产生的吗?不是直接选取时钟源吗?还是只有51单片机需要用定时器产生波特率?

51单片机都是要用定时器的。
举报

更多回帖

×
20
完善资料,
赚取积分