/**********************接受脑电波数据********************************/
#include <SI_EFM8BB52_Register_Enums.h>
bit receive_ok=0; //接收数据完成标志
//串口中用到u8 receive[36]={0}; //接收缓存
void UartInit() //9600bps@11.0592MHz{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
ES = 1; //允许串口1中断
TR1 = 1; //启动定时器1 }
void main(){
variable_init();//外设初始化
UartInit();//串口初始化
EA=1; //打开CPU总中断开关
while(1)
{
if(receive_ok)
{
receive_ok = 0;
//处理你的代码
ES=1;//再次允许串口中断
}
}}
//串口中断服务程序void UART_Rountine() interrupt 4{
static u8 count;//串口接收计数的变量
if(RI)
{
RI=0;
receive[count]=SBUF;
if(count==0&&receive[count]==0xAA) //同步信号
{ count++; }
else if(count==1&&receive[count]==0xAA) //同步信号
{
count++; }
else if(count==2&&receive[count]==0x20) //十进制32,表示后面要接收32个字节数据
{ count++; } else if(count==3&&receive[count]==0x02) //代表信号标识,下一个数据即为信号值数据
{ count++; } else if(count==4) //信号值
{ count++;
}
else if(count==5&&receive[count]==0x83) //代表EEG信号开始了
{ count++;
}
else if(count==6&&receive[count]==0x18) //十进制24,代表EEG Power是由24个字节组成的
{ count++;
}
else if (count >=7 && count < 35)
{
count++; //一直加到receive[35]
} else if(count==35)//最后一个数据,判断校验和,数据多的话是求和
{ count=0; //计数清0
receive_ok =1;//串口接收完成标志,在主程序中判断,并做处理,然后清0
ES=0; //暂时关中断,数据处理完毕后再ES=1;
} else//以上有任何一个条件不满足,将技术清0
{
count=0;//判断不满足条件就将计数值清零
}
}
}