找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机屋顶漏水检测系统PCB原理图与程序源码设计资料

[复制链接]
跳转到指定楼层
楼主
这是我上学期的一个单片机课设
制作的是一个屋顶漏水系统
有完整的AD原理图以及PCB
测试过的无BUG代码
希望能够帮到有需要的同学
不建议直接复制黏贴
希望你能好好参考然后自己做一个

Altium Designer画的屋顶漏传感器水原理图和PCB图如下:(51hei附件中可下载工程文件)


51单片机屋顶漏水检测系统的源程序如下:
  1. /**********************************************************************
  2. ----------------1.开发环境:Keil v4                                           ----------------
  3. ----------------2.使用单片机型号:STC89C52RC                   ----------------
  4. ***********************************************************************/

  5. #include "main.h"
  6. #include "LCD1602.h"
  7. #include "stdio.h"
  8. #include "PCF8591.h"
  9. #include "DHT11.h"

  10. sbit Key1=P1^4;
  11. sbit Key2=P1^5;
  12. sbit Key3=P1^6;

  13. sbit BEEP=P3^7;
  14. sbit LED=P3^6;

  15. sbit RELAY=P1^0;

  16. unsigned char Show_Temp[30];
  17. unsigned int Time_1Ms,Warning_Time_1Ms;
  18. bit Warning;

  19. void Timer1Init(void);                //1毫秒@11.0592MHz

  20. //****************************************************
  21. //主函数
  22. //****************************************************
  23. void main()
  24. {
  25.         unsigned char num,i;
  26.         unsigned int Set_Value[4]={60,25,100,100};
  27.         unsigned int ADC_Get_value[2];
  28.         unsigned int Type=1;
  29.         LED=1;
  30.         BEEP=0;
  31.         LCD_Init();
  32.         Timer1Init();
  33.         LCD_Write_String(0,0,"Welcome to use!");
  34.         Delay_ms(2000);                 //延时,等待传感器稳定
  35.         LCD_Clear();
  36.         RH();
  37.         ADC_Get_value[0]=ReadADC(2);
  38.         ADC_Get_value[1]=ReadADC(3);       
  39.         TR1 = 1;                //定时器1开始计时
  40.         Time_1Ms=2000;
  41.         while(1)
  42.         {
  43.                 if(Time_1Ms>=2000)
  44.                 {
  45.                        
  46.                         TR1 = 0;                //定时器1开始计时
  47.                         Time_1Ms=0;
  48.                         RH();
  49.                         sprintf(Show_Temp,"H%02d %02d T%02d %02d",(unsigned int)U8RH_data_H,(unsigned int)Set_Value[0],(unsigned int)U8T_data_H,(unsigned int)Set_Value[1]);
  50.                         LCD_Write_String(0,0,Show_Temp);
  51.                         for(i=0;i<20;i++)
  52.                                         Show_Temp[i]=0;
  53.                         ADC_Get_value[0]=ReadADC(2);
  54.                         ADC_Get_value[1]=ReadADC(3);
  55.                         sprintf(Show_Temp,"R%03d %03dM%03d %03d",(unsigned int)ADC_Get_value[0],(unsigned int)Set_Value[2],(unsigned int)ADC_Get_value[1],(unsigned int)Set_Value[3]);
  56.                         LCD_Write_String(0,1,Show_Temp);
  57.                         for(i=0;i<20;i++)
  58.                                 Show_Temp[i]=0;
  59.                         TR1 = 1;                //定时器1开始计时
  60.                 }
  61.                 num=KeyScan();
  62.                 if(num==1)
  63.                 {
  64.                         Type++;
  65.                         if(Type>=5) Type=1;
  66.                         if(Type==1)
  67.                         {
  68.                                 LCD_Write_String(14,0,"S1");
  69.                         }
  70.                         if(Type==2)
  71.                         {
  72.                                 LCD_Write_String(14,0,"S2");
  73.                         }
  74.                         if(Type==3)
  75.                         {
  76.                                 LCD_Write_String(14,0,"S3");
  77.                         }       
  78.                         if(Type==4)
  79.                         {
  80.                                 LCD_Write_String(14,0,"S4");
  81.                         }       
  82.                 }
  83.                 if(num==2)
  84.                 {
  85.                         if(Type==1)
  86.                         {
  87.                                 Set_Value[0]-=1;
  88.                                 if(Set_Value[0]<=0) Set_Value[0]=255;
  89.                         }
  90.                         if(Type==2)
  91.                         {
  92.                                 Set_Value[1]-=1;
  93.                                 if(Set_Value[1]<=0) Set_Value[1]=255;       
  94.                         }
  95.                         if(Type==3)
  96.                         {
  97.                                 Set_Value[2]-=10;
  98.                                 if(Set_Value[2]<=0) Set_Value[2]=500;
  99.                         }       
  100.                         if(Type==4)
  101.                         {
  102.                                 Set_Value[3]-=10;
  103.                                 if(Set_Value[3]<=0) Set_Value[3]=500;
  104.                         }       
  105.                 }
  106.                 if(num==3)
  107.                 {
  108.                         if(Type==1)
  109.                         {
  110.                                 Set_Value[0]+=1;
  111.                                 if(Set_Value[0]>=255) Set_Value[0]=0;
  112.                         }
  113.                         if(Type==2)
  114.                         {
  115.                                 Set_Value[1]+=1;
  116.                                 if(Set_Value[1]>=255) Set_Value[1]=0;       
  117.                         }
  118.                         if(Type==3)
  119.                         {
  120.                                 Set_Value[2]+=10;
  121.                                 if(Set_Value[2]>=500) Set_Value[2]=0;
  122.                         }       
  123.                         if(Type==4)
  124.                         {
  125.                                 Set_Value[3]+=10;
  126.                                 if(Set_Value[3]>=500) Set_Value[3]=0;
  127.                         }       
  128.                 }
  129.                 if(num!=0)
  130.                 {
  131.                         Time_1Ms=0;
  132.                         sprintf(Show_Temp,"H%02d %02d T%02d %02d",(unsigned int)U8RH_data_H,(unsigned int)Set_Value[0],(unsigned int)U8T_data_H,(unsigned int)Set_Value[1]);
  133.                         LCD_Write_String(0,0,Show_Temp);
  134.                         for(i=0;i<20;i++)
  135.                                 Show_Temp[i]=0;
  136.                         sprintf(Show_Temp,"R%03d %03dM%03d %03d",(unsigned int)ADC_Get_value[0],(unsigned int)Set_Value[2],(unsigned int)ADC_Get_value[1],(unsigned int)Set_Value[3]);
  137.                         LCD_Write_String(0,1,Show_Temp);
  138.                         for(i=0;i<20;i++)
  139.                                 Show_Temp[i]=0;
  140.                 }
  141.                 if((U8RH_data_H>Set_Value[0])||(U8T_data_H>Set_Value[1])||(ADC_Get_value[0]>Set_Value[2])||(ADC_Get_value[1]>Set_Value[3]))
  142.                 {
  143.                         Warning=1;
  144.                         if(U8RH_data_H>Set_Value[0])
  145.                         {
  146.                                 LCD_Write_Char(3,0,'*');
  147.                         }
  148.                         else
  149.                         {
  150.                                 LCD_Write_Char(3,0,' ');
  151.                         }
  152.                                
  153.                         if(U8T_data_H>Set_Value[1])
  154.                         {
  155.                                 LCD_Write_Char(10,0,'*');
  156.                         }
  157.                         else
  158.                         {
  159.                                 LCD_Write_Char(10,0,' ');
  160.                         }
  161.                         if(ADC_Get_value[0]>Set_Value[2])
  162.                         {
  163.                                 LCD_Write_Char(4,1,'*');
  164.                         }
  165.                         else
  166.                         {
  167.                                 LCD_Write_Char(4,1,' ');
  168.                         }
  169.                         if(ADC_Get_value[1]>Set_Value[3])
  170.                         {
  171.                                 LCD_Write_Char(12,1,'*');
  172.                         }
  173.                         else
  174.                         {
  175.                                 LCD_Write_Char(12,1,' ');
  176.                         }
  177.                 }
  178.                 else
  179.                         Warning=0;
  180.         }
  181. }



  182. //****************************************************
  183. //MS延时函数(12M晶振下测试)
  184. //****************************************************
  185. void Delay_ms(unsigned int n)
  186. {
  187.         unsigned int  i,j;
  188.         for(i=0;i<n;i++)
  189.                 for(j=0;j<123;j++);
  190. }

  191. /****************************************************
  192. 按键扫描函数,返回扫描键值
  193. ****************************************************/
  194. unsigned char KeyScan(void)
  195. {
  196.   if(!Key3)  //如果检测到低电平,说明按键按下
  197.     {
  198.          Delay_ms(20); //延时去抖,一般10-20ms
  199.      if(!Key3)     //再次确认按键是否按下,没有按下则退出
  200.            {
  201.         while(!Key3);//如果确认按下按键等待按键释放,没有释放则一直等待
  202.                                 return 3;   
  203.            }
  204.         }
  205.   if(!Key2)  //如果检测到低电平,说明按键按下
  206.     {
  207.          Delay_ms(20); //延时去抖,一般10-20ms
  208.      if(!Key2)     //再次确认按键是否按下,没有按下则退出
  209.            {
  210.         while(!Key2);//如果确认按下按键等待按键释放,没有释放则一直等待
  211.                                 return 2;
  212.            }
  213.         }
  214.   if(!Key1)  //如果检测到低电平,说明按键按下
  215.     {
  216.          Delay_ms(20); //延时去抖,一般10-20ms
  217.      if(!Key1)     //再次确认按键是否按下,没有按下则退出
  218.            {
  219.         while(!Key1);//如果确认按下按键等待按键释放,没有释放则一直等待
  220.                                 return 1;
  221.            }
  222.         }
  223.    return 0;
  224. }

  225. void Timer1Init(void)                //1毫秒@11.0592MHz
  226. {
  227.         TMOD |= 0x10;                //设置定时器模式
  228.         TL1 = 0x66;                //设置定时初值
  229.         TH1 = 0xFC;                //设置定时初值
  230.         TF1 = 0;                //清除TF1标志
  231.         TR1 = 0;                //定时器1开始计时
  232.         ET1=1;
  233.         EA = 1;
  234. }

  235. /*------------------------------------------------
  236.                  定时器中断子程序
  237. ------------------------------------------------*/
  238. void Timer1_isr(void) interrupt 3 using 2
  239. {
  240.         TL1 = 0x66;                //设置定时初值
  241.         TH1 = 0xFC;                //设置定时初值
  242.         Time_1Ms++;
  243.         if(Warning==1)
  244.         {
  245.                 RELAY=1;
  246.                 Warning_Time_1Ms++;
  247.                 if(Warning_Time_1Ms>500)
  248.                 {
  249.                         LED=~LED;
  250.                         Warning_Time_1Ms=0;
  251.                         BEEP=~BEEP;
  252.                 }
  253.         }
  254.         else
  255.         {
  256.                 LED=1;
  257.                 BEEP=0;
  258. ……………………

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



所有资料51hei提供下载:
屋顶漏水.zip (10.81 MB, 下载次数: 40)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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