Demo entry 6623890

main

   

Submitted by anonymous on Jun 11, 2017 at 16:50
Language: C. Code size: 9.6 kB.

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "bsp_usart.h"
#include "stdio.h"
/**********************************
电子系统课程设计 :
by:刘奕成 段恩悦 姜芯蕊
自己编写的内容主要内容包括:
USER下的
			main.c
HARDWARE下的
			lcd.c
			key.c
			key.h
			led.c
			led.h
			usart.c
			usart.h

************************************/
//#include "SysTick.h"

#define FALSE 0x00
#define TRUE 0x01

#define START 0x00
#define STOP 0xFF

#define RIGHT 0x00
#define LEFT 0xFF

#define GREAT 0x00
#define SMALL 0xFF

/********************各端口定义*********************************/
#define GPIO_EN       GPIOB                 //  使能端口组
#define GPIO_EN_PIN   GPIO_Pin_7            //  使能端口号
#define RCC_GPIO_EN   RCC_APB2Periph_GPIOB  //  使能时钟组

#define GPIO_RW       GPIOB                 //  读/写选择端口组
#define GPIO_RW_PIN   GPIO_Pin_6            //  读/写选择端口号
#define RCC_GPIO_RW   RCC_APB2Periph_GPIOB  //  读/写时钟组

#define GPIO_RS       GPIOB                 //  数据/命令端口组
#define GPIO_RS_PIN   GPIO_Pin_5            //  数据/命令端口号
#define RCC_GPIO_RS   RCC_APB2Periph_GPIOB  //  数据/命令时钟组

#define GPIO_DATA_0       GPIOB         //  数据线0_端口组
#define GPIO_DATA_0_PIN   GPIO_Pin_8    //  数据线0_端口号
#define GPIO_DATA_1       GPIOB         //  数据线1_端口组0
#define GPIO_DATA_1_PIN   GPIO_Pin_9    //  数据线1_端口号
#define GPIO_DATA_2       GPIOB         //  数据线2_端口组
#define GPIO_DATA_2_PIN   GPIO_Pin_10   //  数据线2_端口号
#define GPIO_DATA_3       GPIOB         //  数据线3_端口组
#define GPIO_DATA_3_PIN   GPIO_Pin_11   //  数据线3_端口号
#define GPIO_DATA_4       GPIOB         //  数据线4_端口组
#define GPIO_DATA_4_PIN   GPIO_Pin_12   //  数据线4_端口号
#define GPIO_DATA_5       GPIOB         //  数据线5_端口组
#define GPIO_DATA_5_PIN   GPIO_Pin_13   //  数据线5_端口号
#define GPIO_DATA_6       GPIOB         //  数据线6_端口组
#define GPIO_DATA_6_PIN   GPIO_Pin_14   //  数据线6_端口号
#define GPIO_DATA_7       GPIOB         //  数据线7_端口组
#define GPIO_DATA_7_PIN   GPIO_Pin_15   //  数据线7_端口号
#define RCC_GPIO_DATA   RCC_APB2Periph_GPIOB  //  数据线时钟组

/***********************基本指令***********************************/
#define SET_EN  GPIO_SetBits(GPIO_EN, GPIO_EN_PIN)		//EN 使能  输出1
#define CLE_EN  GPIO_ResetBits(GPIO_EN, GPIO_EN_PIN)	//      输出0 
#define SET_RW  GPIO_SetBits(GPIO_RW, GPIO_RW_PIN)      //RW 读写  输出1
#define CLE_RW  GPIO_ResetBits(GPIO_RW, GPIO_RW_PIN)	//      输出0
#define SET_RS  GPIO_SetBits(GPIO_RS, GPIO_RS_PIN)		//RS 指令  输出1
#define CLE_RS  GPIO_ResetBits(GPIO_RS, GPIO_RS_PIN)	//      输出0
/******************************************************************/


/******************************************************************/

/**************************************************************************************************************************************/
//全局变量
/***************************************/
//蓝牙与串口发送的数据
//串口中断的缓冲器
uint8_t RxBuffer1[20];
//
uint8_t flag=1;

//标志位
	u8 keyflag0,remanflag,relingflag=0;

//传感按键标志位	
u8 LighFlag=FALSE;
u8 BellFlag=FALSE;
u8 ManFlag=FALSE;
u8 MenlingFlag=FALSE;
u8 JINJI=FALSE;


//消息标志位
u8 MessageFlag1=0;
u8 MessageFlag2=0;
u8 MessageFlag3=0;
u8 MessageFlag4=0;
//留言
uint8_t message[20]="";
int RxCounter1=0;


	u32 time15ms=0;		//用来延时计数的函
	
u8 AlertCounter=15000;

int main(void)
{																					


	
	/**********************************************/
	// 
	delay_init();	    	 //延时函数初始化	  
	Lcd_GPIO_init();  //初始化lcd引脚
	KEY_Init();		  //初始化 按键
	LED_Init();		  //初始化电机引脚 作为输出 类似led
	delay_ms(1);
	Lcd_Init();		  //初始化lcd屏幕
	delay_ms(20);
																																																									//fLcd_Puts(0,0,ch2);	//初始化显示


	Lcd_Puts(0,0,"Waitting for you");	//初始化显示
	Lcd_Puts(0,1,"Nobody home");
	BUZZER=1;			//蜂鸣器检测
	LED=1;//LED的代码
	USART_Config();//串口初始化
																																																									//printf( "串口printf函数测试\n" );	
	while (1)
	{	
		
		ShowMessage();
			
		delay_ms(10);
		//
		
		if(MessageFlag2==1)
		{
			LED=0;
		}
		else
		{
			LED=1;
		}
		if(ManFlag==TRUE)
		{
						
				ShowMessage();
				if(LighFlag==TRUE)	//有人情况查看是否需要开灯
				{
					LED=0;
				}
				else if(MessageFlag2==0)
				{
					LED=1;
				}
				
				if(MessageFlag4==0)
				{
					time15ms=0;
				}
				else
				{
					time15ms++;
				}
				
				if(time15ms>=1500)	   //有人超过10s 报警
				{
					if(AlertCounter==15000)
					{
						printf("a");
					}
					AlertCounter++;
					AlertCounter=AlertCounter>15000?0:AlertCounter;
					
					
					
					BUZZER=MessageFlag4==0?1:0;
					JINJI=TRUE;
					//Lcd_Puts(0,0,"please stay away");	//初始化显示	
						
				}
				else
				{
					BUZZER=1;
					JINJI=FALSE;
				}
			}
			else
			{
				LED=1;							  	//没有人关闭led
				time15ms=0;						 //清零紧急报警
				
			}
						
						
						//门铃检测
			if(BellFlag==TRUE)
			{
				Lcd_Puts(0,1,"Somebody home");	//家中有人
				if(JINJI==FALSE)					//非紧急情况
				{
					
					if(MenlingFlag==TRUE)		//门铃
					{
						BUZZER=0;
						
					}
					else
					{
						BUZZER=1;
					}			
					}	
			}
			else
			{
				if(LighFlag==TRUE)	//有人情况查看是否需要开灯
				{
					LED=0;
				}
				else
				{LED=1;}
				Lcd_Puts(0,1,"Nobody!         ");		//家中无人
				if(JINJI==FALSE)					  //非紧急情况
				{	BUZZER=1;}
			}
			
			
			
			
			
			
			
			





////////////////////////////////////////////////传感部分//////////////////////////////////////////
			//key门铃响
			if(WK_MENLING==0)   //
			{
				if(relingflag==0)	   //防止重复检测
				{
					delay_ms(10);				//消除抖动
					if(WK_MENLING==0)   //再次确认
					{
						BUZZER=0;
						relingflag=1;		//防止重复检测
						MenlingFlag=TRUE;
					}				
				}
			}
			
			
			else
			{relingflag=0;
			 MenlingFlag=FALSE;
			}  //否则复位标志
			
			
			
			
			
			//通过红外检测人体
			if(KEY_REDHOT==1)   //检测人体
			{
				if(remanflag==0)	   //防止重复检测
				{
					delay_ms(10);				//消除抖动
					if(KEY_REDHOT==1)   //再次确认
					{
						remanflag=1;		//防止重复检测
						ManFlag=TRUE;
					
					}				
				}
			}
			else
			{remanflag=0;ManFlag=FALSE;}  //否则复位标志
			
			
			
		//通过选择switch检测家里有没有人
		if(KEY_HOME==1)   //检测 门状态
		{
			BellFlag=TRUE;
		}
		else
		{BellFlag=FALSE;}  //否则复位标志

		
		
				
				
				
		//光敏电阻器的检测
		if(KEY_LIGHR==1)   
		{
			if(keyflag0==0)	   //防止重复检测
			{
				delay_ms(10);				//消除抖动
				if(KEY_LIGHR==1)   //再次确认
				{
					keyflag0=1;		//防止重复检测
					LighFlag=TRUE;
				}				
			}
		}
		else
		{keyflag0=0;LighFlag=FALSE;}  //否则复位标志
		

		

		
		
	}//这循环代码截止处
    
	
	
}//这是主函数截止处		
				
				
		

/*******************************************************************************************


//
//		Usart_SendByte(DEBUG_USARTx,'A');
//		Usart_SendHalfWord(DEBUG_USARTx, 0xff56);	
//		Usart_SendArray(DEBUG_USARTx, a,10);
	
//		printf( "串口printf函数测试\n" );
//		
	
//
//         printf("a=%d\r\n",a);
//scanf("%d", &b);
//scanf("%d", &c);
//printf("a=%d, b=%d, c=%d\r\n",a,b,c);
//上面定义了RxBuffer1[]


/*********************************************

显示微信留言的函数

**********************************************/
void ShowMessage(void)
{	
	if(time15ms>=1500)
	{
			Lcd_Puts(0,0,"stay away!");	//初始化显示
			
	}
	else	
	{
		
		if(message[1]==0x00)
		{
			Lcd_Puts(0,0,"Waitting for you");	//初始化显示
		}
		else
		{
			if(MessageFlag1==1&&MessageFlag3==0)
			{
				Lcd_Puts(0,0,"open!");		//开锁
			}
			else if(MessageFlag1==0&&MessageFlag3==0)
			{
				Lcd_Puts(0,0,"close");		//开锁
			}
			
			else if(MessageFlag3==1)
			{
				Lcd_Puts(0,0,message+1);	
			}
		}
	}
}




/*********************************************

串口一接收的中断函数

**********************************************/
void USART1_IRQHandler(void)
{
	if(!flag)
	{
		int i;
		for(i=0;i<sizeof(message);i++)
		{
			message[i]=0x00;
																						
		}

		flag=1;
																			
	}
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//
	{
	/* Read one byte from the receive data register */
		RxBuffer1[RxCounter1] = (uint8_t)USART_ReceiveData(USART1);
		message[RxCounter1]=RxBuffer1[RxCounter1];
		++RxCounter1;
	}

	if(RxBuffer1[RxCounter1-1]=='$')
	{
		flag=0;
		message[RxCounter1-1]=0x00;
		switch(message[0])
	{
		//dn df 门锁开关 
		case 'd':
		MessageFlag3=0;
		//MessageFlag1
		if(message[1]=='n')
		{
																																											
			MessageFlag1=1;
		}
		else
		{
																																												
			MessageFlag1=0;
		}
																																											
		break;
		//ln lf灯的开关
																																											
																																											
		case 'l':
		MessageFlag3=0;
		if(message[1]=='n')
		{
			MessageFlag2=1;//开灯
																																																
		}
		else
		{
			MessageFlag2=0;//关灯
		}
																																											
		break;	
		//wxxxxxx 留言功能
																																						
		case 'w':
		if(message[1]!='\0')
		{
			MessageFlag3=1;
		}
		else
		{
			MessageFlag3=0;
		}
																																									
		break;
																																											
																																											
		case 'b':
		MessageFlag3=0;
		if(message[1]=='f')
		{
			MessageFlag4=0;
		}
		else
		{
			MessageFlag4=1;			
		}
		break;																																					
	}
	}	
	if(!flag)
	{
	int i;
	for(i=0;i<sizeof(RxBuffer1);i++)
	{
		RxBuffer1[i]=0x00;																		
	}
	RxCounter1=0;																		
	}														
	}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).