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

📄 366.c

📁 该程序可作为386的接警程序使用
💻 C
📖 第 1 页 / 共 3 页
字号:

void START24C02(void)     /////启动24c02
{
  scl=0;sda=1;  //用“读”来开始准备启动24C02的工作,把数据线置高,为启动的“下跳”准备
  scl=1;sda=0;  //启动
  scl=0;        //为“写”周期做准备,即准备控制线上跳。
}

void STOP24C02(void)     /////停止24C02
{
  sda=0;scl=1;
  sda=1;scl=0;            
}

bit Check24C02()    //应答位检查
{
  bit Check=0;
  sda=1;scl=1;
  Check=sda;   //接收应答信号
  scl=0;  
  return(Check);
}

void MACK(void)    //发送应答
{
 sda=0;scl=1;scl=0;sda=1;
}

void MNACK(void)   //发送非应答
{
 sda=1;scl=1;scl=0;sda=0;
}

void WriteOneByte(unsigned char dd)     ///写一个字节,已经完善,不再修改-----------------------------
{
  ACC=dd;
  sda=aa7;scl=1;scl=0;  //  数据在scl=0时才能改变
  sda=aa6;scl=1;scl=0;
  sda=aa5;scl=1;scl=0;
  sda=aa4;scl=1;scl=0;
  sda=aa3;scl=1;scl=0;
  sda=aa2;scl=1;scl=0;
  sda=aa1;scl=1;scl=0;
  sda=aa0;_nop_();scl=1;scl=0;
  sda=0;                  //令总线处于备用状态
}

unsigned char ReadOneByte(void)       /////读一个字节-------------------------------
{
  sda=1;
  scl=1;aa7=sda;scl=0;sda=1;
  scl=1;aa6=sda;scl=0;sda=1;
  scl=1;aa5=sda;scl=0;sda=1;
  scl=1;aa4=sda;scl=0;sda=1;
  scl=1;aa3=sda;scl=0;sda=1;
  scl=1;aa2=sda;scl=0;sda=1;
  scl=1;aa1=sda;scl=0;sda=1;
  scl=1;aa0=sda;scl=0;
  return(ACC);
}
//---------------------------------------写整个数组到24c02----------------------------------//

void Write24C02_Array(Number NUMBERW)
                                 /////入口参数为待传送数组
{
  unsigned char NUMSERIAL;  
  unsigned char NUMBYT=NUMBERW[1]+1;      //取组成员个数
  unsigned char i;
  bit Check_bit;
  NUMSERIAL=NUMBERW[0];   //取组的序号

  switch(NUMSERIAL)             //设定数组存放起始位置
  {
   case 1: NUMSERIAL=102; break;  //数组1的起始位置=0 长24位
   case 2: NUMSERIAL=124;break; //数组2的起始位置=21 长13位
   case 3: NUMSERIAL=144;break; //数组3的起始位置=34 长13位
   case 4: NUMSERIAL=164;break; //数组4的起始位置=47 长13位
   case 5: NUMSERIAL=184;break; //数组5的起始位置=60 长13位
   case 6: NUMSERIAL=204;break; //数组6的起始位置=73 长13位
   case 7: NUMSERIAL=224;break; //数组7的起始位置=86 长5 位
   case 8: NUMSERIAL=230;break; //数组8的起始位置=90 长2位
   case 9: NUMSERIAL=233;break; //数组9的起始位置=91 长3位

  } 
    for(i=1;i<=NUMBYT;i++)
      {
       startWrite:  START24C02();     //START24C02()执行完后,scl=0,sda=0
       WriteOneByte(160);            //寻址字节为0A0H,“写”;执行完后,scl=0,sda=0
       Check_bit=Check24C02();      //校验应答位;执行完后,scl=0,sda不管
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(NUMSERIAL);      //确定片内寻址地址
       Check_bit=Check24C02();      //校验应答位
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;

       WriteOneByte(NUMBERW[i]);  //原数组把组的序号放在“0”位置,组成员个数放在“1”位置
       Check_bit=Check24C02();
       if(Check_bit==1)              //如果出错,从新启动总线
       goto startWrite;
     
       STOP24C02();                 //执行完后,scl=0,sda=1
       NUMSERIAL=NUMSERIAL+1;
     } 
}//---------------------------------------写整个数组到24c02结束----------------------------------//


//-----------------------------------读内容到整个结构,数组开始------------------------------------------//
struct ReadArray Read24C02_Array(unsigned char NUMSERIAL)
{
 bit Check_bit;
 unsigned char i;
 struct ReadArray READARRAY;
  switch(NUMSERIAL)             //设定数组存放起始位置
  {
   case 1: NUMSERIAL=102; break; //数组1的起始位置=0 长20位
   case 2: NUMSERIAL=124;break; //数组2的起始位置=20 长13位
   case 3: NUMSERIAL=144;break; //数组3的起始位置=33 长13位
   case 4: NUMSERIAL=164;break; //数组4的起始位置=46 长13位
   case 5: NUMSERIAL=184;break; //数组5的起始位置=59 长13位
   case 6: NUMSERIAL=204;break; //数组6的起始位置=72 长13位
   case 7: NUMSERIAL=224;break; //数组7的起始位置=85 长5 位
   case 8: NUMSERIAL=230;break; //数组8的起始位置=89 长2位
   case 9: NUMSERIAL=233;break; //数组9的起始位置=90 长3位
  } 
 
  startRead:  START24C02();
   WriteOneByte(160);            //寻址字节为0A0H,“写”
   Check_bit=Check24C02();      //校验应答位
   if(Check_bit==1)              //如果出错,从新启动总线
   goto startRead;
   
   WriteOneByte(NUMSERIAL);      //确定片内寻址地址
   Check_bit=Check24C02();      //校验应答位
   if(Check_bit==1)              //如果出错,从新启动总线
   goto startRead;
   STOP24C02();            //  执行完后,scl=0,sda=1

  startReadD: START24C02();
   WriteOneByte(161);            //寻址字节为0A1H,“读”
   Check_bit=Check24C02();      //校验应答位
   if(Check_bit==1)              //如果出错,从新启动总线
   goto startReadD;
      
   READARRAY.Number24[1]=ReadOneByte();  //读出本组有多少个成员,[0]位预留,组成员个数放在[1]位置
                                         //执行“读”完后,scl=0,sda任意
   if(READARRAY.Number24[1]==0)
      MNACK();    
   else
    {
   MACK();                               //发送校验
       for(i=0;i<READARRAY.Number24[1];i++)
      {
       READARRAY.Number24[i+2]=ReadOneByte();
       if(i<READARRAY.Number24[1]-1)
         MACK();
       else MNACK();
      } 
    }
  STOP24C02();
  return(READARRAY);
}//---------------------------读内容到整个结构,数组结束------------------------------------------//

//------------------------------处理在一次下位机发送报警信息来过程中的读取 ,存储----------------------------------//

void READ_MESSAGE()    
{ 
  
  unsigned char Number_Note=0;   //记录是第几个“下位机输入信号”
  unsigned char Number_Key;          //存储“电话机输入键值”的中间变量
  Number NUMBER;       //生成记录一次摘机过程的数组  
  JISHU=5000;          //配合晶振,等待1秒
       
  ReadStatus: MT8880_StatusRegister_READ(); 
   
   if(MT8880_D2==1)     //是否有键值生成             
    {
        MT8880_CP2=0; //停动8880总线 
        MT8880_CS=1;  //停动8880总线

     MT8880_DataRegister_READ();   //读入的一个值出现在MT8880_D0-D3
     
     if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1)  //输入“1” 
       {Number_Key=1; }
     if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0)  //输入“2” 
       {Number_Key=2; }
     if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1)  //输入“3” 
       {Number_Key=3; } 
     if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0)  //输入“4” 
       {Number_Key=4; } 
     if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==1)  //输入“5” 
       {Number_Key=5; }
     if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==0)  //输入“6” 
       {Number_Key=6;  }
     if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==1)  //输入“7” 
       {Number_Key=7;} 
     if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==0)  //输入“8” 
       {Number_Key=8;}
     if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1)  //输入“9” 
       {Number_Key=9; }
     if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0)  //输入“0” 
       {Number_Key=0; }
     if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1)  //输入“*” 
       {Number_Key=11;}
     if(MT8880_D3==1 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0)  //输入“#” 
       {Number_Key=12;}
       
       MT8880_CP2=0; //停动8880总线
       MT8880_CS=1;  //停动8880总线
     
    if(Number_Note>=7) // 已经处理了6次数据
        {
         J_LineToPhone=1;  //模拟挂机
         _nop_(); _nop_(); //指令冗余

     //    NUMBER[4]=0; NUMBER[5]=0; NUMBER[3]=0;
         goto SERIAL;                   //发送给上位机
         _nop_(); _nop_(); //指令冗余
         return;       //软件陷阱
         _nop_(); _nop_(); //指令冗余
         return;       //软件陷阱
        }
     else
        {
         if(Number_Note==0)
         {Number_Note=Number_Note+1;JISHU=5000;goto ReadStatus;}  //丢弃误读的366自己发的握手信号
         NUMBER[Number_Note-1]=Number_Key;  //把键值写入数组
         Number_Note=Number_Note+1;
         JISHU=5000;  
         _nop_(); _nop_(); //指令冗余   
         goto ReadStatus; 
         _nop_(); _nop_(); //指令冗余
         J_LineToPhone=1; //模拟挂机
         return;       //软件陷阱                   
        }
 
   }
  else    //没有生成键值时

⌨️ 快捷键说明

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