微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第61节:组合和非组合BCD码以及数值相互转换

第61节:组合和非组合BCD码以及数值相互转换

时间:11-22 来源:互联网 点击:

  1. /把数值转换成非组合BCD码
  2. for(i=0;i<4;i++)
  3. {
  4. eusart_send(ucBufferBCB_bit4[3-i]);////把组合BCD码返回给上位机观察,注意,高位在数组下标大的方向
  5. }
  6. eusart_send(0xee);//为了方便上位机观察,多发送3个字节ee ee ee作为分割线
  7. eusart_send(0xee);
  8. eusart_send(0xee);
  9. for(i=0;i<8;i++)
  10. {
  11. eusart_send(ucBufferBCB_bit8[7-i]);////把非组合BCD码返回给上位机观察,注意,高位在数组下标大的方向
  12. }
  13. break;
  14. case 2://接收到的是组合BCD码,需要转成数值和非组合BCD码
  15. for(i=0;i<4;i++)
  16. {
  17. ucBufferBCB_bit4[3-i]=ucRcregBuf[uiRcMoveIndex+4+i]; //从串口接收到的组合BCD码,注意,高位在数组下标大的方向
  18. }
  19. BCD4_to_number(ucBufferBCB_bit4,ucBufferNumber); //组合BCD码转成数值
  20. BCD4_to_BCD8(ucBufferBCB_bit4,ucBufferBCB_bit8); //组合BCD码转成非组合BCD码
  21. for(i=0;i<4;i++)
  22. {
  23. eusart_send(ucBufferNumber[3-i]);////把数值返回给上位机观察,注意,高位在数组下标大的方向
  24. }
  25. eusart_send(0xee);//为了方便上位机观察,多发送3个字节ee ee ee作为分割线
  26. eusart_send(0xee);
  27. eusart_send(0xee);
  28. for(i=0;i<8;i++)
  29. {
  30. eusart_send(ucBufferBCB_bit8[7-i]);////把非组合BCD码返回给上位机观察,注意,高位在数组下标大的方向
  31. }
  32. break;
  33. case 3://接收到的是非组合BCD码,需要转成数值和组合BCD码
  34. for(i=0;i<8;i++)
  35. {
  36. ucBufferBCB_bit8[7-i]=ucRcregBuf[uiRcMoveIndex+4+i]; //从串口接收到的非组合BCD码,注意,高位在数组下标大的方向
  37. }
  38. BCD8_to_number(ucBufferBCB_bit8,ucBufferNumber); //非组合BCD码转成数值
  39. BCD8_to_BCD4(ucBufferBCB_bit8,ucBufferBCB_bit4); //非组合BCD码转成组合BCD码
  40. for(i=0;i<4;i++)
  41. {
  42. eusart_send(ucBufferNumber[3-i]);////把数值返回给上位机观察
  43. }
  44. eusart_send(0xee);//为了方便上位机观察,多发送3个字节ee ee ee作为分割线,注意,高位在数组下标大的方向
  45. eusart_send(0xee);
  46. eusart_send(0xee);
  47. for(i=0;i<4;i++)
  48. {
  49. eusart_send(ucBufferBCB_bit4[3-i]);////把组合BCD码返回给上位机观察,注意,高位在数组下标大的方向
  50. }
  51. break;
  52. }
  53. break; //退出循环
  54. }
  55. uiRcMoveIndex++; //因为是判断数据头,游标向着数组最尾端的方向移动
  56. }
  57. uiRcregTotal=0;//清空缓冲的下标,方便下次重新从0下标开始接受新数据
  58. }
  59. }
  60. void eusart_send(unsigned char ucSendData) //往上位机发送一个字节的函数
  61. {
  62. ES = 0; //关串口中断
  63. TI = 0; //清零串口发送完成中断请求标志
  64. SBUF =ucSendData; //发送一个字节
  65. delay_short(400);//每个字节之间的延时,这里非常关键,也是最容易出错的地方。延时的大小请根据实际项目来调整
  66. TI = 0; //清零串口发送完成中断请求标志
  67. ES = 1; //允许串口中断
  68. }
  69. void T0_time(void) interrupt 1 //定时中断
  70. {
  71. TF0=0;//清除中断标志
  72. TR0=0; //关中断
  73. if(uiSendCnt
  74. {
  75. uiSendCnt++; //表面上这个数据不断累加,但是在串口中断里,每接收一个字节它都会被清零,除非这个中间没有串口数据过来
  76. ucSendLock=1; //开自锁标志
  77. }
  78. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  79. TL0=0x0b;
  80. TR0=1;//开中断
  81. }
  82. void usart_receive(void) interrupt 4 //串口接收数据中断
  83. {
  84. if(RI==1)
  85. {
  86. RI = 0;
  87. ++uiRcregTotal;
  88. if(uiRcregTotal>const_rc_size)//超过缓冲区
  89. {
  90. uiRcregTotal=const_rc_size;
  91. }
  92. ucRcregBuf[uiRcregTotal-1]=SBUF; //将串口接收到的数据缓存到接收缓冲区里
  93. uiSendCnt=0;//及时喂狗,虽然main函数那边不断在累加,但是只要串口的数据还没发送完毕,那么它永远也长不大,因为每个中断都被清零。
  94. }
  95. else//发送中断,及时把发送中断标志位清零
  96. {
  97. TI = 0;
  98. }
  99. }
  100. void delay_long(unsigned int uiDelayLong)
  101. {
  102. unsigned int i;
  103. unsigned int j;
  104. fo

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top