A. 基于51单片机的简易加法计数器
你好!这样的效果可以吗
B. 单片机的简单实验编程题
循环3次即可。
MOV R0, #20H ;加数1地址、和的地址
MOV R1, #30H ;加数2地址
CLR C
MOV R2, #3 ;循环3次
A_LOOP:
MOV A, @R0 ;取
ADDC A, @R1 ;加
MOV @R0, A ;存
INC R0
INC R1
DJNZ R2, A_LOOP
CLR A
ADDC A, #0 ;得到进位
MOV 23H, A ;保存
RET
C. 单片机加法运算
你的问题应该出现在键盘处理不完善造成的,稍微修改了一下你试试。 #include #define uchar unsigned char #define unit unsigned int #define OPdata P0 //十位数据口 #define OPdata1 P1//个位数据口 sbit se0=P3^6;//十位选择 sbit se1=P3^7;//个位选择 sbit Q=P2^6; sbit W=P2^5; sbit E=P2^4; uchar cis; //按下键盘次数 uchar jia1; //加数1 uchar jia2; //加数2 uchar z; //中转数 uchar shi; //十位数 uchar ge; //个位数 uchar s; //译码结果 uchar j; //译码结果 uchar sum; //加法结果 uchar keytemp; void judge(uchar m) //数码显像管译码 { switch (m) { case 0: s=0x3F; break; case 1: s=0x06; break; case 2: s=0x5B; break; case 3: s=0x4F; break; case 4: s=0x66; break; case 5: s=0x6D; break; case 6: s=0x7D; break; case 7: s=0x07; break; case 8: s=0x7F; break; case 9: s=0x6F; break; } } void judge1(uchar h) //十位数码显像管译码 { switch (h) { case 0: j=0x3F; break; case 1: j=0x06; break; } } void judgecis() { if (cis==1) { jia1=z; ge=z; shi=0; } else if (cis==2) { jia2=z; ge=z; shi=0; cis=0; } } void jiafa(uchar m,uchar n) //加法 { sum=m+n; if (sum>=10) { ge=sum-10; shi=1; } else { ge=sum; shi=0; } } void main() { cis=0; jia1=0; jia2=0; shi=0; ge=0; s=0; j=0; P2=0XFF; se0=0;//开启十位 se1=0;//开启个位 OPdata=0x3f;//十位 OPdata1=0x3f;//个位 while (1) { Q=0; keytemp=P2; switch (keytemp) { case 0xbb: z=3; cis++;while(P2==0xbb); break; case 0xbd: z=6; cis++;while(P2==0xbd); break; case 0xbe: z=9; cis++;while(P2==0xbe); break; case 0xb7: //等于号 jiafa (jia1,jia2); cis=0; break; } Q=1; W=0; keytemp=P2; switch (keytemp) { case 0xde: z=8; cis++;while(P2==0xde); break; case 0xdd: z=5; cis++;while(P2==0xdd); break; case 0xdb: z=2; cis++;while(P2==0xdb); break; case 0xd7: z=0; cis++;while(P2==0xd7); break; } W=1; E=0; keytemp=P2; switch (keytemp) { case 0xee: z=7; cis++;while(P2==0xee); break; case 0xed: z=4; cis++;while(P2==0xed); break; case 0xeb: z=1; cis++;while(P2==0xeb); break; } judgecis(); judge(ge); OPdata1=s; judge1(shi); OPdata=j; E=1; } }
D. 51单片机,使用keil软件,4字节加法或减法子程序
四个字节加上四个字节,和应该是4~5个字节。
本程序,需要三个地址指针,但是一般只有两个(R0和R1)可以用;如果换用工作区,就比较麻烦了。下面使用B充当“和”的地址指针,RESULT + 4单元,充当加数2的地址指针。
程序如下:
RESULT equ 30H ;和数的地址
ORG 0000H
;实验数据如下:
MOV 20H, #22H ;加数1
MOV 21H, #33H
MOV 22H, #44H
MOV 23H, #0F3H
MOV 24H, #12H ;加数2
MOV 25H, #34H
MOV 26H, #56H
MOV 27H, #78H
MOV R0, #20H ;给定地址
MOV R1, #24H
LCALL _4_JIA_4 ;调用加法子程序
NOP
SJMP$
_4_JIA_4:
MOV RESULT + 4, R1 ;保存加数2地址
MOV B, #RESULT ;保存和的地址
CLR C
MOV R2, #4
LOOP:
MOV A, @R0
INC R0
MOV R1, RESULT + 4
ADDC A, @R1 ;加上加数2
INC R1
MOV RESULT + 4, R1
MOV R1, B
MOV @R1, A ;保存和数
INC R1
MOV B, R1
DJNZ R2, LOOP
CLR A
ADDC A, #0
MOV RESULT + 4, A ;保存第五字节
RET
减法子程序,与上面的加法子程序雷同,只要把ADDC换成SUBB即可改为减法子程序。请楼主自行改写。
E. 单片机运用循环和16位加法 计算数据块(30H至37H)中,8个8位二进制数的和,最终结果放入R1
HE:
MOV R2, #0
MOV R1, #0
MOV R0, #30H
LOOP:
MOV A, R2
ADD A, @R0
MOV R2, A
JNC NEXT
INC R1
NEXT: INC R0
CJNE R0, #38H, LOOP
MOV A, R2
MOV R0, A
RET
END
F. 51单片机加法运算问题,资料如下图所示!
他只是告诉你16位加法运行原理,并不是说8位单片机可以一次算16位加法,16位加法需要运算两次的,第一次算低位,第二次算高位,没有16位指令,16位加法要字节写程序,他告诉你写运行原理。。。
G. 求一个大学51单片机加减法计数器设计实验,高手进
这个不用高手吧,为什么不用一个加一个减呢?这样程序会更简单
H. 51单片机能做两个16位的加法运算吗如1010h和1010h,求大虾!!!!!
没有问题的,可以的,如用汇编
MOV R5, #10H ; 第一数据高字节
MOV R4,#10H ; 第一数据低字节
MOV R3, #10H ; 第二数据高字节
MOV R2,#10H ; 第二数据低字节
MOV A, R4
ADD A, R2
MOV R4, A ; 和低字节 在 R4 中
MOV A, R5
ADDC A, R3
MOV R5, A ; 和高字节 在 R5 中
RET