16位二进制PIC除法子程序
PIC中档单片机的无符号长整型数除以无符号字符型的除法程序
rlf _lc_div+2,f
rlf _lc_div+3,f
rlf _lc_div+4,f
rlf _lc_div+5,f
rlf _lc_div+6,f
movf _lc_div+7,w//用TMP的低位和除数比较,结果先放在W中
subwf _lc_div+5,w
btfsc 0x3,0;//查看借位标志,有就跳。这里要注意,因为减法的进位标志是反的,所以为0就跳
#asm//使用汇编以提高效率
lcdiv0:
decfsz lcdiv@i,f//这句相当于while(--i)
goto lcdiv1
return
lcdiv1:
bcf 0x3,0//清空C寄存器
rlf _lc_div,f//把共用体的前7字节左移1位,目的是把被除数的最高位移到TMP中,顺便把商也左移
{
volatile unsigned char i;//循环次数,如果不加volatile关键字则会被编译器优化掉,造成后边的变量寻址找不到,导致编译失败
lc_div.sj.tmp=0;//变量初始化,主要是防止上一次计算的数据影响本次计算
i=33;//共循环32次,12F683有DECFSZ指令,所以赋值33
unsigned int tmp; //2字节,临时变量
unsigned char cs; //1字节,除数
}sj; //数据,在计算前使用,只用填写被除数BCS(无符号长整型)和除数CS(无符号字符型)
struct
{
unsigned long s;
unsigned char ;
DSP实验报告五:汇编语言程序设计(1)——定点数除法实验
实验五:汇编语言程序设计(1)——定点数除法实验一、实验目的:1.熟悉 C54x 指令系统,掌握常用汇编指令,学习设计程序和算法的技巧。
2.学习用减法和移位指令实现除法运算。
二、实验仪器:安装 CCS3.1(CodeComposerStudioV3.1)的 PC 机。
三、实验内容:编写一个 16 位的定点除法子程序。
四、实验步骤:1.以Simulator的方式启动CCSv3.1。
2.在D:\Lab05_Divisio建立工程,工程名为“div”。
3.新建div.asm,编辑内容如下:4.新建div.cmd,编辑内容如下:5.汇编/编译与连接执行Project→Rebuild All 编译链接.如果未对汇编语言修改编译连接环境(参见实验 2),编译时将出现如下错误:warning:entry point symbol _c_int0 undefined出错原因:缺省时CCS设置项目程序为 C 语言编译,因此当我们编译汇编程序时,要对项目作适当配置。
发现错误要及时修改,修改方法与实验 2 相似:执行Project→Build Options…打开编译选项;在linker 属性页上单击,把Autoinit Model栏选择为 No Autoinitialization;按“确定”保存对配置的修改。
6. 装载程序准备运行调试(1)执行 File→Load Program 装载程序,装载完程序后,CCS把指针指向程序区 0000 处。
为了执行我们的程序代码,需要修改 DSP 的 PC 值;执行ViewÆCPU RegistersÆCPU Registers 打开寄存器窗口;双击窗口中的 PC 标号,CC 弹出修改对话框供修改寄存器;在对话框中输入”start“,程序将处于我们的程序入口点上。
(2)在div.asm窗口中NUMERA变量名上双击鼠标左键,再单击鼠标右键,选择“Add to Watch Window”,在观察窗口中出现 NUMERA 变量,请将窗口中变量名(Name)由“NUMERA”改成“(int*)NUMERA”;“Radix”由“hex”改成“dec”,结果如下:(3)重复(1)的操作,加入 DENOM、QUOT 和 ARIT 四个变量。
16位pic-dspic选型与开发指南
图形显示解决方案
图形显示在用户界面应用中日益流行。使用带集成图形控制器 和硬件加速功能的PIC24F“DA”系列,可以简便地为应用添 加图形显示功能。借助Microchip免费的图形库和开发工具, 您可以快速将图形显示功能集成到采用单个单片机的应用中。 欲了解更多信息,请访问/graphics。
集成DSP
■■ MCU的外观 ■■ 单周期16 x 16 MAC ■■ 40位累加器 ■■ 双操作数取 ■■ 饱和和舍入模式 ■■ 免费库和低成本滤波器■
设计工具
创新的外设
■■ 电机控制外设 ■■ SMPS外设 ■■ 图形控制器 ■■ 用于mTouch™技术的CTMU ■■ USB设备/嵌入式主机/OTG ■■ CAN ■■ 外设触发信号发生器 ■■ 智能模拟
PIC24E:最高性能16位MCU PIC24E器件提供最高70 MIPS性能,以及大容量存储器和 多种封装选项的组合。它们还在小型封装(5 x 5 mm)中包 含大容量闪存。内置外设包括高性能12位ADC,以及通用 和电机控制16位PWM。通信外设包括最多2个CAN模块、■ 4个UART(支持IrDA)、4个SPI、2个I2C和USB设备/嵌入 式主机/OTG。高性能16通道直接存储器访问(DMA)模块 可提供更好的数据处理能力,从而优化CPU吞吐率。提供通 过AEC-Q100认证的扩展级(125°C)和高温(150°C)器 件选择,适用于工业和汽车应用。
节能选项
■■ 超低功耗技术 ■■ 深度休眠电流低至10 nA ■■ 降低速度或禁止CPU的选项 ■■ 应用程序软件可以更改时钟
速度
■■ Vbat后备电池
小型封装
■■ 封装尺寸最小为5 x 5 mm ■■ 带128 KB闪存的16位MCU,
单片机除法指令
单片机是一种微型计算机,它集成了处理器核心、内存和可编程输入输出端口在一个芯片上。
在单片机编程中,除法指令是用于执行两个数相除的算术操作。
不同的单片机架构可能有不同的除法指令集,但大多数都提供了基本的整数除法功能。
以下是一些常见的单片机架构及其对应的除法指令:1.8051单片机: 8051单片机使用8位微控制器,其指令集中包含了除法指令。
例如,DIV AB指令用于将累加器A中的值除以寄存器B中的值,商存放回累加器A,余数存放在累加器B。
2.PIC单片机:在PIC单片机(如PIC16系列)中,除法操作通常通过库函数来实现,而不是直接的硬件指令。
例如,可以使用div函数来执行除法操作。
3.ARM单片机: ARM架构的单片机(如基于Cortex-M系列)提供了更为复杂的除法指令。
例如,SDiv指令用于有符号整数除法,而UDiv 用于无符号整数除法。
这些指令可以处理32位或64位的操作数。
4.AVR单片机: AVR单片机(如Atmega系列)使用ATmega指令集,其中包括DIV指令,用于无符号整数除法。
这个指令将寄存器r0和r1的内容除以r24和r25的内容,结果存放回r0和r1。
5.MSP430单片机: MSP430单片机使用的是MSP430指令集,其中包括16位和32位的除法指令。
例如,div.w #num指令用于将工作寄存器W的内容除以立即数num,结果存放回工作寄存器W。
在使用除法指令时,需要注意以下几点:•数据大小:确保操作数的大小与指令匹配。
例如,如果指令是为8位操作数设计的,那么确保你的数据不会溢出8位的范围。
•除数为零:在执行除法操作前,检查除数是否为零,以避免运行时错误。
•符号:如果你的单片机支持有符号除法,确保正确处理正负号。
•精度:根据需要选择合适的数据类型和精度。
在某些情况下,可能需要使用浮点除法。
单片机的除法指令是编程中的基本操作之一,它们使得单片机能够进行各种数学计算和数据处理任务。
PIC指令集
睡眠指令
省电状态清0超时位置1,看门狗、预分 频清0,振荡器无输出
SLEEP
空操作指令
不做任何操作
NOP
MOVF FSR,0 FSR=0x1A时执行后W=0x1A
W寄存器传送指令
把W寄存器中的值传送到目标寄存器f 中
MOVWF OPTION ;OPTION=0xFF,W=0xE5时执行后 OPTION=0xE5,W=0xE5
寄存器加1,为零 f寄存器中值加1,结果存于目标寄存器,结果为 HERE INCFSZ CNT,1;GOTO LOOP;CONTINUE;PC=HERER执行后,
时跳指令
1执行下一条指令,结果为0忽略并用NOP代替. CNT=CNT减1,当CNT=0,PC=CONTINUE,当CNT≠0时PC=HERE减1
带进位左移指令
C位放在f值的MSB之前当作9位,然后每个位向 RLF REG1,0;REG1=1110 0110,C=0时执行后 左移,C位移到0,结果存于目标寄储器 REG1=1110 0110,W=11001100,C=1
W寄存器中的值和f寄存器中的值相 加,结果存于目标寄存器
ADDWF FSR,0 ;W中的值加FSR的中的值
寄存器减法指令
f寄存器中的值减去W寄存器中的值, SUBWF REG1,1;REG1减去W中的值(结果为正C=1、Z=0;结
运算存于目标寄存中
果为零C=1,Z=0;结果为负时C=0、Z=0
寄存器加1指令
时跳指令
1执行下一条指令,结果为0忽略并用NOP代替. CNT=CNT加1,当CNT=0,PC=CONTINUE,当CNT≠0时PC=HERE加1
寄存器减1,为零 f寄存器中值减1,结果存于目标寄存器,结果为 HERE DECFSZ CNT,1;GOTO LOOP;CONTINUE;PC=HERER执行后,
51单片机如何实现16位二进制除以8位二进制数
51单片机如何实现16位二进制除以8位二进制数在51单片机中实现16位二进制数除以8位二进制数,需要使用软件算法来模拟除法运算。
下面将介绍一种常见的算法,即软件实现的二进制长除法。
1. 初始化数据:设置一个16位的被除数(dividend)和一个8位的除数(divisor),以及一个16位的商(quotient)和一个8位的余数(remainder),初值均为0。
将被除数初始化为要进行除法运算的16位二进制数。
2.进行除法运算:-将被除数依次左移1位,将商的对应符号位设置为左移的次数,直到高位与除数相同或者高位比除数小为止。
这一步是为了找到最高位与除数相等或小于的位置。
-如果此时被除数小于除数,则被除数右移1位,并将商右移1位;反之,被除数减去除数,并将商对应位置1-重复上述过程直到商的最低位左边都处理完毕(共8位)。
-最终16位的商即为运算结果的高8位,余数为运算结果的低8位。
3.输出结果:将商和余数保存到指定的内存地址或寄存器中,即可完成除法运算过程。
需要注意的是,当除数为0时,应该进行异常处理。
接下来提供一段简化的C语言代码实例,以帮助理解:```c#include <stdio.h>unsigned int quotient = 0; // 商unsigned char remainder = 0; // 余数void binaryDivide(unsigned int dividend, unsigned char divisor)for (int i = 0; i < 16; i++)if ((dividend & 0x8000) != 0) { // 当被除数最高位为1dividend = (dividend << 1) & 0xFFFF; // 左移1位后,最高位清零quotient = (quotient << 1) , 0x01; // 商左移1位后,最低位置1if (dividend >= divisor)dividend -= divisor;} elsequotient &= 0xFFFE; // 商最低位置0}} else { // 当被除数最高位为0dividend = (dividend << 1) & 0xFFFF; // 左移1位后,最高位清零quotient = quotient << 1; // 商左移1位if (dividend >= divisor)dividend -= divisor;quotient ,= 0x01; // 商最低位置1}}}remainder = dividend & 0x00FF; // 取低8位为余数int maibinaryDivide(dividend, divisor);printf("Quotient: %04X\n", quotient);printf("Remainder: %02X\n", remainder);return 0;```执行以上代码,输出结果为:```Quotient: 00AARemainder: 24```以上就是如何在51单片机中实现16位二进制数除以8位二进制数的简单介绍和示例。
单片机加减乘除运算代码二进制
单片机加减乘除运算代码二进制随着信息技术的不断发展,单片机技术在各个领域的应用越来越广泛。
单片机是一种集成了微处理器、内存、定时、输入/输出接口电路等功能于一体的微型计算机系统。
在很多实际的应用中,单片机需要进行加减乘除运算,而这些运算是以二进制形式进行的。
本文将就单片机的加减乘除运算代码以及二进制表示进行详细的讨论。
一、单片机加法运算代码二进制在单片机中,加法运算可以通过将两个二进制数进行逐位相加来实现。
具体的代码如下所示:```c#include <stdio.h>int m本人n() {unsigned int a = 60; // 二进制表示为 xxxunsigned int b = 13; // 二进制表示为 xxxunsigned int result = 0;// 逐位相加while (b != 0) {result = a ^ b; // 按位异或操作得到无进位的相加结果b = (a b) << 1; // 按位与操作后左移一位得到进位a = result;}printf("加法运算的结果为:d\n", result); // 输出结果return 0;}```二、单片机减法运算代码二进制单片机的减法运算可以通过将被减数和减数进行逐位相减来实现。
具体的代码如下所示:```c#include <stdio.h>int m本人n() {unsigned int a = 60; // 二进制表示为 xxxunsigned int b = 13; // 二进制表示为 xxxunsigned int result = 0;b = ~b + 1; // 将减数取反加一,得到其补码形式// 逐位相减while (b != 0) {result = a ^ b; // 按位异或操作得到无借位的相减结果b = (a b) << 1; // 按位与操作后左移一位得到借位a = result;}printf("减法运算的结果为:d\n", result); // 输出结果return 0;}```三、单片机乘法运算代码二进制单片机的乘法运算可以通过将被乘数和乘数进行逐位相乘并累加得到结果。
【图文】二进制、十六进制、十进制在PLC编程中的应用,学PLC必备~
【图文】二进制、十六进制、十进制在PLC编程中的应用,学PLC必备~PLC也是一台微电脑,许多功能指令离不开进制转换,同时也是为了增加程序的可读性,想要对PLC进行编程,那么必须得清楚数制的设置以及转化和对应的符号。
当然,人们输入计算机的十进制被转换成二进制进行计算,计算后的结果又由二进制转换成十进制,这都由操作系统自动完成,并不需要人们手工去做。
人们通常采用的数制有十进制二进制、八进制和十六进制。
常用进制对应表常用进制使用场合二进制只有0 和1 两个符号,按照逢二进一的规则运算。
0和1用来表示开关量(或称数字量)的两种不同状态,如触点的断开和接通,线圈的得电和失电等。
所有数据的运算、存储都是采用二进制进行西门子PLC上的输入输出编号是采用八进制方式命名MODBUS-RTU通信数据发送与接收是采用了十六进制某变频器的参数地址以十六进制分配进制之间的相互转换方法:二进制数从低位到高位(即从右往左)计算,第0位的权值是2的0次方,第1位的权值是2的1次方,第2位的权值是2的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了!方法:将二进制数从最低位开始(从右到左),以4位二进制数为一组进行分组,最左边不足4位的补零。
然后对每组分别运用“8421”法则快速运算。
方法:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。
方法:对于每一位十六进制数,分别运用“8421”法则快速运算,逐位展开成4位二进制数,不足四位的补零,最后最左边的零可省略。
方法:要从右到左用二进制的每个数去乘以16的相应次方,然后这些数字相加就是了。
来源:网络。
单片机16位除法子程序 bin_div_16
undiv16:
call unbin_div_16a
mov a,com1
or a,com2
mov com3,a
sbnz com3,0
jmp disdiv16
mov a,com1
and a,com2
mov com3,a
sbz com3,0
mov a,00h
mov to0,a
mov to1,a
mov to2,a
mov to3,a
ret
init_data2:
mov a,099h
mov data0,a
mov a,099h
or a,com2
mov com3,a
sbnz com3,0
jmp disdiv16b
mov a,com1
and a,com2
mov com3,a
sbz com3,0
jmp disdiv16b
not to0
not to1
not to2
jmp disdiv16
not to0
not to1
not to2
mov a,01h
add to0,a
clra
sbz STATUS,c
mov a,01h
add to1,a
clra
sbz STATUS,c
add to2,a
dloop:
bclr STATUS,c
slc data0
slc data1
slc to2
slc to3
mov a,data5 ;ゑ蔼よ猭,ゑ耕蔼,ノㄒ.
pic单片机数学运算
pic单片机数学运算
PIC单片机是一种常见的微控制器,常用于嵌入式系统中。
在PIC单片机中进行数学运算通常涉及到整数运算和浮点数运算两种
情况。
对于整数运算,PIC单片机通常使用移位运算、加法、减法、
乘法和除法等基本运算来进行数学运算。
移位运算可以实现乘法和
除法的快速运算,加法和减法操作可以直接使用单片机的加法器和
减法器来完成。
对于大数乘法和除法运算,通常需要使用软件算法
来实现,因为PIC单片机的位宽有限,需要对数据进行分解和处理。
对于浮点数运算,PIC单片机通常需要借助软件库来实现,因
为PIC单片机本身并不直接支持浮点数运算。
软件库中通常包含了
浮点数的加减乘除、开方、对数、指数等数学函数,可以帮助程序
员在PIC单片机中进行复杂的浮点数运算。
除了基本的数学运算外,PIC单片机还可以通过外部扩展模块
来实现更复杂的数学运算,比如使用外部的数学协处理器或者FPGA
来加速数学运算的处理速度。
总的来说,PIC单片机可以进行基本的整数运算和借助软件库实现浮点数运算,同时也可以通过外部扩展模块来实现更复杂的数学运算。
在实际应用中,需要根据具体的需求和PIC单片机的性能来选择合适的数学运算方法和工具。
PIC单片机汇编运算子程序
;清进位位 ;ACCD 右移 ;判断是否需要相加 ;加乘数至 ACCB,见加法程序 ;清进位位 ;右移部分乘积
;乘法完成否? ;否,继续求乘积 ;是,确定乘积的符号 ;为正,乘法结束 ;为负,乘积取补
NEG_B
DECF COMF BTFSC DECF COMF
;
OVER SETUP
RETURN MOVLW MOVWF MOVF MOVWF MOVF MOVWF CLRF CLRF RETURN .15 TEMP ACCBHI,0 ACCDHI ACCBLO,0 ACCDLO ACCBHI ACCBLO
GOTO CALL CHEK_A BTFSC CALL RETURN
LIST INCLUDE ACCALO ACCAHI ACCBLO ACCBHI ACCCLO ACCCHI ACCDLO ACCDHI TEMP SIGN ORG START GOTO ORG D_mpy CALL CALL INCF CLRF CLRF p=16f877 p16f877.inc EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU 0X0000 MAIN 0X0100 S_SIGN SETUP TEMP ACCCHI ACCCLO ;清 ACCC ;求取乘积的符号,并对负数取补 ;调用子程序,将 ACCB 的值送 ACCD 20 21 23 24 26 27 28 29 2A 2B ;存放乘数低 8 位 ;存放乘数高 8 位 ;存放被乘数低 8 位和乘积第 16~23 位 ;存放被乘数高 8 位和乘积第 24~31 位 ;存放乘积低 8 位 ;存放乘积高 8 位 ;临时寄存器 ;临时寄存器 ;临时寄存器 ;存放乘积的符号
; * * *1 6 × 1 6 位 乘 法 子 程 序 , 入 口 地 址 A C C B × A C C A , 出 口 地 址 A C C B 和 A C C C * * *
16位二进制数转换为十进制数(BCD码)的可用算法
16位⼆进制数转换为⼗进制数(BCD码)的可⽤算法分析将16位⼆进制数转换为⼗进制数(BCD码)的可⽤算法------*****算法⼀:加3移位法(移位指令)"⼆进制数调整BCD码的⽅法是将⼆进制码左移16次,每次移位后都检查低四位LSD+3是否⼤于7,如是则加3,否则不加,⾼4位MSD作同样处理"⼀、为什么左移16次原寄存器是存⼆进制数的,新寄存器是存⼗进制数的,当然要左移16次,把数据全部移进去。
但这⾥要注意两件事,第⼀,如果只安排⼀个字节作⼗进制寄存器,原数据要⼩于64H(即100)。
第⼆,由于新寄存器是⼗进制的,要随时调整。
⼆、检查半字节+3 是否⼤于7,是,则+3在51 系列⾥有⼗进制调节指令(半字节⼤于9,则加6,应该不难理解),PIC ⾥没有,只好采取变通的⽅法。
检查半字节+3 是否⼤于7,也就是检查半字节是否⼤于4。
因为,如果⼤于4(⽐如5、6),下⼀步左移就要溢出了,所以加3,等于左移后的加6,起到⼗进制调节的作⽤。
那为什么要绕个圈⼦去检测半字节+3 是否⼤于7 呢?这样程序编起来会简练⼀些。
假如有⼀个⼆进制数511,我把他转511的⼗进制数1 1111 1111 原数1 0000 0001 ;左移⼀次2 0000 0011 ; 左移⼆次3 0000 0111 ;左移三次,检查低四位+3>7?3.1 0000 1010 ;⼤于7,加3进⾏调整4 0001 0101 ;左移四次, 检查低四位+3>7?4.1 0001 1000 ;⼤于7,加3进⾏调整5 0011 0001 ;左移五次6 0110 0011 ;左移六次,检查⾼四位+3>7?6.1 1001 0011 ;⼤于7,加3进⾏调整7 1 0010 0111 ;左移七次,检查低四位+3>7?7.1 1 0010 1010 ;⼤于7,加3进⾏调整8 10 0101 0101 ;左移⼋次,检查⾼低四位+3>7?8.1 10 1000 1000 ;⼤于7,加3进⾏调整9 101 0001 0001 ;左移九次(得到BCD码511)算法⼆:除法指令unsigned int ui;//(16位⽆符号⼆进制数)?unsigned char uc[5];//(BCD码表⽰的5位⼗进制数)uc[4]=(ui/10000)%10;uc[3]=(ui/1000)%10;uc[2]=(ui/100)%10;uc[1]=(ui/10)%10;uc[0]=ui%10;算法三:减法+循环指令?如例4-22:。
PIC单片机运算子程序(2)
PIC单片机运算子程序(2)4.2 3字节浮点数转换为定点整数子程序的转换结果将采用补码表示。
其转换数值范围:-32768~32767,入口条件和出口条件如下:入口条件:ACCBHI、ACCBLO、EXPB出口条件:ACCBHI、ACCBLO以下为子程序的清单。
由于程序所需调用的子程序和所需通用寄存器单元地址和定点数转换为浮点数子程序相同,在此省略。
使用时,将前面介绍的子程序拷入此处即可。
FtoD CLRF SIGN ;清结果符号寄存器MOVF ACCBHI,0BTFSS ACCBHI,7 ;被转换数是否为负?GOTO D1BSF SIGN,7 ;是,SIGN.7置1CALL NEG_B ;被转换数取补D1 BTFSS EXPB,7 ;被转换数为正,再判阶码为负否?GOTO D2CLRF ACCBHI ;为负,被转换数小于1,无法用定点数表示CLRF ACCBLORETLW 0D2 MOVLW .16 ;被转换数阶码减16(十进制数)SUBWF EXPB,0BTFSS STATUS,C ;阶码小于16?GOTO D3MOVLW 0XFF ;阶码大于等于16,置ACCB为最大,返回MOVWF ACCBHIMOVWF ACCBLORETLW 01D3 CALL FTOW3 ;调用子程序将浮点数转换为定点数BTFSC SIGN,7 ;定点数为负?CALL NEG_B ;是,取补RETLW 0 ;否,返回;**************************************** FTOW3 MOVLW .15 ;EXPB=15(十进制数)?SUBWF EXPB,0BTFSC STATUS,ZRETLW 0 ;是,返回BCF STATUS,C ;否,ACCB继续右移,EXPB加1 RRF ACCBHIRRF ACCBLOINCF EXPBGOTO FTOW3 ;重新判断EXPB=15?【校验举例1】 19531(十进制)化为十六进制数:4C4B0FH结果:4C4BH【校验举例2】 2622(十进制)化为十六进制数:51F00CH结果:0A3EH【例程】MAIN MOVLW 0X4B ;被转换数4C4BH送ACCB MOVWF ACCBLOMOVLW 0X4CMOVWF ACCBHIMOVLW 0X0FMOVWF EXPBCALL FtoD ;调用定点数至浮点数转换子程序END5 码制转换程序设计5.1 双字节定点数至5位BCD码转换程序入口条件:ACCBHI、ACCBLO出口条件:ACCCHI低半字节、ACCCLO、ACCDHI 以下为双字节定点数至5位BCD码转换程序清单。
汇编16位除法
汇编十六位除法---移位相减法16bit/8bit:DividendM:DividendL / DivisorL = ResultM : ResultL …… RemainderL被除数 / 除数 = 商……余数移位相减法步骤:(试用 0xF666 / 0x16 ),总共要相除17步每一步都先将被除数左移1bit,再带进位左移余数,如果余数小于被除数,则直接进行下一步,左移被除数;否则将标志位置一,开始左移被除数。
直到完成17 被除数余数左移1bit 余数–除数开始: 1111 0110 0110 0110 0000 000017: 1110 1100 1100 1100 0000 0001 1110 1011(相减= 加上补数再加1)16: 1101 1001 1001 1000 0000 0011 1110 110115: 1011 0011 0011 0000 0000 0111 1111 000114: 0110 0110 0110 0000 0000 1111 1111 100113: 1100 1100 1100 0000 0001 1110 0000 1000(余数大于除数,标志位置一并且把这里的差值作为余数)12: 1001 1001 1000 0001 0001 0001 1111 101111: 0011 0011 0000 0010 0010 0011 0000 1101(余数大于除数,标志位置一并且把这里的差值作为余数)10: 0110 0110 0000 0101 0001 1010 0000 0100(余数大于除数,标志位置一并且把这里的差值作为余数)9:1100 1100 0000 1011 0000 1000 1111 00108: 1001 1000 0001 0110 0001 0001 1111 10117: 0011 0000 0010 1100 0010 0011 0000 1101(余数大于除数,标志位置一并且把这里的差值作为余数)6: 0110 0000 0101 1001 0001 1010 0000 0100(余数大于除数,标志位置一并且把这里的差值作为余数) 5: 1100 0000 1011 0011 0000 1000 1111 0010 4: 1000 0001 0110 0110 0001 0001 1111 1011 3: 0000 0010 1100 1100 0010 0011 0000 1101(余数大于除数,标志位置一并且把这里的差值作为余数) 2: 0000 0101 1001 1001 0001 1010 0000 0100(余数大于除数,标志位置一并且把这里的差值作为余数) 1: 0000 1011 0011 0011 此行为结果 0xB33。
PLC算术运算和逻辑运算指令
PLC算术运算和逻辑运算指令算术运算和逻辑运算指令加法指令ADD、减法指令SUB乘法指令MUL、除法指令DIV加1指令INC、减1指令DEC字逻辑运算指令(FNC26~FNC29)1、加法指令ADD、减法指令SUBADD指令是将指定的源元件中的二进制数相加,结果送到指定的目标元件中去。
每个数据的最高位作为符号位(0为正,1为负),运算是二进制代数运算。
减法指令SUB与ADD指令类似。
2、乘法指令MUL、除法指令DIVMUL指令是将两个源元件中的数据的乘积送到指定目标元件。
如果为16位数乘法,则乘积为32位,果为32位数乘法,则乘积为64位,如图5.25所示。
数据的最高位是符号位。
3、加1指令INC、减1指令DECINC、DEC指令操作数只有一个,且不影响零标志、借位标志和进位标志。
在16位运算中,32767再加1就变成了-32768。
32位运算时,2147483647再加1就变成-2147483648。
DEC指令与INC指令处理方法类似。
4、字逻辑运算指令(FNC26~FNC29字逻辑运算指令包括WAND(字逻辑与)、WOR(字逻辑或)、WXOR(字逻辑异或)和NEG(求补)指令。
使用方法如图所示。
案例一:假设有一汽车停车场,最大容量只能停车50辆,为了表示停车场是否有空位,试用plc来实现控制。
一、硬件的实现1、I/O分配表2、外部连线根据上述模块的学习,再依据图中的标示,同学们可以自己画出输入及输出端口的分配,在这不加深述。
二、软件的编程案例二:某控制程序中要进行以下算式的运算:38X/255+2 式中“ X ”代表输入端口 K2X0 送入的二进制数,运算结果需送输出口K2Y0 ; X020 为起停开关。
一、硬件的实现1、I/O的分配2、硬件连线根据上述模块的学习,再依据图中的标示,同学们可以自己画出输入及输出端口的分配,在这不加深述。
二、软件的实现。
汇编16位除法
汇编十六位除法---移位相减法16bit/8bit:DividendM:DividendL / DivisorL = ResultM : ResultL …… RemainderL被除数 / 除数 = 商……余数移位相减法步骤:(试用 0xF666 / 0x16 ),总共要相除17步每一步都先将被除数左移1bit,再带进位左移余数,如果余数小于被除数,则直接进行下一步,左移被除数;否则将标志位置一,开始左移被除数。
直到完成17 被除数余数左移1bit 余数–除数开始: 1111 0110 0110 0110 0000 000017: 1110 1100 1100 1100 0000 0001 1110 1011(相减= 加上补数再加1)16: 1101 1001 1001 1000 0000 0011 1110 110115: 1011 0011 0011 0000 0000 0111 1111 000114: 0110 0110 0110 0000 0000 1111 1111 100113: 1100 1100 1100 0000 0001 1110 0000 1000(余数大于除数,标志位置一并且把这里的差值作为余数)12: 1001 1001 1000 0001 0001 0001 1111 101111: 0011 0011 0000 0010 0010 0011 0000 1101(余数大于除数,标志位置一并且把这里的差值作为余数)10: 0110 0110 0000 0101 0001 1010 0000 0100(余数大于除数,标志位置一并且把这里的差值作为余数)9:1100 1100 0000 1011 0000 1000 1111 00108: 1001 1000 0001 0110 0001 0001 1111 10117: 0011 0000 0010 1100 0010 0011 0000 1101(余数大于除数,标志位置一并且把这里的差值作为余数)6: 0110 0000 0101 1001 0001 1010 0000 0100(余数大于除数,标志位置一并且把这里的差值作为余数) 5: 1100 0000 1011 0011 0000 1000 1111 0010 4: 1000 0001 0110 0110 0001 0001 1111 1011 3: 0000 0010 1100 1100 0010 0011 0000 1101(余数大于除数,标志位置一并且把这里的差值作为余数) 2: 0000 0101 1001 1001 0001 1010 0000 0100(余数大于除数,标志位置一并且把这里的差值作为余数) 1: 0000 1011 0011 0011 此行为结果 0xB33。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ENDIF
;
call setup
clrf ACCcHI
clrf ACCcLO
;
; use the mulMac macro 16 times
பைடு நூலகம்;
divMac
divMac
divMac
divMac
divMac
; division macro
;
divMac MACRO
LOCAL NOCHK
LOCAL NOGO
;
bcf STATUS,CARRY
rlf ACCdLO
rlf ACCdHI
rlf ACCcLO
rlf ACCcHI
; ( Optimized for Speed : straight Line Code )
;
;*******************************************************************;
; Division : ACCb(16 bits) / ACCa(16 bits) -> ACCb(16 bits) with
;
; NOTE : Before calling this routine, the user should make sure that
; the Numerator(ACCb) is greater than Denominator(ACCa). If
; the case is not true, the user should scale either Numerator
movwf temp
movf ACCbHI,w ;move ACCb to ACCd
movwf ACCdHI
movf ACCbLO,w
movwf ACCdLO
clrf ACCbHI
clrf ACCbLO
retlw 0
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
;
IF SIGNED
btfss sign,MSB ; check sign if negative
call D_divF ; remainder in ACCc. Here ACCb =0040 & ACCc=003F
;
self goto self ;如不是测试程序,本句无用
;
org PIC54
LIST p=16c54
; (c) CALL D_div
; (d) The 16 bit result is in location ACCbHI & ACCbLO
; (e) The 16 bit Remainder is in locations ACCcHI & ACCcLO
;
; Performance :
; or Denominator or both such that Numerator is greater than
; the Denominator.
;
;
setup
movlw D'16' ; for 16 shifts
; ; for Multiplication & Division needs
; ; to be assembled as Signed Integer
; ; Routines. If 'FALSE' the above two
movf ACCaHI,w
subwf ACCcHI,w ;check if a>c
btfss STATUS,Z_bit
goto NOCHK
movf ACCaLO,w
subwf ACCcLO,w ;if msb equal then check lsb
NOCHK
btfss STATUS,CARRY ;carry set if c>a
goto NOGO
movf ACCaLO,w ;c-a into c
subwf ACCcLO
btfss STATUS,CARRY
decf ACCcHI
goto main
goto chek_A
;
comf ACCbLO ; negate ACCb
incf ACCbLO
btfsc STATUS,Z_bit
decf ACCbHI
comf ACCbHI
;
chek_A
btfss ACCaHI,MSB ; if MSB set go & negate ACCa
;*******************************************************************
; Double Precision Division
; 16位BIN数除法
; Assemble this section only if Signed Arithmetic Needed
;
IF SIGNED
;
S_SIGN
movf ACCaHI,W
xorwf ACCbHI,W
movwf sign
btfss ACCbHI,MSB ; if MSB set go & negate ACCb
retlw 0
goto neg_A
;
ENDIF
;
;*******************************************************************
; 测试程序(注意用法,ACCb/ACCa,结果放在ACCb里,余数放在ACCc里)
ACCbLO equ 12
ACCbHI equ 13
ACCcLO equ 14
ACCcHI equ 15
ACCdLO equ 16
ACCdHI equ 17
temp equ 18
sign equ 19
;
org 0
;*******************************************************************
SIGNED equ FALSE ; Set This To 'TRUE' if the routines
retlw 0
goto neg_B ; negate ACCa ( -ACCa -> ACCa )
ELSE
retlw 0
ENDIF
;
;*******************************************************************
; Program Memory : 370
; Clock Cycles : 263
;
; NOTE :
; The performance specs are for Unsigned arithmetic ( i.e,
; Double Precision Divide ( 16/16 -> 16 )
;
; ( ACCb/ACCa -> ACCb with remainder in ACCc ) : 16 bit output
; with Quotiont in ACCb (ACCbHI,ACCbLO) and Remainder in ACCc (ACCcHI,ACCcLO).
btfsc STATUS,Z_bit
decf ACCaHI
comf ACCaHI
retlw 0
;
;*******************************************************************
;
D_divF
;
IF SIGNED
;*******************************************************************
; Load constant values to ACCa & ACCb for testing
;
main
movlw 1
movwf ACCaHI
movlw 0FF ; loads ACCa = 01FF
movwf ACCaLO
;
movlw 07F
movwf ACCbHI
movlw 0FF ; loads ACCb = 7FFF
movwf ACCbLO
; ; routines ( D_mpy & D_div ) use
; ; unsigned arithmetic.
;*******************************************************************;
; with "SIGNED equ FALSE ").
;
;*******************************************************************;
;
ACCaLO equ 10
ACCaHI equ 11
;
;*******************************************************************