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

📄 366.lst

📁 该程序可作为386的接警程序使用
💻 LST
📖 第 1 页 / 共 4 页
字号:
 239          
C51 COMPILER V6.10  366                                                                    01/16/2006 16:07:10 PAGE 5   

 240          
 241          void START24C02(void)     /////启动24c02
 242          {
 243   1        scl=0;sda=1;  //用“读”来开始准备启动24C02的工作,把数据线置高,为启动的“下跳”准备
 244   1        scl=1;sda=0;  //启动
 245   1        scl=0;        //为“写”周期做准备,即准备控制线上跳。
 246   1      }
 247          
 248          void STOP24C02(void)     /////停止24C02
 249          {
 250   1        sda=0;scl=1;
 251   1        sda=1;scl=0;            
 252   1      }
 253          
 254          bit Check24C02()    //应答位检查
 255          {
 256   1        bit Check=0;
 257   1        sda=1;scl=1;
 258   1        Check=sda;   //接收应答信号
 259   1        scl=0;  
 260   1        return(Check);
 261   1      }
 262          
 263          void MACK(void)    //发送应答
 264          {
 265   1       sda=0;scl=1;scl=0;sda=1;
 266   1      }
 267          
 268          void MNACK(void)   //发送非应答
 269          {
 270   1       sda=1;scl=1;scl=0;sda=0;
 271   1      }
 272          
 273          void WriteOneByte(unsigned char dd)     ///写一个字节,已经完善,不再修改-----------------------------
 274          {
 275   1        ACC=dd;
 276   1        sda=aa7;scl=1;scl=0;  //  数据在scl=0时才能改变
 277   1        sda=aa6;scl=1;scl=0;
 278   1        sda=aa5;scl=1;scl=0;
 279   1        sda=aa4;scl=1;scl=0;
 280   1        sda=aa3;scl=1;scl=0;
 281   1        sda=aa2;scl=1;scl=0;
 282   1        sda=aa1;scl=1;scl=0;
 283   1        sda=aa0;_nop_();scl=1;scl=0;
 284   1        sda=0;                  //令总线处于备用状态
 285   1      }
 286          
 287          unsigned char ReadOneByte(void)       /////读一个字节-------------------------------
 288          {
 289   1        sda=1;
 290   1        scl=1;aa7=sda;scl=0;sda=1;
 291   1        scl=1;aa6=sda;scl=0;sda=1;
 292   1        scl=1;aa5=sda;scl=0;sda=1;
 293   1        scl=1;aa4=sda;scl=0;sda=1;
 294   1        scl=1;aa3=sda;scl=0;sda=1;
 295   1        scl=1;aa2=sda;scl=0;sda=1;
 296   1        scl=1;aa1=sda;scl=0;sda=1;
 297   1        scl=1;aa0=sda;scl=0;
 298   1        return(ACC);
 299   1      }
 300          //---------------------------------------写整个数组到24c02----------------------------------//
 301          
C51 COMPILER V6.10  366                                                                    01/16/2006 16:07:10 PAGE 6   

 302          void Write24C02_Array(Number NUMBERW)
 303                                           /////入口参数为待传送数组
 304          {
 305   1        unsigned char NUMSERIAL;  
 306   1        unsigned char NUMBYT=NUMBERW[1]+1;      //取组成员个数
 307   1        unsigned char i;
 308   1        bit Check_bit;
 309   1        NUMSERIAL=NUMBERW[0];   //取组的序号
 310   1      
 311   1        switch(NUMSERIAL)             //设定数组存放起始位置
 312   1        {
 313   2         case 1: NUMSERIAL=102; break;  //数组1的起始位置=0 长24位
 314   2         case 2: NUMSERIAL=124;break; //数组2的起始位置=21 长13位
 315   2         case 3: NUMSERIAL=144;break; //数组3的起始位置=34 长13位
 316   2         case 4: NUMSERIAL=164;break; //数组4的起始位置=47 长13位
 317   2         case 5: NUMSERIAL=184;break; //数组5的起始位置=60 长13位
 318   2         case 6: NUMSERIAL=204;break; //数组6的起始位置=73 长13位
 319   2         case 7: NUMSERIAL=224;break; //数组7的起始位置=86 长5 位
 320   2         case 8: NUMSERIAL=230;break; //数组8的起始位置=90 长2位
 321   2         case 9: NUMSERIAL=233;break; //数组9的起始位置=91 长3位
 322   2      
 323   2        } 
 324   1          for(i=1;i<=NUMBYT;i++)
 325   1            {
 326   2             startWrite:  START24C02();     //START24C02()执行完后,scl=0,sda=0
 327   2             WriteOneByte(160);            //寻址字节为0A0H,“写”;执行完后,scl=0,sda=0
 328   2             Check_bit=Check24C02();      //校验应答位;执行完后,scl=0,sda不管
 329   2             if(Check_bit==1)              //如果出错,从新启动总线
 330   2             goto startWrite;
 331   2      
 332   2             WriteOneByte(NUMSERIAL);      //确定片内寻址地址
 333   2             Check_bit=Check24C02();      //校验应答位
 334   2             if(Check_bit==1)              //如果出错,从新启动总线
 335   2             goto startWrite;
 336   2      
 337   2             WriteOneByte(NUMBERW[i]);  //原数组把组的序号放在“0”位置,组成员个数放在“1”位置
 338   2             Check_bit=Check24C02();
 339   2             if(Check_bit==1)              //如果出错,从新启动总线
 340   2             goto startWrite;
 341   2           
 342   2             STOP24C02();                 //执行完后,scl=0,sda=1
 343   2             NUMSERIAL=NUMSERIAL+1;
 344   2           } 
 345   1      }//---------------------------------------写整个数组到24c02结束----------------------------------//
 346          
 347          
 348          //-----------------------------------读内容到整个结构,数组开始------------------------------------------/
             -/
 349          struct ReadArray Read24C02_Array(unsigned char NUMSERIAL)
 350          {
 351   1       bit Check_bit;
 352   1       unsigned char i;
 353   1       struct ReadArray READARRAY;
 354   1        switch(NUMSERIAL)             //设定数组存放起始位置
 355   1        {
 356   2         case 1: NUMSERIAL=102; break; //数组1的起始位置=0 长20位
 357   2         case 2: NUMSERIAL=124;break; //数组2的起始位置=20 长13位
 358   2         case 3: NUMSERIAL=144;break; //数组3的起始位置=33 长13位
 359   2         case 4: NUMSERIAL=164;break; //数组4的起始位置=46 长13位
 360   2         case 5: NUMSERIAL=184;break; //数组5的起始位置=59 长13位
 361   2         case 6: NUMSERIAL=204;break; //数组6的起始位置=72 长13位
 362   2         case 7: NUMSERIAL=224;break; //数组7的起始位置=85 长5 位
C51 COMPILER V6.10  366                                                                    01/16/2006 16:07:10 PAGE 7   

 363   2         case 8: NUMSERIAL=230;break; //数组8的起始位置=89 长2位
 364   2         case 9: NUMSERIAL=233;break; //数组9的起始位置=90 长3位
 365   2        } 
 366   1       
 367   1        startRead:  START24C02();
 368   1         WriteOneByte(160);            //寻址字节为0A0H,“写”
 369   1         Check_bit=Check24C02();      //校验应答位
 370   1         if(Check_bit==1)              //如果出错,从新启动总线
 371   1         goto startRead;
 372   1         
 373   1         WriteOneByte(NUMSERIAL);      //确定片内寻址地址
 374   1         Check_bit=Check24C02();      //校验应答位
 375   1         if(Check_bit==1)              //如果出错,从新启动总线
 376   1         goto startRead;
 377   1         STOP24C02();            //  执行完后,scl=0,sda=1
 378   1      
 379   1        startReadD: START24C02();
 380   1         WriteOneByte(161);            //寻址字节为0A1H,“读”
 381   1         Check_bit=Check24C02();      //校验应答位
 382   1         if(Check_bit==1)              //如果出错,从新启动总线
 383   1         goto startReadD;
 384   1            
 385   1         READARRAY.Number24[1]=ReadOneByte();  //读出本组有多少个成员,[0]位预留,组成员个数放在[1]位置
 386   1                                               //执行“读”完后,scl=0,sda任意
 387   1         if(READARRAY.Number24[1]==0)
 388   1            MNACK();    
 389   1         else
 390   1          {
 391   2         MACK();                               //发送校验
 392   2             for(i=0;i<READARRAY.Number24[1];i++)
 393   2            {
 394   3             READARRAY.Number24[i+2]=ReadOneByte();
 395   3             if(i<READARRAY.Number24[1]-1)
 396   3               MACK();
 397   3             else MNACK();
 398   3            } 
 399   2          }
 400   1        STOP24C02();
 401   1        return(READARRAY);
 402   1      }//---------------------------读内容到整个结构,数组结束------------------------------------------//
 403          
 404          //------------------------------处理在一次下位机发送报警信息来过程中的读取 ,存储-------------------------
             ----------//
 405          
 406          void READ_MESSAGE()    
 407          { 
 408   1        
 409   1        unsigned char Number_Note=0;   //记录是第几个“下位机输入信号”
 410   1        unsigned char Number_Key;          //存储“电话机输入键值”的中间变量
 411   1        Number NUMBER;       //生成记录一次摘机过程的数组  
 412   1        JISHU=5000;          //配合晶振,等待1秒
 413   1             
 414   1        ReadStatus: MT8880_StatusRegister_READ(); 
 415   1         
 416   1         if(MT8880_D2==1)     //是否有键值生成             
 417   1          {
 418   2              MT8880_CP2=0; //停动8880总线 
 419   2              MT8880_CS=1;  //停动8880总线
 420   2      
 421   2           MT8880_DataRegister_READ();   //读入的一个值出现在MT8880_D0-D3
 422   2           
 423   2           if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1)  //输入“1” 
C51 COMPILER V6.10  366                                                                    01/16/2006 16:07:10 PAGE 8   

 424   2             {Number_Key=1; }
 425   2           if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0)  //输入“2” 
 426   2             {Number_Key=2; }
 427   2           if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1)  //输入“3” 
 428   2             {Number_Key=3; } 
 429   2           if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0)  //输入“4” 
 430   2             {Number_Key=4; } 
 431   2           if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==1)  //输入“5” 
 432   2             {Number_Key=5; }
 433   2           if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==0)  //输入“6” 
 434   2             {Number_Key=6;  }
 435   2           if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==1)  //输入“7” 
 436   2             {Number_Key=7;} 
 437   2           if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==0)  //输入“8” 
 438   2             {Number_Key=8;}
 439   2           if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1)  //输入“9” 
 440   2             {Number_Key=9; }
 441   2           if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0)  //输入“0” 
 442   2             {Number_Key=0; }
 443   2           if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1)  //输入“*” 
 444   2             {Number_Key=11;}
 445   2           if(MT8880_D3==1 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0)  //输入“#” 
 446   2             {Number_Key=12;}
 447   2             
 448   2             MT8880_CP2=0; //停动8880总线
 449   2             MT8880_CS=1;  //停动8880总线
 450   2           
 451   2          if(Number_Note>=7) // 已经处理了6次数据
 452   2              {
 453   3               J_LineToPhone=1;  //模拟挂机
 454   3               _nop_(); _nop_(); //指令冗余
 455   3      
 456   3           //    NUMBER[4]=0; NUMBER[5]=0; NUMBER[3]=0;
 457   3               goto SERIAL;                   //发送给上位机
 458   3               _nop_(); _nop_(); //指令冗余
 459   3               return;       //软件陷阱
 460   3               _nop_(); _nop_(); //指令冗余
 461   3               return;       //软件陷阱
 462   3              }
 463   2           else
 464   2              {
 465   3               if(Number_Note==0)
 466   3               {Number_Note=Number_Note+1;JISHU=5000;goto ReadStatus;}  //丢弃误读的366自己发的握手信号
 467   3               NUMBER[Number_Note-1]=Number_Key;  //把键值写入数组
 468   3               Number_Note=Number_Note+1;
 469   3               JISHU=5000;  
 470   3               _nop_(); _nop_(); //指令冗余   
 471   3               goto ReadStatus; 
 472   3               _nop_(); _nop_(); //指令冗余
 473   3               J_LineToPhone=1; //模拟挂机
 474   3               return;       //软件陷阱                   
 475   3              }
 476   2       
 477   2         }
 478   1        else    //没有生成键值时
 479   1         {   
 480   2             MT8880_CP2=0; //停动8880总线 
 481   2             MT8880_CS=1;  //停动8880总线
 482   2             JISHU=JISHU-1;      
 483   2            if(JISHU!=0)  

⌨️ 快捷键说明

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