标题:
自己写的一个基于STM32F104的智能安防源程序
[打印本页]
作者:
NOTHIN9
时间:
2019-10-29 16:50
标题:
自己写的一个基于STM32F104的智能安防源程序
用到:超声波,OLED,蓝牙,火焰报警传感器,温湿度传感器;
不足:没有用到操作系统,当时想学ucos3的,然后再写的,但是发下看了一下之后,有点蒙,就直接写裸机
单片机源程序如下:
#include "led.h"
#include "timer.h"
#include "HS0038.h"
#include "usart.h"
#include "instruct.h"
#include "key.h"
#include "exit.h"
#include "beep.h"
#include "pwm.h"
#include "DHT11.h"
#include "oled.h"
#include "SR04.h"
#include "adc.h"
#include "flash.h"
#include "rc522.h"
#include "rtc.h"
//===================================//
/************全局变量声明区************/
//===================================//
//0x01:时间显示标志 0x02:清除时间标志 0x04:温湿度显示标志 0x08:清除温湿度显示 0x10:显示超声波距离和火焰检测标志
//0x20:清除超声波距离和火焰检测显示标志
volatile uint32_t g_Flags = 0;
__IO uint32_t g_HS0038data = 0; //接收红外遥控的数据
volatile uint8_t g_HS0038key = 0; //红外键值
__IO uint8_t SYSClockMode = 0; //用做选择系统时钟源,默认系统时钟由PLL提供
uint32_t TimeOut = 0; //用作优化
u8 *AM_PM[2] = {".AM", ".PM" }; //上下午显示
uint8_t g_FlashRecordBuff[128] = {0}; //用作读取记录缓存
uint8_t g_FlashRecordCnt = 0; //记录读取FLASH位置
uint32_t g_WarningDistance = 100; //超声波报警距离,默认100mm
volatile uint8_t g_LedBright = 50; //控制LED亮度
extern uint8_t g_USART_DataBuf[DATA_BUF_MAX]; //接收串口数据缓冲区
extern uint8_t g_USART_RxCnt; //记录串口接收数据的字节数
extern uint8_t g_USART_RxDoneFlag; //串口数据接收完成标志位
extern volatile uint8_t g_RCTWakeUpFlag; //RTC唤醒标志位
//MFRC522数据区
extern u8 mfrc552pidbuf[18];
extern u8 card_pydebuf[2];
extern u8 card_numberbuf[5];
//***************结束****************//
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组2
InitLED(); //初始化LED
InitKey(); //初始化按键
InitBeep(); //初始化蜂鸣器
InitHS0038(); //初始化红外遥控
InitSr04(); //初始化超声波
InitKeyExit(); //使能按键外部中断
InitUsart1(115200); //初始化串口1 波特率115200bps
InitUsart3(9600); //初始化串口3:波特率9600bps
// InitTIM2(10); //初始化定时器2 定时时间100ms
// InitTIM3(100); //初始化定时器3 定时时间10ms
// InitTIM8(100); //初始化定时器8 定时时间10ms
InitDHT11(); //初始化温湿度
OLED_Init(); //初始化OLED
OLED_Clear(); //清除屏幕
InitRTC_f(); //初始化RTC和读取RTC备份寄存器
InitADC(); //初始化ADC
InitFires(); //初始化火焰传感器,并启动ADC
BootGrap(); //启动页面
// MFRC522_Initializtion();
if(g_WarningDistance == 100) //读取超声波报警距离
ReadWarnDist();
while(1)
{
delay_us(50);
TimeOut++;
if(g_USART_RxDoneFlag) //接收蓝牙命令执行相应功能
{
ChangeTime_Date(g_USART_DataBuf);
Ctrl_LED(g_USART_DataBuf);
ShiftOrder(g_USART_DataBuf);
if((g_Flags & 0x100) == 0x100)
g_Flags |= 0x400; //开启修改标志为
ChangeWarnDist(); //修改超声波报警距离
ClearUsartBuf_Flag(); //清除串口相关标志和缓冲区
}
WarningBeep(); //蜂鸣器报警
if(TimeOut/10000 != 0 && TimeOut%10000 == 0 ) //显示FLASH内容
CardRecord();
if(PAin(8) == 0)
{
g_HS0038data = GET_HS0038Data();
g_HS0038key = GetKey(g_HS0038data);
// if(TimeOut/20000!=0 && TimeOut%20000==0)
printf("%d\r\n",g_HS0038key);
if(g_HS0038key == 17)
{
LED3 ^= 1;
}
}
if(TimeOut/5000 != 0 && TimeOut%5000 == 0 )
ShowTime_Date(g_RCTWakeUpFlag); //显示时间日期
g_RCTWakeUpFlag = 0; //清除RTC唤醒标志
ShowSR04_Fire(); //显示超声波距离和火焰检测
ShowTH(); //显示温湿度
ReadCard(); //读卡
#ifdef DEBUG //调试用
if(TimeOut/20000!=0 && TimeOut%20000==0)
{
TimeOut = 0;
printf("%d\r\n",g_WarningDistance);
}
#endif
}
}
//-------------------------------------------------------------------------------------
// PWM2Led(100);
// PWM2Beep(100);
// AdjustLed3Brightness(0);
// AdjustLed4Brightness(0);
// AdjustBeepVOL(0);
//------------------------------------------------------------------------------------
/****************** 蜂鸣器实验:复位响*****************/
//------------------------------------------------------------------------------------
// BeepOn();
// delay_ms(200);
// BeepOff();
//------------------------------------------------------------------------------------
// revID = Read_w25qxxID();
//
// printf("revID = %04X\r\n",revID);
//------------------------------------------------------------------------------------
/****************** 串口3蓝牙实验:发送命令点亮LED*****************/
//------------------------------------------------------------------------------------
// if(TimeOut/10000!=0 && TimeOut%10000 ==0)
// {
// if(g_USART_RxDoneFlag)
// {
//// SendUartData(USART1,g_USART_DataBuf);
// Ctrl_LED(g_USART_DataBuf);
//
// ClearUsartBuf_Flag();
// }
// printf("SECOND: %d\r\n",sec++);
// if(sec==7)
// sec = 1;
// }
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
/****************** RTC实验 *****************/
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
/****************** 温湿度传感器实验,获取温湿度值*****************/
//------------------------------------------------------------------------------------
// delay_us(100);
// TimeOut++;
// if(TimeOut/60000 != 0 && TimeOut%60000 == 0)
// {
// i_DHT11data = GET_DHT11Data();
// printf("Humidity: %d.%d\r\n",(i_DHT11data>>24&0xff),(i_DHT11data>>16&0xff));
// printf("Temperature: %d.%d\r\n",(i_DHT11data>>8&0xff),(i_DHT11data&0xff));
// TimeOut=0;
// }
//
//
//------------------------------------------------------------------------------------
/****************** PWM实验:控制LED亮度*****************/
//------------------------------------------------------------------------------------
// delay_ms(100);
// g_HS0038data = GET_HS0038Data();
// i_HS0038key = GetKey(g_HS0038data);
// printf("%d\r\n",i_HS0038key);
// if(i_HS0038key == 13 && g_LedBright > 0)
// {
// g_LedBright -= 10;
// }
// else if(i_HS0038key == 12 && g_LedBright < 100)
// {
// g_LedBright += 10;
// }
//
// AdjustLed1Brightness(g_LedBright);
// delay_ms(100);
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
/****************** 定时器实验:控制LED闪烁时间*****************/
//------------------------------------------------------------------------------------
// LED1 ^= OFF;
// delay_ms(100);
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
/****************** 外部中断实验:按键控制LED*****************/
//------------------------------------------------------------------------------------
// LED1 ^= OFF;
// delay_ms(100);
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
/****************** 按键实验:按键控制LED*****************/
//------------------------------------------------------------------------------------
// if(KEY0 == 0)
// {
// delay_ms(100); //软件消除按键抖动
// if(KEY0 == 0)
// {
// LED1 ^= OFF;
// }
// }
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
/****************** 串口1实验:发送命令点亮LED*****************/
//------------------------------------------------------------------------------------
// delay_ms(100);
// if(g_USART_RxDoneFlag)
// {
// Ctrl_LED(g_USART_DataBuf);
// ClearBuf_Flag();
// }
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
/****************** 红外遥控:按键0控制灯*****************/
//------------------------------------------------------------------------------------
// g_HS0038data = GET_HS0038Data();
// g_HS0038key = GetKey(g_HS0038data);
// if(g_HS0038key<21)
// {
// if(g_HS0038key == 0)
// LED1 ^= 1;
// if(g_HS0038key == 1)
// {
// i_DHT11data = GET_DHT11Data();
// printf("Humidity: %d.%d\n",(i_DHT11data>>24&0xff),(i_DHT11data>>16&0xff));
// printf("Temperature: %d.%d\n",(i_DHT11data>>8&0xff),(i_DHT11data&0xff));
// TimeOut=0;
// }
// g_HS0038key = 21;
// g_HS0038data = 0;
// }
//------------------------------------------------------------------------------------
复制代码
所有资料51hei提供下载:
智能安防.rar
(109.13 KB, 下载次数: 22)
2019-10-29 16:49 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1