{"title": "单片机串口通信和定时器中断程序:AD0809 电压测量和光照控制", "description": "本程序使用单片机实现串口通信和定时器中断,并利用AD0809 采集电压,同时使用BH1750 测量光照强度,根据光照值和用户设定阈值控制灯光开关。", "keywords": "单片机, 串口通信, 定时器中断, AD0809, 电压测量, BH1750, 光照控制, DS1302, LCD1602", "content": ""void Uart_init(void)\n{\n\tSCON |= 0x50; // 串口工作方式1,波特率9600\n\tTMOD |= 0x20; // 定时器T1工作于方式2\n\tPCON |= 0x00;\n\tTH1 = 0xfd; // 给定时器T1赋初值,波特率9600\n\tTL1 = 0xfd;\n\tTI = 0;\n\tRI = 0;\n\tTR1 = 1; // 启动定时器T1\n\tIE |= 0x90;\n\tES = 1;\n}\n\n/\n 函 数 名 : Timer0Init\n 函数功能 : 定时器0初始化\n 输 入 : 无\n 输 出 : 无\n****/\nvoid Timer0Init()\n{\n\tTMOD |= 0X01; // 选择为定时器0模式,工作方式1,仅用TR0打开启动。\n\tTH0 = 0XFC; // 给定时器赋初值,定时1ms\n\tTL0 = 0X18;\n\tET0 = 1; // 打开定时器0中断允许\n\tEA = 1; // 打开总中断\n\tTR0 = 1; // 打开定时器\n}\n\nvoid main(void)\n{\n\tu8 i = 0;\n\tUart_init(); // 初始化串口波特率9600\n\tTimer0Init(); // 初始化定时器0\n\tDs1302Init(); // 初始化DS1302\n\tInitLcd1602(); // 初始化LCD1602\n\tInitBH1750(); // 初始化bh1750\n\twhile (1)\n\t{\n\t if (++i >= 20)\n\t {\n\t i = 20;\n\t if (SetCnt == 0)\n\t {\n\t Ds1302ReadTime(); // 读取DS1302时钟\n\t }\n\n\t Illvalue = Read_BH1750(); // 读取光照值\n\n\t LcdShowStr(0, 0, "L="); // 显示当前字符 "L="\n\t Lcd_DisplayIll(2, 0, Illvalue); // 显示当前光照值\n\t LcdShowStr(7, 0, "Lux"); // 显示当前字符 "lux"\n\t Lcd_DisplayIll(11, 0, IllMin); // 显示当前光照值\n\t Lcd_Display(0, 1, hour); // 当前小时\n\t LcdShowStr(2, 1, ":"); // 显示当前字符\n\t Lcd_Display(3, 1, min); // 当前分钟\n\t LcdShowStr(5, 1, ":"); // 显示当前字符\n\t Lcd_Display(6, 1, sec); // 当前秒\n\t Light_Bright(9, 1, Openflag); // 显示开关状态\n\t Lcd_DisplayBatter(12, 1, BatterValue);\n\t }\n\t TR0 = 0; // 关闭定时器0\n\t BatterBuf[BatterCnt] = Read_ADC0809(0) * 1.97 * 2; // 电压缓存\n\t TR0 = 1; // 打开定时器0\n\n\t if (++BatterCnt >= 5)\n\t {\n\t BatterCnt = 0;\n\t BatterValue = (BatterBuf[0] + BatterBuf[1] + BatterBuf[2] + BatterBuf[3] + BatterBuf[4]) / 5 / 10 + 2; // 取平均值\n\t if (BatterValue >= 42)\n\t BatterValue = 42;\n\t }\n\t if (Sw == 0)\n\t {\n\t if (Illvalue < IllMin) // 光照小于阈值\n\t {\n\t Lamp = 0; // 灯光打开\n\t Openflag = 1; // 开关标志位置1\n\t }\n\t else\n\t {\n\t Lamp = 1; // 灯光关闭\n\t Openflag = 0; // 开关标志位置0\n\t }\n\t }\n\t else if (Sw == 1)\n\t {\n\t Lamp = 0; // 灯光打开\n\t Openflag = 1; // 开关标志位置1\n\t }\n\n\t UARTRxdData();\n\t}\n}\n\n/\n 函 数 名 : void Timer0() interrupt 1\n 函数功能 : 定时器0中断函数\n 输 入 : 无\n 输 出 : 无\n****/\nvoid Timer0() interrupt 1\n{\n\n\tTH0 = 0xDC; // 给定时器赋初值,定时10ms\n\tTL0 = 0x00;\n\tKey_program(); // 按键程序\n}\n\nvoid Serial_INT() interrupt 4\n{\n\n\tunsigned char temp; //用于存放读出的寄存器SBUF中的值\n\tif (RI) //检测串口接收中断标志,接收时为1\n\t{\n\t temp = SBUF; //将SBUF寄存器的值存在temp中\n\t UartData[UartCnt] = temp;\n\t RI = 0; //清中断标志\n\t ++UartCnt;\n\t UartFlg = 1; // 接收到数据标志位\n\t UartTmr = 0; // 接收延时\n\t}\n}\n\n#ifdef __cplusplus\n}\n#endif\n


原文地址: https://www.cveoy.top/t/topic/pItK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录