📄 350_int.c
字号:
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
//
#include "include.h"
//-----------------------------------------------------------------------------
// 全局变量声明区
//-----------------------------------------------------------------------------
//
//UART发送控制状态
unsigned char gucvUartSendStatus;
//UART发送序列缓冲(通道号码,采样高位,采样低位,称重数值高位,称重数值低位,CRC高位,CRC低位)
unsigned char gucaUartTxBuf[UART0SENDLENGTH];
//滤波数据
unsigned long gulvLBCalVlu = 0;
// 滤波数组
unsigned long guiaLBDataBuf[LBGREAD];
//-----------------------------------------------------------------------------
// 中断服务程序区
//-----------------------------------------------------------------------------
//准备好所有中断,以便在中断向量区生成RETI,有助抗干扰
//
//-----------------------------------------------------------------------------
// 外部0中断函数
//-----------------------------------------------------------------------------
//
void Int0_ISR(void) interrupt 0
{
_nop_();
_nop_();
_nop_();
}
//-----------------------------------------------------------------------------
// Timer0中断
//-----------------------------------------------------------------------------
//
void Timer0_ISR(void) interrupt 1
{
_nop_();
_nop_();
_nop_();
}
//-----------------------------------------------------------------------------
// 外部1中断函数
//-----------------------------------------------------------------------------
//
void Int1_ISR(void) interrupt 2
{
_nop_();
_nop_();
_nop_();
}
//-----------------------------------------------------------------------------
// Timer1中断
//-----------------------------------------------------------------------------
//
void Timer1_ISR(void) interrupt 3
{
_nop_();
_nop_();
_nop_();
}
//初始化接收发送中断服务
void InitTxRxISR(void)
{
gucvUartSendStatus = UART0SENDLENGTH; //UART发送控制状态
ConverChannelNum = 1; //ADC0转换通道号码
}
//-----------------------------------------------------------------------------
// ADC0中断
//-----------------------------------------------------------------------------
//
void ADC0_ISR(void) interrupt 10
{
//记录滤波次数
static unsigned char LBTimes = 0;
// 记录滤波数组指向位置
static unsigned char LBPosition = 0;
// 滤波发送数据
static unsigned long LBSendData;
//清除中断标志
AD0INT = 0;
// 保存转化结果低8位
ConverResultLo = (ADC0L & 0xc0);
// 保存转换结果中8位
ConverResultMi = ADC0M;
// 保存转换结果高8位
ConverResultHi = ADC0H;
// 累加历史数据
gulvLBCalVlu += (ConverResultHi * 256 * 256 + ConverResultMi * 256 + ConverResultLo);
// 如果采样数据长度到
if (LBTimes == LBGREAD)
{
unsigned char i;
// 求出平均数据
gulvLBCalVlu /= LBGREAD;
// 存入滤波循环数组
guiaLBDataBuf[LBPosition] = gulvLBCalVlu;
// 判断数组循环边界
LBPosition++;
if (LBPosition > LBGREAD)
{
LBPosition = 0;
}
// 再次滑动平均值滤波
for (i = 0, gulvLBCalVlu = 0; i < LBGREAD; i++)
{
gulvLBCalVlu += guiaLBDataBuf[i];
}
// 求出平均数据
gulvLBCalVlu /= LBGREAD;
// 送入待发送字节中
LBSendData = gulvLBCalVlu;
// 清除平均数据
gulvLBCalVlu = 0;
//准备下次循环
LBTimes = 0xff;
}
LBTimes++;
//送入发送区
ConverResultLo = (unsigned char)(LBSendData);
ConverResultMi = (unsigned char)(LBSendData >> 8);
ConverResultHi = (unsigned char)(LBSendData >> 16);
//准备发送数据次数
gucvUartSendStatus = UART0SENDLENGTH;
//进入信息发送状态
TI0 = 1;
}
//-----------------------------------------------------------------------------
// UART0中断
//-----------------------------------------------------------------------------
//
void UART0_ISR(void) interrupt 4
{
//发送采样数据(0xad,采样高位,采样低位)
if(TI0)
{
//清除中断标志
TI0 = 0;
//检查还剩多少位数据未被发送出去
switch(gucvUartSendStatus)
{
//发送采样数据段
case 4:
{
//发送数据起始标志
SBUF0 = 0xad;
break;
}
case 3:
{
//发送转换结果高位
SBUF0 = ConverResultHi;
break;
}
case 2:
{
//发送转换结果低位
SBUF0 = ConverResultMi;
break;
}
case 1:
{
//发送转换结果低位
SBUF0 = ConverResultLo;
break;
}
default:
{
//其他无效中断则初始化发送状态
gucvUartSendStatus = UART0SENDLENGTH;
break;
}
}
gucvUartSendStatus--;
}
//接收上级命令
else if(RI0)
{
//清除中断标志
RI0 =0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -