QT上位机+STC单片机实现串口通信

 

 

要实现串口通信主要分为两个部分,下位机和上位机,下位机主要完成的功能是数据的生成和发送,上位机主要需要将传送来得数据进行存储和处理,这里分为这两部分分别来说

下位机

我这里要实现的功能是通过使用光敏传感器和热敏传感器完成对声、光的A/D采集,并且把这些数据封装成数据包发送到上位机上。

数据采集

寄存器初始设置

    P0M0 = 0xff;
	P0M1 = 0x00;
	P2M0 = 0x08;
	P2M1 = 0x00;
	SEL0 = 0;
	SEL1 = 0;
	SEL2 = 0;
void ADC_LightInit()
{
	P1ASF = 0xff;
	ADC_RES = 0;
	ADC_RESL = 0;
	ADC_CONTR = 0x8c;
	CLK_DIV = 0x20;
}

/*ADCTemp???*/
void ADC_TempInit()
{
	P1ASF = 0xff;
	ADC_RES = 0;
	ADC_RESL = 0;
	ADC_CONTR = 0x8b;
	CLK_DIV = 0x20;
}

注意到这里的温度和光照的ADC_CONTR设置是不同的,因为这两个AD采集需要不同的通道,所以选用的时候会将不同的寄存器值置为1,比如这里分别选择了P1^3和P1^4作为AD转换的通道

采集过程

void ADC_pcs() interrupt 5
{
	time++;
	if(time==2000)
	{
		time = 0;
		if(flag==1)
		{
			/*?*/
			light = (suml+l/2)/l;
			l=0;
		}
		if(flag==-1)
		{
			/*??*/
			temp = (sumt+t/2)/t;
			t = 0;
		}
	}
	if(flag==1)
	{
		l++;
		datal = ADC_RES*256+ADC_RESL;
		suml += datal;
	}
	if(flag==-1)
	{
		t++;
		datat = ADC_RES*256+ADC_RESL;
		sumt += datat;
	}
	ADC_CONTR&=~0X10;  					 //?????,ADC_FLAG??
	ADC_CONTR|=0X08;	 					 //?????,ADC_START?1
	IE = 0xb2;
}

这里使用了一个flag,每次根据这个flag来判断我们这次采集的是光照还是温度,这个值的改变是在定时器中断中完成的,同时也会重新调用上面的两个初始函数中的一个,完成AD通道的切换。这里使用了l和t来分别计算数据采集的次数并且取平均值,减小数据的波动。最后对寄存器的置一或者清零可以参考数据手册上对于每个值的解释:

  • 3
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值