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

📄 main.c

📁 楼宇对讲系统里用的文字信息接收。用可视对讲话机的TFT屏可看到从管理中心发过来的广播信息和本户的特发信息
💻 C
字号:
/***********************************************************/
/*							                               */
/*                CPU:AT89c55WD   20MHZ                    */
/*                Copyright  2004.09  Comelit              */
/*                AUTHOR: LV_XIAO_LU                       */
/*                                                         */
/***********************************************************/

#include "reg52.h"
#include "define.h"
#include "variable.h"
#include "typedef.h"
#include "function.h"


sfr WDTRST = 0xa6;
sfr T2MOD  = 0xc9;

sbit DIVA_STATUS_PORT = P3^2;
sbit MES_SW = P1^7;
sbit CALL_SW = P1^6 ;
sbit DISP_CTR_PORT = P3^5;


void Cpu_init(void);
void Diva_sts_hd(void);
void Judge_work_mode(void);
void Timer2_init(void);
sbit LED_CTR = P1^1 ;
/************************************************/
/*
/************************************************/

void main(void)
{

 /*  special_addr1 = 0xaa;
   special_addr2 = 0x55;
   special_addr1 = 0xa0; 
   init_code_b[0]=0xff;
   init_code_b[1]=0xff;
   init_code_b[2]=0xff;*/

   Cpu_init(); 
   Mes_init();
   Init_mb9002_ic(1);        //BLUE
   Hsio_init(BPS4800);
   Judge_work_mode();          //先判别是否要设置本机地址
   /*启动狗*/
   WDTRST = 0x1e;
   WDTRST = 0xe1;

   EA = 1; 
   TR2 = 1;
   TR0 = 1;
   main_step = 1;
   while(1)
   {


      if(TF0 == 1)
       {
         TF0 = 0 ;
         TH0 = TM20MS_H ;
         TL0 = TM20MS_L ;
         watch_dog_time = 0;                //主循环10MS清0一次
         Diva_sts_hd();
		 Write_flash_hd();                   //管理flash写的状态
         Key_hd();
		 Led_hd();
//		 Trm_hd();
         Message_hd();		 
		 Backup_hd();
         switch(main_step)
         {
          case 1:	

					Key_prc();
				    main_step++;
                    break;
          case 2:
		           
                    Disp_prc();      	    
                    main_step++;
                break;
          case 3:
                   Backup_prc();
                   main_step++;
                   break;
          case 4:
		            Led_prc();        
                    main_step++;
                   break;
          case  5:
		                                        
                    main_step = 1;
                   break;
		  default:
		            main_step = 1;
					break;
          }
       }
   }
}

   
/************************************************/
/************************************************/
void Cpu_init(void)
{
    DISP_CTR_PORT = 1;
	LED_CTR = 1;          //led off
	EA = 0 ;           //disable all interrupt
/*   timer0 20ms no interrupt */
//	TMOD = 0x01 ;  
    IE = 0x00 ;
    TR0 = 0 ;                 // disable timer
	TR1 = 0 ;
	TMOD = 0x01 ;       
	TH0 = TM20MS_H ;
	TL0 = TM20MS_L ; 
	Timer2_init();
	return;      
}



/************************************************/
/************************************************/
/* 下列函数用于判断当前话机的工作状态*/
void Diva_sts_hd(void) 
{
   
  	  DIVA_STATUS_PORT = 1; 
      now_port_F = DIVA_STATUS_PORT ;   //读端口状态
   
     if(now_port_F == 0)         //话机处于呼叫打开状态时
     {
         if(pre_port_F == 1)     //刚呼叫      
         {
            pre_port_F = now_port_F ;
        
            if(read_mes_F == 1)         //如果正在看信息   
            {
 //               MES_SW = SW_OFF;        //关闭信息通道
//				mes_sw_F = 0; 
                CALL_SW = SW_OFF;          
		        sw_delay = TM60MS;      //等待信息通道继电器切换完成时间
	        }
	        else
	        {
	           call_disp_F = 1 ;      //现在话机正处于呼叫状态
			   CALL_SW = SW_OFF;
			}
	     }
	     else if(call_disp_F == 0)
	     {
	         if(sw_delay != 0)
	            sw_delay--;
	         else
	         {
//	            CALL_SW = SW_OFF;         //恢复到默认状态
                MES_SW = SW_OFF;
				mes_sw_F = 0;
		        call_disp_F = 1;
	         }
	     }
	}
	else if(now_port_F == 1)		 
    {
	    if(pre_port_F == 0)              //呼叫结束时
	    {
	        pre_port_F = now_port_F ;
            call_disp_F = 0;		
			if(read_mes_F == 1)         
			{
			   	CALL_SW = SW_ON ;
			    sw_delay = TM60MS;
			}	
//			sw_delay = TM50MS;
	    }
	    if(read_mes_F == 1 )          //只有在待机状态时才能去阅读信息,此时
	    {                             //需要把二个继电器全部切换
		   if(sw_delay!=0)
			   sw_delay--;            //等待呼叫通道切换到空闲状态
//		   else if(MES_SW == SW_OFF)   //呼叫通道切换已完成,而信息通道还没切换过来则
		   else if(mes_sw_F == 0)
           {
		      MES_SW = SW_ON;
			  mes_sw_F = 1;
			  DISP_CTR_PORT = DISP_ON;       //话机CFP = 0;
 			  sw_delay=TM800MS;
		   }
		   else                       //
		      DISP_CTR_PORT = DISP_OFF;     //话机CFP不须一直维持0
	    }
		else                    //不在阅读状态下
		{
		   if(sw_delay!=0)      //如果30S不按键,要关断话机必须把+19V电断掉0.5S
		      sw_delay--;       //才有可能关闭话机,以防止别家正在呼叫时CALL+19V还有,关不断
		   else                 //空闲状态时切换到正常的呼叫通道中
               CALL_SW = SW_OFF;
		}
	}

}


/********************************************/
/*本函数用于判别是否要处于设置地址的工作状态*/
/********************************************/
void Judge_work_mode(void)
{
   unsigned char status_cnt=10;
   CALL_SW = 1;    //为读,先置1
   while(status_cnt == 10)
  {
      if(CALL_SW == 0)
           status_cnt++;
      else
           status_cnt--;
      Delay_10ms();
      CALL_SW = 1;    //再读,先置1
      if(CALL_SW == 0)
          status_cnt++;
      else
          status_cnt--;
   }
   if(status_cnt == 12)
   {
     work_F = 1 ;               //设置本机地址状态
	 main_step = 1;
	 TR0 = 1;
	 EA = 1;
     while(1)
	 {
	     if(TF0 == 1)
         {
           TF0 = 0 ;
           TH0 = TM20MS_H ;
           TL0 = TM20MS_L ;
		   Trm_hd();
		 }
	  }
   }
   else 
      work_F = 0 ;

}

/***************************************************/
/***************************************************/


/***************************************************/
/*   定时器2用于喂狗                               */
/***************************************************/
void Timer2_hd(void) interrupt 5
{
    EA = 0;
    TF2 = 0;
	watch_dog_time++;   //中断里5MS累加一次
	if(watch_dog_time <= 100)   //如果500ms主程序还没执行过一次的话,就认为出现了死机
    {
	   WDTRST = 0x1e;
       WDTRST = 0xe1;
	}
	EA = 1;
	Trm_hd();
	ES = 0;
	if(time_out != 0)
	   time_out--;
	 ES  = 1 ;
}

/***************************************************/
/***************************************************/
void Timer2_init(void)
{
   
	T2CON = 0x00;
	T2MOD = 0x00;
	RCAP2H = TM4MS_H;  //db
	RCAP2L = TM4MS_L;
	TH2 = TM4MS_H ;
	TL2 = TM4MS_L;
	ET2 = 1;          
}
  

⌨️ 快捷键说明

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