① 有关单片机编程的2道题目。希望各位大神可以为我解答,在每一步后标上解释,谢谢!
;启动入口========================
ORG 0000H ;复位启动
AJMP START ;
;主程序========================
START: MOV A,#BLOCK ;数据开始地址
MOV R0,A
ADD A,#4 ;存放结果单元低字节
MOV R1,A
;
MOV A,@R0 ;第一个数低字节
INC R0
MOV B,@R0 ;第一个数高字节
INC R0 ;指向第二个数低字节
;
ADD A,@R0 ;加第二个数低字节
MOV @R1,A ;存结果单元第一字节
INC R0 ;指向第二个数高字节
INC R1 ;指向结果单元第二字节
MOV A,B ;第一个数高字节
ADDC A,@R0 ;加第二个数高字节
MOV @R1,A ;存结果单元第二字节
INC R1 ;指向结果单元第三字节
ADDC A,#0 ;存结果单元第三字节
MOV @R1,A ;存入指定单元
END ;结束
;启动入口========================
ORG 0000H ;复位启动
AJMP START ;
;主控程序========================
START: MOV R0,#BLOCK ;数据开始地址
DEC R0 ;BLOCK-1
MOV B,@R0 ;得到数据个数
;
MOV R0,#BLOCK ;数据开始地址
MOV R1,#STOCK ;用来存放结果的地址
;
LOOP: MOV A,@R0 ;取得一个数据
CLR C ;准备比较
SUBB A,#101 ;比较
JC NOS ;不大于100
;
MOVX @R1,A ;存结果
INC R1 ;指向下一单元
;
NOS: INC R0 ;指向下一个数据
DJNZ B,LOOP ;搜索完所有数据
END ;结束
② 单片机程序分析试题
第一题:
(20H)=20H,(21H)=91H,(22H)=A0H,(23H)=01H
Cy=0, A=0A0H, R0=23H, R1=28H
至于第二题吗,你们老师可真变态,好好的SUBB不让用,要用CJNE
程序如下:
;BLOCK为地址起始位
;LEN为数据数量位
;MINI为最小数据
整个编程的思路是这样的:
先设一个基准数,从最大的0FF设起,再把这些数据与基准数比较是否一致,如果一致,则先把这个数(也就是基准数)存起来,这一行就不用再往下比较了。然后把基准数减一,再执行上面的程序,如果亦有相同的,则把现在的基准数存起来,覆盖原来存的数据。就这样一直减,减到0后,停止,存起来的最后一个基准数就是最小值。
MOV R0, #BLOCK ;将地址起始位置存入R0中
MOV R1, #MINI ;将最后结果存储地址存入R1中
MOV R2, LEN ;数据数量
MOV R3, #0FFH ;比较的基准数
LOOP:
MOV A, @R0 ;读入数据
CJNE A, 03H, NEXTLOOP ;和基准数相比较,不等于则转移
MOV A, @R0 ;等于基准数了,先存起来,如果将基准数减小后,再没有和基准数相等的了,那么这个数就是最小的。
MOV @R1, A
CLR C
MOV A, R3 ;如果基准数已经减到00H了,那么,就不用再减一比较了,因为已经从0FF开始至00结束,全比较过了
JZ WAIT
SUBB A, #01H ;基准数减1
MOV R3, A
MOV R0, #BLOCK
MOV R1, #MINI
MOV R2, LEN
LJMP LOOP
NEXTLOOP:
INC R0
DJNZ R2, LOOP
WAIT:
LJMP $
按你的修改,再修改结果
(20H)=20H,(21H)=91H,(22H)=0D0H,(23H)=00H
Cy=0, A=0D0H, R0=22H, R1=28H
③ 三道单片机编程题目
编写航行标灯控制程序,系统晶振频率单位为6MHz,要求航标灯在白天熄灭,在夜晚断续点亮,时间间隔2秒,即亮2秒,暗2秒,周期循环进行。
--第一、需要先设计出来时钟。
--第二、时间不清,白天,还是晚上,这说法不准确。
下图为某AT89C51应用系统的三位led8段共阳极静态显示器的接口电路,
(1)该静态显示器电路与动态扫描的的显示器电路相比有哪些优缺点?
--看书吧。
(2)写出显示字符“x”,“y”,“z”的段码,
注意,段码的最低位为“a”段,段码的最高位为“dp”段
--y:91H。
--x、z:无法显示。
已知8255A的PA口,PB口,和PC口的地址分别为FF7CH,FF7DH,FF7EH,
且这三个端口均已被编写完毕的初始化程序初始化为方式0输出,
请编写出使三位LED共阳极显示器从左至右显示3.85的程序段。
--那一位显示器安装在左边?
--这题目,也太含糊了。
--假设左边是PA口,右边是PC口。
MOV DPTR, #0FF7CH
MOV A, #30H ;3. 的段码
MOVX @DPTR, A
INC DPTR
MOV A, #80H ;8 的段码
MOVX @DPTR, A
INC DPTR
MOV A, #92H ;5 的段码
MOVX @DPTR, A
END
④ 单片机编程题,请给出正确的编程语言,谢谢
ORG 0000H
AJMP START
ORG 000BH
AJMP INT0
START: MOV TMOD,#10H
SETB EA
SETB ET0
MOV TH0,#B1H
MOV TL0,#E0H ;40MS延时初始值
MOV R0,#01H ;R0用来标志中断里定时器应该赋谁(高低电平)的初值的值
SETB P1.7 ;起始输出高电平
SETB TR0
HERE: SJPM HERE ;等待中断
INT0: MOV A,R0
JNZ GAO
SETB P1.7
MOV TH0,#0B1H
MOV TL0,#0E0H
SETB TR0
INC R0
SJMP NEXT
GAO: CLR P1.7
MOV TH0,#0B9H
MOV TL0,#B0H ;36MS延时初值
SETB TR0
INC R0
CJNE R0,#11,NEXT ;十次36MS延时之后清R0
CLR R0
NEXT: RETI
自己看看对不对吧
用两个定时器的话(一个定时高电平一个定时周期或者一个定时高电平一个定时低电平),可以省掉R0的,程序会比较简单
⑤ 单片机编程题目
这要是用C语言写,没多大问题,分钟都能帮你,但是用汇编……真要人老命啊!话说大学那会老师也是用汇编语言教学,真是误人子弟加坑爹。单片机那么简单有趣的东西,在keil C平台下如此简单,这帮大爷就这么不顾实际的教,坑了多少学生。帮不了你,毕业多年,想起当年的兴趣,发泄下,祝顺利……
⑥ 单片机编程80c51有关查找程序的题目
内部RAM的最大地址我记得是OFFH,也有可能是我错了。
题目是不是查找外部RAM的4000H~40FFH?
是外部的话程序如下:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV DPTR,#4000H
MOVX A,@DPTR
MOV DPTR,#4001H
MOV R7,#0FFH
MOV DATA,#00H
LOOP: CJNE A,DATA,AAA ;不相等跳AAA
MOV DATA,#01H
LJMP BBB
AAA:INC DPTR
MOVX A,@DPTR
DJNZ R7,LOOP
BBB:SJMP $
END
如果是访问寻找ROM中的数据表格用下面指令:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV A,#00H
MOV DPTR,#4000H
MOVC A,@A+DPTR
MOV DPTR,#4001H
MOV R7,#0FFH
MOV DATA,#00H
LOOP: CJNE A,DATA,AAA ;不相等跳AAA
MOV DATA,#01H
LJMP BBB
AAA:INC DPTR
MOV A,#00H
MOVC A,@A+DPTR
DJNZ R7,LOOP
BBB:SJMP $
END
我也是刚开始学,如果错了请告知我下,一起进步哈。
⑦ 几道单片机编程题目,汇编语言
好吧,给你写几个,一次问题的太多了。
1:
PRG1:
MOV DPTR,#2000H
MOV R2,#32
MOV B,#0
LP:
MOVX A,@DPTR
CJNE A,B,LP1
LP1:
JC,LP2
MOV B,A
LP2:
INC DPTR
DJNZ R2,LP
MOV 68H,A
RET
2:
PRG2:
MOV DPTR,#2000H
MOV R2,#0
MOV 6FH,#0
LP:
MOVX A,@DPTR
CJNE A,#41H,LP1 ;'A'=41H
INC 6FH
LP1:
INC DPTR
DJNZ R2,LP
RET
3:;这题不好理解,短整数应该是16位,但按你的描述,是存不下的,所以按有符号字符型数处理
PRG3:
MOV DPTR,#1000H
MOV R2,#30
MOV R0,#30H
MOV R1,#40H
LP:
MOVX A,@DPTR
JB ACC.7,LPF
MOV @R1,A
INC R1
INC DPTR
SJMP LP1
LPF:
MOV @R0,A
INC R0
INC DPTR
LP1:
DJNZ R2,LP
RET
;就写这几个吧,后面的程序,程序量太大,就不写了。
⑧ 一道单片机的编程题
现假定左边是地址,右边的是内容
1.它的功能是以50H为首地址,个数为0AH个的RAM全部清零
2.机器码
7A 0A··········MOV R2,#0AH
mov rn的机器码是01111xxx,其中xxx由Rn的地址来决定,相应地,R0~R7二进制地址为000~111
那么R2就是010,后面的数据就跟着mov rn的机器码后面
7850··········MOV R0,#50H
E4 ···········CLR A;
机器码固定
F6 ·········LOOP:MOV @R0,A
mov @rn,a机器码为1111011n
n就是Rn的n
所以间接寄存器寻址只能是R1或R0
08 ············INC R0
inc rn机器码为00001xxx
xxx同理为Rn的物理地址
DA__ ···········DJNZ R2,LOOP
djnz rn机器码11011xxx
xxx同理为RN的物理地址
loop为8位地址标号
机器码是以loop为首的第一个指令离loop的单元数
所以djnz r2,loop的loop不能放在此后超过255字节的程序空间单元
题中loop:后面跟有MOV @R0,A占1个内部ram单元,INC R0占1个内部ram单元,DJNZ R2占1个内部ram单元(由机器码可得),所以255-3=252=FCH
即机器码为DAFC
···········DONE:
3.对于第三个问题,楼上的方法有误
,R0和R2有可能在00H~A0H
而且你只是把0~10放入50H~5AH单元
所以可以这样
SETB RS1
SETB RS0;R0工作在18H单元
MOV A,#50H
MOV R2,#10
MOV R0,#0
LOOP:
MOV @R0,A
INC A
INC R0
DJNZ R2,LOOP
经仿真无误
⑨ 【高分,在线等】单片机C51程序编程,初学的简单题目
#include<reg51.h>
void main(void)
{
unsigned char shuzhu[5]={1,2,1,3,5}; //随便设的数
unsigned char i,j,t;
for(j=0;j<4;j++)
for(i=0;i<=4-j;i++)
if(shuzhu[i]>shuzhu[i+1])
{
t=shuzhu[i];shuzhu[i]=shuzhu[i+1];shuzhu[i+1]=t;
}
}
用冒泡法就行了
⑩ 51单片机编程题,帮我编个程序。
;采用中断比较好
ORG 0000H
LJMP MAIN
ORG 001BH ;定时器1中断矢量地址
LJMP T1_ISR ;转到中断子程序处执行
ORG 0030H
MAIN: MOV TMOD,#20H ;采用定时器方式2,8位自动重载
MOV TH1,#6 ;由于周期500u,故高低电平均持续250u
MOV TL1,#6 ;计算得定时初值,定时250u
MOV R0,#4 ;置循环次数,4x250u=1m
SETB EA ;开总中断
SETB ET1 ;开定时器1中断
SETB TR1 ;启动T1
SJMP $ ;空循环
;中断子程序
T1_ISR: CPL P1.1 ;P1.1取反
DJNZ R0,OUT ;检测是否计数四次,不够则退出
MOV R0,#4 ;四次已到,给R0重新赋值
CPL P1.0 ;P1.0取反
OUT: RETI ;返回主程序
END
proteus 仿真通过