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

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条回答
xuxia
1楼-- · 2019-07-15 14:21
 精彩回答 2  元偷偷看……
勇哥-lzu
2楼-- · 2019-07-15 16:46
只要使能串口就需要对应的定时器
bobo2021
3楼-- · 2019-07-15 22:03
人中狼 发表于 2017-12-27 11:39
串口使用的定时器是不能再做其他用途使用的,如果还需要使用定时器,就需要开启其他的定时器

串口1用的是定时器1,而我写的是定时器0,应该不冲突才对。
bobo2021
4楼-- · 2019-07-15 22:10
xuxia 发表于 2017-12-27 17:21
菜鸟想问一下,串口什么情况下要用定时器呢?

用串口就会用到定时器,用来产生波特率的。T1
bobo2021
5楼-- · 2019-07-16 00:10
人中狼 发表于 2017-12-27 10:47
AUXR |= 0X80;                //¶¨Ê±Æ÷0¹¤×÷ÔÚ1T
        TMOD &= 0XF0;                //É趨¶¨Ê±Æ÷1Ϊ16λ×Ô¶¯ÖØ×°·½Ê½
        TH0 = 0XF8;                        //¶¨Ê±100΢Ãë

谢谢了,就是这个问题。
bobo2021
6楼-- · 2019-07-16 02:01
 精彩回答 2  元偷偷看……

一周热门 更多>