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

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

时间:11-22 来源:互联网 点击:
第六十一节:组合BCD码非组合BCD码,以及数值三者之间的相互转换和关系。
开场白:
本来这一节打算讲大数据的加法运算的,但是考虑大数据运算的基础是非组合BCD码,所以多增加一节讲BCD码的内容。
计算机中的BCD码,经常使用的有两种格式,即组合BCD码,非组合BCD码。
组合BCD码,是将两位十进制数,存放在一个字节中,例如:十进制数51的存放格式是0101 0001。
非组合BCD码,是将一个字节的低四位编码表示十进制数的一位,而高4位都为0。例如:十进制数51的占用了两个字节的空间,存放格式为:00000101 00000001。
这一节要教大家两个知识点:
第一个:如何编写组合BCD码,非组合BCD码,以及数值三者之间的相互转换函数。
第二个:通过转换函数的编写,重温前面几节所讲到的指针用法。

具体内容,请看源代码讲解。

(1)硬件平台:
基于朱兆祺51单片机学习板

(2)实现功能:
波特率是:9600 。
通过电脑串口调试助手模拟上位机,往单片机发送EB 00 55 XX YY YY … YY YY指令,其中EB 00 55是数据头,XX 是指令类型。YY是具体的数据。
指令类型01代表发送的是数值,需要转成组合BCD码和非组合BCD码,并且返回上位机显示。
指令类型02代表发送的是组合BCD码,需要转成数值和非组合BCD码,并且返回上位机显示。
指令类型03代表发送的是非组合BCD码,需要转成数值和组合BCD码,并且返回上位机显示。

返回上位机的数据中,中间3个数据EE EE EE是分割线,为了方便观察,没实际意义。

例如:十进制的数据52013140,它的十六进制数据是03 19 A8 54。
(a)上位机发送数据:eb 00 55 01 03 19 a8 54
单片机返回:52 01 31 40 EE EE EE 05 02 00 01 03 01 04 00
(b)上位机发送组合BCD码:eb 00 55 02 52 01 31 40
单片机返回:03 19 A8 54 EE EE EE 05 02 00 01 03 01 04 00
(c)发送非组合BCD码:eb 00 55 03 05 02 00 01 03 01 04 00
单片机返回:03 19 A8 54 EE EE EE 52 01 31 40

(3)源代码讲解如下:

  1. #include "REG52.H"
  2. #define const_voice_short40 //蜂鸣器短叫的持续时间
  3. /* 注释一:
  4. * 注意,此处的const_rc_size是20,比之前章节的缓冲区稍微改大了一点。
  5. */
  6. #define const_rc_size20//接收串口中断数据的缓冲区数组大小
  7. #define const_receive_time5//如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完,这个时间根据实际情况来调整大小
  8. void initial_myself(void);
  9. void initial_peripheral(void);
  10. void delay_long(unsigned int uiDelaylong);
  11. void delay_short(unsigned int uiDelayShort);
  12. void T0_time(void);//定时中断函数
  13. void usart_receive(void); //串口接收中断函数
  14. void usart_service(void);//串口服务程序,在main函数里
  15. void eusart_send(unsigned char ucSendData);
  16. void number_to_BCD4(const unsigned char *p_ucNumber,unsigned char *p_ucBCD_bit4);//把数值转换成组合BCD码
  17. void number_to_BCD8(const unsigned char *p_ucNumber,unsigned char *p_ucBCD_bit8);//把数值转换成非组合BCD码
  18. void BCD4_to_number(const unsigned char *p_ucBCD_bit4,unsigned char *p_ucNumber); //组合BCD码转成数值
  19. void BCD4_to_BCD8(const unsigned char *p_ucBCD_bit4,unsigned char *p_ucBCD_bit8); //组合BCD码转成非组合BCD码
  20. void BCD8_to_number(const unsigned char *p_ucBCD_bit8,unsigned char *p_ucNumber); //非组合BCD码转成数值
  21. void BCD8_to_BCD4(const unsigned char *p_ucBCD_bit8,unsigned char *p_ucBCD_bit4); //非组合BCD码转成组合BCD码
  22. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
  23. unsigned intuiSendCnt=0; //用来识别串口是否接收完一串数据的计时器
  24. unsigned char ucSendLock=1; //串口服务程序的自锁变量,每次接收完一串数据只处理一次
  25. unsigned intuiRcregTotal=0;//代表当前缓冲区已经接收了多少个数据
  26. unsigned char ucRcregBuf[const_rc_size]; //接收串口中断数据的缓冲区数组
  27. unsigned intuiRcMoveIndex=0;//用来解析数据协议的中间变量
  28. /* 注释二:
  29. * 注意,本程序规定数值的最大范围是0至99999999
  30. * 数组中的数据。高位在数组下标大的方向,低位在数组下标小的方向。
  31. */
  32. unsigned char ucBufferNumber[4]; //数值,用4个字节表示long类型的数值
  33. unsigned char ucBufferBCB_bit4[4]; //组合BCD码
  34. unsigned char ucBufferBCB_bit8[8]; //非组合BCD码
  35. void main()
  36. {
  37. initial_myself();
  38. delay_long(100);
  39. initial_peripheral();
  40. while(1)
  41. {
  42. usart_

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

网站地图

Top