要实现串口通信主要分为两个部分,下位机和上位机,下位机主要完成的功能是数据的生成和发送,上位机主要需要将传送来得数据进行存储和处理,这里分为这两部分分别来说
下位机
我这里要实现的功能是通过使用光敏传感器和热敏传感器完成对声、光的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来分别计算数据采集的次数并且取平均值,减小数据的波动。最后对寄存器的置一或者清零可以参考数据手册上对于每个值的解释: