基于单片机实现的智能路灯控制系统
#include ///'reg52.h///'//n#include ///'intrins.h///'//t//n#include ///'lcd.h///'//n#include ///'typedef.h///'//n#include ///'ds1302.h///'//n#include ///'AD0832.h///'//n#include ///'bh1750.h///'//t//t//t//t//t//t//t//t//t//t//t//n#ifdef __cplusplus//nextern ///'C///' {//n#endif//n//n//nsbit K1 = P2 ^ 3; // 按键1//nsbit K2 = P2 ^ 4; // 按键2//nsbit K3 = P3 ^ 4; // 按键3 //nsbit Lamp= P1^ 0; // 灯光控制//t//t(路灯开关//n//n//nu8 SetCnt = 0; // 设置计数//nu8 TimeSel = 0; // 时间设置//nu8 TimeCnt = 0; // 时间移位设置//n//nextern u8 Timer[3]; // 设置时间//nextern u8 hour,min,sec; // 小时和分钟和秒//n//nu8 Openflag; // 开关标志位 //nu8 Sw; // 按键控制//nu8 Keyflag; // 按键按下标志位//nu16 Illvalue; // 光照值//nu16 IllMin=30; // 最低光照阈值//nu16 BatterBuf[5]; // 电压缓存//nu8 BatterCnt; // ADC采集计数//nu16 BatterValue; // 电压值//nu8 UartData[6]; // 接收串口数据//nu8 UartTmr=0; // 接收延时//nu8 UartCnt=0; // 接收串口数据个数//nu8 UartFlg=0; // 接收到数据标志位 //n//u16 BatterDis = 1000; // 电池电压显示//n//n//nvoid Light_Bright(u8 x,u8 y,u8 tmp)//n{//n if(tmp==0)//n//t{//n//t LcdShowStr(x,y,///'NO///'); // 显示当前字符//n//t}//n//telse //n//t{//n//t LcdShowStr(x,y,///'YS///'); // 显示当前字符//n//t} //n}//n//n//n//n// 按键程序//nvoid Key_program()//n{//n if(K1==1&&K2==1&&K3==1) // 没有按键按下//n//t {//n//t Keyflag=1; // 按键按下标志位//n//t }//n//t else // 如果有按键按下//n//t {//n//t if(Keyflag==1) // 按键按下标志位为1//n//t//t//t{//n//t//t//t Keyflag =0; // 按键按下标志位//n//t//t//t//t if(K1==0) // 如果按键1按下//n//t//t//t//t {//n//t//t//t//t if(IllMin<10000)//n//t//t//t//t//t//t{//n//t//t//t//t//t//t IllMin++;//n//t//t//t//t//t//t}//n//t//t//t//t//t//t//t//n//t//t//t//t }//n//t//t//t//t if(K2==0) // 如果按键2按下//n//t//t//t//t {//n//t//t//t//t if(IllMin>0)//n//t//t//t//t//t//t{//n//t//t//t//t//t//t IllMin--;//n//t//t//t//t//t//t}//n//t//t//t//t }//n//t//t//t//t if(K3==0) // 如果按键3按下//n//t//t//t//t {//n//t//t//t//t if(++Sw>=2)//n//t//t//t//t//t//t//t Sw =0;//n//t//t//t//t }//n//t//t//t}//n//t }//n //n}//n//n//nvoid UARTRxdData()//n{//n if(UartFlg==1) // 串口有数据接收//n//t {//n//t if(++UartTmr>=2) // 延时等待接收完毕//n//t//t//t{//n//t//t//t if(UartCnt==6) // 如果收到数据长度为6//n//t//t//t//t//t {//n//t//t//t//t//t//t Timer[2] = (UartData[0]-0x30)10+(UartData[1]-0x30); // 计算时//n//t//t//t//t//t//t Timer[1] = (UartData[2]-0x30)10+(UartData[3]-0x30); // 计算分 //n//t//t//t//t//t//t Timer[0] = (UartData[4]-0x30)10+(UartData[5]-0x30); // 计算秒 //n//t//t//t//t//t//t Timer[2] = Timer[2]/1016+Timer[2]%10; // 10进制 转16进制//n//t//t//t//t//t//t Timer[1] = Timer[1]/1016+Timer[1]%10; // 10进制 转16进制//n//t//t//t//t//t//t Timer[0] = Timer[0]/1016+Timer[0]%10; // 10进制 转16进制//n//t//t//t//t//t Ds1302WriteTime(); // 写入数据//t//n//t//t//t//t }//n//t//t//t//t if(UartCnt==4) // 如果收到数据长度为4//n//t//t//t//t {//n//t//t//t//t//t if(UartData[0]=='o'&&UartData[1]=='p'&&UartData[2]=='e'&&UartData[3]=='n')//n//t//t//t//t//t//t {//n//t//t//t//t//t//t Sw= 1; // 打开//n//t//t//t//t//t//t } //n//t//t//t//t//t//t else//t//t if(UartData[0]=='c'&&UartData[1]=='l'&&UartData[2]=='s'&&UartData[3]=='e')//n//t//t//t//t//t//t {//n//t//t//t//t//t//t Sw= 0; // 关闭 //n//t//t//t//t//t//t }//n//t//t//t//t }//n//t//t//t//t //n//t//t//t UartTmr=0; // 接收延时//n//t//t//t UartFlg=0; // 接收到数据标志位置零//n//t//t//t UartCnt=0;//t//t//t//t//t //n//t//t//t}//n//t }//n}//n//nvoid Uart_init(void)//n{//n//n// TMOD |= 0x20; // TMOD=0010 0000B,定时器T1工作于方式2 //n// SCON |= 0x40; // SCON=0100 0000B,串口工作方式1//n// PCON &= 0xef;//n// TH1 = 0xfd; //n// TL1 = 0xfd; //n// TR1 = 1; //n//t//n //tSCON |= 0x50;//n//t//tTMOD |= 0x20;//n//t//tPCON |= 0x00; //n//t//tTH1 = 0xfd; // 根据规定给定时器T1赋初值 波特率9600//n//t//tTL1 = 0xfd; // 根据规定给定时器T1赋初值 波特率9600//n//t//tTI = 0;//n//t//tRI = 0;//n//t//tTR1 = 1; // 启动定时器T1 //n//t//tIE |= 0x90;//n//t ES = 1;//n//t//n}//t//n///n 函 数 名 : Timer0Init//n 函数功能//t//t : 定时器0初始化//n 输 入 : 无//n 输 出 : 无//n****///nvoid Timer0Init()//n{//n//t//tTMOD|=0X01; // 选择为定时器0模式,工作方式1,仅用TR0打开启动。//n//t//tTH0=0XFC;//t // 给定时器赋初值,定时1ms//n//t//tTL0=0X18;//t//n//t//tET0=1; // 打开定时器0中断允许//n//t//tEA=1; // 打开总中断//n//t//tTR0=1; // 打开定时器//t//t//t//t//n}//n//nvoid main(void)//n{//n//t u8 i = 0;//n//t Uart_init(); // 初始化串口波特率9600//n Timer0Init(); // 初始化定时器0//n Ds1302Init(); // 初始化DS1302 //n//t InitLcd1602(); // 初始化LCD1602//n //t InitBH1750();//t//t //初始化bh1750//n//t while(1)//n//t {//n//t//t if(++i>=20)//n//t//t//t {//n//t//t//t//t i =20;//n//t//t//t//t if(SetCnt == 0)//n//t//t//t//t {//n//t//t//t//t//t//t Ds1302ReadTime(); // 读取DS1302时钟//n//t//t//t//t }//n//t//t//t//t //n//t//t//t//t Illvalue = Read_BH1750(); // 读取光照值//n//t//t//t//t //n//t//t//t//t//t//t//t//n//t//t//t//t LcdShowStr(0,0,///'L=///'); // 显示当前字符 ///'L=///$//n//t//t//t//t Lcd_DisplayIll(2,0,Illvalue); // 显示当前光照值//n//t//t//t//t LcdShowStr(7,0,///'Lux///'); // 显示当前字符 ///'lux///$//n//t//t//t//t Lcd_DisplayIll(11,0,IllMin); // 显示当前光照值//n//t//t//t//t Lcd_Display(0,1,hour); // 当前小时//n//t//t//t//t LcdShowStr(2,1,///':///'); // 显示当前字符//n//t//t//t//t Lcd_Display(3,1,min); // 当前分钟//n//t//t//t//t LcdShowStr(5,1,///':///'); // 显示当前字符//n//t//t//t//t Lcd_Display(6,1,sec); // 当前秒//n//t//t//t//t Light_Bright(9,1,Openflag); // 显示开关状态//n//t//t//t//t Lcd_DisplayBatter(12,1,BatterValue);//n//t//t//t }//n//t//t//t TR0=0; // 关闭定时器0//n//t//t BatterBuf[BatterCnt] = Read_ADC0832(0)1.972; // 电压缓存 //n//t//t TR0=1; // 打开定时器0//n//t//t//t //n//t//t//t //n//t//t//t if(++BatterCnt>=5)//n//t//t//t {//n//t//t//t//t BatterCnt =0;//n//t//t//t//t BatterValue=(BatterBuf[0]+BatterBuf[1]+BatterBuf[2]+BatterBuf[3]+BatterBuf[4])/5/10+2; // 取平均值//n//t//t//t//t if(BatterValue>=42)//n//t//t//t//t//t//t BatterValue =42;//n//t//t//t }//n//t//t//t if(Sw==0)//n//t//t//t {//n//t//t//t//t//t if(Illvalue < IllMin) // 光照小于阈值//n//t//t//t//t//t {//n//t//t//t//t//t//t Lamp = 0; // 灯光打开//n//t//t//t//t//t//t Openflag=1; // 开关标志位置1 //n//t//t//t//t//t }//n//t//t//t//t//t else//n//t//t//t//t//t {//n//t//t//t//t//t//t Lamp = 1; // 灯光关闭//n//t//t//t//t//t//t Openflag=0; // 开关标志位置0//n//t//t//t//t//t }//n//t//t//t }//n//t//t//t else if(Sw==1)//n//t//t//t {//n//t//t//t//t Lamp = 0; // 灯光打开//n//t//t//t//t Openflag=1; // 开关标志位置1 //n//t//t//t }//n//t//t //n UARTRxdData();//t//t//t//t //n//t }//n}//t //n//n///n 函 数 名 : void Timer0() interrupt 1//n 函数功能//t//t : 定时器0中断函数//n 输 入 : 无//n 输 出 : 无//n****///nvoid Timer0() interrupt 1//n{//n//t//n//t TH0 = 0xDC; // 给定时器赋初值,定时10ms//n TL0 = 0x00;//n Key_program(); // 按键程序//t//t//t//t //n //n}//n//nvoid Serial_INT() interrupt 4//n{//n//n//t unsigned char temp; //用于存放读出的寄存器SBUF中的值//n//t if(RI) //检测串口接收中断标志,接收时为1//n//t {//n//t//t//t temp = SBUF; //将SBUF寄存器的值存在temp中//n//t//t//t UartData[UartCnt]=temp; //n//t//t//t RI = 0; //清中断标志//n//t//t//t ++UartCnt;//n//t//t//t UartFlg=1; // 接收到数据标志位//n//t//t//t UartTmr=0; // 接收延时//n//t }//n //n//t//t//n}//n此程序涉及哪些方面//n内容:该程序涉及到的方面包括://n1. 串口通信:通过串口接收数据,根据接收到的数据进行相应的操作。//n2. 定时器中断:使用定时器0进行定时,定时器中断用于处理按键程序和其他功能的实时更新。//n3. 按键控制:根据按键的状态进行相应的操作,如调整光照阈值、切换开关状态等。//n4. LCD显示:使用LCD显示模块进行光照值、时间、开关状态等信息的显示。//n5. 光照传感器:通过BH1750光照传感器读取当前光照值。//n6. 电压检测:通过ADC0832模块读取电池电压值。//n7. DS1302时钟模块:使用DS1302模块进行时间的读取和设置。//n8. 灯光控制:根据光照值和设定的阈值控制灯光的开关状态。//n9. 其他外设控制:如控制路灯开关等。
原文地址: https://www.cveoy.top/t/topic/pImx 著作权归作者所有。请勿转载和采集!