2026/4/6 2:15:16
网站建设
项目流程
做报名链接的网站,小程序开发外包服务合同,网站设计企业联系方式内容,安徽网站线上开发公司基于51单片机的智能台灯 #xff08;程序#xff0b;PCB原理图#xff0b;设计报告#xff09; 功能介绍 具体功能#xff1a;
1.光敏电阻感应光亮#xff0c;将信息处理给单片机#xff0c;根据环境亮度调节亮度#xff1b;
2.使用E18- D80NK红外接近传感器#xf…基于51单片机的智能台灯程序PCB原理图设计报告功能介绍具体功能1.光敏电阻感应光亮将信息处理给单片机根据环境亮度调节亮度2.使用E18- D80NK红外接近传感器靠的太近蜂鸣器会提醒报警3.使用HC-SR501人体红外传感器光亮不够且检测到人体时台灯自动亮4.LED驱动电路采用3路串联、每路4颗的LED灯可手动调节台灯亮度5.可以设定学习时间6.检测无人时30秒台灯自动熄灭 时间可调/************************************************* * 名称 : 智能调光台灯 * 功能 : 1亮度不够且有人靠近时台灯自动亮 2靠的太近会提醒坐姿不正蜂鸣器 3附近无人时台灯自动熄灭30秒 时间可调 4根据环境亮度调节等亮度 5可手动调节台灯亮度 6设定学习时间 ***********************************************************************/ //头函数 #include reg52.h #include ADC0809.H //宏定义 #define uint unsigned int #define uchar unsigned char #define DUAN P0 //数码管段位 unsigned char code tab[]{0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff}; //0-9的显示码表 gc.debfa unsigned char code tab_dian[]{0x80,0x9b,0x42,0x0a,0x19,0x0c,0x04,0x9a,0x00,0x08,0xdf}; //带点0-9的显示码表 uchar pdata tt[51]; //定义空数组用于AD0809取平均值 uchar scale20,rsd_sec; //定义占空比比例热释电计时秒变量 char min,sec; //定义计时分秒 //位定义 bit bdata flag_auto, //自动切换标志位 ss, //闪烁标志位 flag_bs, //报警位标志位 flag_rsd, //热释电动作标志位 flag_jiejin1; //接近传感器标志位 uchar flag_set0; //设置变量0 正常 1 调分 2 调秒 uchar lum; //ad0809读出值 //函数声明 void delay(uchar i); //管脚声明 sbit LED P3^4; //PWM输出 sbit change P2^3; //自动模式切换按键 sbit set P2^2; //设置按键 sbit add P2^1; //加按键 sbit sub P2^0; //减按键 sbit rsd P3^6; //热释电 sbit jiejinP3^5; //接近开关 sbit buzzP3^7; sbit W0P2^7; //数码管位端 sbit W1P2^6; sbit W2P2^5; sbit W3P2^4; /********************************************************************** * 名称 : display(); * 功能 : 数码管显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void display() { if(flag_set0) //正常模式下 { DUANtab[min/10]; //送入段码秒数高位 W00; //打开位地址 delay(1); //小延时 W01; //关闭位地址 DUANtab_dian[min%10]; //送入段码秒数低位 W10; delay(1); W11; DUANtab[sec/10]; //送入段码分钟数高位 W20; delay(1); W21; DUANtab[sec%10]; //送入段码分钟数高位 W30; delay(1); W31; } else if(flag_set1) //设置模式下闪烁相应位 { if(ss1) //闪烁标志 ss1 正常显示 { DUAN~tab[min/10]; W00; delay(1); W01; DUAN~tab_dian[min%10]; W10; delay(1); W11; } else //闪烁标志 ss0 熄灭相应位 达到闪烁效果 ss在定时器里500ms取反一次 { DUAN~tab[10]; // W00; delay(1); W01; DUAN~tab_dian[10]; W10; delay(1); W11; } DUAN~tab[sec/10]; W20; delay(1); W21; DUAN~tab[sec%10]; W30; delay(1); W31; } else { DUAN~tab[min/10]; W00; delay(1); W01; DUAN~tab_dian[min%10]; W10; delay(1); W11; if(ss1) { DUAN~tab[sec/10]; W20; delay(1); W21; DUAN~tab[sec%10]; W30; delay(1); W31; } else { DUAN~tab[10]; W20; delay(1); W21; DUAN~tab[10]; W30; delay(1); W31; } } } /********************************************************************** * 名称 : KEY(); * 功能 : 按键控制 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void KEY() { uint lum_mean,lum_all; uchar b,c; if(change0) //自动切换按键按下 { delay(10); //去抖 if(change0) //再次判断按键按下 { buzz0; //蜂鸣器鸣响 flag_auto!flag_auto; //自动模式标志位取反 if(flag_auto1) //当切换到手动模式时 首先将LED发光比例PWM设置在50% scale20; } while(!change) display();buzz1; //等待按键释放 松开按键后关闭蜂鸣器、刷新显示 } if(jiejin0flag_jiejin1) //接近传感器检测到障碍时 开启报警 { buzz0; flag_jiejin0; } if(jiejin!flag_jiejin) //接近传感器检测不到障碍时 关闭报警 { buzz1; flag_jiejin1; } if(set0) //设置键按下时 { delay(10); if(set0) { buzz0; flag_set; //设置变量 if(flag_set3) //加到3时回复回正常模式 flag_set0; flag_bs0; //按下设置 关闭报警 } while(!set) display(); buzz1;//等待按键释放 松开按键后关闭蜂鸣器、刷新显示 } if(flag_set1) //加键按键只有在设置状态flag_set!0时按下才有效 调分 { if(add0) //加按键按下时 { delay(10); //消抖 if(add0) { buzz0; //蜂鸣器响 min; //分 if(min60) min0; } while(!add) display(); buzz1; //等待按键释放 松开按键后关闭蜂鸣器、刷新显示 } if(sub0) //减按键按下时 { delay(10); //消抖 if(sub0) { buzz0; //蜂鸣器响 min--; //分-- if(min0) min59; } while(!sub) display(); buzz1; //等待按键释放 松开按键后关闭蜂鸣器、刷新显示 } } if(flag_set2) //调秒 { if(add0) //加键按下 { delay(10); //消抖 if(add0) { buzz0; //蜂鸣器响 sec; //秒 if(sec60) sec0; } while(!add) display(); buzz1; //等待按键释放 松开按键后关闭蜂鸣器、刷新显示 } if(sub0) //减键按下 { delay(10); if(sub0) //消抖 { buzz0; //蜂鸣器响 sec--; //秒-- if(sec0) sec59; } while(!sub) display(); buzz1; //等待按键释放 松开按键后关闭蜂鸣器、刷新显示 } while(!sub); } if(flag_auto0) //自动模式 { if(flag_rsd1) //且有人在范围内时 环境发光强度控制灯光变化 { for(b0;b49;b) //将空数组tt[]内数值整体左移一位 { tt[b]tt[b1]; //将后一数值放到前一位置 } tt[49]ADC0809(); //将读出的ad0809数值放入tt[49] for(c0;c50;c) //将tt[]内数值相加 { lum_alllum_alltt[c]; } lum_meanlum_all/50; //将总数/50取出平均值 // lum_all0; //将总数清零 if(lum_mean30) scale1; //判断取出平均值大小 小于30 发光强度0% else if(lum_mean150) scale41; //大于150 发光强度100% else scale((lum_mean-30)/3)1; //其他值时将其计算得到发光强度 计算目的是为了得到一个1-41之间的数值 控制灯光变化 } else scale1; //没有人在范围内时 将灯光亮度调至0% } else //手动模式下 { if(flag_set0) //正常模式下 { if(add0) //加键按下 { delay(10); if(add0) { // buzz0; //蜂鸣器响 scale; //灯光比例 if(scale41) scale41; display(); } // while(!add) display(); buzz1; } if(sub0) //减键按下时 { delay(10); if(sub0) { // buzz0; //蜂鸣器响 scale--; //灯光比例-- if(scale1) scale1; display(); } // while(!sub) display(); buzz1; } } } } /********************************************************************** * 名称 : init(); * 功能 : 初始化定时器 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void init() { TMOD0x11; //工作方式1 TH10x3c; TL10xb0; //T1赋初值50ms TH00xff; TL00xe7; //T0赋初值25us ET01; ET11; //打开中断允许开关 EA1; //中断总开关 TR01; //开定时器0 开关 TR10; //关定时器0 开关 } /********************************************************************** * 名称 : main(); * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main() { init(); //调用初始化函数 flag_auto1; //初始化手动模式 rsd0; //热释电引脚置低有信号时时高电平 delay(500); //延时500ms后开机 while(1) //大循环 { KEY(); //调用按键函数 display(); //调用显示函数 } } /********************************************************************** * 名称 : delay(); * 功能 : 延时函数大约1ms * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay(uchar i) { uchar j,k; for(ji;j0;j--) for(k125;k0;k--); } /********************************************************************** * 名称 : void time0() interrupt 1 * 功能 : 定时器T0 中断服务函数PWM脉冲发生函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void time0() interrupt 1 { uchar n; TH00xff; TL00xe7; //重新赋初值 n; //每25us n if(nscale) //n设置比例时打开灯 { LED1; } else if(nscale)//n大于等于设置比例时 关闭灯 { LED0; } if(n40) //n40 25us*401ms 1kHZ { n0; //n0 } else ; } /********************************************************************** * 名称 : void time1() interrupt 3 * 功能 : 定时器T1 中断服务函数计时和闪烁控制 红外热释 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void time1() interrupt 3 { uchar m; TH10x3c; TL10xb0; //重新赋初值 m; //50ms m if((m10||m20)flag_set!0) //每过500ms 并且 在设置状态时 { ss!ss; //闪烁变量取反 } if(m20) //到达1s时 { m0; //m0 if(rsd0) //热释电无信号时 rsd_sec; //热释电计时秒 if(rsd_sec30rsd1) //热释电计时秒小于等于30 并且 热释电有信号时 { rsd_sec0; //将热释电秒清零 flag_rsd1; //标志位置1 控制AD0809采集数值 调节灯光亮度 } else if(rsd_sec30rsd0) //热释电计时秒大于30 并且 热释电无信号时 { flag_rsd0; //标志位置0 停止ad0809转换 关闭灯光 rsd_sec0; //热释电计时秒清零 } if(flag_set0flag_bs0((minsec)!0)) //正常模式下未报警定时时间不为零时 { sec--; if(sec0) //定时秒-- 小于0时 { sec59; //复位到59秒 min--; //分-- } if(min0sec0) //分和秒都减到零时 { min0; flag_bs1; buzz0; //蜂鸣器报警提示时间到 } } // else buzz1; } }硬件设计使用元器件单片机STC89C52注意单片机是通用的无论51还是52、无论stc还是at都一样引脚功能都一样。程序也是一样的。LED蜂鸣器三极管电阻6*6轻触开关7*7自锁开关3.6寸数码管人体感应模块红外接近传感器导线若干结构图设计资料01 原理图本系统原理图采用Altium Designer19设计具体如图02 程序本设计使用软件keil5版本编程设计资料里有安装教程无需担心具体如图03 设计报告三千字设计报告具体如下04 设计资料资料获取请关注同名公众号全部资料包括程序含注释、PCB电路图、AD原理图、设计报告、任务书、元件清单、结构图等。具体内容如下全网最全! 点赞分享一起学习成长。