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

2019-07-15 09:05发布

#include        <stc15f2k60s2.h>
#include <intrins.h>

#define         NOP()        _nop_()

//74HC595 IO
sbit        HC595_SI  = P1^2;       
sbit        HC595_RCK = P1^3;
sbit        HC595_SCK = P1^4;
sbit        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<<i)&0x8000) HC595_SI = 1;
                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;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
bobo2021
1楼-- · 2019-07-16 04:10
人中狼 发表于 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
2楼-- · 2019-07-16 09:16
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中断
}
人中狼
3楼-- · 2019-07-16 12:26
你需要好好看看这款芯片的资料,没用过这个芯片,不过你们的程序里T2不象是当定时器用,似乎是做了串口2的定时器,程序里的注释看不到,所以应该是寄存器设置的问题
891888976
4楼-- · 2019-07-16 16:25
有时候这种细微的过程是很容易被人忽略的。
bobo2021
5楼-- · 2019-07-16 20:48
 精彩回答 2  元偷偷看……
xuxia
6楼-- · 2019-07-16 21:46
bobo2021 发表于 2017-12-29 08:10
用串口就会用到定时器,用来产生波特率的。T1

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

一周热门 更多>