51单片机的16位和8位的运算不准

  • 格式:doc
  • 大小:34.50 KB
  • 文档页数:3

51单片机的16位乘以8位乘法运算可能会出现问题:
例如2927 * 17 = 49759;
但是在51中2927 * 17 和2927 * 1.7 * 10的结果并不同,后者是对的。

/******************************************************************** * 文件名:A_SHUMA.c
* 创建人:zhongbaohua,2012年6月10日
天津工业大学电气工程与自动化学院
* 版本号:1.0
********************************************************************* **/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/****本地变量定义**************************************/
sbit duan = P2^2;
uchar code d_table[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x 71,0x00};
// 0, 1. 2, 3, 4, 5, 6, 7, 8, 9, uchar code w_table[4] = {0xfe,0xfd,0xfb,0xf7};
unsigned int disbuff[4] = {0};
unsigned long int diatance = 0;
/************本地变函数定声名**************************************/ void delay_ms(uint del);
void display(uchar w,uchar d);
void Display();
/************本地main函数******************************************/ void Main(void)
{
unsigned int i = 0;
duan = 1;
P0 = 0x00;
delay_ms(1);
duan = 0;
while(1)
{
diatance = 2927 * 17; //算出来是CM
disbuff[0] = diatance % 1000 / 100;
disbuff[1] = diatance % 1000 %100 / 10;
disbuff[2] = diatance % 1000 %100 % 10;
for(i=0; i<=300;i++)
{
Display();
}
diatance = 21927 * 1.7 * 10 ; //算出来是CM
disbuff[0] = diatance % 1000 / 100;
disbuff[1] = diatance % 100 / 10;
disbuff[2] = diatance % 10;
for(i=0; i<=300;i++)
{
Display();
}/**/
}
}
/******************************************************************** **
* 名称: delay_ms()
* 功能: 延时,延时时间为1ms * del
* 输入: del
* 输出: 无
********************************************************************* **/
void delay_ms(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<60; j++)
;
}
/****************************************************************** * 名称: void display(uchar w,uchar d)
* 功能: 数码管定位显示数值功能
* 输入: w 为位置;d 为数值;
* 输出: 无
******************************************************************/ void display(uchar w,uchar d)
{
P1=w_table[w];
duan=1;
P0=d_table[d];
duan = 0;
P0=0X00;//消影
}
/******************************************************************** **
* 名称: void Display()
* 功能: 数码管位现函数集合
* 输入: none
* 输出: none
*******************************************************************/ void Display()
{
display(0,disbuff[0]);
delay_ms(2);
display(1,disbuff[1]);
delay_ms(2);
display(2,disbuff[2]);
delay_ms(2);
}。