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

📄 main.c

📁 矿工定位系统单端
💻 C
字号:
#include<REG922.h>
#include <absacc.h>
#include "string.h"
#include "intrins.h"

#include "ports.h"
#include "osc.h"
#include "uart.h"
#include "rtc.h"
#include "power.h"
#include "watchdogrtc.h "
#include  "IAP_LITE.H"
bit T_flag=0,set=0,set_ok;
void Send_ok(unsigned char key);
unsigned char ADDR,RX_addr=0,key_tem=01;
unsigned char wring_send_times=0;

//************************程序用的变量********************
unsigned char data RXtem[6], RXdata[6];//程序接收数据缓冲区
unsigned char data RXNOM,RXSTAT=0;
unsigned char data RXTimerOUT,i; //接收超时
bit rxok;          // 接收完成标志
/****************************************************************************/


void Delay100ms(unsigned char x)
{   
  unsigned char i,j;
  
  while(x-- != 0)
  {  
    
 	for (j = 0;j < 114; j++)
	{
     if(rxok)
	  {
	    rxok=0;
		Send_ok(key_tem);
	   	i=0;
	  }
	for (i = 0;i < 88; i++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
	_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
	_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
	_nop_() ;_nop_() ;_nop_() ;};
	}
  }
}
/****************************************************************************/


void Delay1ms(unsigned char idata  x)
{   
  unsigned char i;
  
  while(x-- != 0)
  {
    if(rxok)
	  {
	    rxok=0;
		Send_ok(key_tem);
	   	i=0;
	  }
    for (i = 0;i < 89; i++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
	_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
	_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
	_nop_() ;_nop_() ;_nop_() ;};
  }
}
/****************************************************************************/


void Delay1msa(unsigned char idata  x)
{   
  unsigned char i;
  
  while(x-- != 0)
  {
   
    for (i = 0;i < 89; i++){_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
	_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
	_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;_nop_() ;
	_nop_() ;_nop_() ;_nop_() ;};
  }
}
/***********************************************************************
DESC:    Initializes UART for mode 1
         Baudrate: 9600
RETURNS: Nothing
CAUTION: If interrupts are being used then EA must be set to 1
         after calling this function
************************************************************************/
void uart_init(void)
{
  // configure UART
  // clear SMOD0
  PCON &= ~0x40;
  SCON = 0x50;
  // set or clear SMOD1
  PCON &= 0x7f;
  PCON |= (0 << 8);
  SSTAT = 0x00;

  // enable break detect
  AUXR1 |= 0x40;

  // configure baud rate generator
  BRGCON = 0x00;
  BRGR0 = 0xF0;
  BRGR1 = 0x02;
  BRGCON = 0x03;

  // TxD = push-pull, RxD = input
  P1M1 &= ~0x01;
  P1M2 |= 0x01;
  P1M1 |= 0x02;
  P1M2 &= ~0x02;

  // initially not busy


  // set isr priority to 0
  IP0 &= 0xEF;
  IP0H &= 0xEF;
  // enable uart interrupt
  ES = 0;

} // uart_init
/***********************************************************************
DESC:    Initializes the ports
RETURNS: Nothing
CAUTION: Call before the initialization functions of other peripherals
************************************************************************/
void ports_init(void)
{
  P0M1 &= 0xF0;
  P0M2 &= 0xF0;

  P1M1 |= 0x2C;
  P1M2 &= 0xDF;
  P1M2 |= 0x0C;

} // ports_init
//*******************add**********************************************


 /****************************************************************************
*                                                                           *
* Function:     START_T0                                                    *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
*                                                                           *
****************************************************************************/
void START_T0(unsigned char x)
{
  ET0 = 0 ;
  TR0 = 0;
  RXTimerOUT = x ;
  TL0 = 0;
  TH0 = 0;
  TR0 = 1;
  ET0 = 1 ;
}		 
/****************************************************************************
*                                                                           *
* Function:     CALL_isr_T0                                                 *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
*                                                                           *
****************************************************************************/
void CALL_isr_T0(void)
{
  TR0 = 0;
  RXTimerOUT = 0; 
  TF0 = 1;

}

//********************串口中断处理程序**************************************************************
void ub1ISR(void) interrupt 4 using 1
{
   unsigned char c;
   if ( RI )					    // Receive Command
  {
   // RXTimerOUT=10;
    RI = 0;
	c  = SBUF;
	
	switch(RXSTAT)
	{
	  case 0:                          //接受帧头02
	         if(c==0x55)
               {RXSTAT=1;START_T0(20);}
			 else
               CALL_isr_T0();
	         break;
	  case 1:                       //接收
             if(c==0xaa)
			   {  
                  RXSTAT=2;
                  START_T0(20);
               }
             else
			  { 
			    if(c==0xbb)
				{ 
				   if(!ISP)
					{
					 set=1;
				     RXSTAT=2;
                     START_T0(20);
					}
				
				 }
				else
				{
                RXSTAT=0; 
                CALL_isr_T0();
				}
               }
		   
			// RXSTAT=0;
	         break;
	 case 2:
	        if(c==ADDR)
		    {
             RXSTAT=3;
			 START_T0(20);
			}
			else
			 { 
                RXSTAT=0; 
                CALL_isr_T0();
             }
			 i=0;
	        break;
	 case 3:
	        if(c==ADDR)
			{
			 if(set)
			 {
			  RXSTAT=4;
			  START_T0(20);
			 }
			 else
			 {
              RXSTAT=0;
			  rxok=1;
              CALL_isr_T0();
			 }
			  
			}
		
            break;
	  case 4:
	        RX_addr=c;
			set_ok=1;
			set=0;
		    RXSTAT=0;
            CALL_isr_T0();
	        break;
	  default:
             RXSTAT=0;
   		     break;
	}

  }
 else
 {
       TI=0;
	   
  }
}
/*************************原有的函数需改变*************************************
*                                                                           *
* Function:     isr_timer0                                                  *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
*                                                                           *
****************************************************************************/
void isr_timer0(void) interrupt 1 using 2
{
  TR0=0;
   if(RXTimerOUT!=0)        //此if{}else{} 为新加入的判断超时功能
    { 
       RXTimerOUT--;
    }
    else
    {
      RXSTAT=0;
      RXNOM=0;
	  set=0;
    }


  
  TH0=0Xac;
  TL0=0X95;
  TR0=1;   
}
//**********************************************************
void Send_ok(unsigned char key)
{ 
   unsigned char i;
    ES=0;
    TX_EN=1; 
	Delay1msa(10);
	for(i=0;i<3;i++)
	{
      SBUF = 0x88;				// 发送数据
      while(0==TI);			// 等待发送完毕
      TI = 0;				// 清除发送标志
	  SBUF = 0xff;				// 发送数据
      while(0==TI);			// 等待发送完毕
      TI = 0;				// 清除发送标志

	  SBUF = key;				// 发送数据
      while(0==TI);			// 等待发送完毕
      TI = 0;				// 清除发送标志
	  SBUF = key;				// 发送数据
      while(0==TI);			// 等待发送完毕
      TI = 0;				// 清除发送标志
   }
   if(key_tem==0x02)
   {
     wring_send_times--;
	 if(wring_send_times==0)
	 {
        key_tem=0x01;
	 }
   }
   else
   {
    key_tem=0x01;
   }
	TX_EN=0; 
	Delay1msa(4);
    ES=1;
  
}

/******************************************************************
* 名称:UART_SendByte
* 功能:向串口发送字节数据。
* 入口参数:dat	  待发送的数据
* 出口参数:无
******************************************************************
void  UART_SendByte(uint8 dat)
{  SBUF = dat;				// 发送数据
   while(0==TI);			// 等待发送完毕
   TI = 0;				// 清除发送标志
}


/******************************************************************
* 名称:UART_SendCode
* 功能:读取FLASH中的数据,并发送到串口。
* 入口参数:addr	  读取的起始地址
*          no     读取的数据个数
* 出口参数:无
******************************************************************
void  UART_SendCode(uint16 addr, uint16 no)
{  uint8 code *readp;

   readp = addr;
   for(; no>0; no--)
   {  UART_SendByte(*readp++);		// 读取数据并发送
   }
}

*/
void flash_led(unsigned char j )
{  
   char i;
   for(i=0;i<j;i++)
   {
        LED=0;
        Delay1ms(50);
	    LED=1;
		Delay1ms(50);
   }
 LED=1;	  
}
//******************************************************************
//**********************************************************
void Setok(void)
{ 
  
    ES=0;
    SBUF ='O';				// 发送数据
    while(0==TI);			// 等待发送完毕
    TI = 0;				// 清除发送标志
    SBUF = 'K';				// 发送数据
    while(0==TI);			// 等待发送完毕
    TI = 0;				// 清除发送标志
    ES=1;
}
//**************************************************************
void main(void)
{
  unsigned  char Link_ok=0,j,CS_state=0;

  ports_init();
 if(ISP) 
  {
   user_uart_init();//用户串口初始化
    watchdog_init();//初始化看门狗
  
   }
 else
  {
   uart_init();  //进入ISP模式
   FLASH_WriteByte(0xc04, 0);
  }
  osc_init();
  rtc_init();
  EA=1;
  ES=1;
  CS=0;
  TX_EN=0; //接收状态
  PWR =1;
 //rtc_start();
 LED=0;
 Delay100ms(2);
 LED=1;
  if((FLASH_ReadByte(0XC05)==0x55)&(FLASH_ReadByte(0XC06)==0xaa))//初始化模块的ID
  {
    EA=0;
    ADDR=FLASH_ReadByte(0XC04); 
    EA=1;
      //FLASH_WriteByte(0xc04, 0); 
  }
  else
   {
    ADDR=0;
	EA=0;
    FLASH_WriteByte(0xc04, 0);
    FLASH_WriteByte(0xc05, 0x55);
	FLASH_WriteByte(0xc06, 0xAA);
    EA=1;
   }
//ADDR=0;
while(1)
 { 
  
   if(ISP)
   {
      watchdog_start();
     
	  if(!KEY){wring_send_times=3; key_tem=0x02; LED=0; Delay100ms(2); LED=!LED;LED=0; Delay100ms(2); LED=!LED;}//有键按下
	   watchdog_feed();
      if(rxok)
	  {
	    rxok=0;
		Send_ok(key_tem);
	    flash_led(4);
		i=0;
	    LED=1;
		Link_ok=1;
        watchdog_feed();
	 }
	 if(set_ok)//设置模块的ID
	 {
        watchdog_feed();
	 	set_ok=0;
		Send_ok(key_tem);

		watchdog_feed();
		EA=0;
	    FLASH_WriteByte(0xc04,RX_addr);   //存入新ID
   	    EA=1;
		ADDR=RX_addr;
	    LED=0;
        flash_led(4);
		i=0;
	    LED=1;
		Link_ok=1;
        watchdog_feed();
	 }
    rtc_start();
  switch(CS_state)
  {
   case 0:
   CS=0;
   if(T_flag)
	{    
       watchdog_feed();
      rtc_stop();  
      T_flag=0;
	  i++;
	  if(i>3)
	  {
	    i=0;
        watchdog_feed();
	    if(Link_ok)
	    {
	       Link_ok=0;
           watchdog_feed();
	   
	    }
	   else
	    {
	       LED=0;
           Delay1ms(50);
	       LED=1;
	       j++;
           watchdog_feed();
           CS_state=1;
		   if(j>10)
		  {
		    j=0;
		    DIVM =0x00;
            watchdog_feed();
	        power_mode(POWER_TOTALPOWERDOWN);//休眠
		  }
	    }
	 }
	}
    break;
   case 1:
     CS=1;
   if(T_flag)
	{    
       watchdog_feed();
      rtc_stop();  
      T_flag=0;
	  i++;
	  if(i>3)
	  {
	   i=0;
       watchdog_feed();
	   if(Link_ok)
	   {
	    Link_ok=0;
        watchdog_feed();
	   
	   }
	   else
	   {
	    LED=0;
        Delay1ms(50);
	    LED=1;
	    j++;
        watchdog_feed();
        CS_state=0;
		if(j>10)
		{
		 j=0;
		 DIVM =0x00;
         watchdog_feed();
	     power_mode(POWER_TOTALPOWERDOWN);//休眠
		}
	   }
	 }
	}
    break;
   default:
    CS_state=0;
    break;
   }//end swtich
 

   }
   else
   {
    LED=!LED;
    Delay100ms(10);

	
	
	 if(set_ok)//设置模块的ID
	 {
	    
        watchdog_feed();
	 	set_ok=0;
	    EA=0;
	    FLASH_WriteByte(0xc04,RX_addr);   //存入新ID
   	    EA=1;
		ADDR=RX_addr;
	    LED=0;
        flash_led(4);
		i=0;
	    LED=1;
		Link_ok=1;
        watchdog_feed();
		Setok();
	 }
   }
 }
}

⌨️ 快捷键说明

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