51单片机汇编程序

时间:2024-07-19 18:29:25编辑:分享君

51单片机 用汇编语言怎么编程:几个有符号数的比较大小

51单片机中,没有专门的有符号数比较指令,只能通过一些变通的方法来实现,比如:
比较30H和40H中有符号数的大小,结果放在R2中,大于则为1,等于为0,小于为128:
CMPDAT:
MOV A,30H
JB ACC.7,CMPF1
MOV B,A
MOV A,40H
JB ACC.7,CMPZ2 ;30H正,40H负所以30H>40H
CJNE A,B,CMPZ1 ;均为正,比较大小
MOV R2,#0
RET
CMPZ1:
JC,CMPZ2
CMPZ11:
MOV R2,#128
RET
CMPZ2:
MOV R2,#1
RET
CMPF1:
ANL A,#7FH
MOV B,A
MOV A,40H
JNB ACC.7,CMPF3 ;30H负,40H负
SJMP CMPZ11 ;30负,40H正,所以30H<40H
CMPF3:
ANL A,#7FH
CJNE A,B,CMPF10 ;两个均为负数
MOV R2,#0
RET
CMPF10:
JC CMPZ2 ;30H<40H(负数小者大)
SJMP CMPZ11 ;30H>40H


求个51单片机开平方的汇编程序拜托各位了 3Q

双字节二进制无符号数开平方(快速) 入口条件:被开方数在R2、R3中。 出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 SH2: MOV A,R2 ORL A,R3 JNZ SH20 RET ;被开方数为零,不必运算 SH20: MOV R7,#0 ;左规次数初始化 MOV A,R2 SH22: ANL A,#0C0H ;被开方数高字节小于40H否? JNZ SQRH ;不小于40H,左规格化完成,转开方过程 CLR C ;每左规一次,被开方数左移两位 MOV A,R3 RLC A MOV F0,C CLR C RLC A MOV R3,A MOV A,R2 MOV ACC.7,C MOV C,F0 RLC A RLC A MOV R2,A INC R7 ;左规次数加一 SJMP SH22 ;继续左规 SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间 ADD A,#57H JC SQR2 ADD A,#45H JC SQR1 ADD A,#24H MOV B,#0E3H ;第一区间的斜率 MOV R4,#80H ;第一区间的平方根基数 SJMP SQR3 SQR1: MOV B,#0B2H ;第二区间的斜率 MOV R4,#0A0H;第二区间的平方根基数 SJMP SQR3 SQR2: MOV B,#8DH ;第三区间的斜率 MOV R4,#0D0H;第三区间的平方根基数 SQR3: MUL AB ;与区间基点的偏移量乘区间斜率 MOV A,B ADD A,R4 ;累加到平方根的基数上 MOV R4,A MOV B,A MUL AB ;求当前平方根的幂 XCH A,R3 ;求偏移量(存放在R2R3中) CLR C SUBB A,R3 MOV R3,A MOV A,R2 SUBB A,B MOV R2,A SQR4: SETB C ;用减奇数法校正一个字节的平方根 MOV A,R4 ;当前平方根的两倍加一存入R5R6中 RLC A MOV R6,A CLR A RLC A MOV R5,A MOV A,R3 ;偏移量小于该奇数否? SUBB A,R6 MOV B,A MOV A,R2 SUBB A,R5 JC SQR5 ;小于,校正结束,已达到一个字节的精度 INC R4 ;不小于,平方根加一 MOV R2,A ;保存新的偏移量 MOV R3,B SJMP SQR4 ;继续校正 SQR5: MOV A,R4 ;将一个字节精度的根存入R2 XCH A,R2 RRC A MOV F0,C ;保存最终偏移量的最高位 MOV A,R3 MOV R5,A ;将最终偏移量的低八位存入R5中 MOV R4,#8 ;通过(R5R6/R2)求根的低字节 SQR6: CLR C MOV A,R3 RLC A MOV R3,A CLR C MOV A,R5 SUBB A,R2 JB F0,SQR7 JC SQR8 SQR7: MOV R5,A INC R3 SQR8: CLR C MOV A,R5 RLC A MOV R5,A MOV F0,C DJNZ R4,SQR6 ;根的第二字节计算完,在R3中 MOV A,R7 ;取原被开方数的左规次数 JZ SQRE ;未左规,开方结束 SQR9: CLR C ;按左规次数右移平方根,得到实际根 MOV A,R2 RRC A MOV R2,A MOV A,R3 RRC A MOV R3,A DJNZ R7,SQR9 SQRE: RET PS:很长 我也是找的你就将就看看吧求采纳


求单片机输出占空比可调的PWM波程序

80S52没有硬件PWM功能,靠 定时器中断很简单,只不过频率不能太高,或调 节精度比较差
下面是双定时器产生PWM主要语句:
TMOD=0X11;
TH0=(65536-20000)/256;// 定时20ms
TL0=(65536-20000)%256;
TH1=(65536-b)/256;//定时要小于20ms,改变b的值即改变占空比
TL1=(65536-b)%256;
ET0=1;
EA=1;
TR0=1;
PWM=1;
b=2000;
while(1);
void timer0()interrupt 1
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
PWM=1;
TR1=1;
ET1=1;
}
void timer1()interrupt 3
{
TH1=(65536-b)/256;
TL1=(65536-b)%256;
PWM=0;
TR1=0;
ET1=0;
}
定时器0中断负责每 20ms将管脚置 1,定时1负责在20ms之内的某一时间将该管脚清0
当然也可以采用自动重装方式,中断可以更频繁一些,产生的PWM频率要高一些
也可以只用一个定时器,这时产生PWM波要么频率低,要么调节精度差,因中断一次至少10US,你就不用指望一次调节步距10us以下了


求一个51单片机汇编语言 串口输出一行中文的程序

程序如下,只需要修改MSG中需要发送的中文字符就可以了ORG0000HAJMPMAINORG0100HMAIN:MOVSCON,#40H;设置串行口工作方式1MOVPCON,#0;设置波特率4800MOVTMOD,#20H;波特率可根据需要自己修改MOVTL1,#0FAHMOVTH1,#0FAHSETBTR1MOVDPTR,#MSG;DPTR指向待输出字符串首地址NEXT:MOVA,#0MOVCA,@A+DPTRCJNEA,'$',NEXT1;字符串结尾?AJMPNEXT2NEXT1:CLRTIMOVSBUF,A;发送JNBTI,$;等待发送完成INCDPTR;指向下一字符AJMPNEXTNEXT2:SJMP$;动态暂停MSGDB'中华人民共和国';定义中文字符串MSGENDDB'$';定义字符串结尾字符,自定义END


51单片机定时器的汇编语言程序编程,

这么简单的要求,不用大动干戈。

看看下面的程序,是不是最简单:

ORG 0000H
SETB TR0 ;启动T0
MOV R2, #250 ;定时计数初值
LOOP:
MOV TH0, #(8192 - 8000) / 32 ;定时8ms
MOV TL0, #(8192 - 8000) MOD 32
JNB TF0, $ ;等待8ms
CLR TF0
DJNZ R2, LOOP ;每隔8ms,R2减一次一
CPL P1.0 ;R2为0则LED亮灭转换
LJMP 0000H
END

本程序,已经实验成功。


上一篇:帧中继

下一篇:tudao