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

📄 386_cq.c

📁 C开发的报警程序
💻 C
📖 第 1 页 / 共 5 页
字号:
//------------------2006年3月6日版,是适用重庆高新区第一小学的唯一版本,与366通信握手等待时间缩短--------------------//
  //#include "stdio.h"
  #include "string.h"
  #include <reg52.h>
  #include <intrins.h>
  #include <math.h>
  //#include <absacc.h>


#if 0
#define p 9 
#define l 10 
#endif
//---------------------------------------定义部分----------------------------------------------
//P1
sbit LS164_CP=        P1^0;  //触发OUT     时钟,上升沿 
sbit LS164_AB=        P1^1;  //OUT     串行输入
sbit ISD1420_RECLED=  P1^2;  //IN      录音状态监视,放音完状态监视
sbit ISD1420_PLAYL=   P1^3;  //OUT     语音存储芯片的电平放音方式  单片机4脚
sbit MT8880_D0=       P1^4;  //OUT/IN  双向数据总线
sbit MT8880_D1=       P1^5;  //OUT/IN  双向数据总线
sbit MT8880_D2=       P1^6;  //OUT/IN  双向数据总线
sbit MT8880_D3=       P1^7;  //OUT/IN  双向数据总线

//P3
sbit MT8880_RW=       P3^0;  //OUT     读写选择控制
sbit MT8880_CP2=      P3^1;  //OUT     8880的系统时钟
sbit Sound_Du=        P3^2;  //OUT     发出嘟叫声
sbit MT8880_CS=       P3^3;  //OUT     8880的片选
sbit MT8880_RS0=      P3^4;  //OUT     8880的寄存器选择,配合读写脚,控制读/写控制/数据寄存器
sbit Control_Listen=  P3^5;  //OUT     变低时,进入现场监听状态
sbit scl=             P3^6;  //OUT     I2C总线控制线
sbit sda=             P3^7;  //OUT     I2C总线数据线

//P0
sbit DY=              P0^0;  //OUT     电源LED指示
sbit NOP1=            P0^1;  //NOP     空脚
sbit KD9561_START=    P0^2;  //OUT     启动KD9561输出 
sbit ISD1420_REC_ZJ=  P0^3;  //OUT/IN  录音按钮按下时,与REC脚相连,并监视编程模式下电话是否摘机
sbit FQ4_NC_IN=       P0^4;  //IN      防区4常闭输入
sbit FQ123_NC_IN=     P0^5;  //IN      防区1,2,3常闭输入
sbit NOP2=            P0^6;  //NOP     空脚
sbit HX2272_D3=       P0^7;  //IN      遥控解码器数据总线输入

//P2
sbit BJ=              P2^0;  //OUT     报警LED指示,并送给LM393    
sbit LINE_ALARM=      P2^1;  //IN      电话线路故障报警开关
sbit ToneTest=        P2^2;  //IN      峰值为3.5V的铃流脉冲信号检测
sbit J_LineToPhone=   P2^3;  //OUT     报警时,驱动继电器切断本地电话和外线的联系,同时模拟摘机  
sbit HX2272_VT=       P2^4;  //IN      平时为低,无线解码有效就变高
sbit HX2272_D0=       P2^5;  //IN      遥控解码器数据总线输入 
sbit HX2272_D1=       P2^6;  //IN      遥控解码器数据总线输入
sbit HX2272_D2=       P2^7;  //IN      遥控解码器数据总线输入

bit FLAG_BF;        //初始状态布防标志=0,不布防
bit FLAG_ZJ; 
bit FLAG_BJ;
bit FLAG_BF_YS;
bit FLAG_YHZJ;    
int Time_DU;
int JISHUMORE; 
unsigned char j,jj,k,ToneTime_XUNHUAN3,LOCK_JS;  
bit FLAG_Tone;
bit FLAG_BB;FLAG_COMMOND;
bit FLAG_366; 
bit Reset;
unsigned char FLAG_LOCK,FLAG_FIRST;
unsigned char FLASH_DY;
typedef unsigned char Number[22];      //定义一个20字节长的数组类型,用来放6组电话,一组密码,次数振铃,报警延迟时间
typedef unsigned char Number_P[5];
struct ReadArray 
 {
  unsigned char Number24[22];
 }READARRAY;  


sbit aa7=ACC^7;
sbit aa6=ACC^6;
sbit aa5=ACC^5;
sbit aa4=ACC^4;
sbit aa3=ACC^3;
sbit aa2=ACC^2;
sbit aa1=ACC^1;
sbit aa0=ACC^0;


//--------------------------------------函数部分-----------------------------------------------
void LED_DRIVER(bit D7,bit D6,bit D5,bit D4,bit D3,bit D2,bit D1,bit D0) 
{
  LS164_AB=D7;  LS164_CP=1;  LS164_CP=0;
  LS164_AB=D6;  LS164_CP=1;  LS164_CP=0; 
  LS164_AB=D5;  LS164_CP=1;  LS164_CP=0;
  LS164_AB=D4;  LS164_CP=1;  LS164_CP=0;
  LS164_AB=D3;  LS164_CP=1;  LS164_CP=0;
  LS164_AB=D2;  LS164_CP=1;  LS164_CP=0;
  LS164_AB=D1;  LS164_CP=1;  LS164_CP=0;
  LS164_AB=D0;  LS164_CP=1;  LS164_CP=0;

} 

void DELAY(unsigned char time_delay)
{
 unsigned char i;
 for(i=0;i<time_delay;i++)
 {
 TMOD=0; //13位不重装定时器方式
 TL0=4;
 TH0=6;
 TCON=0;
 TR0=1; //定时器0启动,定时器1不启动
 wait: if(TF0==0)
      {
       NOP2=0;
       goto wait;
      }   
 }
 TCON=0;//停动定时器0
}

void DELAY_50ms()
{
 EA=0;
 TMOD=0; //13位不重装定时器方式
 TL0=48;
 TH0=24;
 TCON=0;
 TR0=1; //定时器0启动,定时器1不启动
 wait: if(TF0==0)
      {
       NOP2=0;
       goto wait;
      }   
 TCON=0;//停动定时器0
}

void DELAY_20ms()
{
 EA=0;
 TMOD=1; //16位不重装定时器方式
 TL0=246;
 TH0=252;
 TCON=0;
 TR0=1; //定时器0启动,定时器1不启动
 wait: if(TF0==0)
      {
       goto wait;
      }   
 TCON=0;//停动定时器0
}

void DELAY_025ms(unsigned char t_delay)
{
 unsigned char ii;
 for(ii=0;ii<t_delay;ii++)
 {
 TMOD=1; //16位不重装定时器方式
 TL0=246;
 TH0=255;
 TCON=0; 
 TR0=1; //定时器0启动,定时器1不启动 
 wait: if(TF0==0)
      {
       NOP2=0;
       goto wait;
      } 
 TCON=0;
 TMOD=0;  
 }
 //TCON=0;//停动定时器0
 //TMOD=0;
} 

void LED_DISPLAY(void) 
{
  LED_DRIVER(0,0,0,0,0,1,1,0); //显示“1”
  DELAY(2);
  LED_DRIVER(1,1,0,1,1,0,1,0); //显示“2”
  DELAY(2);
  LED_DRIVER(1,1,0,0,1,1,1,0); //显示“3”
  DELAY(2);
  LED_DRIVER(1,0,0,0,0,1,1,1); //显示“4”
  DELAY(2);
  LED_DRIVER(1,1,0,0,1,1,0,1); //显示“5”
  DELAY(2);
  LED_DRIVER(1,1,0,1,1,1,0,1); //显示“6”
  DELAY(2);
  LED_DRIVER(0,1,0,0,0,1,1,0); //显示“7”
  DELAY(2);
  LED_DRIVER(1,1,0,1,1,1,1,1); //显示“8”
  DELAY(2);
  LED_DRIVER(1,1,0,0,1,1,1,1); //显示“9”
  DELAY(2);
  LED_DRIVER(0,1,0,1,1,1,1,1); //显示“0” 
  DELAY(2);  
  LED_DRIVER(1,1,0,1,0,1,1,1); //显示“A”
  DELAY(2); 
  LED_DRIVER(1,0,0,1,1,1,0,1); //显示“b”
  DELAY(2); 
  LED_DRIVER(0,1,0,1,1,0,0,1); //显示“C”
  DELAY(2); 
  LED_DRIVER(1,0,0,1,1,1,1,0); //显示“d” 
  DELAY(2);
  LED_DRIVER(0,0,0,0,0,0,0,0); //令所有数码管和BF灯全灭 
}


/* 

void int_t0(void) interrupt 1  /////定时器0中断处理程序,用来处理40ms间隔,启动定时器1
{
 if(ToneTest==0)  //过40ms再次检测到铃流,说明的确是铃流,启动定时器1
   {
    IE=0; //禁止所有中断
    EA=1;
    ET1=0;  //开定时器1中断允许
    TMOD=32;  //16位不重装定时器工作方式1
    TCON=0;
    TH1=99;
    TL1=192; //定时1s
    TR1=1;  //定时器1启动 

    }
 else FLAG_Tone=0;  //退出铃流检测状态
}
 
void int_t1(void) interrupt 3  /////定时器1中断处理程序,用来处理1s间隔
{
 if(FLAG_TIME_ZD!=4)   //不足5秒间隔,再次启动定时器1
   {
     FLAG_TIME_ZD=FLAG_TIME_ZD+1;
     IE=0; //禁止所有中断
     EA=1;
     ET1=0;  //开定时器1中断允许
     TMOD=32;  //16位不重装定时器工作方式1
     TCON=0;
     TH1=99;
     TL1=192; //定时1s
     TR1=1;  //定时器1启动

   }
 else   //到下一个铃流周期(5秒后的)           
   {
     if(ToneTest==0)
       {
         FLAG_TONE_NUMBER=FLAG_TONE_NUMBER+1;  
          //此值为已经检测到的确定的铃流个数,正在检测的不算在内
         DELAY_40MS();//进入本个铃流检测处理流程
       }
     else FLAG_Tone=0;
   } 
}

*/

void MT8880_StatusRegister_READ()
{
  
  MT8880_CP2=0; 
  MT8880_RW=1;      //读状态寄存器
  MT8880_RS0=1;
  MT8880_CS=0;
  MT8880_D0=1;         
  MT8880_D1=1;        
  MT8880_D2=1;  
  MT8880_D3=1;  
  MT8880_CP2=1; 
 
}

void MT8880_DataRegister_READ()
{
  MT8880_CP2=0;      
  MT8880_RW=1;      //读接收数据寄存器
  MT8880_RS0=0;
  MT8880_CS=0;    //给时钟信号
  MT8880_D0=1;         
  MT8880_D1=1;        
  MT8880_D2=1;  
  MT8880_D3=1;
  MT8880_CP2=1;  //读状态寄存器值到D0-D3口
  
}

void MT8880_ControlRegister_Initialize()
{ 
  MT8880_CP2=0;
 
  MT8880_RS0=1;   //du 1  
  MT8880_RW=1;
  MT8880_CS=0; 
  MT8880_D0=1;        
  MT8880_D1=1;       
  MT8880_D2=1;  
  MT8880_D3=1; 
  MT8880_CP2=1;
  MT8880_CP2=0;
  MT8880_CS=1;

  MT8880_RS0=1;  //xie 1
  MT8880_RW=0;
  MT8880_CS=0;
  MT8880_D0=0;         
  MT8880_D1=0;        
  MT8880_D2=0;  
  MT8880_D3=0; 
  MT8880_CP2=1; 
  MT8880_CP2=0;
  MT8880_CS=1; 

  MT8880_RS0=1;  //xie2
  MT8880_RW=0; 
  MT8880_CS=0;     
  MT8880_D0=0;       
  MT8880_D1=0;        
  MT8880_D2=0;  
  MT8880_D3=0;
  MT8880_CP2=1; 
  MT8880_CP2=0;
  MT8880_CS=1;

  MT8880_RS0=1;  //xie3
  MT8880_RW=0; 
  MT8880_CS=0;     
  MT8880_D0=0;       
  MT8880_D1=0;        
  MT8880_D2=0;  
  MT8880_D3=1;
  MT8880_CP2=1; 
  MT8880_CP2=0;
  MT8880_CS=1;


  MT8880_RS0=1;  //xie4
  MT8880_RW=0; 
  MT8880_CS=0;     
  MT8880_D0=0;       
  MT8880_D1=0;        
  MT8880_D2=0;  
  MT8880_D3=0;
  MT8880_CP2=1; 
  MT8880_CP2=0;
  MT8880_CS=1;

  MT8880_RS0=1;  //du 2
  MT8880_RW=1; 
  MT8880_CS=0; 
  MT8880_D0=1;         
  MT8880_D1=1;        
  MT8880_D2=1;  
  MT8880_D3=1; 
  MT8880_CP2=1;
  MT8880_CP2=0;
  MT8880_CS=1;
  
  MT8880_D0=1;  //总线复位       
  MT8880_D1=1;        
  MT8880_D2=1;  
  MT8880_D3=1;
   
}


void MT8880_ControlRegister_Write()
{
  MT8880_CS=1;

  MT8880_RW=0;      //写控制寄存器

⌨️ 快捷键说明

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