找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2725|回复: 3
收起左侧

利用51单片机技术开发的一款家庭安全系统(防盗、防火、防有害气体泄漏)

[复制链接]
ID:696382 发表于 2020-5-29 11:50 | 显示全部楼层 |阅读模式
带lcd液晶显示,热释电红外线、温度传感器、有害气体传感器部分代码(全部代码和原理图等请下载附件)

1.png 1.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替

  5. sfr ISP_DATA  = 0xe2;                                        // 数据寄存器
  6. sfr ISP_ADDRH = 0xe3;                                        // 地址寄存器高八位
  7. sfr ISP_ADDRL = 0xe4;                                        // 地址寄存器低八位
  8. sfr ISP_CMD   = 0xe5;                                        // 命令寄存器
  9. sfr ISP_TRIG  = 0xe6;                                        // 命令触发寄存器
  10. sfr ISP_CONTR = 0xe7;                                        // 命令寄存器

  11. sbit Anf_P    = P1^0;                                        // 人体安防模块
  12. sbit DQ       = P1^1;                                        // 温度传感器的引脚
  13. sbit ADC_CS   = P1^2;                                 // ADC0832的CS引脚
  14. sbit ADC_CLK  = P1^3;                                 // ADC0832的CLK引脚
  15. sbit ADC_DAT  = P1^4;                                 // ADC0832的DI/DO引脚
  16. sbit LcdRs_P  = P2^7;                     // 1602液晶的RS管脚      
  17. sbit LcdRw_P  = P2^6;                     // 1602液晶的RW管脚
  18. sbit LcdEn_P  = P2^5;                     // 1602液晶的EN管脚
  19. sbit Key1_P   = P3^2;                                        // 设置按键
  20. sbit Key2_P   = P3^3;                                        // 减按键
  21. sbit Key3_P   = P3^4;                                        // 加按键
  22. sbit Key4_P   = P3^5;                                        // 布防/撤防按键
  23. sbit Buzzer_P = P2^0;                                        // 蜂鸣器
  24. sbit Led1_P   = P2^3;                                        // 报警灯1,人体报警
  25. sbit Led2_P   = P2^2;                                        // 报警灯2,温度报警
  26. sbit Led3_P   = P2^1;                                        // 报警灯3,烟雾报警


  27. uchar gFlag=0;                                                                // 为0是撤防,为1是布防
  28. uchar gMqAlarm;                                                                // 烟雾报警值
  29. int   gTempAlarm;                                                        // 温度报警值



  30. /*********************************************************/
  31. // 单片机内部EEPROM不使能
  32. /*********************************************************/
  33. void ISP_Disable()
  34. {
  35.         ISP_CONTR = 0;
  36.         ISP_ADDRH = 0;
  37.         ISP_ADDRL = 0;
  38. }


  39. /*********************************************************/
  40. // 从单片机内部EEPROM读一个字节,从0x2000地址开始
  41. /*********************************************************/
  42. unsigned char EEPROM_Read(unsigned int add)
  43. {
  44.         ISP_DATA  = 0x00;
  45.         ISP_CONTR = 0x83;
  46.         ISP_CMD   = 0x01;
  47.         ISP_ADDRH = (unsigned char)(add>>8);
  48.         ISP_ADDRL = (unsigned char)(add&0xff);
  49.         // 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效
  50.         ISP_TRIG  = 0x46;           
  51.         ISP_TRIG  = 0xB9;
  52.         _nop_();
  53.         ISP_Disable();
  54.         return (ISP_DATA);
  55. }


  56. /*********************************************************/
  57. // 往单片机内部EEPROM写一个字节,从0x2000地址开始
  58. /*********************************************************/
  59. void EEPROM_Write(unsigned int add,unsigned char ch)
  60. {
  61.         ISP_CONTR = 0x83;
  62.         ISP_CMD   = 0x02;
  63.         ISP_ADDRH = (unsigned char)(add>>8);
  64.         ISP_ADDRL = (unsigned char)(add&0xff);
  65.         ISP_DATA  = ch;
  66.         ISP_TRIG  = 0x46;
  67.         ISP_TRIG  = 0xB9;
  68.         _nop_();
  69.         ISP_Disable();
  70. }


  71. /*********************************************************/
  72. // 擦除单片机内部EEPROM的一个扇区
  73. // 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除
  74. /*********************************************************/
  75. void Sector_Erase(unsigned int add)         
  76. {
  77.         ISP_CONTR = 0x83;
  78.         ISP_CMD   = 0x03;
  79.         ISP_ADDRH = (unsigned char)(add>>8);
  80.         ISP_ADDRL = (unsigned char)(add&0xff);
  81.         ISP_TRIG  = 0x46;
  82.         ISP_TRIG  = 0xB9;
  83.         _nop_();
  84.         ISP_Disable();
  85. }



  86. /*********************************************************/
  87. // 毫秒级的延时函数,time是要延时的毫秒数
  88. /*********************************************************/
  89. void DelayMs(uint time)
  90. {
  91.         uint i,j;
  92.         for(i=0;i<time;i++)
  93.                 for(j=0;j<112;j++);
  94. }


  95. /*********************************************************/
  96. // 延时15微秒
  97. /*********************************************************/
  98. void Delay15us(void)
  99. {
  100.         _nop_();
  101.         _nop_();
  102.         _nop_();
  103.         _nop_();
  104.         _nop_();
  105.         _nop_();
  106.         _nop_();
  107.         _nop_();
  108.         _nop_();
  109.         _nop_();
  110.         _nop_();
  111.         _nop_();
  112.         _nop_();
  113.         _nop_();
  114.         _nop_();
  115. }


  116. /*********************************************************/
  117. // 复位DS18B20(初始化)
  118. /*********************************************************/
  119. void DS18B20_ReSet(void)
  120. {
  121.         uchar i;
  122.         DQ=0;
  123.         i=240;
  124.         while(--i);
  125.         DQ=1;
  126.         i=30;
  127.         while(--i);
  128.         while(~DQ);
  129.         i=4;
  130.         while(--i);
  131. }


  132. /*********************************************************/
  133. // 向DS18B20写入一个字节
  134. /*********************************************************/
  135. void DS18B20_WriteByte(uchar dat)
  136. {
  137.         uchar j;
  138.         uchar btmp;
  139.         
  140.         for(j=0;j<8;j++)
  141.         {
  142.                 btmp=0x01;
  143.                 btmp=btmp<<j;
  144.                 btmp=btmp&dat;
  145.                
  146.                 if(btmp>0)                // 写1
  147.                 {
  148.                         DQ=0;
  149.                         Delay15us();
  150.                         DQ=1;
  151.                         Delay15us();
  152.                         Delay15us();
  153.                         Delay15us();
  154.                         Delay15us();
  155.                 }
  156.                 else                        // 写0
  157.                 {
  158.                         DQ=0;
  159.                         Delay15us();
  160.                         Delay15us();
  161.                         Delay15us();
  162.                         Delay15us();
  163.                         DQ=1;
  164.                         Delay15us();
  165.                 }
  166.         }
  167. }
复制代码

单片机程序.rar

362.94 KB, 下载次数: 72, 下载积分: 黑币 -5

带源程序文件和word版

原理图word版.rar

38.12 KB, 下载次数: 61, 下载积分: 黑币 -5

模块和总和

评分

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

查看全部评分

回复

使用道具 举报

ID:770773 发表于 2020-6-5 22:50 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:1078332 发表于 2023-6-12 21:59 | 显示全部楼层
问一下作者是用什么软件画的图
回复

使用道具 举报

ID:1084086 发表于 2023-6-14 16:15 | 显示全部楼层
这是用AD画的原理图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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