全套资料包含:Proteus仿真源文件+keil C语言源程序+AD原理图+流程图+元器件清单+说明书等
资料下载:
通过网盘分享的文件:资料分享
链接: 百度网盘 请输入提取码 提取码: tgnu
目录
资料下载:
Proteus仿真功能
项目文件资料:
一、Proteus仿真源文件
二、AD原理图文件
二、报告说明书
三、系统流程图
四、Keil c语言程序源代码
项目功能:
设计光照度、人数检测电路,以光照度为依据控制灯继电器开关,检测人数便于统计。
(2)设计上位机软件程序。接收并显示教室编号,教室内人数,教室内分区照明灯具的开关状态信息;实现上位机对所有教室或某个单独教室进行远程控制。
(3)设计下位机(单片机)控制电路(包含按键电路),一方面自动控制教室内各区域照明的开启和关断,另一方面实现人数状态信息的采集。
(4)采用某种形式的无线通信实现上位机下位机之间的控制与信号传输。
项目文件:
一、Proteus仿真源文件
二、AD原理图文件
二、报告说明书
三、系统流程图
四、器件清单
| 元件 | 型号 | 数量 |
| 单片机 | AT89C51 | 1 |
| 电容 | 10uf | 1 |
| 电容 | 30pf | 2 |
| 晶振 | 12MHZ | 1 |
| 电阻 | 10k | 2 |
| 按钮 | 17 | |
| 实时时钟 | DS1302 | 1 |
| 模数芯片 | PCF8591 | 1 |
| 电位器 | 1k | 1 |
| LED | 红色 | 8 |
| 电阻 | 100欧 | 8 |
| 显示器 | LCD1602 | 1 |
| 排阻 | 10k | 1 |
| 存储器 | 24C02 | 1 |
| 晶振 | 32.768kHZ | 1 |
| 红外对管 | 2 | |
| 串转并芯片 | 74LS595 | 1 |
| 光敏电阻 | 10k | 1 |
五、Keil c语言程序源代码(部分)
#include "reg51.h" #include "intrins.h" #include <PCF8591.h> #include "lcd1602.h" #include "i2c.h" #include "ds1302.h" #include "74hc595.h" #define uchar unsigned char #define uint unsigned int sbit in=P2^3;//红外传感器 uchar time=0,mode=0,hand=0;//系统定时+设置模式+控制模式 uchar light=0,limit=50;//光照+阀值 uchar shi1=12,fen1=0,shi2=6,fen2=0;//开启关闭时间段 uchar num='2';//教室编号 uchar led=0xff;//亮灯数 uchar man=0;//人数 uchar disp1[]="00"; uchar disp2[]="000"; uchar next=0;//接收控制 uchar read=0;//指令存储 void send(uchar i)//串口发送 { SBUF=i; while(!TI); TI=0; } uchar key=0; //按键变量 uchar key_scan()//按键检测 { uchar i,j; i=0; j=0; P1=0x0f; if(P1!=0x0f) //检测有无按下 { switch(P1)//检测行 { case 0x0e:i=3;break; case 0x0d:i=2;break; case 0x0b:i=1;break; case 0x07:i=0; } P1=0xf0; switch(P1)//检测列 { case 0xe0:j=13;break; case 0xd0:j=9;break; case 0xb0:j=5;break; case 0x70:j=1; } } if(key!=i+j) { key=i+j; return key; } else return 0; } //主函数 void main() { uchar i=0; Hc595SendByte(0xff); //初始化存储 limit=At24c02Read(0); if(limit>200) { limit=50; At24c02Write(0,limit); } shi1=At24c02Read(1); if(shi1>23) { shi1=12; At24c02Write(1,shi1); } fen1=At24c02Read(2); if(fen1>59) { fen1=0; At24c02Write(2,fen1); } shi2=At24c02Read(3); if(shi2>23) { shi2=6; At24c02Write(3,shi2); } fen2=At24c02Read(4); if(fen2>59) { fen2=50; At24c02Write(4,fen2); } init_1602(); //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 //设置INT1 IT1=1;//跳变沿出发方式(下降沿) EX1=1;//打开INT1的中断允许。 SCON=0X50; //设置为工作方式1 TMOD=0X21; //设置计数器工作方式2 TH1=0XFD; TL1=0XFD; ES=1; //打开接收中断 TR1=1; //打开计数器 TH0=0X3C; TL0=0XB0; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 while(1) { if(!in &&(man==0))//检测到有人 { man=1; } if(in) //无人 man=0; i=key_scan();//按键检测 if(i==1)//手动开 { if(led>0) led<<=1; hand=1; } if(i==2)//手动关 { if(led<0xff) { led>>=1; led+=0x80; } hand=1; } if(i==3)//自动模式 hand=0; if(i==4)//设置 { mode=1; write_string(1,0," "); write_string(2,0," "); } if(i==8)//OK { mode=0; write_string(1,0," "); write_string(2,0," "); } if(mode==1)//设置模式 { if(i==5)//光照 { if(limit<200) limit++; At24c02Write(0,limit); } if(i==6) { if(limit>0) limit--; At24c02Write(0,limit); } if(i==9)//启动时间 { if(shi1<23) shi1++; At24c02Write(1,shi1); } if(i==10) { if(shi1>0) shi1--; At24c02Write(1,shi1); } if(i==11) { if(fen1<59) fen1++; At24c02Write(2,fen1); } if(i==12) { if(fen1>0) fen1--; At24c02Write(2,fen1); } if(i==13)//关闭时间 { if(shi2<23) shi2++; At24c02Write(3,shi2); } if(i==14) { if(shi2>0) shi2--; At24c02Write(3,shi2); } if(i==15) { if(fen2<59) fen2++; At24c02Write(4,fen2); } if(i==16) { if(fen2>0) fen2--; At24c02Write(4,fen2); } } } } //定时器中断 void Timer0() interrupt 1 { uint i=0,j=0,k=0; if(time<10)//0.5s time++; else { time=0; light=PCF8591_read(1);//测量光照 Ds1302ReadTime();//读取时间 if(hand==0)//自动模式 { i=ds1302_time[2]*60+ds1302_time[1]; j=shi1*60+fen1; k=shi2*60+fen2; if(man>0)//有人 { if(light<limit) { led=0xff<<(8-light*8/limit);//点亮led } else led=0xff; if(j>k) { if((i>j)||(i<k)) _nop_(); else led=0xff; } else { if((i>j)&&(i<k)) _nop_(); else led=0xff; } Hc595SendByte(led); } else { led=0xff; Hc595SendByte(led); } } else //手动模式 Hc595SendByte(led); //显示 if(mode==0)//正常模式 { write_string(1,0,"room:");//房间 disp1[0]=num; disp1[1]=' '; write_string(1,5,disp1); if(hand==1)//模式 write_string(1,8,"hand"); else write_string(1,8,"auto"); disp1[0]=man/10+0x30;//人数 disp1[1]=man%10+0x30; write_string(1,14,disp1); disp1[0]=ds1302_time[2]/10+0x30;//小时 disp1[1]=ds1302_time[2]%10+0x30; write_string(2,0,disp1); write_string(2,2,": "); disp1[0]=ds1302_time[1]/10+0x30;//分钟 disp1[1]=ds1302_time[1]%10+0x30; write_string(2,3,disp1); write_string(2,5,": "); disp1[0]=ds1302_time[0]/10+0x30;//秒 disp1[1]=ds1302_time[0]%10+0x30; write_string(2,6,disp1); disp2[0]=light/100+0x30;//光照 disp2[1]=light%100/10+0x30; disp2[2]=light%10+0x30; write_string(2,9,"L:"); write_string(2,11,disp2); write_string(2,14,"Lx"); } else //设置模式 { write_string(1,0,"Lim:"); disp2[0]=limit/100+0x30;//光照 disp2[1]=limit%100/10+0x30; disp2[2]=limit%10+0x30; write_string(1,4,disp2); write_string(1,7,"Lx"); //启动时间 disp1[0]=shi1/10+0x30;//小时 disp1[1]=shi1%10+0x30; write_string(2,0,disp1); write_string(2,2,": "); disp1[0]=fen1/10+0x30;//分钟 disp1[1]=fen1%10+0x30; write_string(2,3,disp1); //关闭时间 disp1[0]=shi2/10+0x30;//小时 disp1[1]=shi2%10+0x30; write_string(2,8,disp1); write_string(2,10,": "); disp1[0]=fen2/10+0x30;//分钟 disp1[1]=fen2%10+0x30; write_string(2,11,disp1); } } TH0=0X3C; TL0=0XB0; } void Int0() interrupt 0 //外部中断0的中断函数 { if(man<99) man++; } void Int1() interrupt 2 //外部中断1的中断函数 { if(man>0) man--; } //串口中断 void Usart() interrupt 4 { uchar receiveData; receiveData=SBUF;//出去接收到的数据 RI = 0;//清除接收中断标志位 next=!next; if(next)//接收编号 { read=receiveData; } else//接收指令 { if(read=='k')//手动开 { if(led>0) led<<=1; hand=1; } if(read=='l')//手动关 { led=0xff; hand=1; } if(read=='m')//自动模式 { hand=0; } if(read==num)//确认当前设备 { if(receiveData=='a')//光照 { if(limit<200) limit++; At24c02Write(0,limit); } if(receiveData=='b') { if(limit>0) limit--; At24c02Write(0,limit); } if(receiveData=='c')//启动时间 { if(shi1<23) shi1++; At24c02Write(1,shi1); } if(receiveData=='d') { if(shi1>0) shi1--; At24c02Write(1,shi1); } if(receiveData=='e') { if(fen1<59) fen1++; At24c02Write(2,fen1); } if(receiveData=='f') { if(fen1>0) fen1--; At24c02Write(2,fen1); } if(receiveData=='g')//关闭时间 { if(shi2<23) shi2++; At24c02Write(3,shi2); } if(receiveData=='h') { if(shi2>0) shi2--; At24c02Write(3,shi2); } if(receiveData=='i') { if(fen2<59) fen2++; At24c02Write(4,fen2); } if(receiveData=='j') { if(fen2>0) fen2--; At24c02Write(4,fen2); } //发送 if(receiveData=='n') { send(man/10+0x30);//人数 send(man%10+0x30); send(','); send(light/100+0x30);//光照 send(light%100/10+0x30); send(light%10+0x30); send(','); send(limit/100+0x30);//光照阀值 send(limit%100/10+0x30); send(limit%10+0x30); send(','); send(shi1/10+0x30);//开启时间 send(shi1%10+0x30); send(','); send(fen1/10+0x30); send(fen1%10+0x30); send(','); send(shi2/10+0x30);//关闭时间 send(shi2%10+0x30); send(','); send(fen2/10+0x30); send(fen2%10+0x30); send(','); send(hand+0x30);//模式 send(','); switch(led) { case 0x00:send('8');break; case 0x80:send('7');break; case 0xc0:send('6');break; case 0xf8:send('3');break; case 0xfc:send('2');break; case 0xfe:send('1');break; case 0xff:send('0'); } send(','); send(0x0d);//结束 send(0x0a); } } } }六、全套资料包含
七:项目资源获取
需要完整的资料可以点击下面的名片关注,回复“资料”!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓