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

📄 interpt.c

📁 单片机程序,和上位机通讯,采集下位机的射频信号的功率,接收上位机的指令并向上位机回送采集到的下位机的信息,我花了一个月才开发出来的.绝对真实,可靠性强.
💻 C
字号:
//模块监控中断服务程序
//定时器0中断服务程序
#include "fDETDeclare.H"
#include "DETConst.H"
#include "RS485BUF_EX.H"
unsigned char counter;//计数器,用于定时
void Initial(void)
{
	unsigned char flag1,flag2;
    TMOD=0x21;  //初始化串口:方式1,波特率9600
    TL1=0xfd;
    TH1=0xfd;
    TL0=0x00;    //定时器0的时间常数,采用16位计数定时  工作方式1
    TH0=0x28;    //定时10msms
	PCON=0x00;
	SCON=0x70;
    PCON|=0x80;
        fEepromRead(&flag1,0x00ae,1);
        fEepromRead(&flag2,0x00af,1);
        if((flag1!=0x99)&&(flag2!=0x99)){    //若5045是空白的,执行写操作
             flag1=0x99;flag2=0x99;
             fEepromWrite(&flag1,0x00ae,1);   //写标志位
             fEepromWrite(&flag2,0x00af,1);
             
             MODULEADDRESS=0x08;
             fEepromWrite(&MODULEADDRESS,0x00b3,1);

        }
       
        fEepromRead(&MODULEADDRESS,0x00b3,1);

        fEepromRead(&power1,0x0020,1); // 读功率值
        fEepromRead(&power2,0x0030,1);
        fEepromReadW(&powervolt1,0x0021); //读校准直线的两点AD采集值
        fEepromReadW(&powervolt2,0x0031);
       
	    //fEepromRead(&ResetFlag1,0x0070,1);
		ResetFlag1=1;
		ResetFlag=0;
		InitCounter=0;

        RS485DE=0;
        ComAnalysisFlag=0;
        RecFlag=0;                                                //开始将程序初始化为接受状态
        RS485ReadPointer=0;
		RS485WritePointer=0;
        counter=0;
        ADCCS =1;
        ADCCLK =0;
        MODULESELECT=0;  //打到上行模块
        STARTCHECK=0;
        PowerCheckCount=0;
		InterpCounter=0;
		TESTFLAG=0;
        PS=1;
        PT0=0;
        TR0=1;
        TR1=1;
        ET0=1;
        ES=1;EA=1;

}


void SerialInterruptServe(void) interrupt 4
{
	static unsigned char ComLen = 0;//存放数据包的长度
    unsigned char i;
	if(TI!=0){  //将485接口置于发送状态
		TI=0;
		if((--RS485SendLen) == 0x00) {
			//发送完毕,RS485转换到接收状态
            RS485DE=0;
			REN = 1;
		}
		else SBUF=RS485Buffer[RS485ReadPointer++];	    //发送
	}

	if(RI) {		                            //收中断
		RI=0;
		i=SBUF;
		if (ComAnalysisFlag)
			return;
		if(RS485WritePointer>=RS485BUFLEN){
             ComAnalysisFlag=0;
             RS485WritePointer = 0;
             ComLen=0;
             RecFlag=0;
             return;
		}
        if(!RecFlag){
			if (i!=FRAMESTART)
				return;
        	RS485WritePointer = 0;
	        RS485Buffer[RS485WritePointer++]=i;
	        RecFlag=1;
      	    return;
        }
        //收到起始帧以后继续接收
        RS485Buffer[RS485WritePointer++]=i;
        if(RS485WritePointer==6){
            ComLen=RS485Buffer[RS485WritePointer-1];
        }
		if(RS485WritePointer==(ComLen+9)) {//停止接收			
			if(RS485Buffer[RS485WritePointer-1]!=0x7f){
                ComAnalysisFlag=0;
			}
			else {
				InterpCounter=0;
             	ComAnalysisFlag=1;
				REN = 0;
			}

			RecFlag=0;
            RS485WritePointer = 0;
            ComLen=0;
        }
    }
}
//定时查询,每隔300ms查询一次

void TimerInterrupt(void)  interrupt 1 using 2
{
      //重新启动计数
      counter++;
      TL0=0x00;    //定时器0的时间常数,采用16位计数定时  工作方式1
      TH0=0x28;    //
      if(counter>5){  //
	  	InterpCounter++;
        counter=0; //记数器复位,目的是达到每隔1s 查询以次状态
        STARTCHECK=1;
      }
      
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -