串口发送和接受字符串,AD转换多通道读取

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值