📄 报警器.c
字号:
//----------------------------------------------
//毕业设计名称:报警器
//设计者:
//时间:08-03-15
//----------------------------------------------
#include"reg51.h"
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
//LED 显示数字 0 1 2 3 4 5 6 7 8 9 a b c d e f .
uchar code led[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x01,0x00};
//0到F的16个键值
uchar code table[4][4]={{0xf0,0x01,0x02,0x03},
{0xf1,0x04,0x05,0x06},
{0xf2,0x07,0x08,0x09},
{0xf3,0xfb,0x00,0xff}};
//显示缓存
uchar display_buffer[]={0,0};
//密码缓存 初始值为123456
uchar CodeBuff[7]={1,2,3,4,5,6,'\0'};
//读出密码用的缓存
uchar readcode[7]={1,2,3,4,5,6,'\0'};
//密码输入标志: 1为可输入模式 0为非密码输入模式
uchar codeset_flag=0;
//报警标志:1为报警有效 0为报警无效
uchar alarm_flag=1;
//键盘代码缓存 暂存变量
uchar keycode,tmp;
//报警输入变量 mode为报警模式选择,共两种模式,初始值为1
uchar Indata,Indata1,Indata2,mode=1;
//蜂鸣器响应标志 1响应 0不响应
uchar spk_flag;
//定时器的秒计数值
uint seconds=0;
//计次数
uchar count=0;
/*****引脚定义*****/
sbit SPK=P0^4;
sbit LED1=P0^2;
sbit LED2=P0^3;
sbit DATA164=P0^0;
sbit CLK164=P0^1;
sbit SDA=P3^6;
sbit SCL=P3^7;
/*****函数声明***********/
void Send_164(uchar i);
void delay50ms(uint i);
void delay(void);
unsigned char keyscan(void) ;
bit key_flag(void);
void display(void);
void beep(void);
void code_set(void);
void delaydsp(uint i);
void code_read(void) ;
void codeinput(void);
void alarm();
//24c02的声明
void I2cDelay();
void I2cStart();
void I2cStop();
void I2cAck();
void I2cNoAck();
bit WaitAck();
void I2cWriteByte(uchar Data);
uchar I2cReadByte();
void I2cWrite(uchar Address,uchar Data);
uchar I2cRead(uchar Address);
//============================================
//函数名:void Send_164(uchar i)
//函数功能:写164
//制作者:
//日期:08-03-15
//============================================
void Send_164(uchar i)
{
uchar j;
for(j=0;j<8;j++)
{
CLK164=0;
DATA164=(led[i]>>j)&0x01;
CLK164=1;
}
}
//============================================
//函数名:void delay50ms(uint i)
//函数功能:延时50ms
//制作者:
//日期:08-03-15
//============================================
void delay50ms(uint i)
{
uint j;
for(;i>0;i--)
for(j=6245;j>0;j--);
}
//============================================
//函数名:void delay50ms(uint i)
//函数功能:小延时
//制作者:
//日期:08-03-15
//============================================
void delay(void)
{
uchar i;
for(i=200;i>0;i--) ;
}
//============================================
//函数名:void delaydsp(uint i)
//函数功能:显示但延时
//制作者:
//日期:08-03-15
//============================================
void delaydsp(uint i)
{
for(;i>0;i--)
display();
}
//============================================
//函数名:unsigned char keyscan(void)
//函数功能:键盘扫描
//制作者:
//日期:08-03-15
//============================================
unsigned char keyscan(void)
{
unsigned char hang,lie,key;
P2=0xf0;
if(P2!=0xf0)
{
switch(P2&0xf0)
{
case 0x70:hang=0;break; //行扫描
case 0xb0:hang=1;break;
case 0xd0:hang=2;break;
case 0xe0:hang=3;break;
}
P2=0x0f;
switch(P2&0x0f)
{
case 0x07:lie=0;break; //列扫描
case 0x0b:lie=1;break;
case 0x0d:lie=2;break;
case 0x0e:lie=3;break;
}
beep();
while(P2!=0x0f)
display();
key=table[hang][lie]; // 等待按键放开
}
else
key=0;
return (key);
}
//============================================
//函数名:bit key_flag(void)
//函数功能:检测有无按键按下
//制作者:
//日期:08-03-15
//============================================
bit key_flag(void)
{
P2=0xf0;
if(P2==0xf0)
return(0);
else
return(1);
}
//============================================
//函数名:void display(void)
//函数功能:显示程序
//制作者:
//日期:08-03-15
//============================================
void display(void)
{
Send_164(display_buffer[1]);
LED2=1;
delay();
LED2=0;
Send_164(display_buffer[0]);
LED1=1;
delay();
LED1=0;
}
//============================================
//函数名:void beep(void)
//函数功能:短BEEP
//制作者:
//日期:08-03-15
//============================================
void beep(void)
{
SPK=1;
delaydsp(20);
SPK=0;
}
//============================================
//函数名:void Lbeep(void)
//函数功能:长BEEP
//制作者:
//日期:08-03-15
//============================================
void Lbeep(void)
{
SPK=1;
delaydsp(300);
SPK=0;
}
//============================================
//函数名:void code_set(void)
//函数功能:写入密码
//制作者:
//日期:08-03-15
//============================================
void code_set(void)
{
uchar i;
for(i=0;i<6;i++)
{
I2cWrite(i,CodeBuff[i]);//从密码缓存写入24C02
delaydsp(10);
}
CodeBuff[2]='\0'; //在这加一个干扰信号,破坏缓存
}
//============================================
//函数名:void code_read(void)
//函数功能:读出密码从24C02到单片机缓存
//制作者:
//日期:08-03-15
//============================================
void code_read(void)
{
uchar i;
for(i=0;i<6;i++)
{
readcode[i] = I2cRead(i);
delaydsp(10);
}
}
//============================================
//函数名:uchar coderight(void)
//函数功能:密码校验
//制作者:
//日期:08-03-15
//============================================
uchar coderight(void)
{
return(!strcmp(readcode,CodeBuff));
}
//============================================
//函数名:void codeinput(void)
//函数功能:密码输入到缓存
//制作者:
//日期:08-03-15
//============================================
void codeinput(void)
{
tmp=0;
while(codeset_flag) //如果密码设置标志为1则执行这里
{
display_buffer[0]=tmp+1;
if(key_flag()) //如果有键按下则执行此
{
keycode= keyscan();
if(keycode==0xf0||keycode==0xf3) //如果再按下密码设置键(f0)或 报警标志清零键(f3)则清除密码设置标志位
{
codeset_flag=0;
}
if(keycode<10)
display_buffer[1]=keycode; //显示键值
if(keycode==0xff) //如果按下了解认键(0xff)则将当前键值存入密码缓存,并进入下一位密码设置
{
delaydsp(50);
beep(); //双BEEP提示
CodeBuff[tmp]=display_buffer[1]; //将键值存入缓存 为什么存入的是业示缓存的而不是keycode的数据呢? 因为如果不是存显存里的数据的话将会全部存入OXFF键值
tmp++; //缓存地址加1
display_buffer[1]=0x10;
}
if(keycode==0xfb)
tmp--; //如果按下0xfb则返回设置上一个密码
if(tmp>=6) //如果已设置6个密码则完成设置
{
codeset_flag=0;//密码设置标志清零
tmp=0;
// code_set();//将密码写入24C02
beep(); //蜂呜提示
}
}
alarm();
display();
}
}
//============================================
//函数名:void setalarm(void)
//函数功能:调置报警
//制作者:
//日期:08-03-15
//============================================
void setalarm(void)
{
Indata1=0;
alarm_flag=1;
beep();
delaydsp(100);
beep();
display_buffer[1]=0x10;
SPK=spk_flag;
}
//============================================
//函数名:void alarm()
//函数功能:报警
//制作者:
//日期:08-03-15
//============================================
void alarm()
{
if(spk_flag&&alarm_flag)
SPK=1;
else
SPK=0;
}
/***************24c02的程序*******************/
//============================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -