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

📄 main.c

📁 在飞思卡尔MC9S08GB60单片机环境下实现了无线监控
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************************************
*main函数
*Author:echo
*Start Date:2008.4.23
*End Date:
*内容:实现各部分功能
*进度:2008.4.24对接收数据进行处理:丢失,移动,低电压
**************************************/

/**************************************
*头文件
**************************************/
#include "main.h"
#include "SCI.h"
#include "pub_def.h"
#include "wait.h"
        
/**************************************
*全局变量定义
**************************************/
/*和zigbee模块通信波特率为38400,和PC通信波特率为9600
**晶振频率为.......,总线频率为。。。*/
extern UINT8 SciRxBufZb[SCI_RX_BUF_ZB];
extern UINT8 SciRxBuf[SCI_RX_BUF_TC];
extern UINT8 SciTxBuf[SCI_TX_BUF_TC]; 
extern char  Rx2Status;
extern UINT8 SciRxPtr;
extern UINT8 Sci2RxPtr;
extern UINT8 SciTxFlag;
extern UINT8 RxTimeoutFlag;
extern UINT8 SciRxPtr;
extern UINT8 SciTxPtr;
extern UINT8 SciTxLen;

extern UINT8 PrepareTime;
extern UINT8 PrepareTimeFlag;
extern UINT8 GoTime;
extern UINT8 GoTimeFlag;
extern UINT8 RingTime;
extern UINT8 RingTimeFlag;
extern UINT8 HangTime;
extern UINT8 HangTimeFlag;
extern UINT8 LostCount;
extern UINT8 LostAlarmBuff[15];
extern UINT8 PowerCount;
extern UINT8 PowerAlarmBuff[15];
extern UINT8 MoveCount;
extern UINT8 MoveAlarmBuff[15];
extern UINT8 MasterCount;
extern UINT8 MasterPowerLoss;
extern UINT8 AlarmTime;
extern UINT8 first;
extern UINT8 FLASHBUFFER[20];


//RAM子机存储、操作

SLAVE_INFO Slave_Ram_Buff[15]={0};  //结构数组,放2个子机,包括子机ID和子机状态2bytes。
MASTER_INFO Master_Ram_Buff={0};
//UINT8 Slave_Num=0;            //子机个数

//FLASH操作
UINT8 *p1_rom=(UINT8*)0x1080;       //flash第一页指针
UINT8 *p2_rom=(UINT8*)0x1200;					//flash第二页指针,pc
UINT8 *p2_rom_z=(UINT8*)0x1210;				//flash第二页指针,zigbee
UINT8 *p3_rom=(UINT8*)0x1400;				//flash第三页指针
UINT8 *p4_rom=(UINT8*)0x1600;				//flash第四页指针
int FAddr;					//向汇编传递flash的地址
char FCont;					//向汇编传递写入flash的内容
UINT8  Flag_P = 0;
UINT8  Flag_S = 0;

//各结构体变量
rx_packet_t rx_packet={0};        //定义一个用于接受的数据对象
RXFRAME_S rx_data_buffer={0};     //接收有效数据缓存
Date_Time Date_Time_Buff={0};	    //存放时间

//char Receive_DeviceID;				//接收到的子机命令帧的子机地址
char LOST_DeviceID=0;           //上报的丢失的子机ID
char Move_DeviceID=0;						//移动子机ID
char Low_DeviceID=0;						//低电压子机ID
char Normal_DeviceID=0;					//正常子机ID



//定时器计数器
UINT16 timer_count1 = 0;  //定时器1计数,用于统计是否丢失
UINT8 timer_count2 = 0;        //定时器2计数,1S中断,用于计时

//标志位
char NORMAL_Flag=0;				//正常收到标志位
char MOVE_Flag=0;					//移动报警标志位
char LOST_Flag=0;         //丢失报警标志位
char LOW_BATT_Flag=0;			//低电压报警标志位
char COMMU_ERROR_Flag=0;   //子机和座机通信错误标志位
char commu_error_finishflag=0; //子机和座机通信错误报警结束标志位
int commu_error_finishtime=0;
char MasterPower_Flag=0;//主机交流电掉电标志位

//watchdog flag
UINT8 commu_watchdog=0;		
UINT8 LOST_NUM=0;
UINT8 LOW_BATT_NUM=0;
UINT8 MOVE_NUM=0;

//上层可以配置的子机数目
UINT8 SlaveNumber = 0;

//writealarm函数
ALARM_INFO  Slave_Alarm_Info;

//从WRITECONFIG和WRITEALARMINFO函数里面出来的变量
flashunion FlashUnion;

//TC35i计数程序的变量
UINT16 AlarmTimeCount=0;
UINT16 RingTimeCount=0;
UINT16 HangTimeCount=0;
UINT16 PrepareTimeCount=0;
UINT16 GoTimeCount=0;
UINT8 CommuErrorCount=0;
UINT8 CellPhone =1;


//UINT8 godown=0;
     
     
/******************************************
*主函数
******************************************/

void main(void){
  UINT8 transmit_data[7]={0x80,0x00,0x00,0x00,0x01,0xAB,0x2A};
  UINT8 i;
  DisableInterrupts;        //Disable Interrupts
   
  //变量初始化 ,防止变量随机变化
  
  /****************************************************************/
  LOST_DeviceID=0;       //上报的丢失的子机ID
  Move_DeviceID=0;		   //移动子机ID
  Low_DeviceID=0;				 //低电压子机ID
  Normal_DeviceID=0;		 //正常子机ID
  timer_count1 = 0;      //定时器1计数,用于统计是否丢失
  timer_count2 = 0;      //定时器2计数,1S中断,用于计时
  NORMAL_Flag=0;			   //正常收到标志位
  MOVE_Flag=0;			 	 	 //移动报警标志位
  LOST_Flag=0;           //丢失报警标志位
  LOW_BATT_Flag=0;			 //低电压报警标志位
  COMMU_ERROR_Flag=0;    //子机和座机通信错误标志位
  commu_watchdog=0;		
  Date_Time_Buff.year=8;
  Date_Time_Buff.month=5; 
  Date_Time_Buff.day=27;
  Date_Time_Buff.hour=14;
  Date_Time_Buff.minute=19;
  LOW_BATT_NUM=0;
  MOVE_NUM=0;
  LOST_NUM=0;
  p2_rom = (UINT8*)0x1200;			
  p2_rom_z=(UINT8*)0x1210;
  AlarmTimeCount=0;
  RingTimeCount=0;
  PrepareTimeCount=0;
  GoTimeCount=0;
  CommuErrorCount=0;
  /*****************************************************************/
 
  //开始主程序
  SoftDog_Init();					  //软初始化,可以开启或者关闭软狗
  App_Init();								//应用初始化,以及上电后从flash库里将内容考到RAM中,包括子机ID,电话号码
  GPIOConfigInit();       	//初始化IO管脚
  SCIInit();                //初始化串口
  TimeInterrupt_Init() ;		//定时中断初始化
  IRQ_Init();								//交流掉电检测初始化
  EnableInterrupts; /* enable interrupts */
  
  //Feed_SoftDog();
  Feed_HardDog();//喂硬狗
  DelayMS(7000);//等待清除tc35模块的sysstart
  
  RxTimeoutFlag =0;
  for(i=0;i<SCI_TX_BUF_TC;i++)
    {
      SciTxBuf[i]=0;
    }
  for(i=0;i<SCI_RX_BUF_TC;i++)
    {
      SciRxBuf[i]=0;
    }
  SciTxPtr=1;
  SciRxPtr=0;


  /* include your code here */
  for(;;)
    { 
   	  Feed_HardDog();//喂硬狗
   	  if(AlarmTime)		 //报警轮询500ms定时到,读取报警包
   	    { 
   	      AlarmTime = 0;   	        
   	      Transmit_SCI2_Str(transmit_data,7);
          DelayMS(350);
          /*有开始命令
          if(Flag_S)   //PC控制端允许监控,才进入报警循环
            {
              ProcessReceiveDataLoop();
            }
            */
          ProcessReceiveDataLoop();//有子机就可以进入报警循环
          //Feed_SoftDog();					//喂软狗 
   	    }
   	  
      for(i=0;i<100;i++)//方便喂狗而写的循环
        {        
          if(first)        //只有在发短信打电话的循环完成以后,即MCU空闲的时候可以配置
           {
             ProcessPcLoop(); //PC配置、读取轮询
             LED10OFF();//指示单片机处于非报警状态
           }
        }
      //Feed_SoftDog();								 //喂软狗         
    }         
}//主函数结束 

void SoftDog_Init(void)
  {
     SOPT = 0x53; //关闭软狗
     //SOPT = 0xD3; //开启软狗,长周期模式30ms喂狗
  }
  
void Feed_SoftDog(void) 
  {
  	 SRS = 0;//对此寄存器写任意的值都会清除软狗计数器
  }
  
void Feed_HardDog(void) 
  {
  	 PTAD_PTAD4 = 0;
  	 PTAD_PTAD4 = 1; //DOG脚置1喂硬狗
  	 DelayMS(1);			 //满足100ns的脉冲宽度要求
  	 PTAD_PTAD4 = 0;
  }


/**************************************************************
*	Function name: 	App_Init()
*	Parameters: none
*	Return:		none
*	Actions:	application initial      
**************************************************************/
void App_Init(void) {
    UINT8 i=0;
    UINT8 j=0;
//		Slave_Num=0;
    /* flash指针初始化 */
    p1_rom = (UINT8*)0x1080;       //第一页flash,0x1080~0x11ff,共404bytes,存放子机ID
    p2_rom = (UINT8*)0x1200;				//第二页flash,0x1200~0x13ff,共512bytes,存放报警记录
    p2_rom_z=(UINT8*)0x1210;				//flash第二页指针,zigbee
    p3_rom = (UINT8*)0x1400;				//第三页flash,0x1400~0x15ff,共512bytes,存放报警电话
    p4_rom = (UINT8*)0x1600;				//第四页flash,0x1600~0x17ff,共512bytes,存放密码
	  FAddr = 0;										//向汇编传递flash的地址
	  FCont = 0;										//向汇编传递写入flash的内容
	  
	  /* 初始化RAM子机信息 */ 
	  for(i=0;i<15;i++){
	    Slave_Ram_Buff[i].SlaveID = 0;
	    Slave_Ram_Buff[i].Status = 0; 
	    Slave_Ram_Buff[i].move_count=0;
      Slave_Ram_Buff[i].low_batt_count=0;   
      Slave_Ram_Buff[i].move_finishflag=0;	 //报警结束标志位,0为结束,1为正在报警,时间5分钟
      Slave_Ram_Buff[i].move_finishtime=0;	 //报警计时标志位,从finishflag置为1开始计时,计5分钟后将finishflag置为0
      Slave_Ram_Buff[i].low_batt_finishflag=0;
      Slave_Ram_Buff[i].low_batt_finishtime=0;
      Slave_Ram_Buff[i].lost_finishflag=0;
      Slave_Ram_Buff[i].lost_finishtime=0;
   //   Slave_Ram_Buff[i].	       
	  }
	  
	  /*写Flash2中的End位,以免在无报警信息时,读报警信息产生乱码*/
		WriteAlarm(0,0);
}

/**************************************************************
*	Function name: 	Data_Evalate()
*	Parameters: none
*	Return:		none
*	Actions:	将从SCI中断接收来的数据进行数值传递      
**************************************************************/
void Data_Evalate(void){
	UINT8 i;
  /* 收到zigbee发送到数据包分析 */
  rx_packet.dataLength = Sci2RxPtr;           //收到的数据长度
  rx_packet.data = (UINT16 *)&rx_data_buffer;   //收到的数据
  rx_packet.maxDataLength = BUFLEN;		//最大长度
  rx_packet.status = Rx2Status;								//报告状态
  
  //接收到的数据包赋值
  rx_data_buffer.Head[0] = SciRxBufZb[0];
  rx_data_buffer.Head[1] = SciRxBufZb[1];
  rx_data_buffer.Head[2] = SciRxBufZb[2];
  rx_data_buffer.Head[3] = SciRxBufZb[3];
  rx_data_buffer.Head[4] = SciRxBufZb[4];
  rx_data_buffer.Head[5] = SciRxBufZb[5];
  rx_data_buffer.End = SciRxBufZb[108];
  
  
  for (i=0;i<SlaveNumber;i++){
    rx_data_buffer.TAG[i].Mac_AddH =SciRxBufZb[6*(i+1)];
    rx_data_buffer.TAG[i].Mac_AddL = SciRxBufZb[6*(i+1)+1];
   	rx_data_buffer.TAG[i].Link_Quality = SciRxBufZb[6*(i+1)+2];
  	rx_data_buffer.TAG[i].RSSI = SciRxBufZb[6*(i+1)+3];
    rx_data_buffer.TAG[i].Check_SlaveH = SciRxBufZb[6*(i+1)+4];
    rx_data_buffer.TAG[i].Check_SlaveL = SciRxBufZb[6*(i+1)+5];
  }   
}


 
/**************************************************************
*	Function: 	Interrupt_Init()
*	Parameters: none
*	Return:		none
*	Actions:	interrupt initial,这里只定义了定时中断     
**************************************************************/

void TimeInterrupt_Init(void){
  // Timer1中断初始化,用于检测判断超出范围报警,同时用作看门狗  
  TPM1SC = 0x4F;		//开定时器1中断,使用总线频率8M,128分频
  TPM1MOD = 0x2B6;  //每隔1/(8888832/128) *(0x2B6)= 10ms 中断一次
	TPM1CNT = 0x00;    
	// Timer2中断初始化,用于时间计时 
	TPM2SC = 0x4F;		 //开定时器2中断,使用总线频率8M,128分频
	TPM2MOD = 0xFE4F;  //64.0007次中断是一分钟  
	TPM2CNT = 0x00; 
} 

void IRQ_Init(void){
  IRQSC = 0x13;  //选择了下降沿低电压检测方式,使能中断
  //IRQSC = 0x03;  //关主机交流掉电中断
}

	 
/**********************************************************
*   函数名:  VTimer1
*   作者:    zgq
*   时间:    2007.12.7
*   版本号:  1.0
*   功能:    
*   修改时间
*
*************************************************************/
interrupt void VTimer1(){
    UINT16 time1 = 80;
    UINT16 time2 = 800;
    UINT16 time3 = 300;
    UINT16 time4 = 500;
    DisableInterrupts;
    TPM1SC_TOIE = 0;
  
    /******AlarmTime的计时********/
    if(AlarmTimeCount == time1){
      AlarmTime = 1;
      AlarmTimeCount = 0; //归零
    }
    if(AlarmTime==0){
      AlarmTimeCount++;
    } 
    /*****************************/
    /************gotime计时***********/
    if(GoTimeCount==time2){
      GoTime=1;
      GoTimeCount = 0;
      GoTimeFlag = 0;
    }
    if(GoTimeFlag==1){
      GoTimeCount++;
    }
    /***********************************/
    /***preparing计时****************/
    if(PrepareTimeCount==time3){
      PrepareTime=1;
      PrepareTimeCount=0;
      PrepareTimeFlag=0;
    }
    if(PrepareTimeFlag ==1){
      PrepareTimeCount++;
    }
    /**********************************/
    
    /***********************************/
    /***HangTime计时****************/
    if(HangTimeCount==time4){
      HangTime=1;
      HangTimeCount=0;
      HangTimeFlag=0;
    }
    if(HangTimeFlag ==1){
      HangTimeCount++;
    }
    /**********************************/

    
  ////////////添加时钟中断处理代码//////    
    if((RxTimeoutFlag > 0)&&(RxTimeoutFlag <200)) 
    {
        RxTimeoutFlag++;
    }
    
    TPM1SC_TOF = 0;
    TPM1SC_TOIE = 1;
    EnableInterrupts;
    return; 
}


void Check_data_indication(rx_packet_t *rx_packet_rx) 	 //分析接收到的数据	
{  
   UINT8 i;	
   UINT8 j=0;

⌨️ 快捷键说明

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