基于51单片机的教室智能照明灯控制系统仿真原理图方案设计

方案框图:
在这里插入图片描述
原理图:

在这里插入图片描述
仿真图:
在这里插入图片描述
系统控制模块的硬件构成及简介
系统控制单元是以AT89S51单片机主控模块为核心,其它外围电路主要包括:环境光采集电路、时钟模块、热释红外传感器模块、看门狗模块、按键电路、EEPROM存储模块、超时报警模块、数码管显示模块。

环境光模块采用光敏三极管来检测环境光的强度,有光照时,电阻减小,随着光照强度的减弱,电阻逐渐增大,把光信号转化成电信号,实现对光强度的检测。
人体存在传感器模块采用HP-208是基于红外线技术的智能产品,实现对人体存在的检测。
硬件时钟模块采用具有充电能力的低功耗,具有临时性存放数据的RAM寄存器的实时时钟芯片DS1302。该电路的接口简单、价格低廉、使用方便,被广泛的使用。
系统数据存储及故障保护部分由X5045组成,X5045是一种串行通讯的512字节EEPROM,同时兼有看门狗和电源监控功能键盘模块。
2.2系统控制的主要硬件电路
考虑到本系统安装时受环境影响因素比较多,且教室控制设备中的人体存在传感器、光敏三极管等经常会因环境情形变化而不稳定,所以在设计过程中,电子元器件的选用、线路布置和设备的安放要充分考虑到抗干扰问题。
2.2.1系统主控电路
本系统的主控模块采用AT89S51作为主控芯片,它是一种低功耗,8位CMOS工艺处理器,具有8K在线可编程Flash存储器,片内的Flash可多次编程,为在线编程提供了方便。片内有128字节的RAM,4KB的EEPROM,由于合理的安排使用片内RAM空间,所以没有片外扩展的RAM,使电路结构简洁。该芯片的主要特征见如表2.1:
表2.1 AT89S51主要特征
AT89S51引脚 外围器件引脚 说明
P0. 0-P0. 7 ULN2803 数码管段码驱动接口
P2. 0-P2. 7 PNP-9012基极 数码管段码驱动接口
P1. 0 X5045SI X5045串行输入端
P1. 1 X5045SCK X5045串行时钟端
P1. 2 X5045CS X5045片选端
P1. 3 X504550 X5045串行输出端
P1. 4 工作状态指示灯
P1. 5 DS1302CLK DS1302时钟线
P1.6 DS1302I/O DS1302数据线
P1. 7 DS1302RST DS1302复位线
P3. 0- P3. 1 数据采集输入端
P3. 3 人体存在传感器输出信号端
P3. 4 超时报警信号输入端
P3. 7 光敏三极管输入信号端
单片机最小系统如图2-2所示:

图2-2 单片机最小系统
(1) 40(Vcc)20(GND)脚间的电压应有5V 。
(2) 18、19脚分别与20脚间有1.7―2.5V电压
(3) 9(RST)脚与GND间电压基本为0 。
(4) 31脚 (EA)与20引脚(GND)间电压为5V 。

部分代码

#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};       //数据的地址
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[]="                ";			 //清屏内容
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;			  //调节标志位,=1表示进入调节模式,=0是正常模式
bit Auto_flg;		  //自动模式标志位,=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;	  //确认键
sbit UP   =P3^0;	  //加键
sbit DOWN =P3^1;	  //减键
sbit MODE =P3^2;	  //切换按键接口
sbit SWITCH=P3^3;	  //手动开关
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;		  //温度数据口
uchar Select_num;	  //选择按键按下次数
uchar Enter_num;	  //确认按键按下次数
uchar Switch_num;	  //手动开关按键按下次数
float Year,Month,Day,Hour,Minute,Second;			//时间设置值
uchar Week;		
float Hour_H,Minute_H,Second_H;  					//设置开始时间
float Hour_L,Minute_L,Second_L;  					//设置结束时间
int Value1;											//人数
uchar IN1_flag=0;
uchar OUT1_flag=0;
uint Count;           //T0定时器中断计数次数
uchar Miao;

int temperature;									//全局变量 温度

void read_rtc();

/**************************************************LCD1602显示*******************************************************************/
void delay1(uint z)			  //延时函数
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=10;y>0;y--);
}

void write_com(uchar com)			 //写指令函数
{
	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)			//写数据函数
{									
	rw=0;
	delay1(5);
	rs=1;
	delay1(5);
	e=1;
	delay1(5);
	P0=date;
	delay1(5);
	e=0;
	delay1(5);	
}

void init()						    //初始化函数
{	
	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);		        //设置16*2显示,5*7点阵,8位数据接口
	write_com(0x0c);				//设置光标
	write_com(0x06);				//光标自动加1,光标输入方式
	write_com(0x01);				//清屏
	write_com(0x80);				//设置初始显示位置
	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)	 //第一个:参数的地址,第二个:参数的内容
{
	uchar shi,ge;
	shi=dat/10;							//把十位提取出来
	ge=dat%10;							//把个位提取出来
	write_com(add);			   	 		//要写的地址
	write_date(0x30+shi);				//十位的内容   1602字符库
	write_date(0x30+ge);				//个位的内容   1602字符库
}

void Week_dispaly(uchar add,uchar dat)	//第一个:参数的地址,第二个:参数的内容
{
	write_com(add);						//要写的地址
	write_date(0x30+dat);				//十位的内容   1602字符库
}
void Date_dispaly(uchar add,uchar dat)	 //第一个:参数的地址,第二个:参数的内容
{
	uchar shi,ge;
	shi=dat/16;							//把十位提取出来
	ge=dat%16;							//把个位提取出来
	write_com(add+3);			   	 	//要写的地址
	write_date(0x30+shi);				//十位的内容   1602字符库
	write_date(0x30+ge);				//个位的内容   1602字符库				   
}

.

链接:https://pan.baidu.com/s/1evxm6Oemhb3Z531OSGHbAQ
提取码:4hmy

.

  • 18
    点赞
  • 175
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值