找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2711|回复: 3
打印 上一主题 下一主题
收起左侧

车内儿童检测系统单片机源程序-带散热

[复制链接]
跳转到指定楼层
楼主
本实用新型公开一种车内儿童检测报警装置,包括:红外线发射器和接收器、摄像头、控制装置及接收器。所述发射器和接收器分别设置在车座两侧,所述每对发射器和接收器位置一一对应。所述摄像头设置在车内车顶上。所述控制装置设置在车内,其分别与红外线发射器和接收器、摄像头及汽车中控连接。所述控制装置控制摄像头。所述控制装置通过无线网络传输数据,并与接收器连接。本实用新型有益效果在于:采用红外传感器检测儿童是否在车内,同时通过摄像头确认是否误报警,避免儿童被困车内,引致儿童窒息。

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];        //定义串口接收数据缓冲区
//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);           //设置短消息模式                                                                                                                                       
                    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);           //设置短消息模式                                                                                                                                       
                    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
  修改:无
  内容:18B20单线温度检测的应用样例程序
------------------------------------------------*/


#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复位
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;
}


/*------------------------------------------------
                    读取一个字节
------------------------------------------------*/
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);
}
/*------------------------------------------------
                    写入一个字节
------------------------------------------------*/
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); // 启动温度转换
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];        //定义串口接收数据缓冲区
uchar RsPoint;
//以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。


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();
//}


/***********************发送联机指令******************************
*功    能: 串口发送数组命令到TC35,"AT",
*形    参:
*返 回 值:
*备    注: 测试GSM模块是否连接正确
*****************************************************************/
void Send_AT(void)
{
  uchar *p,i=ATwaits;  //ATwaits=10
  //lcd_disp_str(RsBuf,1);


        
        while(i--)        //测试10次,在某一次成功就退出
        {
            //RsBuf[0]='\0';         //有下一句就不需要这句 //清空接收缓冲区
                RsPoint=0;
                // 本来只有\r  我添加的\n        后来证明 可以不加的
                SendString("AT\r");
                //****************************等待应答"OK"
            ES=1;    //必须中断  // 串口中断应许
            delayms_100ms();//等待接受数据完成//delayms_1000ms();delayms_1000ms();
               
            p=mystrstr(RsBuf,"OK");   //接收到的数据存在RsBuf
            if(p!=NULL)         //接收到"OK"
               
                {


                        delayms_1000ms();delayms_1000ms();//delayms_1000ms();delayms_1000ms();


                        break;
                }
        delayms_1000ms();
        
        }


}
/***********************设置短消息模式******************************
*功    能: 串口发送数组命令到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");                 //设置短消息模式  1 TEXT
                else
                        SendString("AT+CMGF=0\r");                 //设置短消息模式  PDU模式
//        SendASC('\r');                        //发送回车指令//
                //****************************等待应答"OK"
            ES=1;    //必须中断  // 串口中断应许
            delayms_100ms();//等待接受数据完成//delayms_1000ms();delayms_1000ms();
                delayms_100ms();delayms_100ms();
            p=mystrstr(RsBuf,"OK");   //接收到的数据存在RsBuf
            if(p!=NULL)         //接收到"OK"
               
                {


                        delayms_1000ms();delayms_1000ms();//delayms_1000ms();delayms_1000ms();


                        break;
                }
delayms_1000ms();


        }


}
/***********************设置短消息中心******************************
*功    能: 串口发送数组命令到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=");           //设置短消息中心
//                SendASC('"');
//                SendString(center);   //短消息中心号码
//                SendASC('"');
//                SendASC('\r');                        //发送回车指令//
//                //****************************等待应答"OK"
//            ES=1;    //必须中断  // 串口中断应许
//            delayms_100ms();//等待接受数据完成//delayms_1000ms();delayms_1000ms();
//               
//            p=mystrstr(RsBuf,"OK");   //接收到的数据存在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);
//        }


//}
/***********************发送TEXT短信息********************************
*功    能: TEXT模式发送短信息
*形    参: char *dialnum 目的号码+8613333333333    char *text发送内容
*返 回 值: 1 发送成功  0 发送失败
*备    注:发送TEXT短信息  之前应该先  1,设置短消息模式   AT+CMGF=? (0)=PDU (1)=TEXT
                                  2,设置短消息中心     AT+CSCA=“+8613800531500”回车                 


*****************************************************************/
char TransmitText(char *dialnum,char *text)   //发送号码        发送内容,字母或数字
{
        uchar i=Sendwaits,j=Sendwaits;
        uchar *p;


        




        SendString("AT+CMGS=");        //信息发送指令 AT+CMGS=//
        
///////////////////////////////
        SendASC('"');
        SendString(dialnum);   //手机号码的引号丢了!!!!!!!!! 已经加上
        SendASC('"');
////////////////////////////////////
        SendASC('\r');                        //发送回车指令//
        RsPoint=0;          //清空接收缓冲区
        //delayms_1000ms();
        while(i--)
        {
               
                delayms_100ms();
                p=mystrstr(RsBuf,">");//">"
                if(p!=NULL)        //如果接受到 >  发送text
                {        
                    ///////Get">"////////////////////////////
                        
                        SendString(text);
                        RsPoint=0;          //清空接收缓冲区
                        SendString("\x1a\r");//'\x1a'结束符(相当CTRL+Z) '\r'回车符
                        //delayms_100ms();
//                        while(j--)
//                        {
//                                delayms_100ms();
//                                p=mystrstr(RsBuf,"OK");
//                                if(p!= NULL )
//                                {
//                                        //发送成功
//                                
//                                       
//                                        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;
}






//  通讯中断接收程序   中断函数无返回值
  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;   //将下一个数据清零
                //SendASC(RsBuf[RsPoint-1]);
                //lcd_disp_str(RsBuf ,2);
    }
        EA=1;
}


车内儿童检测可用程序 - 带散热.zip

77.84 KB, 下载次数: 19, 下载积分: 黑币 -5

策划内儿童检测

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:201936 发表于 2017-10-13 08:17 | 只看该作者
下载学习下,谢谢
回复

使用道具 举报

板凳
ID:248551 发表于 2017-11-12 22:03 | 只看该作者
楼主用的是什么单片机芯片呢?
回复

使用道具 举报

地板
ID:251177 发表于 2017-11-19 20:25 | 只看该作者
下载学习下,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表