超声波门禁系统

1.题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.代码

main.c

******************************************************************************
* 文件名:超声波门禁系统
* 描  述:
* 作  者:思索与猫
* 日  期:  19/5/21
* 备  注: 
*         
******************************************************************************
#include<stc15f2k60s2.h>
#include<sys.h>
uchar shi,fen,miao,hour;
bit mode,flag_keep;
sbit buzz = P0^6;
sbit relay = P0^4;

void relay_and_buzz();

void main()
{
		static uchar index;
		UltraWave_init();      //超声波初始化
		Timer0Init();
		CloseFucker();
		Read_PIN();            //读取eeprom内PIN
		set_time(06,59,00);
		while(1)
		{
				KeyDriver();
				ShowNumber();
				relay_and_buzz();      //蜂鸣器和继电器控制
			
				if(flag_time)          //读取时间
				{
						flag_time = 0;
						miao = Ds1302_Single_Byte_Read(0x81);
						Ds1302_Single_Byte_Write(0x00,0x00);
						fen = Ds1302_Single_Byte_Read(0x83);
						Ds1302_Single_Byte_Write(0x00,0x00);
						shi = Ds1302_Single_Byte_Read(0x85);
						Ds1302_Single_Byte_Write(0x00,0x00);
						hour = shi/16+shi%16;
						if(hour >= 7&&hour <= 22)
						{
								mode = 0;
						}
						else
						{
								mode = 1;
						}
				}
				
				if(flag_wave)      //读取超声波
				{
						flag_wave = 0;
						DealDistance();
						if(mode == 0&&distance <= 30)
						{
								flag_open = 1;
						}
				}		

				if(flag_keep == 1)    //保存PIN到eeprom内
				{
						if(flag_5ms)
						{
								switch(index)
								{
									case 0:write_eeprom(PINback[0],0x00);break;
									case 1:write_eeprom(PINback[1],0x01);break;
									case 2:write_eeprom(PINback[2],0x02);break;
									case 3:write_eeprom(PINback[3],0x03);break;
									case 4:write_eeprom(PINback[4],0x04);break;
									case 5:write_eeprom(PINback[5],0x05);break;
								}
								flag_5ms = 0;
								index++;
								if(index >= 6) 
								{
										index = 0;
										flag_keep = 0;
								}
						}
				}
		}
}

void relay_and_buzz()
{
		if(flag_open)
		{
				P2 = P2&0x1f|0xa0;
				relay = 1;buzz = 0;
				P2 &= 0x1f;
		}
		else if(flag_warn)
		{
				P2 = P2&0x1f|0xa0;
				relay = 0;buzz = 1;
				P2 &= 0x1f;
		}
		else if(flag_open == 0&&flag_warn == 0)
		{
				P2 = P2&0x1f|0xa0;
				relay = 0;buzz = 0;
				P2 &= 0x1f;
		}
}

sys.c

#include<sys.h>
bit flag_time = 1,flag_wave,flag_open,flag_5ms;

void Timer0Init()		//1ms@12.000MHz
{
		AUXR |= 0x80;		
		TMOD &= 0xF0;		
		TL0 = 0x20;		
		TH0 = 0xD1;		
		TF0 = 0;		
		TR0 = 1;	
		ET0 = 1;
		EA = 1;
}

void T0_Time() interrupt 1
{
		static uint count_time = 0,count_wave = 0,count_open = 0,count_warn = 0;
		static uint count_5ms = 0;
		KeyScan();
		Display();
		
		if(++count_5ms >= 5)
		{
				count_5ms = 0;
				flag_5ms = 1;
		}
		
		if(++count_time >= 500)
		{
				count_time = 0;
				flag_time = 1;
		}
		
		if(++count_wave >= 800)
		{
				count_wave = 0;
				flag_wave = 1;
		}
		
		if(flag_open)    //开门5S
		{
				count_open++;
				if(count_open >= 5000)
				{
						count_open = 0;
						flag_open = 0;
				}
		}
		
		if(flag_warn)    //报警3S
		{
				count_warn++;
				if(count_warn >= 3000)
				{
						count_warn = 0;
						flag_warn = 0;
				}
		}
}

void CloseFucker()
{
		P2 = P2&0x1f|0xa0;
		P0 = 0xaf;
		P2 &= 0x1f;
}

void PIN_init()     //PIN初始化
{
		uchar i = 0;
		for(i=0; i<6; i++)
		{
				PIN[i] = 10;
		}
}

void Read_PIN()   //读取PIN
{
		PINback[0] = read_eeprom(0x00);
		PINback[1] = read_eeprom(0x01);
		PINback[2] = read_eeprom(0x02);
		PINback[3] = read_eeprom(0x03);
		PINback[4] = read_eeprom(0x04);
		PINback[5] = read_eeprom(0x05);
}

sys.h

#ifndef __SYS_H_
#define __SYS_H_

#include<stc15f2k60s2.h>
#include<ds1302.h>
#include<iic.h>

typedef unsigned char uchar;
typedef unsigned int uint;
	
void Timer0Init();
void CloseFucker();
void PIN_init();
void Read_PIN();

void Display();
void ShowNumber();

void KeyDriver();
void KeyAction(uchar key_value);
void KeyScan();

void UltraWave_init();
void SendWave();
void DealDistance();

extern uchar shi,fen,miao;
extern uchar view;
extern uint time,distance;
extern uchar PIN[];
extern uchar PINback[];
extern bit mode,flag_keep;
extern bit flag_time,flag_wave,flag_open,flag_warn,flag_5ms;
#endif

dispaly.c

#include<sys.h>

uchar code duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};//10black,11-
uchar PIN[6] = {10,10,10,10,10,10};
uchar PINback[6] = {6,5,4,3,2,1};
uchar disbuf[8];

void Display()
{
		static uchar index = 0;
		P2 = P2&0x1f|0xe0;
		P0 = 0xff;
		P2 &= 0x1f;
	
		P2 = P2&0x1f|0xc0;
		P0 = 1<<index;
		P2 &= 0x1f;
	
		P2 = P2&0x1f|0xe0;
		P0 = ~duan[disbuf[index]];
		P2 &= 0x1f;
		
		index++;
		index &= 0x07;
}

void ShowNumber()
{
		if(mode == 0)
		{
	 		    disbuf[0] = shi/16;
			    disbuf[1] = shi%16;
			    disbuf[2] = 11;
//				disbuf[0] = distance/100;
//				disbuf[1] = distance/10%10;
//				disbuf[2] = distance%10;				
				disbuf[3] = fen/16;
				disbuf[4] = fen%16;
				disbuf[5] = 11;
				disbuf[6] = miao/16;
				disbuf[7] = miao%16;
		}
		else if(mode == 1)
		{
				if(view == 0)        //密码输入界面
				{
						disbuf[0] = 11;
						disbuf[1] = 11;
						disbuf[2] = PIN[0];
						disbuf[3] = PIN[1];
						disbuf[4] = PIN[2];
						disbuf[5] = PIN[3];
						disbuf[6] = PIN[4];
						disbuf[7] = PIN[5];
				}
				else if(view == 1)    //旧密码确认界面
				{
						disbuf[0] = 10;
						disbuf[1] = 11;
						disbuf[2] = PIN[0];
						disbuf[3] = PIN[1];
						disbuf[4] = PIN[2];
						disbuf[5] = PIN[3];
						disbuf[6] = PIN[4];
						disbuf[7] = PIN[5];
				}
				else if(view == 2)   //新密码输入界面
				{
						disbuf[0] = 11;
						disbuf[1] = 10;
						disbuf[2] = PIN[0];
						disbuf[3] = PIN[1];
						disbuf[4] = PIN[2];
						disbuf[5] = PIN[3];
						disbuf[6] = PIN[4];
						disbuf[7] = PIN[5];
				}
				
		}

}

key.c

#include<sys.h>
#define  set 10
#define  reset 11 
#define  OK 14
#define  quit 15
sbit Key_Out_1 = P3^0;
sbit Key_Out_2 = P3^1;
sbit Key_Out_3 = P3^2;
sbit Key_Out_4 = P3^3;

sbit Key_In_1 = P4^4;
sbit Key_In_2 = P4^2;
sbit Key_In_3 = P3^5;
sbit Key_In_4 = P3^4;

uchar KeySta[4][4] = {1,1,1,1,
					  1,1,1,1,
					  1,1,1,1,
					  1,1,1,1};
uchar KeyCodeMap[4][4] = {0,1,2,3,
						  4,5,6,7,
						  8,9,set,reset,
						  12,13,OK,quit};
uchar Error = 0,view;										
bit flag_warn = 0;
void KeyDriver()
{
		static uchar KeyBack[4][4] = {1,1,1,1,
									  1,1,1,1,
									  1,1,1,1,
									  1,1,1,1};
		uchar i = 0,j = 0;
		
		for(i=0; i<4; i++)
		{
				for(j=0; j<4; j++)
				{
						if(KeySta[i][j] != KeyBack[i][j])
						{
								if(KeySta[i][j] == 0)
								{
										KeyAction(KeyCodeMap[i][j]);
								}
						}
						KeyBack[i][j] = KeySta[i][j];
				}
		}
}

void KeyAction(uchar key_value)
{
		 static uchar index = 0;
		 uchar i = 0;
		 if(mode == 1)
		 {
				if(key_value >= 0&&key_value <= 9)    //密码输入0~9
				{
						PIN[index] = key_value;
						index++;	
						if(index > 5) index = 0;
				}
				if(key_value == quit)                 //退出
				{
						view = 0;
						PIN_init();
						index = 0;
				}
				if(key_value == set)                //进入密码设置界面
				{
						view = 1;
				}
				if(key_value == reset)              //密码复位
				{
						PINback[0] = 6;
						PINback[1] = 5;
						PINback[2] = 4;
						PINback[3] = 3;
						PINback[4] = 2;
						PINback[5] = 1;
						flag_keep = 1;
				}
				if(view == 2)                       //新密码保存
				{
						if(key_value == OK)
						{
								for(i=0; i<6; i++)
								{
										PINback[i] = PIN[i];
								}
								flag_keep = 1;
								view = 0;
						}
				}			
				else if(key_value == OK)       //确认按键
				{
						for(i=0; i<6; i++)
						{
								if(PIN[i] != PINback[i])
								{
										flag_open = 0;
										Error++;
										if(Error>=3) 
										{
												Error = 0;       
												flag_warn = 1;     //错误3次报警
												if(view == 1)      //并退出
												{
														view = 0;
												}
										}
										break;
								}
								else
								{			
										if(view == 0)
										{
												flag_open = 1;     //开门
										}
										else if(view == 1)
										{
												view = 2;          //前往新密码输入界面
										}										
								}
						}
						PIN_init();     //初始化
						index = 0;
				}
		 }
}

void KeyScan()
{
		static uchar KeyBuf[4][4] = {0xff,0xff,0xff,0xff,
									 0xff,0xff,0xff,0xff,
									 0xff,0xff,0xff,0xff,
								     0xff,0xff,0xff,0xff};
		static uchar keyout = 0;
		uchar i = 0;
		
		switch(keyout)
		{
			case 0:Key_Out_1 = 0;Key_Out_4 = 1;break;
			case 1:Key_Out_2 = 0;Key_Out_1 = 1;break;
			case 2:Key_Out_3 = 0;Key_Out_2 = 1;break;
			case 3:Key_Out_4 = 0;Key_Out_3 = 1;break;
		}
		
		KeyBuf[keyout][0] = KeyBuf[keyout][0]<<1|Key_In_1;
		KeyBuf[keyout][1] = KeyBuf[keyout][1]<<1|Key_In_2;
		KeyBuf[keyout][2] = KeyBuf[keyout][2]<<1|Key_In_3;
		KeyBuf[keyout][3] = KeyBuf[keyout][3]<<1|Key_In_4;
		
		for(i=0; i<4; i++)
		{
				if(KeyBuf[keyout][i] == 0x00)
				{
						KeySta[keyout][i] = 0;
				}
				else if(KeyBuf[keyout][i] == 0xff)
				{
						KeySta[keyout][i] = 1;
				}
				else
				{
						;
				}
		}
		keyout++;
		keyout &= 0x03;
}

ultrawave.c

#include<sys.h>
#include<intrins.h>
sbit TX = P1^0;
sbit RX = P1^1;

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

uint time;
uint distance;

void UltraWave_init()      //超声波初始化
{
		TMOD |= 0x10;
		TH1 = 0;
		TL1 = 0;
		TF1 = 0;
		TR1 = 0;
}

void SendWave()            //发送超声波
{
		uchar i = 0;
		for(i=0; i<8; i++)
		{
				TX = 1;
				somenop;somenop;somenop;somenop;somenop;
				somenop;somenop;somenop;somenop;somenop;
				TX = 0;
				somenop;somenop;somenop;somenop;somenop;
				somenop;somenop;somenop;somenop;somenop;
		}
}

void DealDistance()        //处理距离
{
		SendWave();
		TR1 = 1;
		while(RX == 1&&TF1 == 0);
		TR1 = 0;
		
		if(TF1 == 1&&RX == 1)
		{
				TF1 = 0;
				distance = 999;
		}
		else if(RX == 0&&TF1 == 0)
		{
				time = TH1*256+TL1;
				distance = (uint)time*0.017;
				TH1 = 0;
				TL1 = 0;
		}
}

ds1302.c

#include "ds1302.h"

void Write_Ds1302_Byte(unsigned char dat) 
{
	unsigned char i;
	SCK = 0;
	for (i=0;i<8;i++) 
	{ 
		if (dat & 0x01) 	
		{
			SDA_SET;		
		}
		else 
		{
			SDA_CLR;		
		}		 
		SCK_SET;
		SCK_CLR;		
		dat = dat >> 1; 
	} 
}

unsigned char Read_Ds1302_Byte(void) 
{
	unsigned char i, dat=0;	
	for (i=0;i<8;i++)
	{	
		dat = dat >> 1;
		if (SDA_R) 	  
		{
			dat |= 0x80;
		}
		else 
		{
			dat &= 0x7F;
		}
		SCK_SET;
		SCK_CLR;
	}
	return dat;
}

void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat)
{ 

	RST_CLR;			
	SCK_CLR;			

	RST_SET;			
	addr = addr & 0xFE;	 
	Write_Ds1302_Byte(addr); 
	Write_Ds1302_Byte(dat);	
	RST_CLR;				
}

unsigned char Ds1302_Single_Byte_Read(unsigned char addr) 
{ 
	unsigned char temp;
	RST_CLR;			
	SCK_CLR;			

	RST_SET;	
	addr = addr | 0x01;	 
	Write_Ds1302_Byte(addr); 
	temp=Read_Ds1302_Byte();
	RST_CLR;	
	return temp;
}

void set_time(unsigned char shi,unsigned char fen,unsigned char miao)
{
		Ds1302_Single_Byte_Write(0x8e,0x00);
		Ds1302_Single_Byte_Write(0x80,miao/10*16+miao%10);
		Ds1302_Single_Byte_Write(0x82,fen/10*16+fen%10);
		Ds1302_Single_Byte_Write(0x84,shi/10*16+shi%10);
		Ds1302_Single_Byte_Write(0x8e,0x80);
}

ds1302.h


#ifndef  __DS1302_H__
#define  __DS1302_H__

#include<stc15f2k60s2.h>
#include<intrins.h>

sbit SCK=P1^7;		
sbit SD=P2^3;		
sbit RST=P1^3;

#define RST_CLR	RST=0	
#define RST_SET	RST=1	

#define SDA_CLR	SD=0	
#define SDA_SET	SD=1	
#define SDA_R	SD	

#define SCK_CLR	SCK=0	
#define SCK_SET	SCK=1	

#define ds1302_sec_addr			0x80		
#define ds1302_min_addr			0x82		
#define ds1302_hr_addr			0x84		
#define ds1302_date_addr		0x86		
#define ds1302_month_addr		0x88		
#define ds1302_day_addr			0x8A		
#define ds1302_year_addr		0x8C		

#define ds1302_control_addr		0x8E		
#define ds1302_charger_addr		0x90 		
#define ds1302_clkburst_addr	0xBE		

extern void Write_Ds1302_Byte(unsigned char dat);
extern unsigned char Read_Ds1302_Byte(void);
extern void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat);
extern unsigned char Ds1302_Single_Byte_Read(unsigned char addr);
extern void set_time(unsigned char shi,unsigned char fen,unsigned char miao);
#endif	 

iic.c

#include "iic.h"
void Delay5us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 12;
	while (--i);
}

void IIC_Start(void)
{
	SDA = 1;
	SCL = 1;
	somenop1;
	SDA = 0;
	somenop1;
	SCL = 0;	
}

void IIC_Stop(void)
{
	SDA = 0;
	SCL = 1;
	somenop1;
	SDA = 1;
}

void IIC_Ack(unsigned char ackbit)
{
	if(ackbit) 
	{	
		SDA = 0;
	}
	else 
	{
		SDA = 1;
	}
	somenop1;
	SCL = 1;
	somenop1;
	SCL = 0;
	SDA = 1; 
	somenop1;
}

bit IIC_WaitAck(void)
{
	SDA = 1;
	somenop1;
	SCL = 1;
	somenop1;
	if(SDA)    
	{   
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else  
	{ 
		SCL = 0;
		return 1;
	}
}

void IIC_SendByte(unsigned char byt)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{   
		if(byt&0x80) 
		{	
			SDA = 1;
		}
		else 
		{
			SDA = 0;
		}
		somenop1;
		SCL = 1;
		byt <<= 1;
		somenop1;
		SCL = 0;
	}
}

unsigned char IIC_RecByte(void)
{
	unsigned char da;
	unsigned char i;
	
	for(i=0;i<8;i++)
	{   
		SCL = 1;
		somenop1;
		da <<= 1;
		if(SDA) 
		da |= 0x01;
		SCL = 0;
		somenop1;
	}
	return da;
}

void write_eeprom(unsigned char dat,unsigned char add)
{
		IIC_Start();
		IIC_SendByte(0xa0);
		IIC_WaitAck();
		IIC_SendByte(add);
		IIC_WaitAck();
		IIC_SendByte(dat);
		IIC_WaitAck();
		IIC_Stop(); 
}

unsigned char read_eeprom(unsigned char add)
{
		unsigned char dat;
	
		IIC_Start();
		IIC_SendByte(0xa0);
		IIC_WaitAck();
		IIC_SendByte(add);
		IIC_WaitAck();
	
		IIC_Start();
		IIC_SendByte(0xa1);
		IIC_WaitAck();
		dat = IIC_RecByte(); 
		IIC_WaitAck();
		IIC_Stop();

		return dat;	
}

iic.h

#ifndef _IIC_H
#define _IIC_H

#include "stc15f2k60s2.h"
#include "intrins.h"

#define somenop1 Delay5us() 
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

sbit SDA = P2^1;  
sbit SCL = P2^0; 

void IIC_Start(void); 
void IIC_Stop(void);  
void IIC_Ack(unsigned char ackbit); 
void IIC_SendByte(unsigned char byt); 
bit IIC_WaitAck(void);  
unsigned char IIC_RecByte(void); 
void Delay5us();
void write_eeprom(unsigned char dat,unsigned char add);
unsigned char read_eeprom(unsigned char add);
#endif
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值