应广单片机用8位乘法器实现16位乘法运算

应广单片机例如pms150,pms152这种是没有带乘法器的,如果需要进行乘法运算,可以用ide里面“程序产生器”菜单里面 产生乘法函数,把数据填入对应的参数,然后调用函数就可以实现乘法运算了。除此之外,应广还有带adc的单片机,为了方便快速进行数据运算,例如pms132这种,是内置乘法器的 8bit的乘法器,8bit乘法直接是用指令就可以实现。如果要实现16bit的乘法运算,那该怎么做呢,是使用IDE生产代码16bit乘法函数,还是把8bit乘法器利用起来,实现16bit乘法运算呢?根据仿真测试,用8bit乘法器实现的16bit乘法运算所需的时间比调用ide生产的乘法函数更短。

不多说,上代码。

/****************系统时钟*********************/

word usTmrCnt;

/**************T16*************************/

DWORD usDat;

DWORD usDat1;

/*用ide生产的16*16bit运算*/

WORDmul_x2;

WORDmul_y2;

DWORDmul_t4;

voidWord_Mul_Word (void)

{//mul_t4[D]=mul_x2[W] * mul_y2[W]

mul_t4$3=0;

mul_t4$2=0;

BYTEcnt;

cnt=16;

do

{

mul_x2>>=1;

if (CF)

{

mul_t4+=(mul_y2 << 16);

}

mul_t4>>>=1;

} while (--cnt);

}

/*带乘法器比如132这种,可以利用8*8乘法器通过乘累加方式实现16*16运算

更加节省运算时间*/

//mul_x2[W] * mul_y2[W]=mul_t4[D];

void Word_Mul_Word1(void)

{

mov a,mul_x2$0;

mov mulop,a;

mov a,mul_y2$0;

mul

mov mul_t4$0 a;

mov a,mulrh;

mov mul_t4$1,a;

mov a,mul_x2$0;

mov mulop,a;

mov a,mul_y2$1;

mul

add mul_t4$1 a;

mov a,mulrh;

mov mul_t4$2,a;

mov a,0;

addc mul_t4$2 a;

mov a,mul_x2$1;

mov mulop,a;

mov a,mul_y2$0;

mul

add mul_t4$1 a;

mov a,mulrh;

addc mul_t4$2 a;

clear mul_t4$3;

mov a,0;

addc mul_t4$3 a;

mov a,mul_x2$1;

mov mulop,a;

mov a,mul_y2$1;

mul

add mul_t4$2 a;

mov a,mulrh;

addc mul_t4$3 a;

ret;

}

void TIME16_Init(void)

{

/* 使用IHRC,1分频,最大计数值是32768*/

$ T16M IHRC,/1,BIT15;

}

/*启动定时器*/

void ResetTmr16(void)

{

usTmrCnt=0;

/*设置初始值*/

STT16 usTmrCnt;

}

/*取得定时器值*/

void GetTmr16Dat(void)

{

/*取得计数值*/

LDT16 usTmrCnt;

}

/*相应于main函数*/

void FPPA0 (void)

{

/*系统时钟为 IHRC默认为16M,因此,IHRC/2=8M*/

.ADJUST_IC SYSCLK=IHRC/2;

word cnt;

cnt=0xffff;

/*初始*/

TIME16_Init();

usTmrCnt=0;

while (1)

{

/*启动定时器*/

ResetTmr16();

/*标准测试*/

.delay 1000;

GetTmr16Dat();

/*设置断点,查看周期数,标准应该是2000+x IHRC时钟周期*/

.delay 1;

while(cnt--)

{

/*启动定时器*/

ResetTmr16();

mul_x2=cnt;

mul_y2=0xffff-cnt;

/*调用ide生产的16bit乘法函数*/

Word_Mul_Word();

/*查看结果*/

usDat=mul_t4;

GetTmr16Dat();

/*设置断点,查看周期数,大概527 IHRC时钟周期*/

.delay 1;

/*启动定时器*/

ResetTmr16();

mul_x2=cnt;

mul_y2=0xffff-cnt;

/*只适合pms132,这类型的带乘法器的芯片*/

Word_Mul_Word1();

/*查看结果*/

usDat1=mul_t4;

GetTmr16Dat();

/*设置断点,查看周期数,大概119 IHRC时钟周期*/

.delay 1;

/*用于测试,运算结果是否有问题*/

if(usDat!=usDat1)

{

break;

}

}

}

}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值