肿瘤康复网,内容丰富有趣,生活中的好帮手!
肿瘤康复网 > 基于51单片机pwm调光护眼台灯智能检测光强光控灯设计proteus仿真原理图PCB

基于51单片机pwm调光护眼台灯智能检测光强光控灯设计proteus仿真原理图PCB

时间:2020-08-28 14:24:27

相关推荐

功能:

0.本系统采用STC89C52作为单片机

1.LCD1602液晶实时显示当前时间/模式/亮度等级

2.按’切换’键可切换四种不同的模式

a) 自动开关,自动调节亮度

b) 手动开关,自动调节亮度

c) 自动开关,手动调节亮度

d) 手动开关,手动调节亮度

3.长按’切换’键可打开或关闭LED小灯

4.按’增大’或’减小’键可调节LED亮度等级

5.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

PCB :

主程序:

#define _MAIN_C#include <reg52.h>#include <stdio.h>#include "main.h"#include "delay.h"#include "eeprom52.h"#include "tlc0832.h"#include "ds1302.h"#include "lcd1602.h"#include "date.h"// 管脚声明sbit IR_SCAN = P1^6;sbit KEY_SUB = P3^6;sbit KEY_ADD = P3^4;sbit KEY_MODE = P3^5;sbit KEY_SET = P3^3;sbit LED_PWM = P2^1;sbit BUZZER = P2^0;extern unsigned char timeBufBcd[8];extern unsigned char timeBufDec[8];unsigned char dispRow0[] = " / / ";unsigned char dispRow1[] = " : : ";unsigned char g_setLocation = 0;unsigned long highT0RH;unsigned long highT0RL;unsigned long lowT0RH;unsigned long lowT0RL;unsigned char g_PWMdutyCycle = 50;unsigned char isNew;unsigned long minuteBuf;bit g_setTimeFlag = 0;bit g_OffFlag = 0;bit g_dispOn = 0;bit g_getADData = 0;void DispTime(); //显示时间void Init_Timer0(); //定时器0初始化void Init_Timer1(); //定时器1初始化void KeyPress(); //按键处理void SetTime(); //设定时间void SetPWM(unsigned int freq, unsigned char dutyCycle); //PWM设定void DispLED(); //显示模式和光照等级CreatByte mode;// 主函数main(){unsigned long PWMfreq = 100;unsigned long adData = 0;unsigned long adDataBuf = 0;static unsigned char getADDataCnt = 0;// 初始化Init_EEPROM();DS1302_Init();if (!isNew){DS1302_ReadTime();}else{DS1302_WriteTime();}LCD_Init();LCD_CLear();SetPWM(PWMfreq, g_PWMdutyCycle);Init_Timer0();Init_Timer1();DispTime();DispLED();while (1){SetPWM(PWMfreq, g_PWMdutyCycle); //设置PWM频率和占空比if (g_dispOn){DispTime(); //显示时间DispLED(); //显示模式和灯光等级g_dispOn = 0;}if (g_setTimeFlag){SetTime(); //设置时间}else{DS1302_ReadTime(); //读取时间}if (g_isAutoOff) //自动开关模式{if (g_OffFlag == 1){LED_PWM = 1;TR0 = 0; //关闭定时器0计数}else{TR0 = 1; //开启定时器0计数}if (IR_SCAN == 0) //有人时一直给最新的秒时间{minuteBuf = timeBufDec[6];}else //没人时,1分钟后关闭台灯{if (minuteBuf == timeBufDec[6] + 1){g_OffFlag = 1;}}}if (g_isAutoAjust == 1 && g_getADData == 1) //自动调整灯光亮度模式{adData = ReadADC(AIN0_GND);adData = 100 * adData / 255; //读取灯光亮度if (getADDataCnt < 5) //累加5次{adDataBuf = adDataBuf + adData;getADDataCnt++;}else //求平均{adDataBuf = adDataBuf / getADDataCnt;if (adDataBuf >= 95){adDataBuf = 95;}else if (adDataBuf <= 5){adDataBuf = 5;}g_PWMdutyCycle = adDataBuf;adDataBuf = 0;getADDataCnt = 0;}g_getADData = 0;}KeyPress(); //按键处理}}void DispTime(){dispRow0[0] = timeBufDec[1] / 10 +'0'; //年dispRow0[1] = timeBufDec[1] % 10 +'0';dispRow0[3] = timeBufDec[2] / 10 +'0'; //月dispRow0[4] = timeBufDec[2] % 10 +'0';dispRow0[6] = timeBufDec[3] / 10 +'0'; //日dispRow0[7] = timeBufDec[3] % 10 +'0';dispRow1[0] = timeBufDec[4] / 10 +'0'; //时dispRow1[1] = timeBufDec[4] % 10 +'0';dispRow1[3] = timeBufDec[5] / 10 +'0'; //分dispRow1[4] = timeBufDec[5] % 10 +'0';dispRow1[6] = timeBufDec[6] / 10 +'0'; //秒dispRow1[7] = timeBufDec[6] % 10 +'0';LCD_WriteStr(0, 0, dispRow0); //显示日期LCD_WriteStr(0, 1, dispRow1); //显示时间switch (timeBufDec[7]) //显示星期{case 1: LCD_WriteStr(10, 0, " Sun."); break;case 2: LCD_WriteStr(10, 0, " Mon."); break;case 3: LCD_WriteStr(10, 0, " Tue."); break;case 4: LCD_WriteStr(10, 0, " Wed."); break;case 5: LCD_WriteStr(10, 0, "Thur."); break;case 6: LCD_WriteStr(10, 0, " Fri."); break;case 7: LCD_WriteStr(10, 0, " Sat."); break;default: LCD_WriteStr(10, 0, " Sun."); break;}}void SetTime(){TR1 = 0;LCD_WriteCommand(0x0F, 0);// LCD_WriteCommand(0x0C, 0);switch (g_setLocation){case 1: LCD_WriteCommand(0x80 + 1, 0); break;case 2: LCD_WriteCommand(0x80 + 4, 0); break;case 3: LCD_WriteCommand(0x80 + 7, 0); break;case 4: LCD_WriteCommand(0x80 + 0x40 + 1, 0); break;case 5: LCD_WriteCommand(0x80 + 0x40 + 4, 0); break;case 6: LCD_WriteCommand(0x80 + 0x40 + 7, 0); break;case 7: LCD_WriteCommand(0x80 + 14, 0); break;case 8: {LCD_WriteCommand(0x0C, 0);DS1302_WriteTime();g_setLocation = 0;g_setTimeFlag = 0;break;}default: ;}TR1 = 1;}void DispLED(){if (g_isAutoOff){LCD_WriteChar(10, 1, 'A'); //自动开关模式}else{LCD_WriteChar(10, 1, 'M'); //手动开关模式}if (g_isAutoAjust){LCD_WriteChar(12, 1, 'A'); //自动调节亮度模式}else{LCD_WriteChar(12, 1, 'M'); //手动调节亮度模式}LCD_WriteChar(14, 1, g_PWMdutyCycle / 5 / 10 + '0');LCD_WriteChar(15, 1, g_PWMdutyCycle / 5 % 10 + '0');}void SetPWM(unsigned int freq, unsigned char dutyCycle){unsigned long totalCnt;unsigned long highCnt;unsigned long lowCnt;totalCnt = 11059200 / freq / 12; // (1/freq) / (12/11059200);highCnt = totalCnt * dutyCycle / 100;lowCnt = totalCnt - highCnt;highCnt = 65536 - highCnt;lowCnt = 65536 - lowCnt;highT0RH = highCnt / 256;highT0RL = highCnt % 256;lowT0RH = lowCnt / 256;lowT0RL = lowCnt % 256;}void KeyPress(){static unsigned int keyCnt;if (!KEY_SET) //设置键按下{DelayMs(10);if (!KEY_SET){if (!g_setTimeFlag){g_setTimeFlag = 1;}g_setLocation++;BUZZER = 0;DelayMs(10);BUZZER = 1;}while (!KEY_SET);}if (!KEY_ADD) //加键按下{DelayMs(180);if (!KEY_ADD){if (!g_setTimeFlag){if (g_isAutoAjust == 1){g_isAutoAjust = 0;}g_PWMdutyCycle = g_PWMdutyCycle + 5;if (g_PWMdutyCycle >= 95){g_PWMdutyCycle = 95;}Write_EEPROM();}else{switch (g_setLocation){case 1:{timeBufDec[1]++;if (timeBufDec[1] >= 100){timeBufDec[1] = 0;}break;}case 2:{timeBufDec[2]++;if (timeBufDec[2] >= 13){timeBufDec[2] = 1;}break;}case 3:{timeBufDec[3]++;if (timeBufDec[3] >= YDay(timeBufDec[1], timeBufDec[2]) + 1){timeBufDec[3] = 1;}break;}case 4:{timeBufDec[4]++;if (timeBufDec[4] >= 24){timeBufDec[4] = 0;}break;}case 5:{timeBufDec[5]++;if (timeBufDec[5] >= 60){timeBufDec[5] = 0;}break;}case 6:{timeBufDec[6]++;if (timeBufDec[6] >= 60){timeBufDec[6] = 0;}break;}case 7:{timeBufDec[7]++;if (timeBufDec[7] > 7){timeBufDec[7] = 1;}break;}default:;}}BUZZER = 0;DelayMs(10);BUZZER = 1;}//while (!KEY_ADD);}if (!KEY_SUB) //减键按下{DelayMs(180);if (!KEY_SUB){if (!g_setTimeFlag){if (g_isAutoAjust == 1){g_isAutoAjust = 0;}g_PWMdutyCycle = g_PWMdutyCycle - 5;if (g_PWMdutyCycle <= 5){g_PWMdutyCycle = 5;}Write_EEPROM();}else{switch (g_setLocation){case 1:{if (timeBufDec[1] == 0){timeBufDec[1] = 100;}timeBufDec[1]--;break;}case 2:{timeBufDec[2]--;if (timeBufDec[2] < 1){timeBufDec[2] = 12;}break;}case 3:{timeBufDec[3]--;if (timeBufDec[3] < 1){timeBufDec[3] = YDay(timeBufDec[1], timeBufDec[2]);}break;}case 4:{if (timeBufDec[4] == 0){timeBufDec[4] = 24;}timeBufDec[4]--;break;}case 5:{if (timeBufDec[5] == 0){timeBufDec[5] = 60;}timeBufDec[5]--;break;}case 6:{if (timeBufDec[6] == 0){timeBufDec[6] = 60;}timeBufDec[6]--;break;}case 7:{timeBufDec[7]--;if (timeBufDec[7] < 1){timeBufDec[7] = 7;}break;}default:;}}BUZZER = 0;DelayMs(10);BUZZER = 1;}//while (!KEY_SUB);}if (!KEY_MODE) //模式键按下{DelayMs(20);while (!KEY_MODE){DelayMs(20);keyCnt++;if (keyCnt >= 50){break;}}if (keyCnt >= 50) {if (TR0 == 1) // 长按关灯{g_isAutoOff = 0;LED_PWM = 1;TR0 = 0;}else //长按开灯{g_isAutoOff = 0;LED_PWM = 0;TR0 = 1;}}else{if (g_setTimeFlag){DS1302_WriteTime();g_setLocation = 0;g_setTimeFlag = 0;}else{g_mode++;g_mode &= 0x03; //满4清零Write_EEPROM();}LCD_WriteCommand(0x0C, 0);BUZZER = 0;DelayMs(10);BUZZER = 1;}keyCnt = 0;while (!KEY_MODE);}}

仿真演示视频:

/video/BV1ad4y1M75Y/

实物演示视频:

/video/BV1LW4y1v774/

如果觉得《基于51单片机pwm调光护眼台灯智能检测光强光控灯设计proteus仿真原理图PCB》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。