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

第65节:大数据的除法运算

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

  1. gBuf[uiRcMoveIndex+3+i-1-k]; //注意,接收到的数组数据与实际存储的数组数据的下标方向是相反的
  2. }
  3. break; //截取数据完成。直接跳出截取数据的while(i<(BCD8_MAX+4))循环
  4. }
  5. else
  6. {
  7. i++;
  8. ucDataBCD4_cnt_2++;//统计第2个有效数据的长度
  9. }
  10. }
  11. }
  12. //注意ucDataBCD8_cnt_1和ucDataBCD8_cnt_2要带地址符号&传址进去
  13. BCD4_to_BCD8(ucDataBCD4_1,ucDataBCD4_cnt_1,ucDataBCD8_1,&ucDataBCD8_cnt_1); //把接收到的组合BCD码转换成非组合BCD码第1个数
  14. BCD4_to_BCD8(ucDataBCD4_2,ucDataBCD4_cnt_2,ucDataBCD8_2,&ucDataBCD8_cnt_2); //把接收到的组合BCD码转换成非组合BCD码第2个数
  15. ClearAllData(BCD8_MAX,ucDataBCD8_3);//清零第3个参与运算的数据,用来接收运行的结果
  16. ucResultFlag=Div(ucDataBCD8_1,ucDataBCD8_2,ucDataBCD8_3); //相除运算,结果放在ucDataBCD8_3数组里
  17. if(ucResultFlag==11) //表示运算结果没有超范围
  18. {
  19. ucDataBCD8_cnt_3=GetDataLength(ucDataBCD8_3,BCD8_MAX);//获取运算结果的有效字节数
  20. if(ucDataBCD8_cnt_3==0) //如果1个有效位数都没有,表示数组所有的数据都是0,这个时候的有效位数应该人为的默认是1位数据,表示一个0
  21. {
  22. ucDataBCD8_cnt_3=1;
  23. }
  24. BCD8_to_BCD4(ucDataBCD8_3,ucDataBCD8_cnt_3,ucDataBCD4_3,&ucDataBCD4_cnt_3); //把非组合BCD码转成组合BCD码。注意,&ucDataBCD4_cnt_3带地址符号&
  25. for(k=0;k
  26. {
  27. eusart_send(ucDataBCD4_3[ucDataBCD4_cnt_3-1-k]); //往上位机发送一个字节的函数
  28. }
  29. }
  30. else //运算结果超范围,返回EE EE EE
  31. {
  32. eusart_send(0xee); //往上位机发送一个字节的函数
  33. eusart_send(0xee); //往上位机发送一个字节的函数
  34. eusart_send(0xee); //往上位机发送一个字节的函数
  35. }
  36. break; //退出循环
  37. }
  38. uiRcMoveIndex++; //因为是判断数据头,游标向着数组最尾端的方向移动
  39. }
  40. ucRcregBuf[0]=0; //把数据头清零,方便下次接收判断新数据
  41. ucRcregBuf[1]=0;
  42. ucRcregBuf[2]=0;
  43. uiRcregTotal=0;//清空缓冲的下标,方便下次重新从0下标开始接受新数据
  44. }
  45. }
  46. void eusart_send(unsigned char ucSendData) //往上位机发送一个字节的函数
  47. {
  48. ES = 0; //关串口中断
  49. TI = 0; //清零串口发送完成中断请求标志
  50. SBUF =ucSendData; //发送一个字节
  51. delay_short(400);//每个字节之间的延时,这里非常关键,也是最容易出错的地方。延时的大小请根据实际项目来调整
  52. TI = 0; //清零串口发送完成中断请求标志
  53. ES = 1; //允许串口中断
  54. }
  55. void T0_time(void) interrupt 1 //定时中断
  56. {
  57. TF0=0;//清除中断标志
  58. TR0=0; //关中断
  59. if(uiSendCnt
  60. {
  61. uiSendCnt++; //表面上这个数据不断累加,但是在串口中断里,每接收一个字节它都会被清零,除非这个中间没有串口数据过来
  62. ucSendLock=1; //开自锁标志
  63. }
  64. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  65. TL0=0x0b;
  66. TR0=1;//开中断
  67. }
  68. void usart_receive(void) interrupt 4 //串口接收数据中断
  69. {
  70. if(RI==1)
  71. {
  72. RI = 0;
  73. ++uiRcregTotal;
  74. if(uiRcregTotal>const_rc_size)//超过缓冲区
  75. {
  76. uiRcregTotal=const_rc_size;
  77. }
  78. ucRcregBuf[uiRcregTotal-1]=SBUF; //将串口接收到的数据缓存到接收缓冲区里
  79. uiSendCnt=0;//及时喂狗,虽然main函数那边不断在累加,但是只要串口的数据还没发送完毕,那么它永远也长不大,因为每个中断都被清零。
  80. }
  81. else//发送中断,及时把发送中断标志位清零
  82. {
  83. TI = 0;
  84. }
  85. }
  86. void delay_long(unsigned int uiDelayLong)
  87. {
  88. unsigned int i;
  89. unsigned int j;
  90. for(i=0;i
  91. {
  92. for(j=0;j<500;j++)//内嵌循环的空指令数量
  93. {
  94. ; //一个分号相当于执行一条空语句
  95. }
  96. }
  97. }
  98. void delay_short(unsigned int uiDelayShort)
  99. {
  100. unsigned int i;
  101. for(i=0;i
  102. {
  103. ; //一个分号相当于执行一条空语句
  104. }
  105. }
  106. void initial_myself(void)//第一区 初始化单片机
  107. {
  108. beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
  109. //配置定时器
  110. TMOD=0x01;//设置定时器0为工作方式1
  111. TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
  112. TL0=0x0b;
  113. //配置串口
  114. SCON=0x50;
  115. TMOD=0X21;
  116. TH1=TL1=-(11059200L/12/32/9600);//这段配置代码具体是什么意思

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

网站地图

Top