|
本實用新型公開一種車內(nèi)兒童檢測報警裝置,包括:紅外線發(fā)射器和接收器、攝像頭、控制裝置及接收器。所述發(fā)射器和接收器分別設(shè)置在車座兩側(cè),所述每對發(fā)射器和接收器位置一一對應(yīng)。所述攝像頭設(shè)置在車內(nèi)車頂上。所述控制裝置設(shè)置在車內(nèi),其分別與紅外線發(fā)射器和接收器、攝像頭及汽車中控連接。所述控制裝置控制攝像頭。所述控制裝置通過無線網(wǎng)絡(luò)傳輸數(shù)據(jù),并與接收器連接。本實用新型有益效果在于:采用紅外傳感器檢測兒童是否在車內(nèi),同時通過攝像頭確認(rèn)是否誤報警,避免兒童被困車內(nèi),引致兒童窒息。
360截圖20171012233650530.jpg (55.75 KB, 下載次數(shù): 59)
下載附件
文件內(nèi)容
2017-10-12 23:40 上傳
1. 主程序
#include"reg52.h"
#include "uart.c"
#include "tc35.c"
#include "18b20.h"
#include "stdio.h"
//sfr PCON=0x87;
#define bug while(1){bee=1;delayms_100ms();delayms_100ms();bee=0;delayms_100ms();delayms_100ms();}
sbit Sw=P1^2;
sbit hongwai=P1^3;
sbit zhengdong=P1^5;
sbit bee=P1^0;
sbit feng=P1^6;
//#define bug while(1){led=1;delayms_100ms();led=0;delayms_100ms();}
//#define RsBuf_N 50
//char RsBuf[RsBuf_N]; //定義串口接收數(shù)據(jù)緩沖區(qū)
//uchar RsPoint=0;
uchar code PhoneNO[]= "+8613796629206";
uchar Text[40]={0};
//uchar code center[]="+8613800566500";
uchar flag,num,a;
bit Q,PD=0;
int n;
float T;
void MinDelay(uint X)
{
uchar i,l;
uint j;
for(i=X;i>0;i--)
for(j=1000;j>0;j--)
for(l=110;l>0;l--);
}
//void T0_Init()
//{
// TMOD|=0x01;
// TH0=(65536-50000)/256;
// TL0=(65536-50000)%256;
// EA=1;
// TR0=1;
// ET0=1;
//}
void main()
{
// T0_Init();
Uart_init();
// init_1602();
bee=0;
feng=0;
flag=1;
n= ReadTemperature();
n= ReadTemperature();
n= ReadTemperature();
while(1)
{
// n= ReadTemperature();
// T=(float)n*0.0625;
// sprintf(Text,"Temp : %2.2f ",(float)T);
// SendString(Text);
while(!Sw)
{
Q=0;
flag=1;
bee=0;
feng=0;
}
while(Sw&&flag)
{
num++;
delayms_10s() ;
if(num>10)
{
// bee=0;
Q=1;
flag=0;
break;
}
}
num=0;
if(Q)
{
if(hongwai==1)
{
bee=1;
feng=1;
n= ReadTemperature();
T=n*0.0625;
sprintf(Text,"Your Chind in Car and Temp is %2d C ",(int)T);
// TR0=0;
Send_AT();
Set_MODE(1); //設(shè)置短消息模式
TransmitText(PhoneNO,Text);
// delayms_10s();
bee=0;
delayms_10s();delayms_10s();delayms_10s();delayms_10s();
bee=0;
feng=0;
// bug
// TR0=1;
}
if(zhengdong==0)
{
delayms_100ms();delayms_100ms();
if(zhengdong==0)
{
bee=1;
delayms_1000ms();
// TR0=0;
Send_AT();
Set_MODE(1); //設(shè)置短消息模式
TransmitText(PhoneNO,"There are situations!");
bee=0;
// TR0=1;
}
}
}
}
}
// void t0_ser() interrupt 1
// {
// TH0=(65536-50000)/256;
// TL0=(65536-50000)%256;
//
//
// a++;
// if(a>20)
// {
// EA=0;
// a=0;
// n= ReadTemperature();
// T=(float)n*0.0625;
// // T=30.0;
// sprintf(Text,"Temp : %3.1f ",(float)T);
// SendString(Text);
//
// EA=1;
// }
//
// }
2. 18B20 溫度傳感器
/*-----------------------------------------------
名稱:18B20溫度傳感器
日期:2009.5
修改:無
內(nèi)容:18B20單線溫度檢測的應(yīng)用樣例程序
------------------------------------------------*/
#include"18b20.h"
/*------------------------------------------------
uS????,?????? unsigned char t,????
unsigned char ??????????,??????
0~255 ??????12M,?????????,????
???? T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS????,?????? unsigned char t,????
unsigned char ??????????,??????
0~255 ??????12M,?????????
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//????1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
18b20初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //DQ復(fù)位
DelayUs2x(5); //稍做延時
DQ = 0; //單片機將DQ拉低
DelayUs2x(200); //精確延時 大于 480us 小于960us
DelayUs2x(200);
DQ = 1; //拉高總線
DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖
dat=DQ; //如果x=0則初始化成功, x=1則初始化失敗
DelayUs2x(25); //稍作延時返回
return dat;
}
/*------------------------------------------------
讀取一個字節(jié)
------------------------------------------------*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
DelayUs2x(25);
}
return(dat);
}
/*------------------------------------------------
寫入一個字節(jié)
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
DelayUs2x(25);
DQ = 1;
dat>>=1;
}
DelayUs2x(25);
}
/*------------------------------------------------
讀取溫度
------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
3.中斷
/******************************************************************
MADE BY lyq
my BLOG http://hi.baidu.com/282280072
*******************************************************************/
#include "uart.c"
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
#define NULL 0
#define ATwaits 10
#define DWWwaits 10
#define Readwaits 10
#define Sendwaits 10
#define RsBuf_N 50
char RsBuf[RsBuf_N]; //定義串口接收數(shù)據(jù)緩沖區(qū)
uchar RsPoint;
//以標(biāo)示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其他模塊中尋找其定義。
void Send_AT(void);
char *mystrstr(char *s, char *t);
void Num2char(uchar i);
/***********************TC35模塊初始化******************************
*功 能: TC35模塊初始化, P0.0輸出低電平至少100ms
*形 參:
*返 回 值:
*備 注:
*****************************************************************/
//void TC35_init()
//{
//
// P1|=0x01;
// P1&=~0x01;
// delayms_100ms();delayms_100ms();delayms_100ms();delayms_100ms();
// delayms_100ms();delayms_100ms();
// P0|=0x01;
// delayms_10s();delayms_10s();delayms_10s();
//}
/***********************發(fā)送聯(lián)機指令******************************
*功 能: 串口發(fā)送數(shù)組命令到TC35,"AT",
*形 參:
*返 回 值:
*備 注: 測試GSM模塊是否連接正確
*****************************************************************/
void Send_AT(void)
{
uchar *p,i=ATwaits; //ATwaits=10
//lcd_disp_str(RsBuf,1);
while(i--) //測試10次,在某一次成功就退出
{
//RsBuf[0]='\0'; //有下一句就不需要這句 //清空接收緩沖區(qū)
RsPoint=0;
// 本來只有\(zhòng)r 我添加的\n 后來證明 可以不加的
SendString("AT\r");
//****************************等待應(yīng)答"OK"
ES=1; //必須中斷 // 串口中斷應(yīng)許
delayms_100ms();//等待接受數(shù)據(jù)完成//delayms_1000ms();delayms_1000ms();
p=mystrstr(RsBuf,"OK"); //接收到的數(shù)據(jù)存在RsBuf
if(p!=NULL) //接收到"OK"
{
delayms_1000ms();delayms_1000ms();//delayms_1000ms();delayms_1000ms();
break;
}
delayms_1000ms();
}
}
/***********************設(shè)置短消息模式******************************
*功 能: 串口發(fā)送數(shù)組命令到TC35,AT+CMGF=1
*形 參: uchar m =1 text模式 m=0 PDU模式
*返 回 值:
*備 注: 1 TEXT
*****************************************************************/
void Set_MODE(uchar m)
{
uchar *p,i=ATwaits; //ATwaits=10
//lcd_disp_str(RsBuf,1);
while(i--) //測試10次,在某一次成功就退出
{
RsPoint=0;
if(m)
SendString("AT+CMGF=1\r"); //設(shè)置短消息模式 1 TEXT
else
SendString("AT+CMGF=0\r"); //設(shè)置短消息模式 PDU模式
// SendASC('\r'); //發(fā)送回車指令//
//****************************等待應(yīng)答"OK"
ES=1; //必須中斷 // 串口中斷應(yīng)許
delayms_100ms();//等待接受數(shù)據(jù)完成//delayms_1000ms();delayms_1000ms();
delayms_100ms();delayms_100ms();
p=mystrstr(RsBuf,"OK"); //接收到的數(shù)據(jù)存在RsBuf
if(p!=NULL) //接收到"OK"
{
delayms_1000ms();delayms_1000ms();//delayms_1000ms();delayms_1000ms();
break;
}
delayms_1000ms();
}
}
/***********************設(shè)置短消息中心******************************
*功 能: 串口發(fā)送數(shù)組命令到TC35, AT+CSCA=“+8613800531500”回車
*形 參: uchar *canter 短消息中心 “+8613800531500”
*返 回 值:
*備 注:
*****************************************************************/
//void Set_CENTER(uchar *center)
//{
// uchar *p,i=ATwaits; //ATwaits=10
// //lcd_disp_str(RsBuf,1);
//
// while(i--) //測試10次,在某一次成功就退出
// {
//
// RsPoint=0;
//
// SendString("AT+CSCA="); //設(shè)置短消息中心
// SendASC('"');
// SendString(center); //短消息中心號碼
// SendASC('"');
// SendASC('\r'); //發(fā)送回車指令//
// //****************************等待應(yīng)答"OK"
// ES=1; //必須中斷 // 串口中斷應(yīng)許
// delayms_100ms();//等待接受數(shù)據(jù)完成//delayms_1000ms();delayms_1000ms();
//
// p=mystrstr(RsBuf,"OK"); //接收到的數(shù)據(jù)存在RsBuf
// if(p!=NULL) //接收到"OK"
//
// {
// lcd_disp_str("Set_CENTER is OK",1);
// lcd_disp_str("CENTER contimue! ",2);
// delayms_1000ms();delayms_1000ms();//delayms_1000ms();delayms_1000ms();
// lcd_disp_str(" ",1);
// lcd_disp_str(" ",2);
// break;
// }
// lcd_disp_str("Set_CENTER failed",1);delayms_1000ms();
// lcd_disp_str(" ",1);
// }
//}
/***********************發(fā)送TEXT短信息********************************
*功 能: TEXT模式發(fā)送短信息
*形 參: char *dialnum 目的號碼+8613333333333 char *text發(fā)送內(nèi)容
*返 回 值: 1 發(fā)送成功 0 發(fā)送失敗
*備 注:發(fā)送TEXT短信息 之前應(yīng)該先 1,設(shè)置短消息模式 AT+CMGF=? (0)=PDU (1)=TEXT
2,設(shè)置短消息中心 AT+CSCA=“+8613800531500”回車
*****************************************************************/
char TransmitText(char *dialnum,char *text) //發(fā)送號碼 發(fā)送內(nèi)容,字母或數(shù)字
{
uchar i=Sendwaits,j=Sendwaits;
uchar *p;
SendString("AT+CMGS="); //信息發(fā)送指令 AT+CMGS=//
///////////////////////////////
SendASC('"');
SendString(dialnum); //手機號碼的引號丟了!!!!!!!!! 已經(jīng)加上
SendASC('"');
////////////////////////////////////
SendASC('\r'); //發(fā)送回車指令//
RsPoint=0; //清空接收緩沖區(qū)
//delayms_1000ms();
while(i--)
{
delayms_100ms();
p=mystrstr(RsBuf,">");//">"
if(p!=NULL) //如果接受到 > 發(fā)送text
{
///////Get">"////////////////////////////
SendString(text);
RsPoint=0; //清空接收緩沖區(qū)
SendString("\x1a\r");//'\x1a'結(jié)束符(相當(dāng)CTRL+Z) '\r'回車符
//delayms_100ms();
// while(j--)
// {
// delayms_100ms();
// p=mystrstr(RsBuf,"OK");
// if(p!= NULL )
// {
// //發(fā)送成功
//
//
// return 1;
// }
//
// delayms_1000ms();
//
// }
}
//else lcd_disp_str("Transmit failure",1);
}
return 0;
}
/***********************字符串查找********************************
*功 能: 查找字符串
*形 參: char *s, char *t ;在s中查找t
*返 回 值: s_temp(t在s中的位置)成功 0 (失敗 )
*備 注:
*****************************************************************/
char *mystrstr(char *s, char *t)
{
char *s_temp; /*the s_temp point to the s*/
char *m_temp; /*the mv_tmp used to move in the loop*/
char *t_temp; /*point to the pattern string*/
if ((s == NULL )|| (t == NULL)) return NULL;
/*s_temp point to the s string*/
for (s_temp = s; *s_temp != '\0'; s_temp++)
{
/*the move_tmp used for pattern loop*/
m_temp = s_temp;
/*the pattern string loop from head every time*/
for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);
/*if at the tail of the pattern string return s_tmp*/
if (*t_temp == '\0') return s_temp;
}
return NULL;
}
// 通訊中斷接收程序 中斷函數(shù)無返回值
void uart_rx(void) interrupt 4 using 3 //放在這里 和放在main()里面是一樣的
{
EA=0;
if((RsPoint<RsBuf_N)&&RI) //必須判斷RI是否為1
//if(RI)
{
RI=0;
RsBuf[RsPoint++]=SBUF;
//RsBuf[RsPoint]=0x00; //將下一個數(shù)據(jù)清零
//SendASC(RsBuf[RsPoint-1]);
//lcd_disp_str(RsBuf ,2);
}
EA=1;
}
|
評分
-
查看全部評分
|