困扰了我快一个学期的问题终于解决了……
原来之前的想法是错的,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