当前位置: 首页 > news >正文

应广单片机用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;

}

}

}

}

http://www.lryc.cn/news/20149.html

相关文章:

  • Android中使用GRPC简明教程
  • 【Linux】使用U盘自动化安装Linux(VMware虚拟机)
  • 内网渗透(五十七)之域控安全和跨域攻击-基于服务账户的非约束委派攻击
  • gitlab 安装到项目上传一篇解决
  • Verilog 逻辑与()、按位与()、逻辑或(||)、按位或(|)、等于(==)、全等(===)的区别
  • 剑指 Offer 22. 链表中倒数第k个节点
  • 数据结构预算法之买卖股票的最好时机(三)动态规划
  • 【数通网络交换基础梳理2】三层设备、网关、ARP表、VLAN、路由表及跨网段路由下一跳转发原理
  • Java-排序链表问题
  • c++之二叉树【进阶版】
  • 【数据库】 SQLServer
  • Linux 4.19 内核中 spinlock 概览
  • TensorFlow 1.x学习(系列二 :1):基本概念TensorFlow的基本介绍,图,会话,会话中的run(),placeholder(),常见的报错
  • javaEE 初阶 — 关于 IPv4、IPv6 协议、NAT(网络地址转换)、动态分配 IP 地址 的介绍
  • 《Qt 6 C++开发指南》简介
  • CleanMyMac是什么清理软件?及使用教程
  • Linux小黑板(9):共享内存
  • Detr源码解读(mmdetection)
  • 一个.Net Core开发的,撑起月6亿PV开源监控解决方案
  • C语言数据结构初阶(2)----顺序表
  • K8S常用命令速查手册
  • Linux系统下命令行安装MySQL5.6+详细步骤
  • 13.STM32超声波模块讲解与实战
  • 逆向之Windows PE结构
  • ACL是什么
  • 操作系统核心知识点整理--内存篇
  • 从零开始学习iftop流量监控(找出服务器耗费流量最多的ip和端口)
  • 第一篇博客------自我介绍篇
  • No suitable device found for this connection (device lo not available(网络突然出问题)
  • 【算法设计技巧】分治算法