找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1133|回复: 3
打印 上一主题 下一主题
收起左侧

AVR M16 楼宇对讲主机

[复制链接]
跳转到指定楼层
楼主
ID:371859 发表于 2018-7-15 11:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <iom16v.h>
#include <avrdef.h>
#define  uchar unsigned char
#define  uint unsigned int
#define fosc 6000000
#define baud 1200
#define dat164 PB1
#define scl164 PB2
#define ledpow PB0
#define keypow PB3
#define unlock PB4

#pragma data:code
const unsigned char tabopen[]={0xff,0XC8,0X86,0X8C,0XC0};
const unsigned char tabbyby[]={0xff,0x7f,0x7f,0x91,0x83};
const unsigned char tabcall[]={0xff,0xc7,0xc7,0x88,0xC6};
const unsigned char tab1[]={0xff,0xf7,0xfb,0xfd,0xfe,0Xf0,0xf0,0xf1,0xf3,0xf7,0xfF,0X00};
const unsigned char tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x7F,0xc7,0xbf};
const unsigned char tabsp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8c,0x92};
const unsigned char tabpk[]={0xff,0x86,0xa1,0xa3,0xc6};
const unsigned char tabset[]={0xff,0x7f,0xce,0x86,0x92};
const unsigned char taberr[]={0xff,0x7F,0xAF,0xAF,0x86};
const unsigned char tabcenter[]={0xff,0x7f,0xc8,0x86,0xc6};
const unsigned char tabof1[]={0xff,0XC0,0x7f,0x0E,0XC0};
const unsigned char tabon1[]={0xff,0xF9,0x7f,0X48,0XC0};
const unsigned char tabnew[]={0xff,0x7f,0xc1,0X86,0XC8};
const unsigned char tabagai[]={0xff,0x4f,0x88,0xC2,0x88};
const unsigned char tabssof[]={0xff,0x8e,0XC0,0x92,0x92};
const unsigned char tabsson[]={0xff,0XC8,0XC0,0x92,0x92};
const unsigned char tabgood[]={0xff,0xa1,0xc0,0xc0,0x90};
#pragma data:data

unsigned char spdisplay[6];  //对讲倒计时
unsigned char display1[6];  //待机显示
unsigned char display[6];  //显示缓存
unsigned char tabdat[8];   //标串口发送数据
unsigned char rxdat[8];   //标串口接收数据
unsigned char keynum[10];  //键值
unsigned char zhujima[8]; //主机地址码

unsigned char key,key1,s60b=60,timeout,d=0,spesc,syspkey,roomp,s8556;

unsigned int k,f,j,sb;                                       //f:待机显示累加 k:按键数量

/*********************************模拟串口定义***********************************************/

#define GET_RX() (PIND & (1<<PIND3))     /* 接收电平值 */
#define SET_TX() (PORTD |= (1<<PORTD4))  /* 发送高电平 */
#define CLR_TX() (PORTD &= ~(1<<PORTD4)) /* 发送低电平 */

unsigned char rx_fifo[10]; /* 仿串口接收数据 */
unsigned char tx_fifo[10]; /* 仿串口发送数据 */
unsigned char rx_pos;           /* 队列中最后接收数据位置 */
unsigned char read_pos;         /* 队列中最后读取数据位置 */
unsigned char tx_pos;           /* 队列中最后发送数据位置 */
unsigned char write_pos;        /* 队列中最后写入数据位置 */
unsigned char rx_buf;           /* 接收字节缓冲 */
unsigned char tx_buf;           /* 发送字节缓冲 */
unsigned char rx_bit;  /* 接收帧位计数 */
unsigned char tx_bit;  /* 发送帧位计数volatile */
unsigned char turn;

/* 数据帧结构 frame */
flash enum xx_bit {BIT_0 = 0,BIT_1,BIT_2,BIT_3,BIT_4,BIT_5,BIT_6,BIT_7,BIT_STOP,BIT_IDLE,BIT_START,};

/**********************************模拟串口程序*********************************************/

/* 变量初始化 */
void var_init(void)
{
    rx_pos = 0;
    read_pos = 0;
    tx_pos = 0;
    write_pos = 0;
    rx_bit = BIT_IDLE;  /* 定义初始收发位为空闲位 */
    tx_bit = BIT_IDLE;
    turn = 0;
}

/* 配置定时器 */
void timer0_init(void)
{
    TCCR0 = ((1<<CS00)|(1<<CS01)|(1<<WGM01)); /*//64分频  CTC模式 */
    TIMSK = (1<<OCIE0);               /* 比较匹配中断使能 */
    OCR0 = 78; /* 比较值77、78,104,103(8M),定时器频率: 6.0MHz/((78+1)*64) =1186.7 Hz */
    TCNT0 = 0;
}


/* 从接收队列读1字节 */
unsigned char rx_byte(void)
{      
           if(rx_pos!=0){return;}
         if (++read_pos == 10)
            read_pos = 0;
                        return rx_fifo[read_pos];
}


/* 向发送队列写1字节 */
void tx_byte(void)//(unsigned char data)
{
    if (++write_pos == 10)
        write_pos = 0;
    tx_fifo[write_pos];// = data;
}



/* 定时器读周期处理函数 */
void rx_turn_isr(void)
{  
    switch (rx_bit) {           /* 根据当前帧位执行相应操作 */
    case BIT_IDLE:
        if (!GET_RX())          /* 检测起始位, 以判断是否有数据待收 */
            rx_bit = BIT_0;
        break;
    case BIT_0:                 /* 开始接收数据 */
    case BIT_1:
    case BIT_2:
    case BIT_3:
    case BIT_4:
    case BIT_5:
    case BIT_6:
    case BIT_7:
        if (GET_RX())           /* 根据端口电平, 写接收缓冲相应位 */
            rx_buf |= (1 << rx_bit);
        else
            rx_buf &= ~(1 << rx_bit);
        rx_bit++;
        break;
    case BIT_STOP:
        if (GET_RX()) { /* 检测停止位, 出现帧错误则丢弃数据, 否则写入接收队列 */
            if (++rx_pos == 10)
                                rx_pos = 0;
            rx_fifo[rx_pos] = rx_buf;
        }
        rx_bit = BIT_IDLE;
               
        break;
    }
}


/* 定时器写周期处理函数 */
void tx_turn_isr(void)
{
    switch (tx_bit) {           /* 根据当前帧位执行相应操作 */
    case BIT_START:
        CLR_TX();               /* 输出起始位 */
        tx_bit = BIT_0;
        break;
    case BIT_0:                 /* 开始发送数据 */
    case BIT_1:
    case BIT_2:
    case BIT_3:
    case BIT_4:
    case BIT_5:
    case BIT_6:
    case BIT_7:
        if (tx_buf & (1 << tx_bit)) /* 根据待发数据位信息, 控制发送端电平 */
            SET_TX();
        else
            CLR_TX();
        tx_bit++;
        break;
    case BIT_STOP:
    case BIT_IDLE:
        SET_TX();
        if (tx_pos != write_pos) { /* 检测是否有待发数据, 无则发送空闲位 */
            if (++tx_pos == 10)
               tx_pos = 0;
                 //tx_buf = tx_fifo[tx_pos];
                // tx_bit = BIT_START;
                                // turn=0;
                                // delay1(10);
                                // break;}
                    tx_buf = tx_fifo[tx_pos];
            tx_bit = BIT_START;
        } else {
            tx_bit = BIT_IDLE;
        }
               
        break;
    }
}

/* 定时器中断处理函数 */
#pragma interrupt_handler timer0_isr:20
void timer0_isr(void)
{

    switch (turn) {
   case 0:               ///* 读周期 */
        rx_turn_isr();
        break;
    case 1:               /* 写周期 */
        tx_turn_isr();
        break;
    }
}

/***********************************标串口配置****************************************/

void USART_Init(void)  //串口初始化
{
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许收发,打开接收中断
UBRRL=(fosc/16/(baud+1))%256;   //设置波特率寄存器0xa0 ;
UBRRH=(fosc/16/(baud+1))/256;    //0x01 ;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP
}

void USART_Tx(uchar data) //发送采用查询方式
{TIMSK = ~(1<<OCIE0);
  while(!(UCSRA&(1<<UDRE)));//上次发送有没有完成
  UDR=data;                       //发送数据
  NOP();
UCSRA |= (1<<6);
TIMSK = (1<<OCIE0);
}

#pragma interrupt_handler uart0_rx:12
void uart0_rx(void)
{ uint y;
TIMSK = ~(1<<OCIE0);
   for(y=0;y<200;y++)
   {
    if(UCSRA&(1<<RXC))//有没有接收到数据
    {
    rxdat[d]=UDR;   
    d++;
    if(rxdat[0]==0){d=0;}
    if(d==8)
      {d=0;
       if(rxdat[0]+rxdat[1]+rxdat[2]+rxdat[3]+rxdat[4]+rxdat[5]+rxdat[6]!=rxdat[7])
       {d=0;datrest();}
      }
     }
           NOP();
       NOP();
       NOP();
  }
  d=0;
  TIMSK = (1<<OCIE0);
}

/*************************************写内部eeprom配置************************************/

void write_eeprom(uint add,uchar dat)
{
  while(EECR&(1<<EEWE));                      //等待上一次写操作结束
  EEAR=add;
  EEDR=dat;                                   //设置地址和数据寄存器
  EECR|=(1<<EEMWE);                           //置位EEWME,硬件清零
  EECR|=(1<<EEWE);                            //置位EEWE用来启动写操作,硬件清零
}

uchar read_eeprom(uint add)
{
  while(EECR&(1<<EEWE));                      //等待上一次写操作结束
  EEAR=add;
  EECR|=(1<<EERE);                            //置位EERE来启动读操作
  return(EEDR);
}


/*********************************端口初始化**********************************************/

void port_init(void)
{
  DDRA=0X00;              //显示
  PORTA=0X0F;
  DDRB=0X1F;              //164\ledpow\keypow\unlock
  PORTB=0X07;
  DDRD|=BIT(5);           //蜂鸣器
  PORTD&=~BIT(5);

  DDRD &= ~BIT(3);         /* PD3输入 仿串口 */
  DDRD |= BIT(4);          /* PD4输出 仿串口 */
  PORTD |= (1<<PORTD4);

  DDRB|=BIT(5)|BIT(4)|BIT(3);
  DDRD|=BIT(7)|BIT(6);
  PORTB&=~BIT(5)|BIT(4)|BIT(3);
  PORTD&=~BIT(7)|BIT(6);

}

//**********************仿串延时约2MS********************************************

void delay1(uint ms)      
{ uint i,jj;
for(i=0;i<ms;i++)
{for(jj=0;jj<12000;jj++);}
}

//**********************仿串延时约2MS********************************************

void delay2(uint ms)      
{ uint i,jj;
for(i=0;i<ms;i++)
{for(jj=0;jj<10;jj++)
   {xinshi();}}
}

void delay(uint ms)      
{
uint i,jj;
for(i=0;i<ms;i++)
{for(jj=0;jj<750;jj++);}
}

//*************************************************164发送显示数据

void sendbyte(uchar displaybyte)               
{ uchar i;
  for(i=0;i<8;i++)
  {
    if(displaybyte&0x80)
      {PORTB|=BIT(dat164);}
    else
      {PORTB&=~BIT(dat164);}
       displaybyte <<= 1;
       PORTB&=~BIT(scl164);
       NOP();
       NOP();
       NOP();
       PORTB|=BIT(scl164);
       NOP();
       NOP();
       NOP();
  }
}


//****************************************************串口接收缓冲初始化
void datrest(void)
{
   uchar i;
   for(i=0;i<8;i++)
   {rxdat[i]=0;}
    d=0;
}

//***************************************************仿串口接收缓冲初始化
void datrest1(void)
{ uchar i;
  TIMSK=~(1<<OCIE0);           
  timer0_init();
  var_init();
  TIMSK = (1<<OCIE0);
  for(i=0;i<10;i++)
  {rx_fifo[i]=0x00;}
}

//****************************************************倒计时显示缓冲
void spyiwei(void)   
{
spdisplay[4]=tabsp[11];
spdisplay[3]=tabsp[10];
spdisplay[2]=tabsp[s60b/10];
spdisplay[1]=tabsp[s60b%10];
}


//****************************************************待机显示
void xinshiw(void)  
{
    f++;
        if(f<1000)
        {
        sendbyte(tab[16]);
        sendbyte(tab[16]);
        sendbyte(tab[16]);
        sendbyte(tab[16]);
        PORTB&=~BIT(ledpow);
        delay(1);
        PORTB|=BIT(ledpow);
        }
        else
         {if(f>999&&f<2000)
            {       
             PORTB|=BIT(ledpow);
             delay(1);
             }
                else
                 {
                  f=0;
                  }
          }
}

//******************************************************输入操作显示
void xinshi(void)   
{     uchar x;
          for(x=4;x>0;x--)
          {
           sendbyte(display[x]);}
           PORTB&=~BIT(ledpow);
           delay(1);
           PORTB|=BIT(ledpow);
}

//—————————————————————————特定符号操作显示
void xinshi1(void)   
{     uchar x;
          for(x=4;x>0;x--)
          {
           sendbyte(display1[x]);}
           PORTB&=~BIT(ledpow);
           delay(1);
           PORTB|=BIT(ledpow);
}

//*************************************************call字符显示数据发送
void call(void)
{
  unsigned char x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabcall[x]);
   }
   PORTB&=~BIT(ledpow);
   delay(1);
   PORTB|=BIT(ledpow);
}          

//**************************************************  60秒对讲倒计时显示数据发送
void sp60(void)
{  uchar x;
  sb++;
   for(x=4;x>0;x--)
     {
      spyiwei();
      sendbyte(spdisplay[x]);
          }
      PORTB&=~BIT(ledpow);  
      delay(1);
      PORTB|=BIT(ledpow);
  if(sb==500)
    {sb=0;
     s60b--;
         if(s60b==0){s60b=60;timeout=1;}
         }              
}

//******************************************************开锁显示数据发送
void open(void)   
{ uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabopen[x]);
   }
   PORTB|=BIT(4);
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

//*********************************************************结束显示数据发送
void byby(void)   
{ uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabbyby[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

//**********************************************************显示键值与数据移位  
void xinshiyiwei(void)   
{   
    display[4]=display[3];
    display[3]=display[2];
        display[2]=display[1];
        display[1]=tab[key];
               
        keynum[9]=keynum[8];
        keynum[8]=keynum[7];
    keynum[7]=keynum[6];
        keynum[6]=keynum[5];
    keynum[5]=keynum[4];
    keynum[4]=keynum[3];
        keynum[3]=keynum[2];
    keynum[2]=keynum[1];
    keynum[1]=keynum[0];
    keynum[0]=key;
       
        k++;        //按键数
        j=0;    //时间累加清零
}

//********************************************************显示“————”与数据移位
void xinshiyiwei1(uchar tb)   
{   
    display1[4]=display1[3];
    display1[3]=display1[2];
        display1[2]=display1[1];
        display1[1]=tab[tb];
       
}

//************************************************出错"ERR"显示字符数据发送
void pkeyerr(void)
{
  uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(taberr[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

//**********************************************CEN显示字条数据发送
void center(void)
{
  uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabcenter[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

//************************************************出错"on.1"显示字符数据发送
void ON1(void)
{
  uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabon1[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

//************************************************出错"of.1"显示字符数据发送
void OF0(void)
{
  uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabof1[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

void new(void)
{
  uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabnew[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

void agai(void)
{
  uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabagai[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

void ssof(void)
{
  uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabssof[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

void sson(void)
{
  uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabsson[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}

void good(void)
{
uchar x;
  for(x=4;x>0;x--)
  {
   sendbyte(tabgood[x]);
   }
  PORTB&=~BIT(ledpow);  
  delay(1);
  PORTB|=BIT(ledpow);
}
//***********************************************************显示缓冲初始化
void xinshiint(void)  
{
  display[1]=0x7f;
  display[2]=0x7f;
  display[3]=0x7f;
  display[4]=0x7f;
}

//***********************************************************键盘扫描

uchar anjianon(void)  //按键有无按下
{ uchar temp;
    DDRA=0XFF;
    PORTA=0X0f;
        DDRA=0Xf0;
    temp=PINA;
        if(temp!=0x0f)
        delay(1);
        temp=PINA;
        if(temp!=0x0f){DDRA=0XFF;return 1;}
        else{DDRA=0XFF;return 0;}
}

void anjian(void)          //键值查找
{   uchar temp,i=0Xf7,a;

        if(anjianon())
        {PORTD|=BIT(5);
         delay(5);
         PORTD&=~BIT(5);
         if(anjianon())
          {
            do{
                        i=(i<<1|i>>7);
                        PORTA=i;
                        DDRA=0Xf0;
                        temp=PINA;
                        a=temp&0x0f;
                        }
                while(a==0x0f);
               
                switch(temp)
                {
                         case(0X77):key=15;break;//f
                         case(0X7b):key=14;break;//e
                         case(0X7d):key=13;break;//d密码
                         case(0X7e):key=12;break;//c

                         case(0Xb7):key=11;break;//b#确认
                         case(0Xbb):key=9;break;//9
                         case(0Xbd):key=6;break;//6
                         case(0Xbe):key=3;break;//3

                         case(0Xd7):key=0;break;//0
                         case(0Xdb):key=8;break;//8
                         case(0Xdd):key=5;break;//5
                         case(0Xde):key=2;break;//2

                         case(0Xe7):key=10;break;//a取消
                         case(0Xeb):key=7;break;//7
                         case(0Xed):key=4;break;//4
                         case(0Xee):key=1;break;//1
                        }                       
               }
                   while(anjianon())
                   {delay(100);}
                        xinshiyiwei();
                        xinshiyiwei1(18);
                 }
        }
               
void anjian1(void)          //键值查找
{   uchar temp,i=0Xf7,a;

        if(anjianon())
        {PORTD|=BIT(5);
         delay(5);
         PORTD&=~BIT(5);
         if(anjianon())
          {
            do{
                        i=(i<<1|i>>7);
                        PORTA=i;
                        DDRA=0Xf0;
                        temp=PINA;
                        a=temp&0x0f;
                        }
                while(a==0x0f);
                switch(temp)
                   {
                    case(0Xe7):key1=10;break;//取消
                        case(0X7e):key1=12;break;//c
                        case(0Xb7):key1=11;break;//b
                        default: ; break;
                   }                       
           }
     }
  }

//****************************************************************标串发送数据

void senddata(void)   
{  uchar i,temp;
     for(i=0;i<8;i++)
         {temp=tabdat[i];
          USART_Tx(temp);               
          }
}
       
//*******************************************************************发送仿串数据
void senddata1(void)   
{  uchar i;
     turn=1;
         delay1(5);
         for(i=10;i>0;i--)
         {tx_byte();
         delay1(1);}
}

//*****************************************************************呼叫管理中心数据格式  
void  sendcenter(uchar odd)
{     uchar i;
      for(i=0;i<6;i++)
          {read_eeprom(i+100);
           zhujima[i]=EEDR;
           }
           tx_fifo[1]=odd;//呼叫码
           tx_fifo[2]=0x00;
           tx_fifo[3]=0x00;
           tx_fifo[4]=0x00;
           tx_fifo[5]=0x00;
           tx_fifo[6]=zhujima[5]<<4|zhujima[4];
           tx_fifo[7]=zhujima[3]<<4|zhujima[2];
           tx_fifo[8]=zhujima[1]<<4|zhujima[0];
           tx_fifo[9]=0x00;//zhujima[1]<<4|zhujima[0];
           tx_fifo[0]=0xff&(tx_fifo[9]+tx_fifo[1]+tx_fifo[2]+tx_fifo[3]+tx_fifo[4]+tx_fifo[5]+tx_fifo[6]+tx_fifo[7]+tx_fifo[8]) ;
          
}

//*************************************************************************主机编码数据格式
//发:88 楼栋 单元 主副 00 00 00 00 00 加和 回:88 楼栋 单元 00 04 04 04 00 00 加和  
void  setmaster(void)
{  
           tx_fifo[1]=0x88;   //命令码
           tx_fifo[2]=keynum[5]<<4|keynum[4];
           tx_fifo[3]=keynum[3]<<4|keynum[2];
           tx_fifo[4]=keynum[1]<<4|keynum[0];
           tx_fifo[5]=0x00;
           tx_fifo[6]=0x00;
           tx_fifo[7]=0x00;
           tx_fifo[8]=0x00;
           tx_fifo[9]=0x00;
           tx_fifo[0]=0xff&(tx_fifo[9]+tx_fifo[1]+tx_fifo[2]+tx_fifo[3]+tx_fifo[4]+tx_fifo[5]+tx_fifo[6]+tx_fifo[7]+tx_fifo[8]) ;
         
}

//***********************************************************************楼外到楼内数据转换长度
void od_to_id(void)
{
    tabdat[0]=tx_fifo[1];
        tabdat[1]=tx_fifo[2];
        tabdat[2]=tx_fifo[3];
    tabdat[3]=tx_fifo[4];
        tabdat[4]=tx_fifo[5];
    tabdat[5]=tx_fifo[6];
    tabdat[6]=tx_fifo[7];
    tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);

}

//***********************************************************************楼内到楼外数据转换长度
void id_to_od(void)
{
       tx_fifo[1]=tabdat[0];   //命令码
           tx_fifo[2]=tabdat[1];
           tx_fifo[3]=tabdat[2];
           tx_fifo[4]=tabdat[3];
           tx_fifo[5]=0x00;             //互通时有不同
           tx_fifo[6]=zhujima[5]<<4|zhujima[4];
           tx_fifo[7]=zhujima[3]<<4|zhujima[2];
           tx_fifo[8]=tabdat[5];
           tx_fifo[9]=tabdat[6];
           tx_fifo[0]=0xff&(tx_fifo[9]+tx_fifo[1]+tx_fifo[2]+tx_fifo[3]+tx_fifo[4]+tx_fifo[5]+tx_fifo[6]+tx_fifo[7]+tx_fifo[8]) ;
          
}

//***********************************************************呼叫分机数据格式
void sendcall(uchar oda)  
{     uchar i;
      for(i=0;i<6;i++)
          {read_eeprom(i+100);
           zhujima[i]=EEDR;
           }
          tabdat[0]=oda;
          tabdat[1]=tabdat[4];
          tabdat[2]=keynum[3]<<4|keynum[2];
      tabdat[3]=keynum[1]<<4|keynum[0];
          tabdat[4]=zhujima[5]<<4|zhujima[4];
      tabdat[5]=0x00;//zhujima[3]<<4|zhujima[2];
      tabdat[6]=zhujima[1]<<4|zhujima[0];
      tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}

// *********************楼内通用送格式  命令码(??)+楼栋号+00+00+楼栋号+00+主副号+累加和
void sendclr(void)  
{     uchar i;
      for(i=0;i<6;i++)
          {read_eeprom(i+100); //eeprom 地址100-105为主机地址码
           zhujima[i]=EEDR;
           }
          tabdat[1]=tabdat[4];
          tabdat[2]=0x00;
      tabdat[3]=0x00;
          tabdat[4]=zhujima[5]<<4|zhujima[4];
      tabdat[5]=0x00;//zhujima[3]<<4|zhujima[2];
      tabdat[6]=zhujima[1]<<4|zhujima[0];
      tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}

//**********************************************************分机密码开锁数据格式
void roompass(void)   
{     uchar i;
      for(i=0;i<6;i++)
          {read_eeprom(i+100);
           zhujima[i]=EEDR;
           }
          tabdat[0]=0x19;
          tabdat[1]=zhujima[5]<<4|zhujima[4];
          tabdat[2]=keynum[7]<<4|keynum[6];
      tabdat[3]=keynum[5]<<4|keynum[4];
          tabdat[4]=keynum[3]<<4|keynum[2];
      tabdat[5]=keynum[1]<<4|keynum[0];
      tabdat[6]=0x00;
      tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);
}

//***************************************************************8031门禁格式化数据格式
void car8031(void)
{ uchar i;
      for(i=0;i<6;i++)
          {read_eeprom(i+100);
           zhujima[i]=EEDR;
           }
      tabdat[0]=0x48;                          //8031         
          tabdat[1]=zhujima[5]<<4|zhujima[4];
          tabdat[2]=zhujima[3]<<4|zhujima[2];//keynum[7]<<4|keynum[6];
      tabdat[3]=0x00;
          tabdat[4]=keynum[5]<<4|keynum[4];
      tabdat[5]=keynum[3]<<4|keynum[2];
      tabdat[6]=keynum[1]<<4|keynum[0];
      tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);

}

//***********************************************************************8054门禁批量注册数据格式
void car8054(void)
{

     // tabdat[0]=0x46;                          //4a      
          tabdat[1]=0x00;
          tabdat[2]=0x00;
      tabdat[3]=0x00;
          tabdat[4]=0x00;
     // tabdat[5]=0x00;                         //01         
      tabdat[6]=0x00;
      tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);

}

//***********************************************************************8051门禁单个注册数据格式
void car8051(void)
{
     uchar i;
      for(i=0;i<6;i++)
          {read_eeprom(i+100);
           zhujima[i]=EEDR;
           }
     // tabdat[0]=0x46;                          //8031         
          tabdat[1]=zhujima[5]<<4|zhujima[4];
          tabdat[2]=keynum[5]<<4|keynum[4];
      tabdat[3]=keynum[3]<<4|keynum[2];
          tabdat[4]=keynum[1]<<4|keynum[0];
      //tabdat[5]=0x00;
      tabdat[6]=0x00;
      tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);

}

//************************************************************************8051送卡号数据格式
void carnuber(void)
{
      //tabdat[0]=0x46;                          //8031         
          //tabdat[1]=zhujima[5]<<4|zhujima[4];
          tabdat[2]=keynum[9]<<4|keynum[8];
      tabdat[3]=keynum[7]<<4|keynum[6];
          tabdat[4]=keynum[5]<<4|keynum[4];
      tabdat[5]=keynum[3]<<4|keynum[2];
      tabdat[6]=keynum[1]<<4|keynum[0];
      tabdat[7]=0xff&(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]);

}


//**************************************分机*******************主机呼叫分机处理程序
void callroom(void)
{  uint w,t,m,mm;
     {k=0;
          //tabdat[0]=0x11;    //呼叫命令
          //tx_fifo[1]=0x11;    //呼叫命令
      sendcenter(0x11);
      senddata1();        //呼叫
          delay1(20);
      sendcall(0x11);
      senddata();        //呼叫
      PORTB|=BIT(5);
          PORTD|=BIT(6);
         for(t=0;t<22;t++)
           {
             w=0;
             do
                 {
                  w++;
                  if(t%2){call();}
                  else{xinshi();}
                  anjian1();
                  if(rxdat[0]==0x0a)                                                       //解码?
                  {
                   delay1(20);
                    for(mm=0;mm<30000;mm++)
                  {
                           PORTD|=BIT(7);
                   sp60();   //60s倒计算
                           if(timeout==1){s60b=60;return;}  
               if(rxdat[0]==0x22)
                           {rxdat[0]=0xff;for(m=0;m<1000;m++){open();if(rxdat[0]==0x06){for(m=0;m<500;m++){byby();}timeout=1;return;}}PORTB&=~BIT(4);}            //开锁       
               if(rxdat[0]==0x06){for(m=0;m<500;m++){byby();}timeout=1;return;} //挂机datrest();
                            anjian();
                           if(key==12||key==10||key==11){key=0;sendcall(0x15);senddata();delay1(20); timeout=1;return;}
                  }
                          }
                   if(key1==12||key1==10||key1==11){key1=0;sendcall(0x15);senddata();delay1(20);timeout=1; return;}            //取消退出
                 }
         while(w!=1100);
            }
                timeout=1; return;
          }
   }

//*************************************管理机********************主机呼叫管理机处理程序
void callcenter(void)
{  uint w,t,m,mm,i;
     k=0;
          //tx_fifo[1]=0x11;    //呼叫命令
      sendcenter(0x11);
      senddata1();        //呼叫
          delay1(40);
          turn=0;
          w=0;
          PORTB|=BIT(5);
          PORTD|=BIT(6);
         for(t=0;t<22;t++)
           {
            do
                 {
                  w++;          
                  if(t%2){call();}
                  else{center();}
                  anjian1();
                 // delay(2);                        
                  for(i=0;i<10;i++)
                  {rx_byte();}                             //模拟串口收数
                  //if(rx_fifo[0]==rx_fifo[1]+rx_fifo[2]+rx_fifo[3]+rx_fifo[4]+rx_fifo[5]+rx_fifo[6]+rx_fifo[7]+rx_fifo[8]+rx_fifo[9])
                  //{
                    if(rx_fifo[1]==0x0a)                                                       //解码?
                     { delay1(40);
                       for(mm=0;mm<30000;mm++)
                     {
                               
                                  PORTD|=BIT(7);
                      sp60();                                                             //60s倒计算
                  if(timeout==1){s60b=60;return;}  
                  if(rx_fifo[1]==0x22)
                                  {rx_fifo[1]=0x0a;for(m=0;m<1000;m++){open(); if(rx_fifo[1]==0x06){for(m=0;m<500;m++){byby();}timeout=1;return;}}PORTB&=~BIT(4);}            //开锁       
                  if(rx_fifo[1]==0x06){for(m=0;m<500;m++){byby();}timeout=1;return;} //挂机datrest();
                                  anjian1();
                                  if(key1==12||key1==10||key1==11){key1=0;sendcenter(0x15);senddata1();delay1(40);datrest1();timeout=1;return;}            //取消退出
                     }
                      }
                  // }
                   if(key1==12||key1==10||key1==11){key1=0;sendcenter(0x15);senddata1();delay1(40);datrest1(); timeout=1;;return;}            //取消退出
                 }
         while(w!=1000);
                 w=0;
            }
          }

//******************************************************楼内外数据空闲相互转发处理程序
void changdata(void)
{ uchar i;
  turn=0;
  delay1(40);
  for(i=0;i<10;i++)
     {rx_byte();}                             //模拟串口收数
         if(rx_fifo[0]==rx_fifo[1]+rx_fifo[2]+rx_fifo[3]+rx_fifo[4]+rx_fifo[5]+rx_fifo[6]+rx_fifo[7]+rx_fifo[8]+rx_fifo[9])
           {
            if(rx_fifo[1]==0xff||rx_fifo[1]==0x00){;}         //监视主机
                else{od_to_id();senddata();delay1(40);}
                  }
   if((tabdat[7])==(tabdat[0]+tabdat[1]+tabdat[2]+tabdat[3]+tabdat[4]+tabdat[5]+tabdat[6]))
   if(tabdat[0]==0xff||rx_fifo[1]==0x00){;}      //监视主机     
   else{id_to_od();senddata1();delay1(40);}

}



//******************************************************************密码开锁处理程序
void pkeyopen(void)
{ uint w,t,x,i,y;
  uchar roompkey=0;
  key=0;
  k=0;
  for(x=4;x>0;x--)
  {
    display1[x]=tabpk[x];
   }
   for(i=0;i<4;i++)
          {read_eeprom(i+110);    //EEPROM地址110-113储存公共密码
           zhujima[i]=EEDR;
           read_eeprom(i+120);    //EEPROM地址110-113储存公共密码
           zhujima[i+4]=EEDR;
           }

  for(w=0;w<10000;w++)         //约10秒内输入密码
  {  
         xinshi1();
     anjian();
         if(key==10||key==11||key==12){xinshiint();return;}          //取消退出
        if(key==14)     //********************************************系统密码设置系统开/关
         {k=0;
           for(x=4;x>0;x--) {display1[x]=tabpk[x];}
         do
            {y++;
                 xinshi1();
                 anjian();
         if((zhujima[4]==0xff)&&(zhujima[5]==0xff)&&(zhujima[6]==0xff)&&(zhujima[7]==0xff))//自动判定是否初始密码
             {for(t=0;t<10;t++)
                {w=0;
                  do
                   {w++;
                    if(t%2){ON1();}
                        else{OF0();}
                    anjian();
                                delay(1);
                    if(key==10||key==12){return;}
                    if(key==1){s8556=1;for(t=0;t<1000;t++){sson();}timeout=1;return;}
                    if(key==0){s8556=0;for(t=0;t<1000;t++){ssof();}timeout=1;return;}
                   }
                           while(w!=600);
                          }
                         timeout=1;return;
                  }
                  //for(x=4;x>0;x--){display1[x]=tabpk[x];  }//************************输入设置的系统密码
          if(k==4)
                  {
                   if((zhujima[4]==keynum[0])&&(zhujima[5]==keynum[1])&&(zhujima[6]==keynum[2])&&(zhujima[7]==keynum[3]))
                    { key=0xff;              //清键值//
                for(t=0;t<10;t++)
                  {w=0;
                   do
                    {w++;
                    if(t%2){ON1();}
                        else{OF0();}
                    anjian();
                                delay(1);
                    if(key==10||key==12){return;}
                    if(key==1){s8556=1;for(t=0;t<1000;t++){sson();}timeout=1;return;}
                    if(key==0){s8556=0;for(t=0;t<1000;t++){ssof();}timeout=1;return;}
                   }
                           while(w!=600);
                          }
                         timeout=1;return;
                  }
                   if((zhujima[4]!=keynum[0])||(zhujima[5]!=keynum[1])||(zhujima[6]!=keynum[2])||(zhujima[7]!=keynum[3]))
                   {for(t=0;t<1000;t++)        {pkeyerr();}timeout=1;return;}
                  }
                }
           while(y<5000);
         timeout=1;return;
         }

         
     if(k==4)   //******************************************************公共密码开锁            
         {
          do
            {y++;
                 xinshi1();
                 anjian();
         if((zhujima[0]==keynum[0])&&(zhujima[1]==keynum[1])&&(zhujima[2]==keynum[2])&&(zhujima[3]==keynum[3]))
             {for(t=0;t<1000;t++){open();}timeout=1; return;}
            }
           while(k==4&&y<3000);
           if(k==4){for(t=0;t<1000;t++){pkeyerr();}timeout=1;return;}
           }
         if((k==8)&&(roomp==1))//************************************************个人密码开锁
           {roompass();
            senddata();
                xinshiyiwei1(16);
                t=0;
                do
                {
                 t++;
                 if(t==1000){xinshiyiwei1(16);}
                 if(t==2000){xinshiyiwei1(16);}
                 if(t==3000){xinshiyiwei1(16);}
                 xinshi1();                 
                 if(rxdat[0]==0x1a){for(t=0;t<1000;t++){open();}timeout=1; return;}
                }
                while(t!=4000);
                for(t=0;t<1000;t++)
                {pkeyerr();}
                timeout=1;
                return;
        }
         if((k==8)&&(roomp==0)){for(t=0;t<1000;t++)        {pkeyerr();}timeout=1;return;}
        }
  timeout=1;
}

//**************************************************************************系统功能设置程序

void systemset(void)
{uint w,x,t,i,ww,temp;
  for(x=4;x>0;x--)
   {
    display1[x]=tabset[x];
   }
   k=0;
  for(w=0;w<10000;w++)
   {
    xinshi1();
        anjian();
        if(key==10||key==11||key==12){return;}          //取消退出
//***********************************************************************************主机编码


        if((k==4)&&(keynum[0]==0)&&(keynum[1]==5)&&(keynum[2]==5)&&(keynum[3]==8))  //8550
        {
         k=0;
         TIMSK=~(1<<OCIE0);
         for(x=4;x>0;x--)
       {
        display[x]=tabset[x];
        }
         for(w=0;w<10000;w++)
         {
          anjian();
          if(key==10||key==12){return;}
          xinshi();
         // delay(2);
          if((k==6)&&(keynum[0]+keynum[1]+keynum[2]+keynum[3]+keynum[4]+keynum[5]!=0))
          {for(i=0;i<6;i++){write_eeprom(i+100,keynum[i]);}
              turn=1;
                  TIMSK=(1<<OCIE0);
              delay1(5);
              setmaster();
              senddata1();
                  TIMSK=~(1<<OCIE0);
                  //datrest1();
                  turn=0;
                  ww=0;
                  delay1(1);
        do{
           ww++;
           turn=0;
           TIMSK=(1<<OCIE0);
           anjian();
           //delay2(8);
           xinshi();
           if(key==10||key==12){return;}
           for(i=0;i<10;i++)
                  {rx_byte();} //模拟串口收数  
               if(rx_fifo[1]==0x04||rx_fifo[2]==0x04||rx_fifo[3]==0x04||rx_fifo[5]==0x04||rx_fifo[6]==0x04||rx_fifo[7]==0x04){for(t=0;t<1000;t++){byby();}datrest1();timeout=1;return;}
                  // datrest1();
                }
          while(ww!=3000&&rx_fifo[6]!=0x04);
             // turn=1;
                 // TIMSK=(1<<OCIE0);
             // delay1(5);
             // tx_fifo[1]=rx_fifo[1];
             // tx_fifo[2]=rx_fifo[2];
             // tx_fifo[3]=rx_fifo[3];
             // tx_fifo[4]=rx_fifo[4];
             // tx_fifo[5]=rx_fifo[5];
             // tx_fifo[6]=rx_fifo[6];
             // tx_fifo[7]=rx_fifo[7];
             // tx_fifo[8]=rx_fifo[8];
             // tx_fifo[9]=rx_fifo[8];
             // tx_fifo[0]=0xff&(tx_fifo[9]+tx_fifo[1]+tx_fifo[2]+tx_fifo[3]+tx_fifo[4]+tx_fifo[5]+tx_fifo[6]+tx_fifo[7]+tx_fifo[8]) ;
              //senddata1();
           for(t=0;t<1000;t++){pkeyerr();}
           timeout=1;
           return;
           }
         }
          timeout=1;
           return;
   }
//******************************************************************************公共密码设置
           if((k==4)&&(keynum[0]==5)&&(keynum[1]==5)&&(keynum[2]==5)&&(keynum[3]==8))  //8555
        {
         k=0;
         for(x=4;x>0;x--)
       {
        display[x]=tabset[x];
        }
         for(w=0;w<10000;w++)
         {
          anjian();
          if(key==10||key==12){return;}
          xinshi();
         // delay(5);
          if(k==4)
          {for(i=0;i<4;i++){write_eeprom(i+110,keynum[i]); }
           for(t=0;t<1000;t++){good();}
           timeout=1;
           return;
           }
         }
           timeout=1;
           return;
   }

//*****************************************************************************门禁格式化
   if((k==4)&&(keynum[0]==1)&&(keynum[1]==3)&&(keynum[2]==0)&&(keynum[3]==8))  //8031
        {
         k=0;
         for(x=4;x>0;x--)
       {
        display[x]=tabset[x];
        }
         for(w=0;w<10000;w++)
         {
          anjian();
          if(key==10||key==12){return;}
          xinshi();
         // delay(5);
          if(k==6)
          {car8031();
           senddata();
           for(t=0;t<1000;t++){good();}
           timeout=1;
           return;
           }
         }
         timeout=1;
           return;
   }

   //*****************************************************************************门禁格式化
if((k==4)&&(keynum[0]==1)&&(keynum[1]==5)&&(keynum[2]==0)&&(keynum[3]==8))  //8051
        {
         k=0;
         for(x=4;x>0;x--)
       {
        display[x]=tabset[x];
        }
         for(w=0;w<10000;w++)
         {
          anjian();
          if(key==10||key==12){return;}
          xinshi();
          //delay(5);
         // x=1;
          if(k==6)
          {  k=0;
         tabdat[0]=0x46;                             //送卡位置
             tabdat[1]=zhujima[5]<<4|zhujima[4];
                 tabdat[5]=0x00;
                 car8051();
             senddata();
                 CLI();
                 delay1(20);
                 SEI();
                 tabdat[0]=0x4a;
             tabdat[1]=zhujima[5]<<4|zhujima[4];
                 tabdat[5]=0x01;
                 car8051();
             //senddata();
                 anjian();
             if(key==10||key==12){return;}
             for(w=0;w<12000;w++)
               {
                xinshi();
                        anjian();
                        if(key==10||key==12){return;}
                       if(k==10)
                  {k=0;
                           tabdat[0]=0x44;                         //送卡号                          
                   tabdat[1]=zhujima[5]<<4|zhujima[4];
                           carnuber();
                   senddata();
                       CLI();
                       delay1(20);
                       SEI();
                           tabdat[0]=0x4a;                                 
                   //tabdat[1]=0x00;
                           carnuber();
                   //senddata();
                   for(t=0;t<1000;t++){good();}
                           timeout=1;
                   return;
                           }
                           }
                           }
                 }
                   timeout=1;
               return;
              }

//*****************************************************************************门禁批量注册
   if((k==4)&&(keynum[0]==4)&&(keynum[1]==5)&&(keynum[2]==0)&&(keynum[3]==8))  //8054
        {
         k=0;
         for(x=4;x>0;x--)
       {
        display[x]=tabset[x];
        }
         for(w=0;w<1000;w++)
         {
          anjian();
          if(key==10||key==12){return;}
          xinshi();
          //delay1(5);
          tabdat[0]=0x46;
          tabdat[5]=0x00;
          car8054();
          senddata();
          delay1(20);
          tabdat[0]=0x4a;
          tabdat[5]=0x01;
          car8054();
          //senddata();
          for(t=0;t<1000;t++){good();}
          timeout=1;
          return;
           }
         }

//*****************************************************************************系统密码设置
    if((k==4)&&(keynum[0]==6)&&(keynum[1]==5)&&(keynum[2]==5)&&(keynum[3]==8))  //8556
        {
         k=0;
          for(i=0;i<4;i++)
          {read_eeprom(i+120);    //EEPROM地址120-123储存系统密码
           zhujima[i]=EEDR;
           }
           for(w=0;w<10000;w++)
            {
         if((zhujima[0]==0xff)&&(zhujima[1]==0xff)&&(zhujima[2]==0xff)&&(zhujima[3]==0xff))
             {
                  for(x=4;x>0;x--){display[x]=tabnew[x];}
                  //xinshi();
                  //for(t=0;t<800;t++){new();}
                  //xinshiyiwei1(16);
              for(w=0;w<10000;w++)
                {
                 anjian();
                 if(key==10||key==12){return;}
                 xinshi();
                       if(k==4)
                          {for(x=4;x>0;x--){display[x]=tabagai[x];}
                           k=0;
                       for(w=0;w<10000;w++)
                   {
                    anjian();
                    if(key==10||key==12){return;}
                    xinshi();
                //for(x=4;x>0;x--){display[x]=tabset[x];}
                          if(k==4)
                              {if((keynum[0]==keynum[4])&&(keynum[0]==keynum[4])&&(keynum[0]==keynum[4])&&(keynum[0]==keynum[4]))         
                        {for(i=0;i<4;i++){write_eeprom(i+120,keynum[i]);}
                         for(t=0;t<1000;t++){good();}
                         timeout=1;
                          return;}
                        }
                       }
                        }
                      }
                  }
                  }
                if((zhujima[0]!=0xff)&&(zhujima[1]!=0xff)&&(zhujima[2]!=0xff)&&(zhujima[3]!=0xff))
             {k=0;
                  for(x=4;x>0;x--) {display1[x]=tabpk[x];}
              for(w=0;w<10000;w++)
                {
                 anjian();
                 xinshi1();
                 if(key==10||key==11||key==12){xinshiint();return;}          //取消退出
             if(k==4)
                          {
               if((zhujima[0]==keynum[0])&&(zhujima[1]==keynum[1])&&(zhujima[2]==keynum[2])&&(zhujima[3]==keynum[3]))
                     {k=0;
                                  for(x=4;x>0;x--){display[x]=tabnew[x];}
                      for(w=0;w<10000;w++)
                        {
                         anjian();
                         if(key==10||key==12){return;}
                         xinshi();
                               if(k==4)
                                          {for(x=4;x>0;x--){display[x]=tabagai[x];}
                                            k=0;
                               for(w=0;w<10000;w++)
                             {
                              anjian();
                              if(key==10||key==12){return;}
                              xinshi();
                                    if(k==4)
                                        {if((keynum[0]==keynum[4])&&(keynum[0]==keynum[4])&&(keynum[0]==keynum[4])&&(keynum[0]==keynum[4]))         
                                  {for(i=0;i<4;i++){write_eeprom(i+120,keynum[i]); }
                                   for(t=0;t<1000;t++){good();}
                                   timeout=1;
                                   return;
                                                         }
                                                         if((keynum[0]!=keynum[4])||(keynum[0]!=keynum[4])||(keynum[0]!=keynum[4])||(keynum[0]!=keynum[4]))         
                                                         {for(t=0;t<1000;t++){pkeyerr();}timeout=1;return;}
                             }
                         }
                         }
              }
             }
                 if((zhujima[4]!=keynum[0])||(zhujima[5]!=keynum[1])||(zhujima[6]!=keynum[2])||(zhujima[7]!=keynum[3]))
                   {for(t=0;t<1000;t++)        {pkeyerr();}timeout=1;return;}
                }
           }
           }
           }
   if(k>4){for(t=0;t<1000;t++)        {pkeyerr();}timeout=1;return;}
   if((k==4)&&(keynum[0]==5)&&(keynum[1]==8)&&(keynum[2]==1)&&(keynum[3]==9))  //8054
        {
         k=0;
         for(t=0;t<10;t++)
         {w=0;
          do
           {w++;
            if(t%2){ON1();}
                else{OF0();}
            anjian();
            if(key==10||key==12){return;}
            if(key==1){roomp=1;for(t=0;t<1000;t++){good();}timeout=1;return;}
            if(key==0){roomp=0;for(t=0;t<1000;t++){good();}timeout=1;return;}
           }
       while(w!=1000);
           }
                   timeout=1;
            return;
        }
       


/**************************************************************************************/
   timeout=1;
}
}

//***************************************************************************按键处理程序

void anjiancunli(void)        
{  uint t;
  //xinshiint();
  while(k!=0&&j<12000)        
   {
     j++;
     anjian();
         if(key==14)                                                                       //呼叫管理中心
         {callcenter();
         if(timeout=1)
         {timeout=0;s60b=60;PORTB&=~BIT(4);PORTB&=~BIT(5);PORTD&=~BIT(6)|BIT(7);return;}}                                                      
         
     if(key==10||key==11||key==12){tabdat[0]=0x15;sendclr();senddata();return;}        //取消退出
         
         if(key==13){pkeyopen();if(timeout==1){timeout=0;return;}}                         //密码开锁
         
         if((k==4)&&((keynum[0]+keynum[1]+keynum[2]+keynum[3])!=0))                        //呼叫分机
         {callroom();
         if(timeout=1)
         {timeout=0;s60b=60;PORTB&=~BIT(4);PORTB&=~BIT(5);PORTD&=~BIT(6)|BIT(7);return;}}      
         
         if((k==4)&&((keynum[0]+keynum[1]+keynum[2]+keynum[3])==0))                        //系统设置
         {if(s8556==1){systemset();if(timeout==1){timeout=0;return;}}else{for(t=0;t<1000;t++){ssof();}return;}}
          
         
       
         xinshi();
   }

}
         
         


void main(void)
{ uint t;
  port_init();
  USART_Init();               
  timer0_init();              /* 配置定时器 */
  var_init();                 /* 仿串口初始化变量 */
  //UCSRB = 0x00;             //禁止串口中断
// TIMSK=~(1<<OCIE0);        //禁止定时器0中断TIMSK = (1<<OCIE0)
  SEI();
  while(1)
   {
    j=0;
        k=0;
        xinshiint();
    xinshiw();
    anjian();
        anjiancunli();
        if(rxdat[0]==0x44){for(t=0;t<1000;t++){open();}}
        //changdata();
   }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-7-15 16:47 | 只看该作者
此贴补全原理图后可获得积分
回复

使用道具 举报

板凳
ID:559423 发表于 2019-6-16 11:25 来自手机 | 只看该作者
怎么联系你
回复

使用道具 举报

地板
ID:552794 发表于 2019-6-19 08:55 | 只看该作者
工程不小。现在是否都采用tcp/ip通讯协议。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表