双字节除法
基于51单片机的高速公路测速系统和车牌识别分析
基于51单片机的高速公路测速系统和车牌识别分析添加时间: 2010-3-20 11:19:19 文章来源: 文章作者: 点击数:17688摘要鉴于高速公路限速牌不能很好地对司机起到警示作用的作用,本文设计了一套基于MCS-51单片机,包含光电探测装置和显示装置的电子屏幕。
它不仅能方便设置并显示该路段的限制速度,以完成普通电子限速牌的限速提示功能,同时能将测得的车速实时显示,并自动判断是否超速。
另外它低廉的造价和经计算证明较高的精度大大提高了它的可用性。
车辆牌照自动识别系统是近几年发展起来的基于图像和字符识别术的智能化交通管理系统,是目前国内外模式识别应用研究领域的一个热点。
本文对系统中区域提取、图像预处理、字符分割和字符识别等环节涉及的算法、设计做了一个比较详细的论述。
本文在图像预处理中重点介绍一种在图像获取阶段有目的定位关注的物体,讨论了灰度图像二值化的多种算法,利用它在原始图像形成的标识区域特性,在约束条件下,按照识别牌几何特征提出了一种特殊的二值化处理方法。
实验证明该图像识别系统具有较高的可靠性与稳定性,减小了进一步车牌识别中计算量大的问题,从而提高了车牌识别的准确性和快速性。
讨论了灰度图像二值化的多种算法基于数学形态学的图像去除噪声的方法。
基于数学形态学的图像去除噪声是通过对图像的开、闭操作有选择的去噪声。
可以去除直径小于字符笔划半径的孤立噪声点。
还详细地介绍了基于字符形态划分的字符识别方法。
基于字符形态划分的字符识别方法是在对数字字符结构进行充分分析的基础上,对基元检测,归纳字符形态特征,得到的快速字符识别方法。
关键词:光电检测;车速测量;单片机;电子限速牌;车辆牌照;图像处理;基元检测;字符识别基于51单片机的高速公路测速系统和车牌识别分析AbstractIn view of the highway speed limit unlicensed drivers should not very well serve as a warning to the role, this article has designed a single-chip based on the MCS-51, including the photoelectric detection devices and display devices of the electronic screen. It not only can easily set up and display the road speed limit in order to achieve common electronic speed limit signs prompt function, can be simultaneously measured real-time display of speed and automatically determine whether the speeding. In addition it is low cost and the higher the accuracy of calculations greatly enhance its usability. Vehicle License Plate Recognition system is developed in recent years based on the image and character recognition operation of the Intelligent Traffic Management System, the application of pattern recognition at home and abroad are currently a hot area ofresearch. In this paper, the system of regional extraction, image preprocessing, character segmentation and character recognition algorithm, such as aspect involved in the design to do a more detailed exposition. In this paper image pre-processing in the introduction of a focus at image acquisition phase has the purpose of positioning objects of concern, discussed the gray image binarization of a variety of algorithms, use it in the original logo image formation of regional characteristics, in binding conditions, identification card in accordance with the geometric characteristics of a particular binarization approach. Experiments prove that the image recognition system has high reliability and stability, further reduce the vehicle license plate recognition in the calculation of a large quantity of questions, thereby increasing the accuracy of license plate recognition and speed.Discussed the gray image binarization algorithm of multiple images based on mathematical morphology method to remove noise. Images based on mathematical morphology to remove the image noise is through the open and close operation has chosen to noise. Can remove the character strokes of a diameter less than the radius of the isolated noise points. Also detail the division of character-based form of character recognition methods. Morphological character-based division of Character Recognition on the figure are at a full analysis of character structure based on element detection, morphological characteristics summarized characters get Character Recognition Express.Key words:Photoelectric detection; speed measurement; Singlechip; electron speed licensing; vehicle license; image processing; motif detection; Character Recognition目录摘要................................................................................. (I)Abstract........................................................................... . (II)第1章绪论................................................................................. . (2)1.1 车牌字符识别研究课题的背景 (2)1.2 车牌字符识别研究的意义 (2)1.3 车牌字符识别研究的应用现状及发展 (3)1.4 本文主要内容.................................................................................第2章车牌图像预处理 (5)2.1 数字图像处理的相关介绍 (5)2.1.1 数字图像处理概念 (5)2.1.2 图像的数字化表示 (5)2.1.3 本文中图像处理所涉及的相关领域 (6)2.2 图像二值化................................................................................. . (6)2.2.1 彩色图像和灰度图像 (6)2.2.2 基于灰度的图像二值化 (7)2.2.3 图像二值化结果演示 (9)2.3 用数学形态学的方法去除噪声 (10)2.3.1 数学形态学的几种基本运算 (10)2.3.2 经开闭运算前后的图像对比显示 (16)2.4 单个字符图像的分割 (17)2.4.1 我国车牌的特点 (17)2.4.2 对所要识别的车牌的分析 (17)2.4.3 基于列扫描黑色像素积累的字符分割 (18)2.4.4 已经分割后的单个字符演示 (18)2.5 本章小结................................................................................. . (19)第3章基于字符形态划分的字符识别 (19)3.1 字符识别概述................................................................................3.1.1 目前字符识别的一些常规方法 (20)3.2 字符轮廓分析 (21)3.2.1 字符轮廓的划分 (21)3.2.2 字符四方向轮廓公式化表示 (21)3.3 字符轮廓的变化特征 (22)3.4 字符形态划分的结构基元 (22)3.4.1 字符结构基元划分原理 (22)3.4.2 字符形态划分方法的特点 (23)3.5 利用字符结构基元划分的字符识别原理 (24)3.5.1 基元的检测 (24)3.5.2 轮廓的统计特征 (25)3.5.3 用字符形态识别数字字符 (25)3.5.3.1 数字字符的特点 (25)3.5.3.2 数字字符的识别方法 (26)3.5.4 字符识别的matlab算法流程 (27)3.6 本课题整体流程 (29)3.6.1 对本课题流程的总体说明 (29)3.6.2 用MATLAB完成本课题的流程图 (30)3.7 基于字符形态划分的字符识别方法的特点和不足 (30)3.8 本章小节................................................................................. (31)结论................................................................................. . (32)参考文献................................................................................. (33)第1章绪论1.1 车牌字符识别研究课题的背景随着21世纪经济全球化和信息时代的到来,作为信息来源的自动检测、图像识别技术越来越受到人们的重视。
汇编语言指令大全.
字扩展指令 CWD(Convert Word to Double Word)
格式: CWD
功能: 将字扩展为双字长,即把AX寄存器的符号位扩展到DX中.
说明:
1. 两个字或字节相除时,先用本指令形成一个双字长的的被除数.
2. 本指令不影响标志位.
3. 示例: 在B1、B2、B3字节类型变量中,分别存有8们带符号数a、b、c,实现(a*b+c)/a运算。
2. AAA的调整操作
若(AL) and 0FH>9 或 AF=1,则调整如下:
(AL)<--(AL)+6,(AH)<--(AH)+1,AF=1,CF<--AF,(AL)<--(AL) and 0FH
AAD
未组合十进制数除法调整指令 AAD(ASCII Adjust for Division)
格式: AAD
在除法指令前对ax合十进制数进行调整以便能用div指令实现两个未组合的十进制数的除法运算其结果为未组合的十进制数商在al中和余数在ahaad指令是在执行除法div之前使用的以便得到二进制结果存于al然后除以oprd得到的商在al中余数在ah示例
AAA
未组合的十进制加法调整指令 AAA(ASCII Adgust for Addition)
3. 加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响.以上标志也称为结果标志.
4. 该指令对标志位的影响同ADD指令.
ADD
加法指令 ADD(Addition)
格式: ADD OPRD1,OPRD2
功能: 两数相加
说明:
1. OPRD1为任一通用寄存器或存储器操作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器操作数.
单片机浮点数计算
在单片机应用系统的数据处理过程中,经常会遇到小数的运算问题,如求解BCD的增量算式、线性化处理等。
因此,需要用二进制数来表示小数。
表示小数的方法一般有两种,定点数和浮点数。
定点数结构简单,与整数的运算过程相同,运算速度快。
但随着所表示数的范围的扩大,其位数成倍增加,给运算和存储带来不便,而且也不能保证相对精度不变。
浮点数的结构相对复杂,但它能够以固定的字节长度保持相对精度不变,用较少的字节表示很大的数的范围,便于存储和运算,在处理的数据范围较大和要求精度较高时,采用浮点数。
浮点数的概念常用的科学计数法来表示一个十进制数如l234.75=1.23475E3=1.23475×103在数据很大或很小时,采用科学计数避免了在有效数字前加0来确定小数点的位置,突出了数据的有效数字的位数,简化了数据的表示。
可以认为,科学计数法就是十进制数的浮点数表示方法。
在二进制效中,也可以用类似的方法来表示一个数,如1234.75=10011010010.11(二进制)=0.1001101001011×211一般表达式为N=S×2p在这种表示方法中,数值由四个部分组成,即尾数S及符号,阶码P及符号。
在二进制中,通过定义相应字节或位来表示这四部分,就形成了二进制浮点数。
二进制浮点数可以有多种不同的表示方法,下面是一种常见的三字节浮点数的格式:其中尾数占16位,阶码占6位,阶符占1位,数符占1位。
阶码通常用补码来表示。
在这种表示方法中,小数点的实际位置要由阶码来确定,而阶码又是可变的,因此称为浮点数。
1234.75用这种格式的浮点数表示就是:0000 1011 1001 1010 0101 1000用十六进制表示为1234.75=0B9A58H-1234.75=4B9A58H0.171875=043B00H-0.171875=443B00H三字节浮点数所能表示的最大值为1×263=9.22×1018能表示的最小数的绝对值为0.5×2-63=5.42×10-20其所表示的数的绝对值范围=(5.42×10-20~9.22×1018),由此可以看到,比三字节定点数表示的数的范围大得多。
二进制除法原理
二进制除法原理其实二进制除法和我们平时用竖式计算的10进制除法的原理是一样的,但是有一点要注意,就是计算机计算的结果是有限的,比如说一个16Bit数除以一个8Bit数,结果不能超过8Bit,否则按溢出处理。
所以在计算前先要判断结果会不会溢出,方法是用被除数的高8位和除数相减,如果大于等于0则认为是溢出:商大于等于0x100,任何一个8Bit数与0x100乘积的高8位只可能小于除数,例如一个16进制数0x12,乘以0x100的结果为0x1200,也就是说只有小于0x1200的除数除以0x12的商才不会超过8Bit。
例如:0x1200/0x12(结果为0x100) --> (0x12 - 0x12) = 0,溢出0x11FF/0x12(结果为0xFF) -->(0x11 - 0x12) < 0, 不会溢出计算方法:(0x0E8E/0x12)0000 1110 1000 1110 / 0001 00100001 1101 0001 1100假设商为0,商和被除数左移一位0001 0010___________________0000 1011 够减,上次假设的商为1,再假设本次商为0和被除数同时左移一位0001 0110 0011 10100001 0010___________________0000 0100 够减,上次假设的商为1,再假设本次商为0和被除数同时左移一位0000 1000 0111 01100001 0010___________________---- ---- 不够减,上次假设的商OK,再假设本次商为0和被除数同时左移一位0001 0000 1110 11000001 0010___________________---- ---- 不够减,上次假设的商OK,再假设本次商为0和被除数同时左移一位0010 0001 1101 10000001 0010___________________0000 1111 够减,上次假设的商为1,再假设本次商为0和被除数同时左移一位0001 1111 1011 00100001 0010___________________0000 1101 够减,上次假设的商为1,再假设本次商为0和被除数同时左移一位0001 1011 0110 01100001 0010___________________0000 1001 够减,上次假设的商为1,再假设本次商为0和被除数同时左移一位0001 0010 1100 11100001 0010___________________0000 0000 够减,上次假设的商为1,即1100 1111,移位8次,结束开始:判断是否溢出,溢出,设置溢出标志退出否则,继续循环计数器= 8循环开始:被除数带0左移一位被除数高8位和除数相减,不够减则检查循环次数否则用8为差替换被除数的高8位被除数最低位置1(即刚才假设的商应该为1)检查循环次数:循环计数器减1, 不为0则继续循环(跳到循环开始处) 否则, 清除溢出标志输出商结束。
功能双字节二进制有符号数除法(补码)(精)
(二)(11)标号:DIVS功能:双字节二进制有符号数除法(补码)入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
出口信息:OV=0时商在R2、R3中,OV=1时溢出。
影响资源:PSW、A、B、R1~R7 堆栈需求:5字节DIVS: LCALL MDS ;计算结果的符号和两个操作数的绝对值PUSH PSW ;保存结果的符号LCALL DIVD ;计算两个绝对值的商JNB OV,DVS1 ;溢出否?POP ACC ;溢出,放去结果的符号,保留溢出标志RETDVS1: POP PSW ;未溢出,取出结果的符号MOV R4,#0MOV R5,#0MDSE: JB F0,MDS2 ;用补码表示结果CLR OV ;结果为正,原码即补码,计算成功RETMDS: CLR F0 ;结果符号初始化MOV A,R6 ;判断第二操作数的符号JNB ACC.7,MDS1;为正,不必处理CPL F0 ;为负,结果符号取反XCH A,R7 ;第二操作数取补,得到其绝对值CPL AADD A,#1XCH A,R7CPL AADDC A,#0MOV R6,AMDS1: MOV A,R2 ;判断第一操作数或运算结果的符号JNB ACC.7,MDS3;为正,不必处理CPL F0 ;为负,结果符号取反MDS2: MOV A,R5 ;求第一操作数的绝对值或运算结果的补码CPL AADD A,#1MOV R5,AMOV A,R4CPL AADDC A,#0MOV R4,AMOV A,R3CPL AADDC A,#0MOV R3,AMOV A,R2CPL AADDC A,#0MOV R2,AMDS3: CLR OV ;运算成功RET(12)标号:SH2功能:双字节二进制无符号数开平方(快速)入口条件:被开方数在R2、R3中。
出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
影响资源:PSW、A、B、R2~R7 堆栈需求:2字节SH2: MOV A,R2ORL A,R3JNZ SH20RET ;被开方数为零,不必运算SH20: MOV R7,#0 ;左规次数初始化MOV A,R2SH22: ANL A,#0C0H ;被开方数高字节小于40H否?JNZ SQRH ;不小于40H,左规格化完成,转开方过程CLR C ;每左规一次,被开方数左移两位MOV A,R3RLC AMOV F0,CCLR CRLC AMOV R3,AMOV A,R2MOV ACC.7,CMOV C,F0RLC ARLC AMOV R2,AINC R7 ;左规次数加一SJMP SH22 ;继续左规(13)标号:SH4功能:四字节二进制无符号数开平方(快速)入口条件:被开方数在R2、R3、R4、R5中。
双字节除法
51单片机只是8位的,但有时候需要实现双字节除法,里面的指令只支持8位。
想来想去,只好用减法来实现了。
下面这个子程序是双字节除以双字节,商、余数结果都是双字节保存,可能有点消耗资源,但这样可以整合在一块。
;****************************************;函数名称:Div2Byte;功能描述:无符号数双字节除法;传入参数:R0R1被除数 R2R3除数;返回数据:R4R5商 R6R7余数;其他说明:比如双字节数R0R1,R0高字节 R1低字节;****************************************Div2Byte:mov R4,#0mov R5,#0 ;商赋初值零mov A,R0mov R6,Amov A,R1mov R7,A ;余数赋初值,保证商为零时余数正常Div2Byte_1:mov A,R1clr csubb A,R3 ;低字节相减mov R1,Amov A,R0subb A,R2 ;高位相减mov R0,Ajc Div2Byte_3 ;如果高字节都需要借位则退出循环clr cmov A,R5;为什么这里不直接使用INCR5add A,#1mov R5,Ajnc Div2Byte_2inc R4 ;商加一Div2Byte_2:mov A,R1mov R7,Amov A,R0mov R6,A ;更新余数LJMP Div2Byte_1Div2Byte_3:RET使用示范:16进制双字节数字 05D2H 除以 0105H,商是0005H,余数是00D2Hmov R0,#5Hmov R1,#0D2Hmov R2,#1Hmov R3,#5Hlcall Div2Byte则结果是R4:00H R5:05H R6:0 R7:D2H整体感觉这个程序有问题!!可能在计算简单的除法是可以得出结果,但是..... 下面这个更是让我........8051单片机双字节除法ORG 0000H;8051单片机双字节除法 071205MOV R7,#08H;初始化数据,r7和r6为被除数,r7为高位MOV R6,#05H;r5和r4为除数,r5为高位MOV R5,#03HMOV R4,#03HMOV R0,#00H;本次计算为用减法实现除法,r0为商的存储器LOOP: CLR CMOV A,R6MOV R2,A;暂存余数低位r2SUBB A,R4MOV R6,AMOV A,R7MOV R3,A;暂存余数高位r3SUBB A,R5MOV R7,AJC OVER;如果r7r6小于r5r4则跳转到结束INC R0AJMP LOOPOVER: NOP;r3和r2为余数r3为高位END有破绽!!下面这个只能说貌似正确;=================================================; Division for three-byte data;; 2008_05_08;================================================= ORG 0000HAJMP MAINORG 0030HMAIN:MOV 77H,#0FHMOV 78H,#42HMOV 79H,#40HMOV 7AH,#00HMOV 7BH,#03HMOV 7CH,#0E8HLCALL DIV_MBSJMP MAIN;================================================= ; DIVISION FOR THREE-BYTE DATA; DIVIDEND FROM 77H&78H&79H; DIVISOR FROM 7AH&7BH&7CH; QUOTIENT TO 77H&78H&79H; 2008_05_08 BY SZCKIC;================================================= DIV_MB: MOV 7DH,#00HMOV 7EH,#00HMOV 7FH,#00HMOV R7,#18HNEXTBIT:CLR CMOV A,79HRLC AMOV 79H,AMOV A,78HRLC AMOV 78H,AMOV A,77HRLC AMOV 77H,A;Arithmetical complimentMOV A,7FHRLC AMOV 7FH,AMOV A,7EHRLC AMOV 7EH,AMOV A,7DHRLC AMOV 7DH,AMOV 5AH,7DHMOV 5BH,7EHMOV 5CH,7FHMOV 5DH,7AHMOV 5EH,7BHMOV 5FH,7CHLCALL TDECJNC UPDATEDJNZ R7,NEXTBITTMPRETUPDATE: INC 79HMOV 7FH,5CHMOV 7EH,5BHMOV 7DH,5AHDJNZ R7,NEXTBITTMPRETNEXTBITTMP:LJMP NEXTBIT;================================================= ; Subtracter for three-byte data;================================================= TDEC: CLR CMOV A,5CHSUBB A,5FHMOV 5CH,AMOV A,5BHSUBB A,5EHMOV 5BH,AMOV A,5AHSUBB A,5DHMOV 5AH,ARET。
单片机多字节加减乘除法程序
单片机多字节加减乘除法程序文章长度[6790]加入时间[2007-8-14]更新时间[2012-6-12 18:04:14]级别[0][评论][收藏]一种实用的单片机多字节除法算法一种实用的单片机多字节除法算法在单片机的实际应用中,除法运算是比较常见的一种运算。
以MCS-51单片机为例,虽然它提供了除法指令,但只能进行单字节除以单字节的运算,如果要进行多字节的除法运算,就得自己设计算法。
目前,许多资料上都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:1.只能求出商,不能求出余数;2.在被除数高二位大于除数时,不能进行运算;3.商只有两个字节。
例如,被除数是0FFFFFFFFH,除数是0004H时,商数应该是3FFFFFFFH,余数是0003H。
但是,用以前的算法是无法进行运算的。
在实际运用中,参与运算的数是任意的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应用中受到了很大的限制。
为了满足实际运用中的需要,我设计了一套新的四字节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。
下面以MCS-51汇编语言为例进行说明。
该算法增加了两字节的余数单元,并把被除数单元用来存放商数。
运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。
若除数不为零,则采用移位相减法进行运算。
首先,把进位位和余数单元清零。
再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位(如图示),共移位32次。
每移位一次,余数单元都 C (H L)(HH HL LH LL) 进位位余数单元被除数单元和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。
判断是否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。
仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,其余情况均视为够减。
双字节的加法,减法,乘法,除法
MOV R1,A
MOV A,R4
MOV B,R5
DIV1: SETB FO;置溢出标志
RET
SUBB A,R6
JNC DIV1;被除数高位字节大于除数,转溢出处理
MOV B,DIV1;无溢出执行除法,置循环次数
MOV B,#16;被除数向左移一位,低位送零
DDIV2: CLR C
MOV A,R6
ADDC A,R4
MOV R6,A
MOV A,R5
MOV R3,A
MOV A,R6
MUL AB;R5*R4
ADD A,R1;第三次乘积低位加R5暂存R6
XCH A,R4
XCH A,B
ADDC A,R1;第三次乘积高位加R5存R5
XCH A,R3;低位→R7,R7→A准备乘数
MOV R1,B;高位暂存R1
MOV B,R6
MUL AB;R6*R3
ADD A,R1;乘积低位加上一乘积高位暂存R4
MOV R1,A
MOV FO,C;保存进位位
MOV A,R6
MUL AB;R6*R4
ADD A,R1;第四次乘积低位加R5存R5
MOV R1,A
RLC A
MOV R1,A
XCH A,R2
RLC A
XCH A,R2
MOV FO,C;保护移出的最高位
CLR C
CLR A
MOV ACC.0,C
MOV C,FO
ADDC A,B;第四次乘积高位加低位来的进位后存于R4
MOV R2,A
RET
MOV R2,A
单片机乘除运算的原理
作者:Etual邮箱:Etual@QQ :506042111日期:2009-1-12很多人喜欢将人家的程序直接调用,而不问原因和究竟。
这典型的“拿来主义”有好有坏,当然了,作为学习者我们并不希望这样,我们期待的是理解每一个原理性的东西。
下面基于EMC单片机,没有内置的乘法和除法指令,我们必须编写子程序来实现乘除运算。
这是数学运算的问题,程序不复杂,很简单,但是原理不好理解,需要慢慢分析。
(一)乘法运算的原理以及实现。
(二)除法运算的原理以及实现除法运算,当年学习MCS-51的时候学习过除法子程序,不过也是半懂不懂的样子,然而自己亲手将那程序移植到EMC单片机上面之后才真正的理解了这子程序是怎么一回事。
本质:除法的子程序的本质就是用单片机模仿人做的除法运算。
这什么意思呢?且听我一一细说。
1,普通数学运算,9/3我们是怎么算的?回想起小学学的除法,怎么列竖式,怎么得到商,怎么得到余数。
33如果911-----------11| 100111----------1111----------看出1001 / 11 = 11 … 0 这个跟我们十进制得出的结果是一致的。
其实单片机除法子程序,就是做了上面的那么一个过程而已,跟我们的思维是完全一样的。
只是实现起来有点小技巧。
(1)下面解释除法的具体实现步骤,为了简单起见,我们用了双字节除法来说明问题。
1,第一步需要做的是清楚用到的寄存器,设定循环次数(等于被除数的位数),然后判断除数是否为0,如果为0则退出,返回出错代码。
div_cal_16_8:clr redue0mov a,@16mov cnt_div,amov a,divsor0jbs psw,zjmp div_cal_16_8_loopmov a,@DIVISOR_ZEROjmp div_cal_16_8_end我们首先将被除数向左移动一位,因为减法运算是在redue0寄存器中进行的,所以这个寄存器也要一起移动,保存移出的数据,移出的数据的运算是在redue0中执行减法操作,减剩下的数也是存放在redue0中,判断最高位移出的一位是0还是1,表示redue0肯定比除数大,因为多了一位,则直接进行减法操作,结果保存回redue0中,注意,这里是无符号数减法,减去之后得到的就是结果,而不需要做补码运算。
一种实用的单片机多字节除法程序
一种实用的单片机多字节除法程序在单片机的实际应用中,除法运算是以比较常见的运算。
以MCS-51单片机为例,虽然提供了除法指令,但只能进行单字节的运算。
如果要进行多字节的除法运算,就得自己设计算法。
目前,许多资料上都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:1.只能求出商,不能求出余数;2.在被除数高二字节大于除数时,不能进行运算;3.商只有两个字节。
例如,被除数是0FFFFFFFFH,除数是0004H时,商数应该是3FFFFFFFH,余数是0003H。
但是,用以前的算法是无法进行运算的。
在实际运用中,参与运算的数是任意的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应用中受到了很大的限制。
为了满足实际运用中的需要,有一套新的四字节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。
下面以MCS-51汇编语言为例进行说明。
该算法增加了两字节的余数单元,并把被除数单元用来存放商数。
运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。
若除数不为零,则采用移位相减法进行运算。
首先,把进位位和余数单元清零。
再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位,共移位32次。
每移位一次,余数单元都和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。
判断是否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。
仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,其余情况均视为够减。
这样,等到全部运算结束时,商数为四个字节,存放在被除数单元中;余数为两个字节,存放在余数单元中。
例如,被除数是0FFFFFFFFH,除数是0004H时,运行新的算法,商数是3FFFFFFFH,存放在被除数单元中,余数是0003H,存放在余数单元中。
直角坐标转换为极坐标的快速算法
直 角坐标转换为极坐标的快速算法
匕 滨 洪
( 海军大连舰艇 学院 航 海 系, 辽宁 大连 16 1 ) 1 0 8
摘要 : 中介 绍了一种利用移位和查表指令 实现直 角坐标 转换 为极坐标 的新 算法。该 文
算法较用“ 比较法” 函数运算” 和“ 等算法提高 了速 度, 满足实时控制的需要。
所在象 限; 据 I I 根 f f x 、 y 的大 小判 断 所在 象
1 1
二
当f l f f x > y 时,
=t g , D=l .e x1 c S
厶
X X…… X寺或 X =XX2 X…… × , 寺 X2 2 满
足 :≤ X 2 一1条 件 。作 出 y 数 表 , 有 0 ≤ 倒 只
1
计 算 出 后 , 分 别根据 X、 的符 号判 断 再 y
X< Y。首先 作 除法 运 算 R = A , 中 X, 同 式 Y
时乘 以 个 或 2 Y 为 双字节 时乘 , 字节 时 ( 单
乘2, : )即
1
。
数 和正割 函数运 算得 出 、e0 , Se 值 最后 作一 次单
字 节乘 以双 字节乘 法得 出 D。
1
维普资讯
第2卷第2 5 期
2002年 4 月
海 军 大 连 舰 艇 学 院 学 报
J u a f l n Na a △ 里 o m 1 i vl o Da a
Vo. 5, t2 No. 2
Ap r.2 0 0 2
和 y, 单 片 机 上 计 算 在
、 / r
是非 常复杂
X、 最 大 为 双 字 节 二 进 制 无 符 号 数 , y 且
51单片机经典流水灯程序
单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成loop:mov p1,a ;将A送到P1口,发光二极管低电平点亮lcall delay ;调用延时子程序rl a ;累加器A循环左移一位ajmp loop ;重新送P1显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1retend51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。
ORG 0;程序从0地址开始START: MOV A,#0FEH ;让ACC的内容为LOOP: MOV P2,A ;让P2口输出ACC的内容RR A;让ACC的内容左移CALL DELAY ;调用延时子程序LJMP LOOP ;跳到LOOP处执行;0.1秒延时子程序(12MHz晶振)===================DELAY: MOV R7,#200 ;R7寄存器加载200次数D1: MOV R6,#250 ;R6寄存器加载250次数DJNZ R6,$ ;本行执RET;返回主程序END;结束程序开关控制的单片机流水灯汇编在单片机控制下,用一个拨动开关K1,控制8个发光二极管L1-L8,发光的时间间隔为0.5秒。
单片机实用子程序库大全
内容目前已有若干版本的子程序库公开发表,它们各有特色。
本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
地址小的单元存放数据的高字节。
例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。
2.运算精度:单次定点运算精度为结果最低位的当量值。
3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。
汇编-乘除法指令
汇编-乘除法指令
乘法指令
⽆符号的乘法指令MUL
带符号的乘法指令IMUL
**注意 : ** 乘法指令采⽤隐含寻址,隐含了存放被乘数的累加器 AL 或 AX , 以及存放结果的 AX 或 AX,DX(16·16)是32位,需要DX存放⾼16位⽆符号数乘法指令
格式 : MUL OPRD 操作数不能是⽴即数
操作 :
如果OPRD是字节数AL·OPRD−−−>AX
如果OPRD是16位数AX·OPRD−−−>DXAX
有符号数乘法指令
格式 : IMUL OPRD 操作数不能是⽴即数
指令执⾏原理
将两个操作数取补码 (对负数按位取反加1,正数不变)
做乘法运算
将乘积取补码
除法指令
⽆符号的除法指令DIV
带符号的乘法指令IDIV
除法指令的操作
若OPRD是字节数
执⾏:AX/OPRD
结果:AL是商AH是余数
若OPRD是双字节数
执⾏:DXAX/OPRD
结果:AX是商DX是余数
指令要求被除数是除数的双倍字长
算术运算类指令⼩结
算术运算类指令的执⾏会影响标志位
INC和DEC指令的执⾏不会影响CF
Processing math: 100%。
汇编div的用法
汇编div的用法一、什么是汇编div指令在汇编语言中,div是除法指令,用于将一个无符号数除以另一个无符号数,得到商和余数。
二、div指令的语法div指令有两种形式: 1. div r/m8:将AX寄存器的值除以指定的源操作数(一个8位无符号数)。
2. div r/m16:将DX:AX寄存器的值除以指定的源操作数(一个16位无符号数)。
三、div指令的使用方法使用div指令进行除法运算时,需要注意以下几个方面。
1. 寄存器的使用•若进行8位除法运算,除数不能为零,并且结果的商存放在AL寄存器,余数存放在AH寄存器中。
•若进行16位除法运算,除数不能为零,并且结果的商存放在AX寄存器,余数存放在DX寄存器中。
2. 操作数的选择•单字节的除法运算只能使用寄存器或内存变量作为操作数。
•双字节的除法运算除了可以使用寄存器和内存变量作为操作数,还可以使用立即数作为操作数,但是除数不能为零。
3. 除数的大小•8位除法运算的除数是一个字节无符号整数,范围是0-255。
•16位除法运算的除数是一个字无符号整数,范围是0-65535。
4. 除法运算的结果•除法运算的结果是一个商和一个余数。
•商存放在指定的寄存器中,余数存放在指定的寄存器中。
四、div指令的示例以下是使用div指令进行除法运算的示例代码:section .datadividend db 10 ; 被除数divisor db 2 ; 除数section .textglobal _start_start:mov al, dividend ; 将被除数加载到AL寄存器中mov bl, divisor ; 将除数加载到BL寄存器中xor ah, ah; 清空AH寄存器div bl; 进行除法运算mov byte [quotient], al; 将商存放在[quotient]变量中mov byte [remainder], ah; 将余数存放在[remainder]变量中section .bssquotient resb 1 ; 存放商remainder resb 1 ; 存放余数五、总结通过本文的介绍,我们了解到了汇编语言中div指令的用法。
C语言二进制除法用左右移位来表示
C语⾔⼆进制除法⽤左右移位来表⽰有些编译器和硬件是⽀持乘除法和浮点运算,运⽤起来也是很⽅便!唯⼀让我不满的就是很占⽤ROM ! 所以某些平台恰好可以⽤移位来换算!学习推算⼼得:分母是为 2的平⽅的情况下成⽴! 2.4.8.16.32.64.128.256.512.1024.2048......左移1位相当于乘以2 左移2位相当于乘以4 左移3位相当于乘以8 左移4位相当于乘以16 ...... 是以⼀累加,乘以2的平⽅累加右移1位相当于除以2 右移2位相当于除以4 右移3位相当于除以8 右移4位相当于除以16 ...... 是以⼀累减,乘以2的平⽅累减类题⼀:LM75A 温度传感器中的温度转换!1、保留了两位⼩数点 value =t*0.125; 0.125为 8分之⼀乘以100= 8分之100 t =value * 100; 相当于t = (t << 6)+(t << 5)+(t << 2); 64 32 4 刚好为 100 t = t>>3; 相当于除 82、保留了⼀位⼩数点value =t*1.25; 1.25 为 4分之5 相当于 t = (t << 2) + t; 4 t = t >> 2;类题⼆:DS18B20 温度传感器中的温度转换!1、保留了两位⼩数点 value =t*0.0625;t =value * 100; t = 1/16 * 100 = 25/4;相当于t = (t << 4)+(t << 3)+ t ; 16 8 1 刚好为 25t = t>>2; 相当于除 42、保留了⼀位⼩数点value =t*0.628; 0.628 为 8分之5 相当于 t = (t << 2) + t; 4 t = t >> 3; 相当于除 8。
3 乘法运算指令
• 说明:①.要求2操作数字长相等,且不能为立即数。 说明: 要求2操作数字长相等, 不能为立即数。
• • • ②.若CF=OF=1,说明乘积高半部分不为0,AH(DX) CF=OF=1 说明乘积高半部分不为0,AH(DX) 里有乘积的有效数字。 里有乘积的有效数字。 CF=OF=0 说明乘积高半部分为0 若CF=OF=0,说明乘积高半部分为0。
IMUL指令除计算对象是带符号二进制数外(补码) 其他都与MUL一样, IMUL指令除计算对象是带符号二进制数外(补码),其他都与MUL一样,但计算 指令除计算对象是带符号二进制数外 MUL一样 结果不同。 结果不同。 说明:#.若CF=OF=1,说明乘积高半部分不为0,AH(DX)里有乘积的有效数字; 说明:#.若CF=OF=1,说明乘积高半部分不为0,AH(DX)里有乘积的有效数字; 说明乘积高半部分不为0,AH
• •
执行后 (AX)=FFDEH=-34, CF=OF=0, (AX)=FFDEH=-34, CF=OF=0 (AH)为(AL)的符号扩展 的符号扩展。 (AH)为(AL)的符号扩展。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
双字节除法
用移位指令求两数的商,看不懂得原理,单片机老师只说了三个字‘不知道’
题目出自北航单片机原理及接口技术,李朝青版。
102页,麻烦解释一下其数学原理,谢谢啦
题目:编写双字节除法(16位除八位)
解:将被子除数放于(R6)(R5)中,除数放于(R4)中。
在程序运行中,(R5)保存被除数低们和商,(R6)保存余数,设07H存放中间标志位,程序执行完后,(R5)为商,(R6)为余数,其程序如下:
DV:MOV R7,#08H
S0:CLR C
MOV A ,R5
RLC A
MOV R5,A
MOV A ,R6
RLC A
MOV 07H,C
CLR C
SUBB A,R4
JB 07H,S1
JNC S1
ADD A,R4
SJMP S2
S1:INC R5
S2:MOV R6,A
DJNZ R7,S0
RET
可以仿照十进制的除法来理解。
只不过商的每一位只是0或1,也就是说先用高位的被除数减去除数,结果只有两种:1,高位大于被除数(商1);2,高位小于被除数(商0).没有十进制那麽多的情况,所以每往左移一位都可以直接用减法。
而上面的算法只不过是通过移位把商放在R5的后面了,左移八次后正好商全部都在R5中,而余数都移到R6中了。