#include "bsp.h"
#define Rx_Read PC_IDR_IDR5
unsigned char Uart3RxBuf[32];
unsigned char Uart3TxBuf[7];
unsigned char UART3_RxStep=0;
//unsigned char UART3_RxStart=0;
unsigned char UART3_RxOK=0;
//unsigned int PM25Data_[PM25Data_Div];
unsigned int PM25Data;
unsigned int PM1Data;
unsigned int PM10Data;
unsigned char GR_PM = 0;
//unsigned int temp_pm;
/*******************************************************************************
**函数名称:void UART3_Init(unsigned int baudrate)
**功能描述:初始化USART模块
**入口参数:unsigned int baudrate -> 设置串口波特率
**输出:无
*******************************************************************************/
void UART3_Init(unsigned int baudrate)
{
#ifdef Use_Simulate_UART3
TIM2_PSCR = 0X03;
TIM2_ARRH = (uint8_t)(2200>>8);
TIM2_ARRL = (uint8_t)(2200);
TIM2_EGR = (uint8_t)0X01;
TIM2_CR1 |= (uint8_t)0X80;
TIM2_IER |= (uint8_t)0X01;
// TIM2_CR1 |= (uint8_t)0X01;
PC_DDR_DDR5 = 0;
PC_CR1_C15 = 1;
PC_CR2_C25 = 1;
EXTI_CR1_PCIS = 3;
#else
unsigned int baud; //
if(baudrate == 9600) //先写BRR2 , 再写BRR1
{
UART3_BRR2 = 0X03; //9600bps @16M
UART3_BRR1 = 0x68; //9600bps @16M
}
else
{
baud = 16000000 / baudrate; //设定串口相应波特率与串口时钟的分频数
UART3_BRR2 = ((unsigned char)((baud & 0xf000) >> 8 )) |
((unsigned char)(baud & 0x000f)); //先写波特比率的高4位与低4位
UART3_BRR1 = ((unsigned char)((baud & 0x0ff0) >> 4)); //后写波特比率的中间8位
}
UART3_CR1_bit.UARTD = 0; //使能UART0
UART3_CR2_bit.RIEN = 1; //使能中断接收
UART3_CR2_bit.TEN = 1; //使能发送
UART3_CR2_bit.REN = 1; //接收使能
#endif
}
/*PM2.5指数 等级 注意事项
0-50 1级 优 参加户外活动呼吸清新空气
50-100 2级 良 可以正常进行室外活动
101-150 3级 轻度 敏感人群减少体力消耗大的户外活动
151-200 4级 中度 对敏感人群影响较大
201-300 5级 重度 所有人应适当减少室外活动
>300 6级 严重 尽量不要留在室外*/
void GetUART3Data()
{
if(UART3_RxOK == 1)
{
UART3_RxOK = 2;
/******************等级评定*****************/
if(PM25Data < PM_GradeYou)
GR_PM = 1;
else if((PM25Data >= PM_GradeYou) && (PM25Data < PM_GradeLiang))
GR_PM = 2;
else if((PM25Data >= PM_GradeLiang) && (PM25Data < PM_GradeQing))
GR_PM = 3;
else if((PM25Data >= PM_GradeQing) && (PM25Data < PM_GradeZhong1))
GR_PM = 4;
else if((PM25Data >= PM_GradeZhong1) && (PM25Data < PM_GradeZhong2))
GR_PM = 5;
else if(PM25Data >= PM_GradeZhong2)
GR_PM = 6;
}
}
static void Sort(unsigned int array[],u8 n)
{
u8 i,j,k;
u16 t;
for(i=0;i<n-1;i++)
{
k = i;
for(j=i+1;j<n;j++)
if(array[j]<array[k])
k = j;
t = array[k];
array[k] = array[i];
array[i] = t;
}
}
unsigned int Get_AverageData(unsigned int GetFrequency[],u8 n)
{
u8 i;
u32 temp=0;
Sort(GetFrequency,n);
for(i=5;i<(n-5);i++)
temp += GetFrequency[i];
temp /= (n - 10);
return temp;
}
#ifndef Use_Simulate_UART3
#pragma vector = 0x17 /**USART3接收字符中断服务函数*/
__interrupt void UART3_RX_RXNE(void)
{
static unsigned int Sum;
if(UART3_RxStep == 0) //一帧数据的开始
{
Uart3RxBuf[0] = UART3_DR;
if(Uart3RxBuf[0] == 0X42)
{
UART3_RxStep = 1;
Sum = 0;
}
}
else if(UART3_RxStep == 1) //
{
Uart3RxBuf[1] = UART3_DR;
if(Uart3RxBuf[1] == 0X4D)
{
UART3_RxStep = 2;
Sum = 0x8f;
}
else
UART3_RxStep = 0;
}
else
{
Uart3RxBuf[UART3_RxStep] = UART3_DR;
if(UART3_RxStep < 30)
Sum += Uart3RxBuf[UART3_RxStep];
UART3_RxStep++;
if(UART3_RxStep >= 32)
{
if(Sum == ((u16)Uart3RxBuf[30]*256 + (u16)Uart3RxBuf[31]))
{
UART3_RxOK = 1;
PM1Data = (u16)Uart3RxBuf[10]*256 + (u16)Uart3RxBuf[11];
PM25Data = (u16)Uart3RxBuf[12]*256 + (u16)Uart3RxBuf[13];
PM10Data = (u16)Uart3RxBuf[14]*256 + (u16)Uart3RxBuf[15];
Uart3RxBuf[4] = TVOC_Data / 256;
Uart3RxBuf[5] = TVOC_Data % 256;
Uart3RxBuf[6] = Temperature / 256;
Uart3RxBuf[7] = Temperature % 256;
Uart3RxBuf[8] = Humidity / 256;
Uart3RxBuf[9] = Humidity % 256;
Uart3RxBuf[16] = CO2_Result / 256;
Uart3RxBuf[17] = CO2_Result % 256;
Uart3RxBuf[18] = HCHO_Average / 256;
Uart3RxBuf[19] = HCHO_Average % 256;
}
UART3_RxStep = 0; //接收指针控制
// UART3_RxStart = 0; //接收复位90ms
}
}
UART3_SR_RXNE = 0; //清除中断标志
}
#endif
#ifdef Use_Simulate_UART3
u8 RX_RDATA_Count = 0;
u8 RX_Bit = 0;
u8 RX_Continuity_Bit = 0;
u16 TIM2_CNTR;
u8 RX_RDAT;
u8 RX_RDATA[32];
u8 RX_RDAT_OK = 0;
#pragma vector=0xF
__interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)
{
if(RX_Bit)
{
RX_Continuity_Bit = 10 - RX_Bit;
TIM2_CNTR = RX_Continuity_Bit*2000;
RX_Bit = 10;
while(RX_Continuity_Bit)
{
RX_RDAT |= (u8)(0x01<<(RX_Bit - RX_Continuity_Bit - 1));
RX_Continuity_Bit--;
}
if(RX_Bit==10)
{
RX_Bit = 0;
RX_RDAT_OK = 1;
RX_RDATA[RX_RDATA_Count] = RX_RDAT;
RX_RDATA_Count++;
if(RX_RDATA_Count>=32)
RX_RDATA_Count = 0;
RX_RDAT = 0;
}
}
TIM2_CR1 &= (uint8_t)~0X01;
TIM2_CNTRH = 0;
TIM2_CNTRL = 0;
TIM2_SR1 &= (uint8_t)(~0X01);
}
u8 t2_flag = 1;
u8 t1_flag = 0;
u16 CO2_Temp;
u16 CO2_CountTemp;
u16 CO2_DataH;
u16 CO2_DataHL;
u8 CO2_Data_OK = 0;
#pragma vector = 7 //设置串口1接收中断向量号 = 20
__interrupt void EXTI_PORTC_IRQHandler(void)
{
if(t2_flag != Rx_Read)
{
t2_flag = Rx_Read;
TIM2_CR1 &= (uint8_t)~0X01;
TIM2_CNTR = (u16)(TIM2_CNTRH*256);
TIM2_CNTR += (u16)TIM2_CNTRL;
TIM2_CNTRH = 0;
TIM2_CNTRL = 0;
TIM2_CR1 |= (uint8_t)0X01;
if(TIM2_CNTR > 2000)
{
RX_Bit = 0;
return;
}
if(TIM2_CNTR > 900)
RX_Continuity_Bit = TIM2_CNTR / 200;
else if(TIM2_CNTR > 500)
RX_Continuity_Bit = TIM2_CNTR / 185;
else
RX_Continuity_Bit = TIM2_CNTR / 170;
RX_Bit += RX_Continuity_Bit;
if(RX_Bit >10)
RX_Bit = 0;
if(Rx_Read == 0)
{
while(RX_Continuity_Bit)
{
RX_RDAT |= (u8)(0x01 << (RX_Bit - RX_Continuity_Bit - 1));
RX_Continuity_Bit--;
}
}
if(RX_Bit==10)
{
RX_Bit = 0;
RX_RDATA[RX_RDATA_Count] = RX_RDAT;
RX_RDATA_Count++;
if(RX_RDATA_Count >= 32)
RX_RDATA_Count = 0;
RX_RDAT = 0;
}
}
if(t1_flag != CO2_Read)
{
t1_flag = CO2_Read;
CO2_CountTemp = Time4_Count;
if(CO2_Read)
{
CO2_DataHL = CO2_CountTemp > CO2_Temp ? CO2_CountTemp - CO2_Temp : 1000 + CO2_CountTemp - CO2_Temp;
if(CO2_DataHL < 200)
CO2_DataHL += 1000;
CO2_Temp = CO2_CountTemp;
CO2_Data_OK |= 0X01;
}
else
{
CO2_DataH = CO2_CountTemp > CO2_Temp ? CO2_CountTemp - CO2_Temp : 1000 + CO2_CountTemp - CO2_Temp;
}
}
}
#endif
STM8S模拟串口接收
需积分: 10 41 浏览量
2017-11-24
17:22:36
上传
评论
收藏 3KB RAR 举报
...174
- 粉丝: 0
- 资源: 3