基于51单片机教室灯光全自动控制设计( proteus仿真+程序+设计报告+原理图+讲解视频)

您所在的位置:网站首页 led车灯模组生产工艺视频讲解图 基于51单片机教室灯光全自动控制设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机教室灯光全自动控制设计( proteus仿真+程序+设计报告+原理图+讲解视频)

2024-07-10 23:59| 来源: 网络整理| 查看: 265

基于51单片机教室灯光全自动控制设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机教室灯光全自动控制设计 1. 主要功能:2. 讲解视频:3. 仿真设计4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接

仿真图proteus7.8及以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0075

1. 主要功能:

基于51单片机的教室灯光自动控制系统

1、数码管显示当前工作强度,光照阈值和教室人数;

2、设定值可以通过按键调整;

3、通过按键模拟红外对射传感器统计进出人数;

4、教室内是否开灯取决于光照强度,光照强度低于阈值(教室灯光暗)的时候开灯;

5、教室内开灯的数量根据教室内人数的多少设定,人数越多,开灯数量越多;

需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

img

以下为本设计资料展示图:

2. 讲解视频:

讲解视频包含仿真运行讲解和代码讲解

基于51单片机教室灯光控制proteus仿真+程序+设计报告+原理图+讲解视频

3. 仿真设计

打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真后数码管显示当前光照强度,光照阈值,教室人数,光照强度低于阈值即教室内灯光暗,满足开灯条件。此时教室人数0,即教室没有人,所以不需要开灯。

img

通过点击按键进教室完成教室人数的设置,从1开始,每多十个人多开一盏灯,最多开8盏灯。

img

如果光照强度大于阈值,说明自然光足够亮,不需要开灯。

img

4. 程序代码

使用keil4或者keil5编译,代码有注释,可以结合视频理解代码含义。

mian 函数

#include "reg51.h" #include "ADC0832.h" sbit smg1=P2^0;//数码管引脚 sbit smg2=P2^1; sbit smg3=P2^2; sbit smg4=P2^3; sbit smg5=P2^4; sbit smg6=P2^5; sbit k1=P1^0;//按钮 sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; unsigned char time=0; unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char num=0;//人数 unsigned char light=0,limit=20;//光照 unsigned char m1=0,m2=0,m3=0,m4=0; void delay(unsigned int i)//延时 { while(i--); } void disp() { // 根据光照强度light的十位数,通过数组smgduan获取对应的显示数据,并将结果显示在P0口上(假设用于连接数码管的段选) P0 = smgduan[light / 10]; // 清除数码管第一位(smg1)的位选信号,使其不显示任何数字 smg1 = 0; // 延时100ms,以便观察数码管的显示效果 delay(100); // 设置数码管第一位(smg1)的位选信号为1,使显示数据生效 smg1 = 1; // 根据光照强度light的个位数,通过数组smgduan获取对应的显示数据,并更新到P0口上 P0 = smgduan[light % 10]; // 清除数码管第二位(smg2)的位选信号 smg2 = 0; // 延迟100ms delay(100); // 设置数码管第二位(smg2)的位选信号为1,使显示数据生效 smg2 = 1; // 同理,根据光照阀值limit的十位和个位数,分别显示到数码管的第三位和第四位 P0 = smgduan[limit / 10]; smg3 = 0; delay(100); smg3 = 1; P0 = smgduan[limit % 10]; smg4 = 0; delay(100); smg4 = 1; // 根据人数num的十位和个位数,分别显示到数码管的第五位和第六位 P0 = smgduan[num / 10]; smg5 = 0; delay(100); smg5 = 1; P0 = smgduan[num % 10]; smg6 = 0; delay(100); smg6 = 1; } // 主函数定义 void main() { // 设置定时器0的工作模式为模式1(16位定时器/计数器) TMOD |= 0X01; // 设置定时器0的高8位初始值,这里设置的是一个特定的计数值(具体取决于晶振频率和系统配置) TH0 = 0X3C; // 设置定时器0的低8位初始值,与TH0共同决定定时器的初值 TL0 = 0XB0; // 打开定时器0中断允许位,使能定时器0中断功能 ET0 = 1; // 打开总中断,允许单片机接收并处理所有中断请求 EA = 1; // 启动定时器0 TR0 = 1; // 进入无限循环 while(1) { // 调用disp()函数,执行显示操作(如可能的话,可能是显示当前光照阈值或人数等信息) disp(); // 检测按键k1状态,并在m1标记为0时调整光照阈值limit(增1) if(!k1 && (m1 == 0)) { if(limit 0) // 如果当前阈值大于最小值0 limit--; // 阈值减1 m2 = 1; // 标记m2为已操作 } // 当按键k2释放时,重置m2标记 if(k2) m2 = 0; // 检测按键k3表示有人进入教室,当m3标记为0时增加教室内人数num(增1) if(!k3 && (m3 == 0)) { if(num 0) // 如果当前人数大于最小值0 num--; // 人数减1 m4 = 1; // 标记m4为已操作 } // 当按键k4释放时,重置m4标记 if(k4) m4 = 0; // 判断当前光照强度是否低于设定阈值limit if(light 0),根据人数开启相应数量的灯光 if(num > 0) P3 = 0xff


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3