找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2152|回复: 0
收起左侧

单片机模拟仓库物流环境监测的仿真和源程序

[复制链接]
ID:103965 发表于 2018-7-26 10:07 | 显示全部楼层 |阅读模式
主控芯片采用STC89C52RC,使用到的模块有 MQ2 红外对管 火焰模块等等。有仿真文件,仅供参考学习之用。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png 0.png

sbit LED1 = P1 ^ 0;    //高于最佳温度范围指示灯
sbit LED2 = P1 ^ 1;    //低于最佳温度范围指示灯

sbit LED3 = P1 ^ 2;    //范围指示灯高于最佳湿度
sbit LED4 = P1 ^ 3;    //低于最佳湿度范围指示灯

sbit Flame_LED = P1 ^ 4;//火焰指示灯
sbit MQ2_LED = P1 ^ 5;//烟雾指示灯
sbit Ir_LED = P1 ^ 6;//红外对管 报警指示灯

sbit TRH = P1 ^ 7; //温湿度传感器DHT11数据接入


-------------------------------------------------------------------

sbit LED_DC  = P2^0; // OLED模块  DC   CS悬空
sbit LED_RST = P2^1; // OLED模块  RST
sbit LED_SDA = P2^2;  // OLED模块  D1
sbit LED_SCL = P2^3;  // OLED模块  D0

sbit beep = P2 ^ 5;    //蜂鸣器模块
sbit flame = P2 ^ 6; //火焰报警器模块
sbit MQ2 = P2 ^ 7; //烟雾检测模块 检测到为 0



-----------------------------------------------------------------------------------------

//sbit infrared = P3^2; //红外  外部中断0

sbit key_ir = P3 ^ 4; //解除红外报警按钮 为自锁开关
sbit police_ok = P3 ^ 5; //确认收到红外报警按钮
-----------------------------------------------------------------------------------------
按键接线:
-------------------------------------------------------------------------------
sbit KEY1 = P0^2; // 更改/确认建
sbit KEY2 = P0^3; //加
sbit KEY3 = P0^4; //减
sbit KEY4 = P0^5; //下一项

-------------------------------------------------------------------------------------------------------------------------------


----------------------------------------------------------------------
| Px |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |
----------------------------------------------------------------------
| P1 |  LED1 |  LED2 |  LED3 |  LED3 | 火焰L | MQ2 L |  红外L |  TRH  |      全部为LED 除P1.7
----------------------------------------------------------------------
| P2 | OL_DC | OL_RST| OL_D0 | OL_D1 |       | 蜂鸣器| 火 焰 |  MQ2  |
----------------------------------------------------------------------
| P3 |       |       |红外对管|       |key_ir|收到key|       |       |       key_ir 为自锁开关
----------------------------------------------------------------------
| P0 |       |       |  KEY1 |  KEY2 |  KEY3 |  KEY4 |       |       |
----------------------------------------------------------------------

单片机源程序如下:
  1. /******************************************************************************
  2.   文 件 名   : main.c
  3.   版 本 号   : v1.0
  4.   作    者   : Guokaiyi
  5.   生成日期   : 2012-12-1
  6.   最近修改   :
  7.   功能描述   : OLED演示例程(51系列)
  8.                说明:
  9.                ----------------------------------------------------------------
  10.                G    电源地
  11.                VCC  接5V或3.3v电源
  12.                D0   P1^0(SCLK)
  13.                D1   P1^1(MOSI)
  14.                RST  P1^2
  15.                DC   P1^3
  16.                CS   已经默认选中,可以不接
  17.                ----------------------------------------------------------------
  18. sbit LED_SCL = P1^0;
  19. sbit LED_SDA = P1^1;
  20. sbit LED_RST = P1^2;
  21. sbit LED_DC  = P1^3;

  22. //DHT11温湿度测试程序
  23. //P2作为LCD的数据控制口,P1.6 作为DHT11data总线 ,P1.1作为状态显示
  24. ******************************************************************************/

  25. /*----------------------------------------------------------------------------*
  26. * 包含头文件                                                                 *
  27. *----------------------------------------------------------------------------*/
  28. #include "common.h"
  29. #include "oled.h"
  30. #include <intrins.h>
  31. #include "SCAN_KEY.h"

  32. #include "DHT11.h"

  33. /*----------------------------------------------------------------------------*
  34. * 宏定义                                                                     *
  35. *----------------------------------------------------------------------------*/

  36. /*----------------------------------------------------------------------------*
  37. * 全局变量                                                                   *
  38. *----------------------------------------------------------------------------*/

  39. unsigned char str1[] = {"        "};
  40. unsigned char str2[] = {"        "};


  41. unsigned char DiWenDu[] = {"    "};
  42. unsigned char GaoWenDu[] = {"   "};

  43. unsigned char DiShiDu[] = {"    "};
  44. unsigned char GaoShiDu[] = {"   "};


  45. sbit LED1 = P1 ^ 0;        //高于最佳温度范围指示灯
  46. sbit LED2 = P1 ^ 1;        //低于最佳温度范围指示灯

  47. sbit LED3 = P1 ^ 2;        //高于最佳湿度范围指示灯
  48. sbit LED4 = P1 ^ 3;        //低于最佳湿度范围指示灯

  49. sbit Flame_LED = P1 ^ 4;//火焰指示灯
  50. sbit MQ2_LED = P1 ^ 5;//烟雾指示灯
  51. sbit Ir_LED = P1 ^ 6;//红外对管 报警指示灯

  52. UCHAR8 TH_data, TL_data, RH_data, RL_data, CK_data;
  53. DHT11DATA Dht11TRHData;


  54. volatile int optimum_TL = 26;//最佳温度  26 -28 度 最适宜温度
  55. volatile int optimum_RL = 45;//最佳湿度        45% - 65%

  56. volatile int optimum_TH = 28;//最佳温度  26 -28 度 最适宜温度
  57. volatile int optimum_RH = 65;//最佳湿度                45% - 65%

  58. bit Cursor_Flag = 0;        //        是否显示光标
  59. int Cursor_place = 0;        //光标位置 0没有 1TL 2TH 3RL 4RH
  60. bit SetKeyFlag = 0;                //是否按下设置键 0 未按下 1按下





  61. sbit MQ2 = P2 ^ 7; //烟雾检测模块 检测到为 0
  62. sbit flame = P2 ^ 6; //火焰报警器模块
  63. sbit beep = P2 ^ 5;        //蜂鸣器模块
  64. //sbit infrared = P3^2; //红外

  65. sbit key_ir = P3 ^ 4; //解除红外报警按钮
  66. sbit police_ok = P3 ^ 5; //确认收到红外报警按钮


  67. #define MQ2_BJ                 0
  68. #define FLAME_BJ         0
  69. #define IR_BJ                 0
  70. #define BEEP_ON         0
  71. #define BEEP_OFF         1
  72. //int ir_key = 0;
  73. int ir_police = 0;


  74. void call_police() //报警
  75. {
  76.         char beepbaojingno = 0;
  77.        
  78.     if(police_ok == 0) ir_police = 0;


  79.     if(MQ2 == MQ2_BJ) {
  80.                 beepbaojingno = 1;
  81.         MQ2_LED = 0;
  82.     } else {
  83.         MQ2_LED = 1;
  84.     }


  85.     if(flame == FLAME_BJ) {
  86.         beepbaojingno = 2;
  87.         Flame_LED = 0;
  88.     } else
  89.         {
  90.         Flame_LED = 1;
  91.     }


  92.     if(ir_police == 1)
  93.     {
  94.                 if(key_ir == 0)
  95.                 {
  96.                         ir_police = 0;        //报警解除
  97.                 } else
  98.                 {
  99.                         beepbaojingno = 3;
  100.                         Ir_LED = 0;
  101.                 }
  102.     }
  103.     else
  104.     {
  105.         Ir_LED = 1;
  106.     }

  107.        
  108.         if(beepbaojingno != 0)
  109.         {
  110.                 beep = BEEP_ON;
  111.         }else
  112.         {
  113.                 beep = BEEP_OFF;
  114.         }

  115. }


  116. /*********************************************************************************
  117. *实验名   :外部中断实验(下降沿触发)
  118. *实验效果        :按下学习板上第三排任意按键,LED灯前后四位状态调换
  119. *
  120. *********************************************************************************/

  121. void Init_police()
  122. {
  123.     Flame_LED = 1;
  124.     MQ2_LED = 1;
  125.     Ir_LED = 1;
  126.     beep = BEEP_OFF;
  127.     EA = 1; //全局中断打开
  128.     EX0 = 1; //INT0中断允许
  129.     IT0 = 1; //触发方式为下降沿触发

  130. }

  131. void ISR_KEY()interrupt 0
  132. {
  133.     if(key_ir == 0)
  134.     {
  135.         ir_police = 0;        //报警解除
  136.     } else
  137.     {
  138.         ir_police = 1;        //报警
  139.     }
  140. }











  141. /*----------------------------------------------------------------------------*
  142. * 内部函数原型                                                               *
  143. *----------------------------------------------------------------------------*/
  144. VOID MAIN_Init(VOID); //初始化函数
  145. VOID DHT11_Display(VOID); //DHT11显示函数


  146. void delay_display(unsigned char ms);        //延时显示 主要解决延迟时间内不能按键操作

  147. int optimum_judge_T();        //最佳 温度 判断                -1 小于 最小值  0 正常  1 大于最大值
  148. int optimum_judge_R();        //最佳 湿度 判断                -1 小于 最小值  0 正常  1 大于最大值

  149. void TR_optimum_adjust(); //温湿度 最佳 调节
  150. void Optimum_Display();        //最佳温湿度显示

  151. void Optimum_panduan();        //最佳湿度判断

  152. void NotDisplayCursor();        //不显示光标
  153. void DisplayCursor_temp();        //显示光标
  154. void Call_DisplayCursor();        //必要的调用显示光标函数

  155. void NotCursor_L3();        //第三行不显示光标

  156. /*----------------------------------------------------------------------------*
  157. * 外部函数原型                                                               *
  158. *----------------------------------------------------------------------------*/
  159. VOID main(void)
  160. {
  161.     MAIN_Init();

  162.     Optimum_Display();
  163.     DHT11_Display();

  164.     call_police(); //报警

  165.     while(1)
  166.     {
  167.         delay_display(500);//延时显示 主要解决延迟时间内不能按键操作

  168.         Optimum_panduan();

  169.         if(Cursor_place != 0)
  170.         {
  171.             Call_DisplayCursor();
  172.         }

  173.         call_police(); //报警

  174.     }

  175. }

  176. VOID MAIN_Init(VOID)
  177. {
  178.     LED1 = 1;
  179.     LED2 = 1;
  180.     LED3 = 1;
  181.     LED4 = 1;

  182.     Init_police();

  183.     LED_Init();//OLED初始化
  184.     key_init();
  185.        
  186.         key_ir = 1;

  187. }

  188. void Optimum_panduan() //最佳湿度判断
  189. {
  190.     int temp_T, temp_R;
  191. //最佳温度判断        -1 小于 最小值  0 正常  1 大于最大值
  192.     temp_T = optimum_judge_T();        //最佳 温度 判断
  193.     temp_R = optimum_judge_R();        //最佳 温度 判断

  194.     switch(temp_T)
  195.     {
  196.     case 0:
  197.         LED1 = 1;
  198.         LED2 = 1;
  199.         break;
  200.     case 1:
  201.         LED1 = 0;
  202.         LED2 = 1;
  203.         break;
  204.     case -1:
  205.         LED1 = 1;
  206.         LED2 = 0;
  207.         break;

  208.     }

  209.     switch(temp_R)
  210.     {
  211.     case 0:
  212.         LED3 = 1;
  213.         LED4 = 1;
  214.         break;
  215.     case 1:
  216.         LED3 = 0;
  217.         LED4 = 1;
  218.         break;
  219.     case -1:
  220.         LED3 = 1;
  221.         LED4 = 0;
  222.         break;

  223.     }

  224. }

  225. void delay_display(unsigned char ms)        //延时显示 主要解决延迟时间内不能按键操作
  226. {
  227.     unsigned char i;
  228.     Optimum_panduan(); //最佳湿度判断
  229.     DHT11_Display();//温湿度 显示
  230.     while(ms--)
  231.     {
  232.         for(i = 0; i < 30; i++)
  233.         {
  234.             TR_optimum_adjust();//温湿度 最佳 调节
  235.         }
  236.     }

  237. }

  238. void TR_optimum_adjust() //温湿度 最佳 调节
  239. {
  240.     int key;
  241.     key = key_return(); //1 设置键    2 加     3 减    4 下一条

  242.     switch(key)
  243.     {
  244.     case 1:
  245.         SetKeyFlag = !SetKeyFlag;
  246.         if(SetKeyFlag)
  247.         {
  248.             Cursor_Flag = 1;
  249.             Cursor_place = 1;
  250.         } else
  251.         {
  252.             Cursor_Flag = 0;
  253.             Cursor_place = 0;
  254.             Call_DisplayCursor();
  255.         }
  256.         break;
  257.     case 2:
  258.         if(Cursor_place == 1)
  259.         {
  260.             if(optimum_TL < optimum_TH)
  261.             {
  262.                 optimum_TL++;
  263.             }

  264.         } else if(Cursor_place == 2)
  265.         {
  266.             optimum_TH++;
  267.             if( optimum_TH > 99 )
  268.                 optimum_TH = 99;
  269.         } else if(Cursor_place == 3)
  270.         {
  271.             if(optimum_RL < optimum_RH)
  272.             {
  273.                 optimum_RL++;
  274.             }
  275.         } else if(Cursor_place == 4)
  276.         {
  277.             optimum_RH++;
  278.             if( optimum_RH > 99 )
  279.                 optimum_RH = 99;
  280.         }
  281.         break;

  282.     case 3:
  283.         if(Cursor_place == 1)
  284.         {
  285.             optimum_TL--;
  286.             if( optimum_TL < 0 )
  287.                 optimum_TL = 0;
  288.         } else if(Cursor_place == 2)
  289.         {
  290.             if(optimum_TH > optimum_TL)
  291.             {
  292.                 optimum_TH--;
  293.             }
  294.         } else if(Cursor_place == 3)
  295.         {
  296.             optimum_RL--;
  297.             if( optimum_RL < 0 )
  298.                 optimum_RL = 0;
  299.         } else if(Cursor_place == 4)
  300.         {
  301.             if(optimum_RH > optimum_RL)
  302.             {
  303.                 optimum_RH--;
  304.             }
  305.         }
  306.         break;

  307.     case 4:
  308.         Cursor_place++;
  309.         if(Cursor_place == 5)
  310.             Cursor_place = 1;
  311.         break;
  312.     }
  313.     if(key != -1)
  314.     {
  315.         Optimum_Display();
  316.         Call_DisplayCursor();
  317.     }

  318. }

  319. void GeShiHuaDht11Data_Humi()//湿度
  320. {
  321.     //湿度整数部分
  322.     str1[0] = (char)(0X30 + RH_data / 10);
  323.     str1[1] = (char)(0X30 + RH_data % 10);
  324.     str1[2] =  0x2e; //小数点
  325.     //湿度小数部分
  326.     str1[3] = (char)(0X30 + RL_data / 10);
  327.     str1[5] = 0X25; //"%"
  328.     str1[6] = 0X52; //"R"
  329.     str1[7] = 0X48; //"H"
  330.        
  331. }
  332. void GeShiHuaDht11Data_Temp()//温度
  333. {
  334.     //温度整数部分
  335.     str2[0] = (char)(0X30 + TH_data / 10);
  336.     str2[1] = (char)(0X30 + TH_data % 10);
  337.     str2[2] =  0x2e; //小数点
  338.     //温度小数部分
  339.     str2[3] = (char)(0X30 + TL_data / 10);
  340.     str2[5] = 0X27;  //"'"
  341.     str2[6] = 0X43;  //"C"

  342. }



  343. VOID DHT11_Display(VOID)
  344. {
  345.         Dht11TRHData = SendDht11Data();
  346.        
  347.         TH_data = Dht11TRHData.DtempH;
  348.         TL_data = Dht11TRHData.DtempL;
  349.        
  350.         RH_data = Dht11TRHData.DhumiH;
  351.         RL_data = Dht11TRHData.DhumiL;

  352.         GeShiHuaDht11Data_Humi();
  353.         GeShiHuaDht11Data_Temp();
  354.     LED_P8x16Str(0, 0, (UCHAR8*)"TRH RH: ");
  355.     LED_P8x16Str(64, 0, (UCHAR8*)str1);        //写湿度数据

  356.     LED_P8x16Str(0, 1, (UCHAR8*)"TRH  T: ");
  357.     LED_P8x16Str(64, 1, (UCHAR8*)str2);

  358.     //delay_ms(1000) ;

  359. }

  360. void NotDisplayCursor()        //不显示光标
  361. {
  362.     LED_P8x16Str(24, 2, (UCHAR8*)" ");
  363.     LED_P8x16Str(80, 2, (UCHAR8*)" ");

  364.     LED_P8x16Str(24, 3, (UCHAR8*)" ");
  365.     LED_P8x16Str(80, 3, (UCHAR8*)" ");
  366. }

  367. void DisplayCursor_temp()        //显示光标
  368. {
  369.     switch(Cursor_place)
  370.     {
  371.     case 1:
  372.         LED_P8x16Str(24, 2, (UCHAR8*)"|");
  373.         break;

  374.     case 2:
  375.         LED_P8x16Str(80, 2, (UCHAR8*)"|");
  376.         break;

  377.     case 3:
  378.         LED_P8x16Str(24, 3, (UCHAR8*)"|");
  379.         break;

  380.     case 4:
  381.         LED_P8x16Str(80, 3, (UCHAR8*)"|");
  382.         break;
  383.     }
  384. }

  385. void Call_DisplayCursor()
  386. {
  387.     Cursor_Flag = !Cursor_Flag;
  388.     NotDisplayCursor();        //不显示
  389.     if(Cursor_Flag == 1)
  390.     {
  391.         DisplayCursor_temp();        //显示光标
  392.     }
  393. }

  394. void Optimum_Display()        //最佳温湿度显示
  395. {
  396. //        0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120           128
  397. //        T L :     2  5     T  H  :     5  5

  398.     /*--------------------低温度---------------------------*/
  399.     DiWenDu[0] = (char)(0X30 + optimum_TL / 10);
  400.     DiWenDu[1] = (char)(0X30 + optimum_TL % 10);

  401.     LED_P8x16Str(0, 2, (UCHAR8*)"TL:");
  402.     LED_P8x16Str(32, 2, (UCHAR8*)DiWenDu);
  403. ……………………

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

所有资料51hei提供下载:
仓库物流.zip (201.3 KB, 下载次数: 26)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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