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

📄 报警器.c

📁 报警器单片机VC程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------
//毕业设计名称:报警器
//设计者:
//时间: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 + -