這是我上學期的一個單片機課設
制作的是一個屋頂漏水系統
有完整的AD原理圖以及PCB
測試過的無BUG代碼
希望能夠幫到有需要的同學
不建議直接復制黏貼
希望你能好好參考然后自己做一個
Altium Designer畫的屋頂漏傳感器水原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51單片機屋頂漏水檢測系統的源程序如下:
- /**********************************************************************
- ----------------1.開發環境:Keil v4 ----------------
- ----------------2.使用單片機型號:STC89C52RC ----------------
- ***********************************************************************/
- #include "main.h"
- #include "LCD1602.h"
- #include "stdio.h"
- #include "PCF8591.h"
- #include "DHT11.h"
- sbit Key1=P1^4;
- sbit Key2=P1^5;
- sbit Key3=P1^6;
- sbit BEEP=P3^7;
- sbit LED=P3^6;
- sbit RELAY=P1^0;
- unsigned char Show_Temp[30];
- unsigned int Time_1Ms,Warning_Time_1Ms;
- bit Warning;
- void Timer1Init(void); //1毫秒@11.0592MHz
- //****************************************************
- //主函數
- //****************************************************
- void main()
- {
- unsigned char num,i;
- unsigned int Set_Value[4]={60,25,100,100};
- unsigned int ADC_Get_value[2];
- unsigned int Type=1;
- LED=1;
- BEEP=0;
- LCD_Init();
- Timer1Init();
- LCD_Write_String(0,0,"Welcome to use!");
- Delay_ms(2000); //延時,等待傳感器穩定
- LCD_Clear();
- RH();
- ADC_Get_value[0]=ReadADC(2);
- ADC_Get_value[1]=ReadADC(3);
- TR1 = 1; //定時器1開始計時
- Time_1Ms=2000;
- while(1)
- {
- if(Time_1Ms>=2000)
- {
-
- TR1 = 0; //定時器1開始計時
- Time_1Ms=0;
- RH();
- 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]);
- LCD_Write_String(0,0,Show_Temp);
- for(i=0;i<20;i++)
- Show_Temp[i]=0;
- ADC_Get_value[0]=ReadADC(2);
- ADC_Get_value[1]=ReadADC(3);
- 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]);
- LCD_Write_String(0,1,Show_Temp);
- for(i=0;i<20;i++)
- Show_Temp[i]=0;
- TR1 = 1; //定時器1開始計時
- }
- num=KeyScan();
- if(num==1)
- {
- Type++;
- if(Type>=5) Type=1;
- if(Type==1)
- {
- LCD_Write_String(14,0,"S1");
- }
- if(Type==2)
- {
- LCD_Write_String(14,0,"S2");
- }
- if(Type==3)
- {
- LCD_Write_String(14,0,"S3");
- }
- if(Type==4)
- {
- LCD_Write_String(14,0,"S4");
- }
- }
- if(num==2)
- {
- if(Type==1)
- {
- Set_Value[0]-=1;
- if(Set_Value[0]<=0) Set_Value[0]=255;
- }
- if(Type==2)
- {
- Set_Value[1]-=1;
- if(Set_Value[1]<=0) Set_Value[1]=255;
- }
- if(Type==3)
- {
- Set_Value[2]-=10;
- if(Set_Value[2]<=0) Set_Value[2]=500;
- }
- if(Type==4)
- {
- Set_Value[3]-=10;
- if(Set_Value[3]<=0) Set_Value[3]=500;
- }
- }
- if(num==3)
- {
- if(Type==1)
- {
- Set_Value[0]+=1;
- if(Set_Value[0]>=255) Set_Value[0]=0;
- }
- if(Type==2)
- {
- Set_Value[1]+=1;
- if(Set_Value[1]>=255) Set_Value[1]=0;
- }
- if(Type==3)
- {
- Set_Value[2]+=10;
- if(Set_Value[2]>=500) Set_Value[2]=0;
- }
- if(Type==4)
- {
- Set_Value[3]+=10;
- if(Set_Value[3]>=500) Set_Value[3]=0;
- }
- }
- if(num!=0)
- {
- Time_1Ms=0;
- 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]);
- LCD_Write_String(0,0,Show_Temp);
- for(i=0;i<20;i++)
- Show_Temp[i]=0;
- 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]);
- LCD_Write_String(0,1,Show_Temp);
- for(i=0;i<20;i++)
- Show_Temp[i]=0;
- }
- 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]))
- {
- Warning=1;
- if(U8RH_data_H>Set_Value[0])
- {
- LCD_Write_Char(3,0,'*');
- }
- else
- {
- LCD_Write_Char(3,0,' ');
- }
-
- if(U8T_data_H>Set_Value[1])
- {
- LCD_Write_Char(10,0,'*');
- }
- else
- {
- LCD_Write_Char(10,0,' ');
- }
- if(ADC_Get_value[0]>Set_Value[2])
- {
- LCD_Write_Char(4,1,'*');
- }
- else
- {
- LCD_Write_Char(4,1,' ');
- }
- if(ADC_Get_value[1]>Set_Value[3])
- {
- LCD_Write_Char(12,1,'*');
- }
- else
- {
- LCD_Write_Char(12,1,' ');
- }
- }
- else
- Warning=0;
- }
- }
- //****************************************************
- //MS延時函數(12M晶振下測試)
- //****************************************************
- void Delay_ms(unsigned int n)
- {
- unsigned int i,j;
- for(i=0;i<n;i++)
- for(j=0;j<123;j++);
- }
- /****************************************************
- 按鍵掃描函數,返回掃描鍵值
- ****************************************************/
- unsigned char KeyScan(void)
- {
- if(!Key3) //如果檢測到低電平,說明按鍵按下
- {
- Delay_ms(20); //延時去抖,一般10-20ms
- if(!Key3) //再次確認按鍵是否按下,沒有按下則退出
- {
- while(!Key3);//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
- return 3;
- }
- }
- if(!Key2) //如果檢測到低電平,說明按鍵按下
- {
- Delay_ms(20); //延時去抖,一般10-20ms
- if(!Key2) //再次確認按鍵是否按下,沒有按下則退出
- {
- while(!Key2);//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
- return 2;
- }
- }
- if(!Key1) //如果檢測到低電平,說明按鍵按下
- {
- Delay_ms(20); //延時去抖,一般10-20ms
- if(!Key1) //再次確認按鍵是否按下,沒有按下則退出
- {
- while(!Key1);//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
- return 1;
- }
- }
- return 0;
- }
- void Timer1Init(void) //1毫秒@11.0592MHz
- {
- TMOD |= 0x10; //設置定時器模式
- TL1 = 0x66; //設置定時初值
- TH1 = 0xFC; //設置定時初值
- TF1 = 0; //清除TF1標志
- TR1 = 0; //定時器1開始計時
- ET1=1;
- EA = 1;
- }
- /*------------------------------------------------
- 定時器中斷子程序
- ------------------------------------------------*/
- void Timer1_isr(void) interrupt 3 using 2
- {
- TL1 = 0x66; //設置定時初值
- TH1 = 0xFC; //設置定時初值
- Time_1Ms++;
- if(Warning==1)
- {
- RELAY=1;
- Warning_Time_1Ms++;
- if(Warning_Time_1Ms>500)
- {
- LED=~LED;
- Warning_Time_1Ms=0;
- BEEP=~BEEP;
- }
- }
- else
- {
- LED=1;
- BEEP=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
屋頂漏水.zip
(10.81 MB, 下載次數: 41)
2018-4-20 13:59 上傳
點擊文件名下載附件
|