📄 报警器.c
字号:
//函数名:void I2cDelay()
//函数功能:I2C延时
//制作者:
//日期:08-03-15
//============================================
void I2cDelay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//============================================
//函数名:void I2cStart()
//函数功能:I2C起始条件
//制作者:
//日期:08-03-15
//============================================
void I2cStart()
{
SDA=1;
_nop_();
SCL=1;
I2cDelay();
SDA=0;
I2cDelay();
SCL=0; //钳住I2C总线,准备发送或接收数据
_nop_();
}
//============================================
//函数名:void I2cStop()
//函数功能:I2C停止条件
//制作者:
//日期:08-03-15
//============================================
void I2cStop()
{
SDA=0;
_nop_();
SCL=1;
I2cDelay();
SDA=1;
I2cDelay();
}
//============================================
//函数名:void I2cAck()
//函数功能:发ACK应答
//制作者:
//日期:08-03-15
//============================================
void I2cAck()
{
SDA=0;
_nop_();
SCL=1;
I2cDelay();
SCL=0;
_nop_();
}
//============================================
//函数名:void I2cNoAck()
//函数功能:发NOACK应答
//制作者:
//日期:08-03-15
//============================================
void I2cNoAck()
{
SDA=1;
_nop_();
SCL=1;
I2cDelay();
SCL=0;
_nop_();
}
//============================================
//函数名:bit WaitAck()
//函数功能:等待应答
//制作者:
//日期:08-03-15
//============================================
bit WaitAck()
{
uchar Time=255;
SDA=1;
_nop_();
SCL=1;
I2cDelay();
while(SDA)
{
Time--;
if(Time==0)
{
I2cStop();
return (0);
}
}
SCL=0;
_nop_();
return (1);
}
//============================================
//函数名:void I2cWriteByte(uchar Data)
//函数功能:I2C写一字节数据
//制作者:
//日期:08-03-15
//============================================
void I2cWriteByte(uchar Data)
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
I2cDelay();
SDA=(bit)(Data&0x80);
Data<<=1;
I2cDelay();
SCL=1;
I2cDelay();
}
SCL=0;
}
//============================================
//函数名:uchar I2cReadByte()
//函数功能:I2C读一字节数据
//制作者:
//日期:08-03-15
//============================================
uchar I2cReadByte()
{
uchar i,TmpData=0;
SDA=1;
for(i=0;i<8;i++)
{
SCL=0;
I2cDelay();
SCL=1;
I2cDelay();
TmpData<<=1;
TmpData|=SDA;
}
SCL=0;
return(TmpData);
}
//============================================
//函数名:void I2cWrite(uchar Address,uchar Data)
//函数功能:I2C写数据到AT24C02
//制作者:
//日期:08-03-15
//============================================
void I2cWrite(uchar Address,uchar Data)
{
I2cStart(); //启动总线
I2cWriteByte(0xA0);//发送器件地址
WaitAck();
I2cWriteByte(Address);//发送器件子地址
WaitAck();
I2cWriteByte(Data);//发送数据
WaitAck();
I2cStop();
}
//============================================
//函数名:uchar I2cRead(uchar Address)
//函数功能:I2C从AT24C02读数据
//制作者:
//日期:08-03-15
//============================================
uchar I2cRead(uchar Address)
{
uchar TmpData;
I2cStart();//启动总线
I2cWriteByte(0xA0);//发送器件地址
WaitAck();
I2cWriteByte(Address);//发送器件子地址
WaitAck();
I2cStart();//启动总线
I2cWriteByte(0xA1);//发送器件地址
I2cAck();
TmpData=I2cReadByte();//读取数据
I2cNoAck();
I2cStop();
return(TmpData);
}
//============================================
//函数名:void mode2(void)interrupt 1
//函数功能:定时器0
//制作者:
//日期:08-03-15
//============================================
void mode2(void) interrupt 1 //报警模式2
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256; //50ms的中断
count++;
if(count==20) //1S 的中断
{
seconds++;
count=0;
if(seconds==120) //如果120秒钟内没解除 报警则报警
{
if(alarm_flag==1)
spk_flag=1; //报警
TR0=0; //关闭定时器
}
}
}
//============================================
//函数名:void main()
//函数功能:主函数
//制作者:
//日期:08-03-15
//============================================
void main()
{
spk_flag=0;
P1=0x0f;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;
EA=1;
code_set();
setalarm();
while(1)
{
/*******遥控和报警信号****************/
//读取P1口的值,即触发地点及遥控的值
if((P1&0x0f)!=0x0f)
{
Indata=P1;
//如果P1口的值有改变则执行
if(Indata!=Indata2)
{
Indata1=Indata;
Indata2=Indata;
}
//如果是热释电传感器则马上报警
if((Indata1>2)&&(Indata1<8)&&alarm_flag)
spk_flag=1;
//如果是门磁则执行
if((Indata>=8)&&(Indata<=16)&&alarm_flag)
{
if(mode==1) //报警方式1门磁一触发则报警
{
spk_flag=1;
}
if(mode==2)
{
TR0=1; //启动定时器0
}
}
//遥控置位报警
if(Indata1==1)
{
setalarm();
}
if(Indata1==2) //遥控清零报警
{
Indata1=0;
spk_flag=0;
alarm_flag=0;
beep();
display_buffer[1]=0x11;
}
}
display_buffer[0]=Indata;
/*************按键*************/
if(key_flag()) //如果有键按下则执行此
{
keycode= keyscan(); //取得键值
if(keycode==0xf0) //如果按了密码设置键(f0)则置位密码设置标志位
{
Lbeep();
codeset_flag=1;
codeinput();
code_read();
if(coderight())
{
codeset_flag=1;
codeinput();
code_set();
CodeBuff[2]='\0'; //在这加一个干扰信号,破坏缓存
}
else
{
display_buffer[1]=0x0e;
alarm_flag=1;
}
}
else if(keycode==0xf2)//按下设置报警,置位报警位
{
setalarm();
}
else if(keycode==0xf3)//按下清除报警,清零报警位
{
Lbeep();
codeset_flag=1;
codeinput(); //输入密码
code_read(); //从24C 02读出原来的密码用于校验
if(coderight()) //如果输入密码正确则执行
{
alarm_flag=0;
display_buffer[1]=0x11;
CodeBuff[2]='\0'; //在这加一个干扰信号,破坏缓存
}
else //如果密码不正确则显示E
{
display_buffer[1]=0x0e;
alarm_flag=1;
}
}
else if(keycode==0xf1)//如果按下MODE键则更改模式
{
mode++;
if(mode==3)
mode=1;
display_buffer[1]= mode;
}
else if(keycode==0xfb||keycode==0xff);
//这里什么都不做
else
display_buffer[1]=keycode; //否则显示键值
}
display();
alarm();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -