"void UARTRxdData()\n{\n\t\tif(UartFlg==1) // 串口有数据接收\n\t\t {\n\t\t\t\tif(++UartTmr>=2) // 延时等待接收完毕\n\t\t\t\t{\n\t\t\t\t\t\tif(UartCnt==6) // 如果收到数据长度为6\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\tTimer[2] = (UartData[0]-0x30)10+(UartData[1]-0x30); // 计算时\n\t\t\t\t\t\t\t\tTimer[1] = (UartData[2]-0x30)10+(UartData[3]-0x30); // 计算分 \n\t\t\t\t\t\t\t\tTimer[0] = (UartData[4]-0x30)10+(UartData[5]-0x30); // 计算秒 \n\t\t\t\t\t\t\t\tTimer[2] = Timer[2]/1016+Timer[2]%10; // 10进制 转16进制\n\t\t\t\t\t\t\t\tTimer[1] = Timer[1]/1016+Timer[1]%10; // 10进制 转16进制\n\t\t\t\t\t\t\t\tTimer[0] = Timer[0]/1016+Timer[0]%10; // 10进制 转16进制\n\t\t\t\t\t\t\t\tDs1302WriteTime(); // 写入数据\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t }\n\t\t\t\t\t\tif(UartCnt==4) // 如果收到数据长度为4\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\tif(UartData[0]=='o'&&UartData[1]=='p'&&UartData[2]=='e'&&UartData[3]=='n')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tSw= 1; // 打开\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if(UartData[0]=='c'&&UartData[1]=='l'&&UartData[2]=='s'&&UartData[3]=='e')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tSw= 0; // 关闭 \n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t }\n\t\t\t\t\t\t\n\t\t\t\tUartTmr=0; // 接收延时\n\t\t\t\tUartFlg=0; // 接收到数据标志位置零\n\t\t\t\tUartCnt=0; \n\t\t\t\t}\n\t\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 SCON |= 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\n"这段程序是一个串口接收函数和串口初始化函数。\n\nUARTRxdData()函数用于接收串口数据。首先判断UartFlg变量是否为1,如果为1则表示串口有数据接收。然后判断UartTmr变量是否大于等于2,如果大于等于2则表示延时等待接收完毕。接着判断UartCnt变量的值,如果为6,则表示收到的数据长度为6,根据收到的数据计算时、分、秒的值,并将其转换为16进制。最后调用Ds1302WriteTime()函数将数据写入。如果UartCnt为4,则表示收到的数据长度为4,根据收到的数据判断打开或关闭的指令,并将Sw变量赋值相应的值。最后将UartTmr、UartFlg和UartCnt变量清零。\n\nUart_init()函数用于初始化串口。首先设置SCON寄存器的值为0x50,表示串口工作方式1,并且启用串口中断。然后设置TMOD寄存器的值为0x20,表示定时器T1工作于方式2。接着设置PCON寄存器的值为0x00,表示串口波特率不加倍。然后给定时器T1赋初值,设置波特率为9600。最后启动定时器T1,并开启串口中断。\n\n"

串口数据接收和初始化程序代码解析

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

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