微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第62节:大数据的加法运算

第62节:大数据的加法运算

时间:11-22 来源:互联网 点击:
开场白:
直接用C语言的“+”运算符进行加法运算时,“被加数”,“加数”,“和”,这三个数据的最大范围是unsigned long 类型,也就是数据最大范围是4个字节,十进制的范围是0至4294967295。一旦超过了这个范围,则运算会出错。因此,当进行大数据加法运算时,我们要额外编程序,实现大数据的算法。其实这种算法并不难,就是我们在小学里学的四则运算算法。
我们先要弄清楚一个新的概念。不考虑小数点的情况下,数据有两种表现形式。一种是常用的变量形式,另外一种是上一节讲到的BCD码数组形式。变量的最大范围有限,而BCD码数组的形式是无限的,正因为这个特点,所以我们可以进行大数据运算。
这一节要教大家两个知识点:
第一个:如何通过用for循环语句改写上一节的组合BCD码跟非组合BCD码的转换函数。
第二个:如何编写涉及到大数据加法运算的算法程序函数,同时也复习了指针的用途。
第三个:如何在串口程序中通过关键字来截取所需要的数据。

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

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

(2)实现功能:
波特率是:9600 。
通过电脑串口调试助手模拟上位机,往单片机发送组合BCD码的被加数和加数。单片机把组合BCD码的运算结果返回到上位机。最大范围4位,从0到9999,如果超范围则返回EE EE EE报错。往单片机发送的数据格式:EB 00 55 XX XX 0d 0aYY YY0d 0a指令,其中EB 00 55是数据头,XX 是被加数,可以是1个字节,也可以是2个字节。YY是加数,可以是1个字节,也可以是2个字节。0d 0a是固定的结束标志。
例如:
(a)1234+5678=6912
上位机发送数据:eb 00 55 12 34 0d 0a 56 78 0d 0a
单片机返回:69 12

(b)9999+56=10055超过4位的9999,所以报错
上位机发送数据:eb 00 55 99 990d 0a 56 0d 0a
单片机返回:EE EE EE表示出错了

(3)源代码讲解如下:

  1. #include "REG52.H"
  2. /* 注释一:
  3. * 本系统中,规定最大运算位数是4位。
  4. * 由于STC89C52单片机的RAM只有256个,也就是说系统的变量数最大
  5. * 不能超过256个,如果超过了这个极限,编译器就会报错。如果这个算法
  6. * 移植到stm32或者PIC等RAM比较大的单片机上,那么就可以把这个运算位数
  7. * 设置得更加大一点。
  8. */
  9. #defineBCD4_MAX 2//本系统中,规定的组合BCD码最大字节数,一个字节包含2位,因此4位有效运算数
  10. #defineBCD8_MAX (BCD4_MAX*2)//本系统中,规定的非组合BCD码最大字节数,一个字节包含1位,因此4位有效运算数
  11. #define const_rc_size30//接收串口中断数据的缓冲区数组大小
  12. #define const_receive_time5//如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完,这个时间根据实际情况来调整大小
  13. #define uchar unsigned char //方便移植平台
  14. #define ulong unsigned long //方便移植平台
  15. //如果在VC的平台模拟此算法,则都定义成int类型,如下:
  16. //#define uchar int
  17. //#define ulong int
  18. void initial_myself(void);
  19. void initial_peripheral(void);
  20. void delay_long(unsigned int uiDelaylong);
  21. void delay_short(unsigned int uiDelayShort);
  22. void T0_time(void);//定时中断函数
  23. void usart_receive(void); //串口接收中断函数
  24. void usart_service(void);//串口服务程序,在main函数里
  25. void eusart_send(unsigned char ucSendData);
  26. void BCD4_to_BCD8(const unsigned char *p_ucBCD_bit4,unsigned char ucBCD4_cnt,unsigned char *p_ucBCD_bit8,unsigned char *p_ucBCD8_cnt);
  27. void BCD8_to_BCD4(const unsigned char *p_ucBCD_bit8,unsigned char ucBCD8_cnt,unsigned char *p_ucBCD_bit4,unsigned char *p_ucBCD4_cnt);
  28. void ClearAllData(uchar ucARRAY_MAX,uchar *destData);
  29. uchar GetDataLength(const uchar *destData,uchar ucARRAY_MAX);
  30. uchar AddData(const uchar *destData,const uchar *sourceData,uchar *resultData);
  31. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
  32. unsigned intuiSendCnt=0; //用来识别串口是否接收完一串数据的计时器
  33. unsigned char ucSendLock=1; //串口服务程序的自锁变量,每次接收完一串数据只处理一次
  34. unsigned intuiRcregTotal=0;//代表当前缓冲区已经接收了多少个数据
  35. unsigned char ucRcregBuf[const_rc_size]; //接收串口中断数据的缓冲区数组
  36. unsigned intuiRcMoveIndex=0;//用来解析数据协议的中间变量
  37. unsigned char ucDataBCD4_1[BCD4_MAX]; //接收到的第1个数组合BCD码数组形式这里是指被加数
  38. unsigned char ucData

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

网站地图

Top