网站大量收购独家精品文档,联系QQ:2885784924

单片机技术及应用项目教程 课件 项目7-4修正万年历时间.ppt

单片机技术及应用项目教程 课件 项目7-4修正万年历时间.ppt

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

4修正万年历时间

一正确判断协议的开始发送端向接收端发送数据时,接收端处于被动地位,数据的到来是随机而不可预知的。如果发送端连续不断的发送各种数据,如何从这个庞大的数据流中解析出每条数据,将使我们首先要解决的问题。

命令解释协议头命令号命令长度命令体校验和读取时间5AH01H00H无累加和读取时间回复02H07H年月日时分秒星期设置时间03H07H年月日时分秒星期设置时间回复04H07H年月日时分秒星期表7-5十六进制协议

(1)一共指定了4条协议,并有各自的唯一命令编号,分别为:读取时间(01H)、读取时间回复(02H)、设置时间(03H)、设置时间回复(04H)。(2)协议头采用5AH,这是因为5AH译成二进制,0、1出现的概论一样的,可以在一定程度上增强抗干扰能力。(3)命令长度实际上是命令体的长度,不包含校验和。(4)校验和我们采用累加和的形式予以实现,具体计算方法是从协议头开始连续加到命令体的最后一个字节。增加校验和是为了判断接收到数据的正确性,接收端接收到数据后,会重新计算校验和,如果,计算的校验和与发送端传递过来的校验和相同,则说明传递的数据正确,否则说明在传输时数据发生了变化,这条协议应该抛弃。

二在中断函数中实现UART数据的接收(1)我们在上一个例程的基础上,完成本例程的程序设计,复制例程7.18,并打开工程。(2)定义全局数组u8g_UartReceivedData[20]用于UART接收到的数据,这里将数组的大小定义为20,则最大接收到的数据长度不应超过20。(3)定义全局变量u8g_UartIsReceived用于标识是否接收到完整的数据,当UART0中断服务处理函数完成了整条协议数据的接收,则将此变量定义为TRUE,用户逻辑始终检测此变量,当检测到它的数据为TRUE时,就可以进行协议的解析工作了。完整的全局变量定义,如程序7-19所示。【程序7-19】//定义全局变量uint8u8g_DisplayString[8];uint8u8g_DisplayPoint[8]={0,0,0,1,0,1,0,1};uint8u8g_UartReceivedData[20]; //存储UART接收到的数据uint8u8g_UartIsReceived=FALSE; //表示UART中的数据是否接收完毕uint8u8g_Is1000ms=FALSE; //标识1000ms到

(4)接下来,我们看完整的UART0中断服务处理函数中的程序,如程序7-20所示。【程序7-20】#ifINTERNAL_PERIPHERAL_UART0_MODE!=0ISR(USART__RX_vect){ uint8u8_UartData,u8_CheckOutSum,i; staticuint8u8_IsRecevied=FALSE,u8_Number=0; u8_UartData=UDR0; if(u8_UartData==0x5a) { u8_IsRecevied=TRUE; u8_Number=0; } if(u8_IsRecevied==TRUE) { u8g_UartReceivedData[u8_Number]=u8_UartData; if((u8_Number2)(u8_Number==(3+u8g_UartReceivedData[2]))) { //表明已收到数据流的最后一个字节

//计算校验和 u8_CheckOutSum=0; for(i=0;iu8_Number;i++) { u8_CheckOutSum=u8_CheckOutSum+u8g_UartReceivedData[i]; } if(u8_CheckOutSum==u8g_UartReceivedData[u8_Number]) { //校验和正确 u8g_UartIsReceived=TRUE; //标识数据接收完毕 } u8_IsRecevied=FALSE; u8_Number=0; } else { u8_Number++; } } if(u8_Number=20) { //接收数据超长处理 u8_IsRecevied=FALSE; u8_Number=0; }#ifPROTOCOL_MINIUART_UART0_MODE!=0 miniUART_UartInterrupt(miniUART_UART0,u8_UartDa

您可能关注的文档

文档评论(0)

balala11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档