判断从串口接收的每五个字节与所存储的验证码是否相同

2019-07-16 07:02发布

做一个监控系统,判断从串口接收的每五个字节与所存储的验证码是否相同?我这样的程序问题在哪啊?或者有人能说一下编程的思路吗?
这下面是我的程序   谢谢大家了





  1. def.h

  2. #ifndef __DEF_H__
  3. #define __DEF_H__

  4. #define uint8  unsigned char
  5. #define uint16 unsigned int
  6. #define uint32 unsigned long
  7. #define LCD_BUS P0

  8. #define RS_SET() (P2=P2|0X80)
  9. #define RS_CLR() (P2=P2&0X7F)
  10. #define RW_SET() (P2=P2|0X40)
  11. #define RW_CLR() (P2=P2&0XBF)
  12. #define EN_SET() (P2=P2|0X20)
  13. #define EN_CLR() (P2=P2&0XCF)

  14. #define START     0XFF //包头
  15. #define CMD_DAT   0X01  //命令码
  16. #define CMD_PARA  0X02 //命令参数
  17. #define CRC_DAT   0X03  //校验码
  18. #define END_DAT   0XF0 //包尾标志


  19. #endif

  20. main.c

  21. #include <at89x52.h>
  22. #include "def.h"

  23. static uint8 CRC[5]={START,CMD_DAT,CMD_PARA,CRC_DAT,END_DAT}; //5位状态查询结果码

  24. void delay(uint8 delay_time)
  25. {
  26. uint8 i,j;
  27. for(i = delay_time;i > 0;i--)
  28. { for(j = 110;j > 0;j--); }
  29. }

  30. void delays(void)   //误差 0us
  31. {
  32.     unsigned char a,b,c;
  33.     for(c=167;c>0;c--)
  34.         for(b=171;b>0;b--)
  35.             for(a=16;a>0;a--);
  36. }

  37. void write_com(uint8 com)
  38. {
  39. RS_CLR();
  40. delay(5);
  41. RW_CLR();
  42. delay(5);
  43. LCD_BUS = com;
  44. delay(5);
  45. EN_SET();
  46. delay(5);
  47. EN_CLR();
  48. }

  49. void write_data(uint8 dat)
  50. {
  51. RS_SET();
  52. delay(5);
  53. RW_CLR();
  54. delay(5);
  55. LCD_BUS =dat;
  56. delay(5);
  57. EN_SET();
  58. delay(5);
  59. EN_CLR();
  60. }

  61. void lcd_init()
  62. {
  63. EN_CLR();
  64. write_com(0x38);
  65. write_com(0x0e);
  66. write_com(0x06);
  67. write_com(0x01);
  68. write_com(0x80);
  69. }

  70. void display(uint8 add,uint8* disdat)
  71. {
  72. write_com(add);
  73. while((*disdat)!='') //发送字符串,直到遇到0才结束
  74. {
  75. write_data(*disdat); //发送一个字符
  76. disdat++;  //移动到下一个字符
  77. }
  78. }

  79. void Int_UART(void)
  80. {
  81. TMOD=(TMOD&0x0f)|0x20; //T1模式设置为方式二,自动生重装初始值,内部工作时钟,不需外部控制   
  82.    TH1=0xfd; //装波特率初始值
  83.    TL1=0xfd;
  84.    TR1=1;
  85.    SCON=0x50; //串口方式1,允许接收
  86.    ES=1; //中断允许
  87.    EA=1;
  88. }

  89. void main(void)
  90. {
  91. Int_UART(); //初始化串口
  92. lcd_init();
  93. delays();
  94.   while(1)
  95. {
  96. if(RI)
  97. {
  98. RI = 0;
  99. if(SBUF==START)
  100. {
  101. if(RI)
  102. {
  103. RI=0;
  104. if(SBUF==CMD_DAT)
  105. {
  106. if(RI)
  107. {
  108. RI=0;
  109. if(SBUF==CMD_PARA)
  110. {
  111. if(RI)
  112. {
  113. RI=0;
  114. if(SBUF==CRC_DAT)
  115. {
  116. if(RI)
  117. {
  118. RI=0;
  119. if(SBUF==END_DAT)
  120. {
  121. display(0xc0,"Rece Complete!");
  122. }
  123. }
  124. }
  125. }
  126. }
  127. }
  128. }
  129. }

  130. }
  131. }
  132. }
  133. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。