单片机的编程题目

试用三种方法 (乘法 左移法.....)将A累加器中的无符号数乘以4,乘积存放于B和A中
要用指令来完成

#include
#include
//右移函数需要此头文件intrins.h
大小写不限
sbit
t=p3^3
//p3^3是指你单片机实际连接的方式,你根据实际情况改一下
main()
{
int
i=0;
int
a;
while(1)
{
while(t==0);
//若脉冲一直为低电平,程序停在此处,
//每当高电平来临,跳出此句话,执行下面的语句
i++;
if(i==1000)
{
a<<1;
i=0;
}
}
}
/*推荐郭天祥的《十天学会单片机》视频教程,
共13集,5.13g大,很清晰。我大二的时候连数电和模电都没学,也能看懂这个。学了之后就对单片机很了解了。但要买块单片机来学那个教程。
该教程可在迅雷下载到,我原来是在淘宝网买的dvd光盘,有些书店里也有这个教程。
学完之后就会用单片机做东西了!
只要你学过c语言,就很容易学会单片机!
*/
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-11-28
共同研究一下:下面的几种方法(下面采用汇编的形式写,可能这样比C更容易理解一点)
1:(移位法)
clrr TmpL ;清临时寄存器
clrr TmpH

movar TmpL

rl TmpL,1 ;不带进位左移(左移两位相当于*4)
btrss status,C_FLAG ;C_FLAG 进位标志
inc TmpH,1

rl TmpL,1
btrss status,C_FLAG
inc TmpH,1

movr TmpH,0 ;放入值 高位放入B 低位放入A
movar B
movr TmpL,0

2:(相加法)
clrr TmpL ;清临时寄存器
clrr TmpH

movar TmpL ;放入初值
movia 3 ;放入计数次数(4-1)
movar downcount

ADD_star: ;改为调用形式应该更好
ADD_loop:
movr downcount,1
btrsc status,Z_FLAG ;Z_FLAG 零标志
goto ADD_end

movr TmpL,0
addar TmpL,1
btrsc status,C_FLAG
inc TmpH,1 ;这里没有考虑溢出问题

decr downcount,1
btrss status,Z_FLAG
goto ADD_loop

movr TmpH,0
movar B
movr TmpL,0
ADD_end:

3:
clrr TmpL ;清临时寄存器
clrr TmpH

mulia a,2 ;乘数过大采用调用的形式更好
btrsc status,C_FLAG ;注单片机”相乘“会影响”进位标志“
inc TmpH,1

mulia a,2
btrsc status,C_FLAG
inc TmpH,1
movar TmpL

movr TmpH,0 ;放入值
movar B
movr TmpL,0本回答被提问者采纳
第2个回答  2008-06-02
<<单片机原理,接口及应用--嵌入在式系统技术基础>>清华大学出版社,作者,肖看,李群芳.这本书有一道一模一样的题目,下面是这道题的标准准答案.
(1)利用乘法指令:
MOV B,#04H
MUL AB
SJMP $
(2)利用移位指令:
RL A
RL A
MOV 20H,A
ANL A,#03H
MOV B,A
MOV A,20H
ANL,#0FCH
SJMP $
(3)用加法指令:
ADD A,A
MOV R0,A
MOV A,#0
ADDC A,A
MOV B,A
MOV A,R0
ADD A,A
MOV R1,A
MOV A,B
ADDC A,B
MOV B,A
MOV A,R1
SJMP $
相似回答