⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 350_int.c

📁 C8051F350单片机24位AD采样程序。
💻 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 + -