|
基于51單片機的教室智能照明控制系統(tǒng)
芯片:stc89c52 ;
時間模塊:ds1302
顯示:1602
溫度:ds18b2紅外檢測+lm339比較器
文件包括原理圖,PCB,源碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真圖.jpg (850.34 KB, 下載次數(shù): 92)
下載附件
2020-4-6 22:30 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
PCB.jpg (146.5 KB, 下載次數(shù): 69)
下載附件
2020-4-6 22:30 上傳
原理圖.jpg (368.08 KB, 下載次數(shù): 101)
下載附件
2020-4-6 22:30 上傳
制作出來的實物圖如下:
1.jpg (421.48 KB, 下載次數(shù): 90)
下載附件
2020-4-6 22:31 上傳
2.jpg (417.82 KB, 下載次數(shù): 60)
下載附件
2020-4-6 22:31 上傳
3.jpg (408.11 KB, 下載次數(shù): 92)
下載附件
2020-4-6 22:31 上傳
4.jpg (491.1 KB, 下載次數(shù): 74)
下載附件
2020-4-6 22:31 上傳
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar time_data[7];
- uchar code write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //數(shù)據(jù)的地址
- uchar code read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
- uchar code table1[]="C: 00|2000/00/00";
- uchar code table2[]="T: 00|00:00:00 0";
- uchar code table3[]=" "; //清屏內(nèi)容
- uchar code table4[]=" Set Real Time ";
- uchar code table5[]=" Set Open Time ";
- uchar code table6[]=" Start Time: ";
- uchar code table7[]=" 00:00:00 ";
- uchar code table8[]=" End Time: ";
- uchar code table9[]="Date: 2000/00/00";
- uchar code table0[]="Time: 00:00:00 0";
- bit Adjust; //調(diào)節(jié)標(biāo)志位,=1表示進入調(diào)節(jié)模式,=0是正常模式
- bit Auto_flg; //自動模式標(biāo)志位,=1表示手動模式,=0是自動模式
- sbit rs=P1^0; //LCD1602
- sbit rw=P1^1; //LCD1602
- sbit e=P1^2; //LCD1602
- sbit sck=P2^5; //時鐘端口
- sbit io=P2^6; //時鐘端口
- sbit rst=P2^7; //時鐘端口
- sbit SELT =P1^6; //選擇鍵
- sbit ENTER=P1^7; //確認(rèn)鍵
- sbit UP =P3^0; //加鍵
- sbit DOWN =P3^1; //減鍵
- sbit MODE =P3^2; //切換按鍵接口
- sbit SWITCH=P3^3; //手動開關(guān)
- sbit AUTO_LED=P1^3; //自動模式燈接口
- sbit HAND_LED=P1^4; //手動燈接口
- sbit LAMP1=P3^4; //燈接口
- sbit LAMP2=P3^5; //燈接口
- sbit LAMP3=P3^6; //燈接口
- sbit LAMP4=P3^7; //燈接口
- sbit LIGHT1=P2^0; //光線檢測端口
- sbit IN1=P2^2;
- sbit OUT1=P2^1;
- sbit DQ=P1^5; //溫度數(shù)據(jù)口
- uchar Select_num; //選擇按鍵按下次數(shù)
- uchar Enter_num; //確認(rèn)按鍵按下次數(shù)
- uchar Switch_num; //手動開關(guān)按鍵按下次數(shù)
- float Year,Month,Day,Hour,Minute,Second; //時間設(shè)置值
- uchar Week;
- float Hour_H,Minute_H,Second_H; //設(shè)置開始時間
- float Hour_L,Minute_L,Second_L; //設(shè)置結(jié)束時間
- int Value1; //人數(shù)
- uchar IN1_flag=0;
- uchar OUT1_flag=0;
- uint Count; //T0定時器中斷計數(shù)次數(shù)
- uchar Miao;
- int temperature; //全局變量 溫度
- void read_rtc();
- /**************************************************LCD1602顯示*******************************************************************/
- void delay1(uint z) //延時函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- void write_com(uchar com) //寫指令函數(shù)
- {
- rw=0;
- delay1(5);
- rs=0;
- delay1(5);
- e=1;
- delay1(5);
- P0=com;
- delay1(5);
- e=0;
- delay1(5);
- }
- void write_date(uchar date) //寫數(shù)據(jù)函數(shù)
- {
- rw=0;
- delay1(5);
- rs=1;
- delay1(5);
- e=1;
- delay1(5);
- P0=date;
- delay1(5);
- e=0;
- delay1(5);
- }
- void init() //初始化函數(shù)
- {
- uchar num;
- Year=17;
- Month=1;
- Day=1;
- Hour=15;
- Minute=30;
- Second=50;
- Week=1;
- Hour_H=22;
- Minute_H=0;
- Second_H=0;
- Hour_L=18;
- Minute_L=0;
- Second_L=0;
- e=0; // 時序表e初始為0
- write_com(0x38); //設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口
- write_com(0x0c); //設(shè)置光標(biāo)
- write_com(0x06); //光標(biāo)自動加1,光標(biāo)輸入方式
- write_com(0x01); //清屏
- write_com(0x80); //設(shè)置初始顯示位置
- for(num=0;num<16;num++)
- {
- write_date(table1[num]);
- delay1(5);
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(table2[num]);
- delay1(5);
- }
- }
- void SetTime_dispaly(uchar add,uchar dat) //第一個:參數(shù)的地址,第二個:參數(shù)的內(nèi)容
- {
- uchar shi,ge;
- shi=dat/10; //把十位提取出來
- ge=dat%10; //把個位提取出來
- write_com(add); //要寫的地址
- write_date(0x30+shi); //十位的內(nèi)容 1602字符庫
- write_date(0x30+ge); //個位的內(nèi)容 1602字符庫
- }
- void Week_dispaly(uchar add,uchar dat) //第一個:參數(shù)的地址,第二個:參數(shù)的內(nèi)容
- {
- write_com(add); //要寫的地址
- write_date(0x30+dat); //十位的內(nèi)容 1602字符庫
- }
- void Date_dispaly(uchar add,uchar dat) //第一個:參數(shù)的地址,第二個:參數(shù)的內(nèi)容
- {
- uchar shi,ge;
- shi=dat/16; //把十位提取出來
- ge=dat%16; //把個位提取出來
- write_com(add+3); //要寫的地址
- write_date(0x30+shi); //十位的內(nèi)容 1602字符庫
- write_date(0x30+ge); //個位的內(nèi)容 1602字符庫
- }
- void LCD_Clean(uchar i) //液晶屏清除顯示
- {
- uchar num;
- if(i==1)
- {
- write_com(0x80); //設(shè)置初始顯示位置
- for(num=0;num<16;num++) //顯示第一行內(nèi)容
- {
- write_date(table3[num]);
- delay1(1);
- }
- }
- if(i==2)
- {
- write_com(0x80+0x40);
- for(num=0;num<16;num++) //顯示第二行內(nèi)容
- {
- write_date(table3[num]);
- delay1(1);
- }
- }
- }
- void LCD_Display_String(unsigned char line,unsigned char *string)
- { //液晶屏顯示內(nèi)容,把要顯示的內(nèi)容寫到對應(yīng)的位置
- unsigned char i;
- unsigned char address=0;
- if(line==1)
- {
- address=0x80; //0X80是第1行的第1個位置 ,0x81第2位
- }
- else if(line==2)
- {
- address=0x80+0x40; //0X80+0x40是第2行的第1個位置 ,0X80+0x40+1是第2行第2位
- }
-
- for(i=0;i<16;i++)
- {
- write_com(address);
- write_date(string[i]);
- address++;
- }
- }
- /**********************************DS1302時鐘***************************************/
- void Time_Display(void)
- {
- read_rtc();
- Date_dispaly(0x80+0x40+9,time_data[6]); //顯示秒
- Date_dispaly(0x80+0x40+6,time_data[5]); //顯示分
- Date_dispaly(0x80+0x40+3,time_data[4]); //顯示時
- Date_dispaly(0x80+11,time_data[3]); //顯示日
- Date_dispaly(0x80+8,time_data[2]); //顯示月
- Week_dispaly(0x80+0x40+15,time_data[1]); //顯示周
- Date_dispaly(0x80+5,time_data[0]); //顯示年
- // Year/10*16+Year%10
- Hour=time_data[4]/16*10+time_data[4]%16;;
- Minute=time_data[5]/16*10+time_data[5]%16;;
- Second=time_data[6]/16*10+time_data[6]%16;;
- }
- void write_ds1302_byte(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- sck=0;
- io=dat&0x01; //準(zhǔn)備數(shù)據(jù),從最低位開始
- dat=dat>>1;
- sck=1;
- }
- }
- void write_ds1302(uchar add,uchar dat)
- {
- rst=0;
- _nop_(); //CPU原地踏步
- sck=0;
- _nop_();
- rst=1;
- _nop_();
- write_ds1302_byte(add); //傳地址
- write_ds1302_byte(dat); //傳數(shù)據(jù)
- rst=0; //不受其他影響
- _nop_();
- io=1; //釋放
- sck=1;
- }
- uchar read_ds1302(uchar add)
- {
- uchar i,value;
- rst=0;
- _nop_(); //CPU原地踏步
- sck=0;
- _nop_();
- rst=1;
- _nop_();
- write_ds1302_byte(add);
- for(i=0;i<8;i++)
- {
- value=value>>1;
- sck=0;
- if(io)
- value=value|0x80;
- sck=1;
- }
- rst=0;
- _nop_();
- sck=0;
- _nop_();
- sck=1;
- io=1;
- return value;
- }
- void set_rtc() //設(shè)置時間
- {
- uchar i,j;
- for(i=0;i<7;i++) //轉(zhuǎn)換BCD碼
- {
- j=time_data[i]/10;
- time_data[i]=time_data[i]%10;
- time_data[i]=time_data[i]+j*16;
- }
- write_ds1302(0x8e,0x00); //去除寫保護
- for(i=0;i<7;i++)
- {
- write_ds1302(write_add[i],time_data[i]);
- }
- write_ds1302(0x8e,0x80); //加寫保護
- }
- void read_rtc()
- {
- uchar i;
- for(i=0;i<7;i++)
- {
- time_data[i]=read_ds1302(read_add[i]); //最終讀出來的數(shù) 16進制
- }
- }
- /*************************************************按鍵****************************************************************/
- void Keyscan(void)
- {
- if(SELT==0)
- {
- delay1(2);
- if(SELT==0)
- {
- while(!SELT);
- Select_num++; //選擇鍵按下一次
- Adjust=1; //進入調(diào)節(jié)模式
- }
- if(Select_num==1)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table4);
- LCD_Display_String(2,table5);
- write_com(0x80+0); //寫 >>
- write_date(0x3e);
- write_com(0x80+1); //寫 >>
- write_date(0x3e);
- Enter_num=0;
- }
- if(Select_num==2)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table4);
- LCD_Display_String(2,table5);
- write_com(0x80+0x40+0); //寫 >>
- write_date(0x3e);
- write_com(0x80+0x40+1); //寫 >>
- write_date(0x3e);
- Enter_num=0;
- }
- if(Select_num==3)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table1);
- LCD_Display_String(2,table2);
- Select_num=0;
- Enter_num=0;
- Adjust=0;
- }
- write_com(0x0c); //光標(biāo)不再閃爍
- Enter_num=0;
- }
-
- if(ENTER==0)
- {
- delay1(2);
- if(ENTER==0)
- {
- while(!ENTER);
- Enter_num++;
- }
- if(Select_num==1) //設(shè)置實時時間
- {
- if(Enter_num==1)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table9);
- LCD_Display_String(2,table0);
- SetTime_dispaly(0x80+8,Year);
- SetTime_dispaly(0x80+11,Month);
- SetTime_dispaly(0x80+14,Day);
- SetTime_dispaly(0x80+0x40+6,Hour);
- SetTime_dispaly(0x80+0x40+9,Minute);
- SetTime_dispaly(0x80+0x40+12,Second);
- Week_dispaly(0x80+0x40+15,Week);
- write_com(0x80+8); //光標(biāo)閃爍地址,停留在年的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==2)
- {
- write_com(0x80+11); //光標(biāo)閃爍地址,停留在月的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==3)
- {
- write_com(0x80+14); //光標(biāo)閃爍地址,停留在日的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==4)
- {
- write_com(0x80+0x40+6); //光標(biāo)閃爍地址,停留在時的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==5)
- {
- write_com(0x80+0x40+9); //光標(biāo)閃爍地址,停留在分的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==6)
- {
- write_com(0x80+0x40+12); //光標(biāo)閃爍地址,停留在秒的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==7)
- {
- write_com(0x80+0x40+15); //光標(biāo)閃爍地址,停留在星期的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==8)
- {
- Enter_num=0;
- write_com(0x0c); //光標(biāo)不再閃爍
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table1);
- LCD_Display_String(2,table2);
- time_data[0]=Year;///10*16+Year%10;
- time_data[1]=Week;///10*16+Week%10;
- time_data[2]=Month;///10*16+Month%10;
- time_data[3]=Day;///10*16+Day%10;
- time_data[4]=Hour;///10*16+Hour%10;
- time_data[5]=Minute;///10*16+Minute%10;
- time_data[6]=Second;///10*16+Second%10;
- set_rtc(); //設(shè)置時間
- Select_num=0;
- Adjust=0;
- }
- }
- if(Select_num==2) //設(shè)置開關(guān)鎖時間
- {
- if(Enter_num==1)
- {
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table6);
- LCD_Display_String(2,table7);
- SetTime_dispaly(0x80+0x40+4,Hour_L);
- SetTime_dispaly(0x80+0x40+7,Minute_L);
- SetTime_dispaly(0x80+0x40+10,Second_L);
- write_com(0x80+0x40+4); //光標(biāo)閃爍地址,停留在時的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==2)
- {
- write_com(0x80+0x40+7); //光標(biāo)閃爍地址,停留在分的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==3)
- {
- write_com(0x80+0x40+10); //光標(biāo)閃爍地址,停留在秒的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==4)
- {
- write_com(0x0c); //光標(biāo)不再閃爍
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table8);
- LCD_Display_String(2,table7);
- SetTime_dispaly(0x80+0x40+4,Hour_H);
- SetTime_dispaly(0x80+0x40+7,Minute_H);
- SetTime_dispaly(0x80+0x40+10,Second_H);
- write_com(0x80+0x40+4); //光標(biāo)閃爍地址,停留在時的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==5)
- {
- write_com(0x80+0x40+7); //光標(biāo)閃爍地址,停留在分的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==6)
- {
- write_com(0x80+0x40+10); //光標(biāo)閃爍地址,停留在秒的位置上
- write_com(0x0f); //光標(biāo)閃爍
- }
- if(Enter_num==7)
- {
- Enter_num=0;
- write_com(0x0c); //光標(biāo)不再閃爍
- LCD_Clean(1);
- LCD_Clean(2);
- LCD_Display_String(1,table1);
- LCD_Display_String(2,table2);
- Select_num=0;
- Adjust=0;
- }
- }
- }
- if(UP==0)
- {
- delay1(2);
- if(UP==0)
- {
- while(!UP);
- if(Select_num==1)
- {
- if(Enter_num==1)
- {
- Year++;
- if(Year>99)
- Year=0;
- SetTime_dispaly(0x80+8,Year);
- write_com(0x80+8);
- write_com(0x0f);
- }
- if(Enter_num==2)
- {
- Month++;
- if(Month>12)
- Month=1;
- SetTime_dispaly(0x80+11,Month);
- write_com(0x80+11);
- write_com(0x0f);
- }
- if(Enter_num==3)
- {
- Day++;
- if(Day>31)
- Day=1;
- SetTime_dispaly(0x80+14,Day);
- write_com(0x80+14);
- write_com(0x0f);
- }
- if(Enter_num==4)
- {
- Hour++;
- if(Hour>23)
- Hour=0;
- SetTime_dispaly(0x80+0x40+6,Hour);
- write_com(0x80+0x40+6);
- write_com(0x0f);
- }
- if(Enter_num==5)
- {
- Minute++;
- if(Minute>59)
- Minute=0;
- SetTime_dispaly(0x80+0x40+9,Minute);
- write_com(0x80+0x40+9);
- write_com(0x0f);
- }
- if(Enter_num==6)
- {
- Second++;
- if(Second>59)
- Second=0;
- SetTime_dispaly(0x80+0x40+12,Second);
- write_com(0x80+0x40+12);
- write_com(0x0f);
- }
- if(Enter_num==7)
- {
- Week++;
- if(Week>7)
- Week=1;
- Week_dispaly(0x80+0x40+15,Week);
- write_com(0x80+0x40+15);
- write_com(0x0f);
- }
- }
- if(Select_num==2)
- {
- if(Enter_num==1)
- {
- Hour_L++;
- if(Hour_L>23)
- Hour_L=0;
- SetTime_dispaly(0x80+0x40+4,Hour_L);
- write_com(0x80+0x40+4);
- write_com(0x0f);
- }
- if(Enter_num==2)
- {
- Minute_L++;
- if(Minute_L>59)
- Minute_L=0;
- SetTime_dispaly(0x80+0x40+7,Minute_L);
- write_com(0x80+0x40+7);
- write_com(0x0f);
- }
-
- if(Enter_num==3)
- {
- Second_L++;
- if(Second_L>59)
- Second_L=0;
- SetTime_dispaly(0x80+0x40+10,Second_L);
- write_com(0x80+0x40+10);
- write_com(0x0f);
- }
- if(Enter_num==4)
- {
- Hour_H++;
- if(Hour_H>23)
- Hour_H=0;
- SetTime_dispaly(0x80+0x40+4,Hour_H);
- write_com(0x80+0x40+4);
- write_com(0x0f);
- }
- if(Enter_num==5)
- {
- Minute_H++;
- if(Minute_H>59)
- Minute_H=0;
- SetTime_dispaly(0x80+0x40+7,Minute_H);
- write_com(0x80+0x40+7);
- write_com(0x0f);
- }
-
- if(Enter_num==6)
- {
- Second_H++;
- if(Second_H>59)
- Second_H=0;
- SetTime_dispaly(0x80+0x40+10,Second_H);
- write_com(0x80+0x40+10);
- write_com(0x0f);
- }
- }
- }
- }
- if(DOWN==0)
- {
- delay1(2);
- if(DOWN==0)
- {
- while(!DOWN);
- if(Select_num==1)
- {
- if(Enter_num==1)
- {
- Year--;
- if(Year<0)
- Year=99;
- SetTime_dispaly(0x80+8,Year);
- write_com(0x80+8);
- write_com(0x0f);
- }
- if(Enter_num==2)
- {
- Month--;
- if(Month<1)
- Month=12;
- SetTime_dispaly(0x80+11,Month);
- write_com(0x80+11);
- write_com(0x0f);
- }
- if(Enter_num==3)
- {
- Day--;
- if(Day<1)
- Day=31;
- SetTime_dispaly(0x80+14,Day);
- write_com(0x80+14);
- write_com(0x0f);
- }
- if(Enter_num==4)
- {
- Hour--;
- if(Hour<0)
- Hour=23;
- SetTime_dispaly(0x80+0x40+6,Hour);
- write_com(0x80+0x40+6);
- write_com(0x0f);
- }
- if(Enter_num==5)
- {
- Minute--;
- if(Minute<0)
- Minute=59;
- SetTime_dispaly(0x80+0x40+9,Minute);
- write_com(0x80+0x40+9);
- write_com(0x0f);
- }
- if(Enter_num==6)
- {
- Second--;
- if(Second<0)
- Second=59;
- SetTime_dispaly(0x80+0x40+12,Second);
- write_com(0x80+0x40+12);
- write_com(0x0f);
- }
- if(Enter_num==7)
- {
- Week--;
- if(Week<1)
- Week=7;
- Week_dispaly(0x80+0x40+15,Week);
- write_com(0x80+0x40+15);
- write_com(0x0f);
- }
- }
- if(Select_num==2)
- {
- if(Enter_num==1)
- {
- Hour_L--;
- if(Hour_L<0)
- Hour_L=23;
- SetTime_dispaly(0x80+0x40+4,Hour_L);
- write_com(0x80+0x40+4);
- write_com(0x0f);
- }
- if(Enter_num==2)
- {
- Minute_L--;
- if(Minute_L<0)
- Minute_L=59;
- SetTime_dispaly(0x80+0x40+7,Minute_L);
- write_com(0x80+0x40+7);
- write_com(0x0f);
- }
- if(Enter_num==3)
- {
- Second_L--;
- if(Second_L<0)
- Second_L=59;
- SetTime_dispaly(0x80+0x40+10,Second_L);
- write_com(0x80+0x40+10);
- write_com(0x0f);
- }
-
- if(Enter_num==4)
- {
- Hour_H--;
- if(Hour_H<0)
- Hour_H=23;
- SetTime_dispaly(0x80+0x40+4,Hour_H);
- write_com(0x80+0x40+4);
- write_com(0x0f);
- }
- if(Enter_num==5)
- {
- Minute_H--;
- if(Minute_H<0)
- Minute_H=59;
- SetTime_dispaly(0x80+0x40+7,Minute_H);
- write_com(0x80+0x40+7);
- write_com(0x0f);
- }
- if(Enter_num==6)
- {
- Second_H--;
- if(Second_H<0)
- Second_H=59;
- SetTime_dispaly(0x80+0x40+10,Second_H);
- write_com(0x80+0x40+10);
- write_com(0x0f);
- }
- }
- }
- }
- if(MODE==0) //切換按鍵按下
- {
- delay1(2); //消抖
- if(MODE==0)
- {
- while(!MODE); //按鍵釋放
- Auto_flg=~Auto_flg; //模式切換
- if(Auto_flg==0) //自動模式
- {
- AUTO_LED=0; //自動燈亮
- HAND_LED=1;
- }
- if(Auto_flg==1) //手動模式
- {
- AUTO_LED=1;
- HAND_LED=0; //手動燈亮
- LAMP1=1; //關(guān)燈
- LAMP2=1;
- LAMP3=1;
- LAMP4=1;
- }
- }
- }
- if(Auto_flg==1) //手動模式
- {
- if(SWITCH==0) //燈開關(guān)按鍵按下
- {
- delay1(2); //消抖
- if(SWITCH==0)
- {
- while(!SWITCH); //按鍵釋放
- Switch_num++; //按下次數(shù)增加
- if(Switch_num==1) //按下一次,開一盞燈
- {
- LAMP1=0;
- LAMP2=1;
- LAMP3=1;
- LAMP4=1;
- }
- if(Switch_num==2) //按下二次,開二盞燈
- {
- LAMP1=0;
- LAMP2=0;
- LAMP3=1;
- LAMP4=1;
- }
- if(Switch_num==3) //按下3次,開3盞燈
- {
- LAMP1=0;
- LAMP2=0;
- LAMP3=0;
- LAMP4=1;
- }
- if(Switch_num==4) //按下4次,開4盞燈
- {
- LAMP1=0;
- LAMP2=0;
- LAMP3=0;
- LAMP4=0;
- }
- if(Switch_num==5) //按下5次,開0盞燈
- {
- LAMP1=1;
- LAMP2=1;
- LAMP3=1;
- LAMP4=1;
- Switch_num=0; //次數(shù)清除
- }
- }
- }
- }
- }
- void Open(void)
- {
- float Now;
- float Set_L,Set_H;
- Now=Hour+Minute/60+Second/3600; //把實時時間化成小時為單位
- Set_L=Hour_L+Minute_L/60+Second_L/3600; //把設(shè)置下限時間化成小時為單位
- Set_H=Hour_H+Minute_H/60+Second_H/3600; //把設(shè)置上限時間化成小時為單位
- if(Auto_flg==0) //自動模式
- {
- if((Now>=Set_L)&(Now<=Set_H)) //實時時間在上下限時間范圍內(nèi)
- {
- if(LIGHT1==0) //光線不足
- {
- if(Value1==0)
- {
- LAMP1=1; //全滅
- LAMP2=1;
- LAMP3=1;
- LAMP4=1;
- }
- if((Value1>0)&(Value1<10))
- {
- LAMP1=0; //亮一個燈
- LAMP2=1;
- LAMP3=1;
- LAMP4=1;
- }
- if((Value1>=10)&(Value1<20))
- {
- LAMP1=0; //亮二個燈
- LAMP2=0;
- LAMP3=1;
- LAMP4=1;
- }
- if((Value1>=20)&(Value1<30))
- {
- LAMP1=0; //亮三個燈
- LAMP2=0;
- LAMP3=0;
- LAMP4=1;
- }
- if(Value1>=30)
- {
- LAMP1=0; //亮四個燈
- LAMP2=0;
- LAMP3=0;
- LAMP4=0;
- }
- }
- if(LIGHT1==1) //光線強烈
- {
- LAMP1=1; //全滅
- LAMP2=1;
- LAMP3=1;
- LAMP4=1;
- }
- }
-
- if((Now<Set_L)|(Now>Set_H)) //實時時間不在范圍內(nèi)
- {
- LAMP1=1; //全滅
- LAMP2=1;
- LAMP3=1;
- LAMP4=1;
- }
- }
- }
- /*******************************************************************************************************/
- void Count_Value(void)
- {
- SetTime_dispaly(0x80+3,Value1);
- if(IN1==0)
- {
- delay1(1);
- if(IN1==0)
- {
- while(!IN1);
- if(OUT1_flag==0)
- {
- IN1_flag=1;
- TR0=1; //開啟定時器 防止誤觸發(fā)
- }
- if(OUT1_flag==1)
- {
-
- Value1++; //人數(shù)增加
- if(Value1>=99) //如果人數(shù)計數(shù)到99,變?yōu)樽畲?9
- Value1=99;
- OUT1_flag=0; //清零
- IN1_flag=0;
- TR0=0; //關(guān)閉定時器
- Count=0;
- Miao=0;
- }
- }
- }
- if(OUT1==0)
- {
- delay1(1);
- if(OUT1==0)
- {
- while(!OUT1);
- if(IN1_flag==0)
- {
- OUT1_flag=1;
- TR0=1; //開啟定時器 防止誤觸發(fā)
- }
- if(IN1_flag==1)
- {
- Value1--; //人數(shù)減少
- if(Value1<0) //如果人數(shù)計數(shù)小于0,變?yōu)樽钚?
- Value1=0;
- IN1_flag=0; //清零
- OUT1_flag=0;
- TR0=0; //關(guān)閉定時器
- Count=0;
- Miao=0;
- }
- }
- }
- }
- /****************************************溫度************************************************************/
- /*void delay(uint y) //DS18B20延時函數(shù)(仿真用)
- {
- while(y--);
- }
- */
- void delay(uint z) //DS18B20延時函數(shù)(實物用)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=1;y>0;y--);
- }
- void write_byte(uint dat) //寫一個字節(jié)
- {
- uchar i;
- for(i=0;i<8;i++) //循環(huán)八次 共有八位
- {
- DQ=0; //寫零
- DQ=dat&0x01; //向總線寫位數(shù)據(jù),從最低位寫起
- delay(4);
- DQ=1; //寫一
- dat>>=1; //下次寫作準(zhǔn)備,移位數(shù)據(jù)
- }
- delay(4);
- }
- uchar read_byte(void) //讀一個字節(jié),返回值
- {
- uchar i;
- uint value;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
51單片機的教室智能照明控制系統(tǒng).7z
(2.91 MB, 下載次數(shù): 237)
2020-4-6 22:31 上傳
點擊文件名下載附件
基于51單片機的教室智能照明控制系統(tǒng) 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|