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

📄 sci.c

📁 在飞思卡尔MC9S08GB60单片机环境下实现了无线监控
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************
*SCI.c
*Author:echo
********************************************/



//头文件
#include <string.h>
#include "SCI.h"
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC9S08GB60.h> /* include peripheral declarations */
#include "wait.h"
#include "FLASH.h"
#include "GPIO.h"
#include "main.h"

//全局变量
//wpj,串口1
UINT8 SciRxBuf[SCI_RX_BUF_TC]={0};
UINT8 volatile SciRxPtr=0;
//UINT8 volatile SciRxLen=0;
UINT8 SciTxBuf[SCI_TX_BUF_TC]={0};
UINT8 volatile SciTxPtr=0;
UINT8 volatile SciTxLen=0;
UINT8 volatile SciTxFlag=0;
UINT8 volatile RxTimeoutFlag=0;			//接收超时包完成
extern UINT8 FLASHBUFFER[20];
extern UINT8 Flag_P;
extern UINT8  Flag_S;


//wxy ,串口2
UINT8 SciRxBufZb[SCI_RX_BUF_ZB]={0};
UINT8 Sci2RxPtr=0;
char Rx2Status=0;
UINT8 PrepareTime=0;
UINT8 PrepareTimeFlag=0;
UINT8 GoTime=0;
UINT8 GoTimeFlag=0;
UINT8 RingTime=0;
UINT8 RingTimeFlag=0;
UINT8 HangTime=0;
UINT8 HangTimeFlag=0;
UINT8 LostCount=0;
UINT8 LostAlarmBuff[15]={0};
UINT8 PowerCount=0;
UINT8 PowerAlarmBuff[15]={0};
UINT8 MoveCount=0;
UINT8 MoveAlarmBuff[15]={0};
UINT8 MasterCount=0;//用来标记有ZIGBEE报警
UINT8 MasterPowerLoss=0;//用来标记有主机掉电
UINT8 AlarmTime=0;
UINT8 first = 1;


void SCIInit(void){
	  /* Initial SCI1*/
  //16M外部晶振,8M总线频率
  ICGC1_RANGE = 1;
  ICGC1_REFS  = 1;
  ICGC1_CLKS1 = 1;
  ICGC1_CLKS0 = 1;
  ICGC1_OSCSTEN = 0;
  ICGC2_MFD2 = 0;
  ICGC2_MFD1 = 1;
  ICGC2_MFD0 = 0;
  ICGC2_RFD2 = 0;
  ICGC2_RFD1 = 0;
  ICGC2_RFD0 = 0;
  
  	SCI1BDH = 0x00;
//	SCI1BDL = baud38400;	
	  SCI1BDL = MyBaud9600 ;
//	SCI1BDL = baud4800 ;
//  SCI1BDL = baud2400;

  	SCI2BDH = 0x00;
//	SCI2BDL = baud38400;	
  	SCI2BDL = MyBaud9600 ;
//	SCI2BDL = baud4800 ;
//  SCI1BDL = baud2400;

  SCI1C2 = 0x2C;            /*允许接收中断,允许发送器,允许接收器*/
  SCI2C2 = 0x2C;            /*允许接收中断,允许发送器,允许接收器*/
}




//中断方式接收zigbee模块返回的信息
interrupt void SCI2(void){	
	unsigned char status,dummy,datatemp;
	do{
		status = SCI2S1;
	}	while ((status & 0x20) == 0);
	
	//Check for Errors (Framing, Noise, Parity)
	if ((status & 0x07) != 0) {
		dummy = SCI2D;
		return;
	}
	//Good Data.
	 datatemp = SCI2D;
	 
  	if(Sci2RxPtr >= SCI_RX_BUF_ZB) {
	    return;
  	}
    if((Sci2RxPtr == 0 && datatemp == 0xC0)||(Sci2RxPtr != 0 && datatemp != 0xC0)){
      SciRxBufZb[Sci2RxPtr] = datatemp; // load SCI register to data 
      Sci2RxPtr++;
    }
    if(Sci2RxPtr == SCI_RX_BUF_ZB) {
      Rx2Status=SUCCESS;
    }
} 

/*向连接PC机的SCI传送一个byte,使用串口1*/						 
void Transmit_SCI_Byte(UINT8 T_Byte){
   while (!SCI1S1_TDRE);  // ensure Tx data buffer empty 
   SCI1D = T_Byte; // load data to SCI2 register 
   while (!SCI1S1_TC); // wait for Tx complete 
}

//向IPlink 1221-2164模块发送一个字符,使用串口2
void Transmit_SCI2_Byte(UINT8 T_Byte2){  
    while (!SCI2S1_TDRE);  // ensure Tx data buffer empty 
    SCI2D = T_Byte2; // load data to SCI2 register 
    while (!SCI2S1_TC); // wait for Tx complete
}

//向IPlink 1221-2164模块发送一串字符
void Transmit_SCI2_Str(UINT8 *pStr,UINT8 nLen)
{
	int i;	
	Sci2RxPtr =0;
	for (i=0; i<nLen; i++)	{
	    Transmit_SCI2_Byte(pStr[i]);
	}
} 




/**********************************************************
*   函数名:  Transmitt
*   作者:    zgq
*   时间:    2007.12.7
*   版本号:  1.0
*   功能:    
*   修改时间
*
*************************************************************/
void UARTTransmitt(void) {
  //Feed_SoftDog();					//喂软狗
  Feed_HardDog();
	while(SciTxFlag == TRANSMITT_ING);
	DelayMS(5);
	if(SciTxFlag == TRANSMITT_READY){   
		SCI1D =  SciTxBuf[0];
		SCI1C2_TCIE = 1;		 //允许发送中断
		SciTxFlag = TRANSMITT_ING;
	}
}


//从串口1接收数据的中断程序,tc35
interrupt void VScirx(void){        
  UINT8 u8status;
  // ensure Rx data buffer is full 
  do{
    u8status = SCI1S1;
  } while ((u8status & 0x20) == 0);
  DisableInterrupts;
  LED9ON();
  // load SCI register to data buffer
  if(SciRxPtr >= SCI_RX_BUF_TC) return;   
  SciRxBuf[SciRxPtr] = SCI1D;
  SciRxPtr++; 
  RxTimeoutFlag = 1;
  LED9OFF();
  EnableInterrupts; 
}	 


//通过串口1向tc35发送数据的中断程序
interrupt void VScitx(void) {
	UINT8 u8status;
  /////////////////////////////////////////////////////////////
  /////由于不明原因(通过查询手册感觉是芯片设计原因),////////////
  /////如果打开发送中断将会不断有数据进入,因此只在需要发送时打///////
  /////开中断允许,发送完成后关闭   /////////////////////////////////
  // ensure Tx complete 
  do{
    u8status = SCI1S1;
  }while ((u8status & 0x40) == 0);
  LED9ON();
  //测试
  /*
    for(;;){
    if(SciTxPtr >= SciTxLen)SciTxPtr=0;
      
    SCI1D = SciTxBuf[SciTxPtr];
    SciTxPtr++;	 
    }*/  
  //发送下一个字节
  if(SciTxPtr < SciTxLen){  
    SCI1D = SciTxBuf[SciTxPtr];
    SciTxPtr++;
    SciTxFlag = TRANSMITT_ING;        
  }else{ 
    DelayMS(5);
    SCI1C2_TCIE = 0; //关闭发送中断
    SciTxPtr = 1;
    SciTxFlag = TRANSMITT_READY;
    LED9OFF();
  }   
}	 



/********************************************************
* 函数名: 等待PC的配置命令
* 作者:wpj
* 时间:2008.5.10
* 功能:根据与PC相连的串口接收下来的包,对Flash进行读写
*********************************************************/
void ProcessPcLoop(void)
{
 	UINT8 i;
 	if(RxTimeoutFlag >= RX_TIMEOUT)
 	{  //确定收了一个整包
 	  BELL=0;
    RxTimeoutFlag = 0;
    SciRxPtr = 0;

    //if((((SciRxBuf[0] < 0x5A)&&(SciRxBuf[0]>=0x50))||(SciRxBuf[0]==0x5F))||(SciRxBuf[0]==0x60))//有开始命令
    if(((SciRxBuf[0] < 0x5A)&&(SciRxBuf[0]>=0x50))||(SciRxBuf[0]==0x5F))//没有开始命令  
      {      
         WriteConfig(&SciRxBuf[7], SciRxBuf[6], SciRxBuf[0]);
      }
    else if((SciRxBuf[0]<0x5F)&&(SciRxBuf[0]>0x59)) 
      {
         WriteAlarmInfo(&SciRxBuf[7], SciRxBuf[6], SciRxBuf[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;
          }
  
  }
}

void MessagePrepare(void)
{
    UINT16 i;
    
    BELL = 1;
    if(first != 1)				 //第一次发送,不用等
      {
         //Feed_SoftDog();					//喂软狗
         while(SciTxFlag==TRANSMITT_ING);//等待上一次发送完毕         
         while(RxTimeoutFlag < 3);
         RxTimeoutFlag=0;
         Feed_HardDog();      
      }
    
    //Feed_SoftDog();					//喂软狗  
    for(i=0;i<SCI_TX_BUF_TC;i++){ 
            SciTxBuf[i]=0;
          } 

    for(i=0;i<SCI_RX_BUF_TC;i++){
            SciRxBuf[i]=0;
          }
    (void)strcpy(SciTxBuf,"AT+CMGS=069\r"); 
    SciTxLen = 12;
    SciRxPtr = 0;
    UARTTransmitt(); //串口发送
}

void MessageGo(UINT8 cmd, UINT8 TelNum)
{
    UINT8 i,k,flag;
    BELL = 0;
    while(SciTxFlag==TRANSMITT_ING);//等待上一次发送完毕         
    //Feed_SoftDog();					//喂软狗
    while(RxTimeoutFlag < 3);
    RxTimeoutFlag=0; 
    Feed_HardDog();
    do{
      flag=0;
      for(i=0;i<SCI_RX_BUF_TC;i++) {
        if(SciRxBuf[i]== '>')//再写短信内容 
        {
          //Feed_SoftDog();					//喂软狗
          flag=1;
          for(i=0;i<SCI_TX_BUF_TC;i++){ 
            SciTxBuf[i]=0;
          } 
          
          
          switch(cmd){
            
            
            case LOST_ALARM:
              strcpy(SciTxBuf,"08916800000000000011000D91680000000000000008A736000000000000000000000000000000005B50673A4E225931002000200020002000200020002000200020002000200020002000200020");

              /////////////////填地点///////////////
              ReadFlash(ALARM_INFO1);
              for(i=0;i<24;i++)
                {
                  SciTxBuf[48+i] = FLASHBUFFER[i];
                }
              /////////////////填个数///////////////
              for(i=0;i<8;i++)    
                {
                  SciTxBuf[72+i] = 0x30;
                }
              SciTxBuf[74] = 0x33;
              SciTxBuf[78] = 0x33;
              if(LostCount >= 10)
                {
                  SciTxBuf[75] = 0x31;
                  SciTxBuf[79] = LostCount - 0x0A + 0x30;
                } 
              else
                {
                  SciTxBuf[75] = 0x30;
                  SciTxBuf[79] = LostCount + 0x30;                

⌨️ 快捷键说明

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