单片机控制LED灯亮度
{ "title": "void Light_Bright(u8 x,u8 y,u8 tmp)\n{\n if(tmp==0)\n {\n LcdShowStr(x,y,"NO"); // 显示当前字符\n }\n else \n {\n LcdShowStr(x,y,"YS"); // 显示当前字符\n } \n}\n\n\n// 按键程序\nvoid Key_program()\n{\n if(K1==1&&K2==1&&K3==1) // 没有按键按下\n {\n Keyflag=1; // 按键按下标志位\n }\n else // 如果有按键按下\n {\n if(Keyflag==1) // 按键按下标志位为1\n {\n Keyflag =0; // 按键按下标志位\n if(K1==0) // 如果按键1按下\n {\n if(IllMin<10000)\n {\n IllMin++;\n }\n }\n if(K2==0) // 如果按键2按下\n {\n if(IllMin>0)\n {\n IllMin--;\n }\n }\n if(K3==0) // 如果按键3按下\n {\n if(++Sw>=2)\n Sw =0;\n }\n }\n }\n \n}\n\n\nvoid UARTRxdData()\n{\n if(UartFlg==1) // 串口有数据接收\n {\n if(++UartTmr>=2) // 延时等待接收完毕\n {\n if(UartCnt==6) // 如果收到数据长度为6\n {\n Timer[2] = (UartData[0]-0x30)10+(UartData[1]-0x30); // 计算时\n Timer[1] = (UartData[2]-0x30)10+(UartData[3]-0x30); // 计算分 \n Timer[0] = (UartData[4]-0x30)10+(UartData[5]-0x30); // 计算秒 \n Timer[2] = Timer[2]/1016+Timer[2]%10; // 10进制 转16进制\n Timer[1] = Timer[1]/1016+Timer[1]%10; // 10进制 转16进制\n Timer[0] = Timer[0]/1016+Timer[0]%10; // 10进制 转16进制\n Ds1302WriteTime(); // 写入数据\n }\n if(UartCnt==4) // 如果收到数据长度为4\n {\n if(UartData[0]=='o'&&UartData[1]=='p'&&UartData[2]=='e'&&UartData[3]=='n')\n {\n Sw= 1; // 打开\n } \n else if(UartData[0]=='c'&&UartData[1]=='l'&&UartData[2]=='s'&&UartData[3]=='e')\n {\n Sw= 0; // 关闭 \n }\n }\n \n UartTmr=0; // 接收延时\n UartFlg=0; // 接收到数据标志位置零\n UartCnt=0;\n }\n }\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\n SCON |= 0x50;\n TMOD |= 0x20;\n PCON |= 0x00; \n TH1 = 0xfd; // 根据规定给定时器T1赋初值 波特率9600\n TL1 = 0xfd; // 根据规定给定时器T1赋初值 波特率9600\n TI = 0;\n RI = 0;\n TR1 = 1; // 启动定时器T1 \n IE |= 0x90;\n ES = 1;\n\n} \n\nvoid ADC0809_init(void)\n{\n P1ASF = 0xFF; \n ADC_RES = 0;\n ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START ; \n\n}\n\n/\n 函 数 名 : Timer0Init\n 函数功能 : 定时器0初始化\n 输 入 : 无\n 输 出 : 无\n****/\nvoid Timer0Init()\n{\n TMOD|=0X01; // 选择为定时器0模式,工作方式1,仅用TR0打开启动。\n TH0=0XFC; // 给定时器赋初值,定时1ms\n TL0=0X18; \n ET0=1; // 打开定时器0中断允许\n EA=1; // 打开总中断\n TR0=1; // 打开定时器 \n}\n\nvoid main(void)\n{\n u8 i = 0;\n Uart_init(); // 初始化串口波特率9600\n Timer0Init(); // 初始化定时器0\n Ds1302Init(); // 初始化DS1302 \n InitLcd1602(); // 初始化LCD1602\n InitBH1750(); //初始化bh1750\n while(1)\n {\n if(++i>=20)\n {\n i =20;\n if(SetCnt == 0)\n {\n Ds1302ReadTime(); // 读取DS1302时钟\n }\n \n Illvalue = Read_BH1750(); // 读取光照值\n \n \n LcdShowStr(0,0,"L="); // 显示当前字符 "L="\n Lcd_DisplayIll(2,0,Illvalue); // 显示当前光照值\n LcdShowStr(7,0,"Lux"); // 显示当前字符 "lux"\n Lcd_DisplayIll(11,0,IllMin); // 显示当前光照值\n Lcd_Display(0,1,hour); // 当前小时\n LcdShowStr(2,1,":"); // 显示当前字符\n Lcd_Display(3,1,min); // 当前分钟\n LcdShowStr(5,1,":"); // 显示当前字符\n Lcd_Display(6,1,sec); // 当前秒\n Light_Bright(9,1,Openflag); // 显示开关状态\n Lcd_DisplayBatter(12,1,BatterValue);\n }\n TR0=0; // 关闭定时器0\n BatterBuf[BatterCnt] = Read_ADC0809()1.972; // 电压缓存 \n TR0=1; // 打开定时器0\n \n \n if(++BatterCnt>=5)\n {\n BatterCnt =0;\n BatterValue=(BatterBuf[0]+BatterBuf[1]+BatterBuf[2]+BatterBuf[3]+BatterBuf[4])/5/10+2; // 取平均值\n if(BatterValue>=42)\n BatterValue =42;\n }\n if(Sw==0)\n {\n if(Illvalue < IllMin) // 光照小于阈值\n {\n Lamp = 0; // 灯光打开\n Openflag=1; // 开关标志位置1 \n }\n else\n {\n Lamp = 1; // 灯光关闭\n Openflag=0; // 开关标志位置0\n }\n }\n else if(Sw==1)\n {\n Lamp = 0; // 灯光打开\n Openflag=1; // 开关标志位置1 \n }\n\n UARTRxdData(); \n }\n}\n \n\n/\n 函 数 名 : void Timer0() interrupt 1\n 函数功能 : 定时器0中断函数\n 输 入 : 无\n 输 出 : 无\n****/\nvoid Timer0() interrupt 1\n{\n \n TH0 = 0xDC; // 给定时器赋初值,定时10ms\n TL0 = 0x00;\n Key_program(); // 按键程序 \n \n}\n\nvoid Serial_INT() interrupt 4\n{\n\n unsigned char temp; //用于存放读出的寄存器SBUF中的值\n if(RI) //检测串口接收中断标志,接收时为1\n {\n temp = SBUF; //将SBUF寄存器的值存在temp中\n UartData[UartCnt]=temp; \n RI = 0; //清中断标志\n ++UartCnt;\n UartFlg=1; // 接收到数据标志位\n UartTmr=0; // 接收延时\n }\n \n \n}\n#ifdef __cplusplus\n}\n#endif
原文地址: https://www.cveoy.top/t/topic/pIti 著作权归作者所有。请勿转载和采集!