困扰了我快一个学期的问题终于解决了……
原来之前的想法是错的,PCF8591是可以连续工作的,不需要进行延时……
PCF8591每读出一次,就会启动一次的转换,而转换的结果,在下次才能读出,所以需要调整顺序。

//读取湿度、光强
void Read_wet_light()
{
    Light=Read_PCF8591(0x03);   //0x01通道为光
    Wet=Read_PCF8591(0x01);        //0x03为湿度
    Wet=(Wet*5)/255;
}

下面是串口发送字符串、接受字符串以及字符串匹配的解决方案,但是数据在接受时每个两个字节就会丢一个字节,不知道为啥……

//串口初始化
void Uart_Init()
{
    TMOD|=0x20;
    TH1=0xe8;
    TL1=0xe8;
    TR1=1;
    
    AUXR=0x00;
    SCON=0x50;
    
    //EA=1;
    PS=1;
    ES=1;
}

//串口发送一个字节数据
void Uart_SendByte(uchar add)
{
    ES=0;
    SBUF=add;
    while(!TI);
    TI=0;
    ES=1;
}

//串口发送一组数据
void Uart_Send_string(uchar *str)
{
    ES=0;                        //关闭串口中断,防止发送数据时进入中断
    while((*str)!='\0')
    {
        Uart_SendByte(*str);
        str++;
        Choose_SMG_state();
    }
    ES=1;
}

//串口接受数据
bit Uart_Receive_String()
{
    uchar *ptr=Uart_dat;
    uchar i=0;
    uchar count=0;
    
    loop:
    RI=0;
    (*ptr)=SBUF;
    if(i<6)
    {
        i++;
        while(!RI)
        {
            count++;
            if(count>260)
                return 0;
        }
        ptr++;
        goto loop;
    }
    
    return 1;
}

//字符串比较 "AAASSS"
bit Compare_string()
{
    uchar i;
    for(i=0;i<6;i++)
    {
        if(Uart_dat[i]!=Start_string[i])
            return 0;
    }
    return 1;
}

//串口中断服务函数
void Uart_Service() interrupt 4
{
    uchar i;
    if(Uart_Receive_String())
    {
        if(Compare_string())
        {
            Working_flag=1;
            for(i=0;i<6;i++)
            {
                Uart_SendByte(Uart_dat[i]);
            }
        }
        else
            //Working_flag=0;
        RI=0;
    }
}

References:
https://blog.csdn.net/qq_26093511/article/details/52799563