第65节:大数据的除法运算
时间:11-22
来源:互联网
点击:
开场白:
直接用C语言的“/”运算符进行除法运算时,“被除数”,“ 除数”,“商”,这三个数据的最大范围是unsigned long 类型,也就是数据最大范围是4个字节,十进制的范围是0至4294967295。一旦超过了这个范围,则运算会出错。因此,当进行大数据除法运算时,我们要额外编程序,实现大数据的算法。其实这种算法并不难,就是我们在小学里学的四则运算算法。
我们先要弄清楚一个新的概念。不考虑小数点的情况下,数据有两种表现形式。一种是常用的变量形式,另外一种是BCD码数组形式。变量的最大范围有限,而BCD码数组的形式是无限的,正因为这个特点,所以我们可以进行大数据运算。
这一节要教大家一个知识点:
第一个:如何编写涉及到大数据除法运算的算法程序函数,同时也复习了指针的用途。
具体内容,请看源代码讲解。
(1)硬件平台:
基于朱兆祺51单片机学习板。
(2)实现功能:
波特率是:9600 。
通过电脑串口调试助手模拟上位机,往单片机发送组合BCD码的被除数和除数,单片机把组合BCD码的运算结果返回到上位机。被除数与除数的最大范围都是从0到9999,如果运算的商超过允许保存的最大位数范围或者除数为0,则返回EE EE EE报错。
往单片机发送的数据格式:EB 00 55 XX XX 0d0aYY YY 0d0a指令,其中EB 00 55是数据头,XX XX是被除数,是1到2个字节的组合BCD码。YY YY是除数,是1到2个字节的组合BCD码。0d 0a是固定的结束标志。
例如:
(a)9816 ÷ 8= 1227
上位机发送数据:eb 00 55 98 16 0d 0a 08 0d 0a
单片机返回:12 27
(b)9816 ÷ 0= 出错了,除数不能为0。
上位机发送数据:eb 00 55 98 16 0d 0a 00 0d 0a
单片机返回:EE EE EE
(3)源代码讲解如下:
直接用C语言的“/”运算符进行除法运算时,“被除数”,“ 除数”,“商”,这三个数据的最大范围是unsigned long 类型,也就是数据最大范围是4个字节,十进制的范围是0至4294967295。一旦超过了这个范围,则运算会出错。因此,当进行大数据除法运算时,我们要额外编程序,实现大数据的算法。其实这种算法并不难,就是我们在小学里学的四则运算算法。
我们先要弄清楚一个新的概念。不考虑小数点的情况下,数据有两种表现形式。一种是常用的变量形式,另外一种是BCD码数组形式。变量的最大范围有限,而BCD码数组的形式是无限的,正因为这个特点,所以我们可以进行大数据运算。
这一节要教大家一个知识点:
第一个:如何编写涉及到大数据除法运算的算法程序函数,同时也复习了指针的用途。
具体内容,请看源代码讲解。
(1)硬件平台:
基于朱兆祺51单片机学习板。
(2)实现功能:
波特率是:9600 。
通过电脑串口调试助手模拟上位机,往单片机发送组合BCD码的被除数和除数,单片机把组合BCD码的运算结果返回到上位机。被除数与除数的最大范围都是从0到9999,如果运算的商超过允许保存的最大位数范围或者除数为0,则返回EE EE EE报错。
往单片机发送的数据格式:EB 00 55 XX XX 0d0aYY YY 0d0a指令,其中EB 00 55是数据头,XX XX是被除数,是1到2个字节的组合BCD码。YY YY是除数,是1到2个字节的组合BCD码。0d 0a是固定的结束标志。
例如:
(a)9816 ÷ 8= 1227
上位机发送数据:eb 00 55 98 16 0d 0a 08 0d 0a
单片机返回:12 27
(b)9816 ÷ 0= 出错了,除数不能为0。
上位机发送数据:eb 00 55 98 16 0d 0a 00 0d 0a
单片机返回:EE EE EE
(3)源代码讲解如下:
- #include "REG52.H"
- /* 注释一:
- * 本系统中的除法运算,规定被除数和除数的最大范围是0至9999.
- * 由于STC89C52单片机的RAM只有256个,也就是说系统的变量数最大
- * 不能超过256个,如果超过了这个极限,编译器就会报错。由于51单片机RAM资源有限,
- * 因此规定除数的最大范围不能超过9999,如果这个算法移植到stm32或者PIC等RAM比较大
- * 的单片机上,那么就可以把这个运算位数设置得更加大一点。调整下面 BCD4_MAX的大小,
- * 可以调整运算的数据范围。
- */
- #defineBCD4_MAX 3//调整BCD4_MAX的大小,可以调整运算的数据范围。
- #defineBCD8_MAX (BCD4_MAX*2)//本系统中,规定的非组合BCD码能保存的最大字节数,一个字节包含1位有效运算数
- #define const_rc_size30//接收串口中断数据的缓冲区数组大小
- #define const_receive_time5//如果超过这个时间没有串口数据过来,就认为一串数据已经全部接收完,这个时间根据实际情况来调整大小
- #define uchar unsigned char //方便移植平台
- #define ulong unsigned long //方便移植平台
- //如果在VC的平台模拟此算法,则都定义成int类型,如下:
- //#define uchar int
- //#define ulong int
- void initial_myself(void);
- void initial_peripheral(void);
- void delay_long(unsigned int uiDelaylong);
- void delay_short(unsigned int uiDelayShort);
- void T0_time(void);//定时中断函数
- void usart_receive(void); //串口接收中断函数
- void usart_service(void);//串口服务程序,在main函数里
- void eusart_send(unsigned char ucSendData);
- void BCD4_to_BCD8(const unsigned char *p_ucBCD_bit4,unsigned char ucBCD4_cnt,unsigned char *p_ucBCD_bit8,unsigned char *p_ucBCD8_cnt);
- void BCD8_to_BCD4(const unsigned char *p_ucBCD_bit8,unsigned char ucBCD8_cnt,unsigned char *p_ucBCD_bit4,unsigned char *p_ucBCD4_cnt);
- void ClearAllData(uchar ucARRAY_MAX,uchar *destData);
- uchar GetDataLength(const uchar *destData,uchar ucARRAY_MAX);
- uchar AddData(const uchar *destData,const uchar *sourceData,uchar *resultData);//两个数相加
- uchar CmpData(const uchar *destData,const uchar *sourceData); //比较两个数的大小
- uchar SubData(const uchar *destData,const uchar *sourceData,uchar *resultData);//两个数相减
- void EnlargeData(uchar *destData,uchar enlarge_cnt); //数组向大索引值移位,移一位相当于放大10倍
- uchar MultData(const uchar *destData,const uchar *sourceData,uchar *resultData); //两个数相乘
- uchar DivLessTenData(const uchar *destData,const uchar *sourceData,uchar *resultData,uchar *remD
大数据除法运 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)