📄 386_cq.c
字号:
//------------------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 + -