基于51单片机智能蓝牙台灯仿真程序原理图PCB功能介绍具体功能1.分为手动/自动两种模式自动模式下对应LED指示灯亮2.手动模式下可用按键调节亮度3.自动模式下当红外模块检测到有人时开灯。且亮度根据环境光照强度自动调整4.蓝牙模块把台灯的状态信息上传到手机显示​演示视频基于51单片机智能蓝牙台灯程序#include reg52.h #include intrins.h /***微信公众号木子单片机****/ #define uchar unsigned char // 以后unsigned char就可以用uchar代替 #define uint unsigned int // 以后unsigned int 就可以用uint 代替 sbit LED P1^0; // 模式指示灯亮是自动模式灭是手动模式 sbit Key1 P1^1; // 按键1模式切换按键 sbit Key2 P1^2; // 按键2亮度减少按键 sbit Key3 P1^3; // 按键3亮度增加按键 sbit Lamp P1^4; // 台灯控制引脚 sbit ADC_CLK P2^0; // ADC0832的CLK引脚 sbit ADC_DAT P2^1; // ADC0832的DI/DO引脚 sbit ADC_CS P2^3; // ADC0832的CS引脚 sbit Module P2^2; // 人体红外检测模块 uchar gCount0; // 全局计数变量 uchar gIndex; // 亮度变量0是最暗9是最亮一共10档 uint gTime0; // 计时变量用于计时多久没检测到有人 /*********************************************************/ // 毫秒级的延时函数time是要延时的毫秒数 /*********************************************************/ void DelayMs(uint time) { uint i,j; for(i0;itime;i) for(j0;j112;j); } /*********************************************************/ // ADC0832的时钟脉冲 /*********************************************************/ void WavePlus() { _nop_(); ADC_CLK 1; _nop_(); ADC_CLK 0; } /*********************************************************/ // 获取指定通道的A/D转换结果 /*********************************************************/ uchar Get_ADC0832() { uchar i; uchar dat10; uchar dat20; ADC_CLK 0; // 电平初始化 ADC_DAT 1; _nop_(); ADC_CS 0; WavePlus(); // 起始信号 ADC_DAT 1; WavePlus(); // 通道选择的第一位 ADC_DAT 0; WavePlus(); // 通道选择的第二位 ADC_DAT 1; for(i0;i8;i) // 第一次读取 { dat11; WavePlus(); if(ADC_DAT) dat1dat1|0x01; else dat1dat1|0x00; } for(i0;i8;i) // 第二次读取 { dat2 1; if(ADC_DAT) dat2dat2|0x80; else dat2dat2|0x00; WavePlus(); } _nop_(); // 结束此次传输 ADC_DAT 1; ADC_CLK 1; ADC_CS 1; if(dat1dat2) // 返回采集结果 return dat1; else return 0; } /*********************************************************/ // 定时器初始化 /*********************************************************/ void TimerInit() { TMOD 0x21; // 使用定时器 SCON 0x50; // 配置串口寄存器 TH0 252; // 给定时器0的TH0装初值 TL0 24; // 给定时器0的TL0装初值 TH1 0xfd; // 计算波特率的值为9600 TL1 0xfd; // 计算波特率的值为9600 ET0 1; // 打开定时器0中断 ES 1; // 打开串口中断 EA 1; // 打开总中断 TR0 1; // 启动定时器0 TR1 1; // 启动定时器1 } /*********************************************************/ // 串口发送数据函数 /*********************************************************/ void UartSendData(uchar dat) { SBUFdat; while(!TI); TI0; } /*********************************************************/ // 发送数据到蓝牙模块 /*********************************************************/ void SendBlueTooth() { UartSendData(gIndex48); // 发送当前亮度 UartSendData(/); if(LED0) // 发送控制模式 UartSendData(0); else UartSendData(1); } /*********************************************************/ // 手动控制 /*********************************************************/ void ManualControl() { // 亮度减少 if(Key20) // 如果按键2被按下去 { if(gIndex0) // 只要当前亮度不为最低才能减少亮度 { gIndex--; // 亮度降低一档 DelayMs(300); // 延时0.3秒 } } // 亮度增加 if(Key30) // 如果按键3被按下去 { if(gIndex9) // 只要当前亮度不为最高才能增加亮度 { gIndex; // 亮度增加一档 DelayMs(300); // 延时0.3秒 } } } /*********************************************************/ // 自动控制 /*********************************************************/ void AutoControl(uchar num) { if(num59) // 最亮 gIndex9; else if((num65)(num81)) // 第二亮 gIndex8; else if((num87)(num103)) // 第三亮 gIndex7; else if((num109)(num125)) gIndex6; else if((num131)(num147)) gIndex5; else if((num153)(num169)) gIndex4; else if((num175)(num191)) gIndex3; else if((num197)(num213)) gIndex2; else if((num219)(num235)) gIndex1; else if(num241) // 最暗 gIndex0; } /*********************************************************/ // 主函数 /*********************************************************/ void main() { uchar i; uchar ret; TimerInit(); // 定时器初始化 LED0; // 指示灯点亮(自动模式指示灯) retGet_ADC0832(); // 获取AD采集结果(环境光照强度) AutoControl(ret); // 上电先进行一次自动亮度控制 AutoControl(ret7); while(1) { /* 模式切换控制 */ if(Key10) // 如果按键1被按下去 { LED~LED; // 切换LED灯状态 if(LED0) // 如果切换后是自动模式的话 { retGet_ADC0832(); // 获取AD采集结果(环境光照强度) AutoControl(ret); // 进行一次自动亮度调整 AutoControl(ret7); } DelayMs(10); // 延时消除按键按下的抖动 while(!Key1); // 等待按键释放 DelayMs(10); // 延时消除按键松开的抖动 } /* 亮度控制 */ if(LED1) // 如果LED是灭的 { for(i0;i20;i) { ManualControl(); // 则进行手动控制 DelayMs(10); } } else // 如果LED是亮的 { if(gTime30000) // 如果最近30秒内检测到有人 { retGet_ADC0832(); // 获取AD采集结果(环境光照强度) AutoControl(ret); // 进行自动控制 } DelayMs(200); } *********//完整资料 */***微信公众号木子单片机****/ /*检测是否有人*/ if(Module1) { gTime0; // 检测到有人则把30秒计时清零 } if(gTime30000) // 如果gTime的值超过了30000 { gTime30000; // 则把gTime的值重新赋值为30000避免过大溢出 if(LED0) { gIndex0; // 如果30秒检测不到有人则把台灯熄灭 } } /* 发送数据到手机蓝牙 */ SendBlueTooth(); } }硬件设计使用元器件单片机STC89C51注意单片机是通用的无论51还是52、无论stc还是at都一样引脚功能都一样。程序也是一样的。11.0592M晶振30pF独石电容10uF 25V电解电容1K 0.25W电阻10K 0.25W 电阻6.5*6.5*5 按键5V USB小灯USB-A母座5516 光敏电阻ADC0832 芯片8Pin IC座ADC0832座3mm 绿led 9*15洞洞板S8550PNP三极管HC-SR501 人体红外热释传感器3Pin排座热释传感器座子4Pin排座蓝牙模块座子HC-06蓝牙模块 8.8*8.5 双排自锁开关DC3.5*1.1电源座导线若干添加图片注释不超过 140 字可选流程图添加图片注释不超过 140 字可选设计资料01仿真图本设计使用Proteus8.3和Proteus8.9两个版本设计具体如图添加图片注释不超过 140 字可选02原理图本系统原理图采用Altium Designer19设计具体如图添加图片注释不超过 140 字可选03程序本设计使用软件keil5版本编程设计具体如图添加图片注释不超过 140 字可选04PCB本系统PCB采用Altium Designer19设计具体如图添加图片注释不超过 140 字可选05设计资料资料获取请看前面演示视频全部资料包括仿真源文件 、AD原理图、程序含注释、PCB、结构框图、流程图、元件清单等。具体内容如下全网最全! 操作演示请观看前面演示视频点赞分享一起学习成长。