找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机设计的防止幼儿误锁车内报警系统PCB原理图+源程序

[复制链接]
跳转到指定楼层
楼主
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <REGX52.H>
  2. #include <LCD1602.H>
  3. #include <eeprom52.h>
  4. #include <DS18B20.h>
  5. #include <HX711.h>
  6. #include <BJDJ.h>

  7. #define uchar unsigned char
  8. #define uint  unsigned int
  9. //---------------------------->Dispose
  10. sbit FIR1 = P1^0;
  11. sbit FIR2 = P1^1;

  12. uchar delay_time=0;    //检测延时2s
  13. uchar yanshi_time=0;
  14. uchar count_time=0;    //锁车5s倒计时
  15. bit   count_flag=0;
  16. //---------------------------->Timer
  17. uint  ms = 0;
  18. uint  time=0;
  19. //---------------------------->Display
  20. bit Read_Weight = 0;    //重量标志位
  21. bit Read_Temp = 0;      //温度标志位
  22. int temp = 0;
  23. sbit alarm = P3^5;      //继电器         0导通,        门未锁
  24. uchar Door = 1;

  25. //---------------------------->Key
  26. sbit key1 = P3^3;            //控制继电器
  27. sbit key2 = P3^4;                //控制布防、撤防

  28. bit key1_flag=0;
  29. bit key2_flag=0;

  30. ////---------------------------->电机驱动
  31. uint Stop_time = 0;               //半圈计数变量
  32. uchar zhuan = 0;                   //正反转标志
  33. //---------------------------->Police
  34. sbit beep = P2^4;
  35. bit  beep1 = 0;
  36. ///--------------------------------------------->GSMsim800
  37. //-----> Uart1 And GSM  Definition
  38. unsigned char xdata Uart1_Buff[50];  //串口1缓冲数组
  39. unsigned char Uart1_Count=0;         //串口1累加变量

  40. unsigned char Quest_flag=1;                         //GSM状态标志位,等于0,进行初始化,等于一是进入发短信区域
  41. unsigned int  GSM_Send_Time=0;                 //AT指令发送间隔时间
  42. unsigned char GSM_Num=0;                         //AT指令指向
  43. unsigned char GSM_Send=0;                         //发送短信使能标志位
  44. unsigned char GSM_Send_Num=0;                 //短信编号
  45. unsigned char Phone[12]={'\0'};                 //定义手机号存储数组

  46. bit memory_flag=0;

  47. bit cx_flag=0;






  48. //初始化显示,主要用在上电校准称重的时候显示界面
  49. void display_int()
  50. {
  51.    
  52.    LCD1602_write(0,0x80);                 
  53.    LCD1602_writebyte("    Welcome    ");          
  54.    LCD1602_write(0,0xC0);
  55.    LCD1602_writebyte(" initialize... ");
  56. }




  57. void delay(uint z)
  58. {
  59.           while(z--);
  60. }


  61. void UartSend(unsigned char dat)  //发送一个字节
  62. {
  63.         SBUF=dat;
  64.         while(!TI);
  65.         TI=0;
  66. }


  67. void UartSendString(char *s) //发送一串数据
  68. {
  69.     while (*s)                 
  70.     {
  71.         UartSend(*s++);  
  72.     }
  73. }




  74. void keyscan()
  75. {
  76.           if(!key1)
  77.          {
  78.                   if(key1_flag==1)
  79.                  {
  80.                           key1_flag=0;
  81.                         Door=(Door+1)%2;            //0 门锁
  82.                  }        
  83.          }
  84.         else key1_flag = 1;


  85.           if(!key2)
  86.          {
  87.                   if(key2_flag==1)
  88.                  {
  89.                           key2_flag=0;
  90.                         if(cx_flag==1)
  91.                          {
  92.                                   beep1=0;
  93.                                 zhuan=2;
  94.                                 cx_flag=0;
  95.                          }
  96.                  }        
  97.          }
  98.         else key2_flag = 1;


  99. }


  100. void display()
  101. {
  102. //第一行显示重量数据,有超重显示横杠的设定
  103.    LCD1602_write(0,0x80);       
  104.    LCD1602_writebyte("Weight:");
  105.    if(Weight_Shiwu<10000)
  106.     {
  107.            LCD1602_write(1,0x30+Weight_Shiwu/1000%10);
  108.            LCD1602_write(1,'.');
  109.            LCD1602_write(1,0x30+Weight_Shiwu/100%10);
  110.            LCD1602_write(1,0x30+Weight_Shiwu/10%10);
  111.            LCD1602_write(1,0x30+Weight_Shiwu%10);

  112.         }
  113.         else
  114.         {
  115.            LCD1602_write(1,'-');
  116.            LCD1602_write(1,'.');
  117.            LCD1602_write(1,'-');
  118.            LCD1602_write(1,'-');
  119.            LCD1602_write(1,'-');
  120.           
  121.         }
  122.     LCD1602_writebyte("Kg   ");  

  123.     LCD1602_write(0,0xC0);
  124.     LCD1602_writebyte("Dr: ");
  125.     if(alarm==0)    LCD1602_writebyte("Open  ");
  126.     else            LCD1602_writebyte("Close ");  

  127.                 LCD1602_write(1,0x30+temp/100%10);
  128.                 LCD1602_write(1,0x30+temp/10%10);
  129.                 LCD1602_writebyte(".");
  130.                 LCD1602_write(1,0x30+temp%10);
  131.                 LCD1602_write(1,0xdf);
  132.                 LCD1602_writebyte("C");

  133. //
  134. //                LCD1602_write(1,0x30+count_time/10%10);
  135. //                LCD1602_write(1,0x30+count_time%10);
  136. //                LCD1602_writebyte(" ");
  137. //                LCD1602_write(1,0x30+delay_time/10%10);
  138. //                LCD1602_write(1,0x30+delay_time%10);
  139. //                LCD1602_write(0,0xc0);
  140. //                LCD1602_write(1,0x30+yanshi_time/10%10);
  141. //                LCD1602_write(1,0x30+yanshi_time%10);
  142. }


  143. void GSM_Init()         //GSM函数
  144. {
  145.    unsigned char G_Tab[20];
  146.    if(Quest_flag==1) //开始查询GSM状态//此时还没有初始化完成,首先,先初始化 ,发AT,能够响应上,关回显,设置短信处理方式
  147.          {

  148.                 switch(GSM_Num)
  149.                 {
  150.                         case 0: UartSendString("AT\r\n");                  break; //AT
  151.                         case 1: UartSendString("ATE1\r\n");                break;//关回显
  152.                         case 2: UartSendString("AT+CNMI=3,2,2,0,1\r\n");  break;//设置
  153.                         case 3: UartSendString("AT+CMGF=1\r\n");          break; //配制
  154.                         case 4: UartSendString("AT+COPS?\r\n");            break; //查询网络
  155.                         case 5: Quest_flag=0;  GSM_Num=0;                       break; //初始化彻底结束
  156.             }
  157.                 GSM_Send_Time=100;
  158.          }
  159.          else
  160.          {
  161.                                           
  162.                      GSM_Send_Time=100;
  163.                          if(GSM_Send==1)  //发送短信标志
  164.                                 {       
  165.                                         Phone[11]='\0';
  166.                                         if(GSM_Send_Num==0)  //Num 是短信编号,就是发送哪条短信,这个是返回Set End 的       
  167.                                          {
  168.                                                         switch(GSM_Num)
  169.                                                         {
  170.                                                                 case 0: UartSendString("AT+CMGF=1\r\n");              break;
  171.                                                                
  172.                                                                 case 1: UartSendString("AT+CMGS=\"");                                          
  173.                                                                         UartSendString(Phone);         
  174.                                                                             UartSendString("\"\r\n");                      break; //AT+CMGS="13343851798"
  175.                                                                
  176.                                                                 case 2: UartSendString("Set End");  GSM_Num=3;  GSM_Send_Time=5;                   break;
  177.                                                                
  178.                                                                 case 3: G_Tab[0]=0x1a;
  179.                                                                         UartSend(G_Tab[0]);                         break;
  180.                                                                 case 4: GSM_Num=0;   GSM_Send=0;                    break;
  181.        
  182.                                                         }
  183.                                          }
  184.                                         else if(GSM_Send_Num==1)
  185.                                          {
  186.                                                         switch(GSM_Num)
  187.                                                         {
  188.                                                                 case 0: UartSendString("AT+CMGF=0\r\n");               break;
  189.                                                                 case 1: UartSendString("AT+CMGS=67\r\n");              break;   
  190.                                                             
  191.                                                                 case 2: UartSendString("0011000D9168");         //12
  192.                                         G_Tab[0]=Phone[1];                                //11
  193.                                                                         G_Tab[1]=Phone[0];
  194.                                                                         G_Tab[2]=Phone[3];
  195.                                                                         G_Tab[3]=Phone[2];
  196.                                                                         G_Tab[4]=Phone[5];
  197.                                                                         G_Tab[5]=Phone[4];
  198.                                                                         G_Tab[6]=Phone[7];
  199.                                                                         G_Tab[7]=Phone[6];
  200.                                                                         G_Tab[8]=Phone[9];
  201.                                                                         G_Tab[9]=Phone[8];
  202.                                                                         G_Tab[10]='F';
  203.                                                                             G_Tab[11]=Phone[10];
  204.                                                                         UartSendString(G_Tab);                    //8                  52
  205.                                                                 UartSendString("0008A934"); //末尾两位数是发送的短信长度,每个汉字占两个字节(18个字节转16进制为12)
  206.                                     UartSendString("8BF76CE8610FFF0C5F53524D6E295EA6FF1A0020");//请注意当前温度:空   36

  207.                                                                                 UartSendString("003");                                              //数据16
  208.                                                                                 UartSend(0x30+temp/100%10);

  209.                                                                                 UartSendString("003");
  210.                                                                                 UartSend(0x30+temp/10%10);

  211.                                                                                 UartSendString("002E");                //.
  212.                                                                                 UartSendString("003");
  213.                                                                                 UartSend(0x30+temp%10);

  214.                                                                                 UartSendString("21030020FF0C");                                  //℃,符号12
  215.                                                                                 UartSendString("00208F6651856709905775595E7C513F3002"); //车内有遗留幼儿。 32
  216.                                                                         GSM_Num=3;   GSM_Send_Time=5;                  break;
  217.                                                                 case 3: G_Tab[0]=0x1a;
  218.                                                                         UartSend(0x1a);                        break;
  219.                                                                 case 4: GSM_Num=0;   GSM_Send=0;                       break;                                                        
  220.                                                         }
  221.                                          }


  222.                                 }
  223.                                 else GSM_Num=0;       
  224.          }
  225. }



  226. void dispose()                 //处理函数
  227. {                                                                                                                
  228.           if(Read_Weight==1)
  229.          {
  230.                   Read_Weight=0;
  231.                 Get_Weight();
  232.          }

  233.         if(Read_Temp==1)
  234.          {
  235.                   Read_Temp=0;
  236.                 temp=Temper();
  237.          }

  238.         if(Door==1)
  239.          {
  240.                   alarm=0;   //车门打开
  241.          }
  242.         else
  243.          {
  244.                    alarm=1;
  245.                 count_flag=1;
  246.          }
  247. }


  248. void police()           //报警函数
  249. {
  250.     static only=0;
  251.         if(count_flag==1)
  252.          {
  253.                   count_flag=0;
  254.                 if(only==1)
  255.                  {
  256.                           count_time=5;    //检测倒计时5s
  257.                         only=0;
  258.                  }
  259.                
  260.          } else only=1;

  261.    
  262.           if(alarm==1&&count_time==0)
  263.          {
  264.                   if(FIR1==1)
  265.                  {
  266.                           delay_time=3;        //延时检测2s
  267.                           if(FIR2==1&&Weight_Shiwu>3000&&Weight_Shiwu<10*1000)
  268.                          {
  269.                                   beep1=1;                //报警
  270.                                 zhuan=1;
  271.                                 cx_flag=1;
  272.                                 GSM_Send=1;
  273.                                 GSM_Send_Num=1;
  274.                          }
  275.                  } else if(FIR2==1&&delay_time!=0)
  276.                   {
  277.                            if(Weight_Shiwu>3000&&Weight_Shiwu<10*1000)
  278.                          {
  279.                                   beep1=1;                //报警
  280.                                 zhuan=1;
  281.                                 cx_flag=1;
  282.                                 GSM_Send=1;
  283.                                 GSM_Send_Num=1;
  284.                          }
  285.                   }


  286.                   if(FIR2==1)
  287.                  {
  288.                           yanshi_time=3;        //延时检测2s
  289.                           if(FIR1==1&&Weight_Shiwu>3000&&Weight_Shiwu<10*1000)
  290.                          {
  291.                                   beep1=1;                //报警
  292.                                 zhuan=1;
  293.                                 cx_flag=1;
  294.                                 GSM_Send=1;
  295.                                 GSM_Send_Num=1;
  296.                          }
  297.                  } else if(FIR1==1&&yanshi_time!=0)
  298.                   {
  299.                            if(Weight_Shiwu>3000&&Weight_Shiwu<10*1000)
  300.                          {
  301.                                   beep1=1;                //报警
  302.                                 zhuan=1;
  303.                                 cx_flag=1;
  304.                                 GSM_Send=1;
  305.                                 GSM_Send_Num=1;
  306.                          }
  307.                   }
  308.          }

  309. }



  310. void memory()          //存储函数
  311. {
  312.    unsigned char q=0;
  313.    if(memory_flag==1)
  314.     {
  315.           memory_flag=0;
  316.           SectorErase(0x2000);
  317.           for(q=0;q<11;q++)
  318.            {
  319.                byte_write(0x2000+q,Phone[q]);
  320.            }
  321.         }
  322. }



  323. void read_memory() //读取存储函数
  324. {
  325.    unsigned char q=0;
  326.    for(q=0;q<11;q++)
  327.     {
  328.         Phone[q]=byte_read(0x2000+q);
  329.     }
  330. }




  331. void Time0_int()  //定时器0
  332. {
  333.     TMOD= 0x01;   //设置定时器模式
  334.         TH0 = 0x4c;           //5ms
  335.         TL0 = 0x00;               
  336.         ET0=1;
  337.         TR0=1;
  338.         EA =1;
  339. }


  340. //使用定时器2用作波特率发生器
  341. void Timer2_Uart()
  342. {
  343.         T2CON = 0x34;
  344.         RCAP2H = 0xFF;
  345.         RCAP2L = 0xDC;
  346.         TH2 = 0xFF;
  347.         TL2 = 0xDC;
  348.         TR2 = 1;      
  349.         SCON = 0x50;
  350.         ES = 1;  
  351. }


  352. void main()
  353. {
  354.     LCD1602_cls();
  355.     display_int();
  356.     Get_Maopi();
  357.           Time0_int();   //初始化
  358.     Timer2_Uart();         //调用定时器 2 初始化波特率
  359.     read_memory();         //调用读取存储函数
  360.         do
  361.         {
  362.                 delay(100);
  363.                 temp=Temper();
  364.         }
  365.         while (temp==850);
  366.         while(1)
  367.          {
  368.                  if(Weight_Shiwu<=3)  Weight_Shiwu=0;
  369.          

  370.                  display();                //显示函数
  371.                  dispose();     //处理函数
  372.                  keyscan();                //按键
  373.                  police();                //报警函数
  374.                  memory();
  375.                  if(GSM_Send_Time==0) GSM_Init(); //GSM


  376.                  while(zhuan==1)
  377.                   {
  378.                           if(Stop_time<4096)
  379.                           {
  380.                                           Bjdj_Drive(zz[DJ_Loop]);
  381.                                         DJ_Loop=(DJ_Loop+1)%8;
  382.                                         Stop_time++;
  383.                                         delay(100);
  384.                           }
  385.                           else
  386.                            {
  387.                                     zhuan = 0;
  388.                                         Stop_time=0;
  389.                            }       
  390.                   }

  391.                  while(zhuan==2)
  392.                   {

  393.                           if(Stop_time<4096)
  394.                           {
  395.                                           Bjdj_Drive(fz[DJ_Loop]);
  396.                                         DJ_Loop=(DJ_Loop+1)%8;
  397.                                         Stop_time++;
  398.                                         delay(100);
  399.                           }
  400.                           else
  401.                            {
  402.                                     zhuan=0;
  403.                                         Stop_time=0;
  404.                            }       
  405.                   }


  406.          }
  407. }


  408. void Time0() interrupt 1  //定时器0
  409. {

  410.         TH0 = 0x4c;           //50ms
  411.         TL0 = 0x00;               
  412.         ms++;
  413.         time++;

  414.         if(GSM_Send_Time!=0)    GSM_Send_Time--;         //GSM指令发送间隔
  415.     if(ms%5==0)         //250ms
  416.          {
  417.                   if(beep1==1)            beep=!beep;
  418.                 else                beep=1;
  419.          }

  420.         if(ms%20==0)  //1s
  421.          {
  422.             ms=0;
  423.             Read_Weight=1;
  424.             Read_Temp=1;

  425.                 if(count_time!=0)    count_time--;    //锁车延时5s
  426.                 if(delay_time!=0)         delay_time--;          //检测延时2s
  427.                 if(yanshi_time!=0)         yanshi_time--;
  428.          }
  429. }   


  430. //---->Uart1
  431. void Uart1() interrupt 4   //串口中断回调
  432. {
  433.    unsigned char i=0;
  434.    if(RI)
  435.     {
  436.           RI=0;
  437.           Uart1_Buff[Uart1_Count] = SBUF;
  438.           Uart1_Count=(Uart1_Count+1)%50;
  439.           Uart1_Buff[Uart1_Count]='\0';


  440.            if(Quest_flag==1) //说明此时在初始化
  441.                 {
  442.                    if(GSM_Num==0||GSM_Num==1||GSM_Num==2||GSM_Num==3) //这里都是返回的  OK
  443.                          {
  444.                            if(Uart1_Count>=4&&Uart1_Buff[Uart1_Count-1]=='\n'&&Uart1_Buff[Uart1_Count-2]=='\r'&&Uart1_Buff[Uart1_Count-3]=='K'&&Uart1_Buff[Uart1_Count-4]=='O')
  445.                                  {
  446.                                    GSM_Num++;
  447.                                    GSM_Send_Time=3;
  448. ……………………

  449. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
防止幼儿误锁车内报警系统.zip (797.4 KB, 下载次数: 59)


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

使用道具 举报

沙发
ID:808674 发表于 2020-7-28 01:17 | 只看该作者
你好,感谢你的分享,小白想请问一下车门锁状态检测的详细操作,哪个模块是实现这个功能的呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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