A. mcs-51单片机程序中可以直接调用中断服务程序吗为什么
这样给你说吧。当单片机运行起来的时候是高速运转你while(1)里面的程序。但是这样是不够的,比如你想把某个信号传递给单片机让它处理,比如说:你按了某个键来控制某个灯的亮灭,这时候就需要单片机来响应你的动作,响应的方式就是中断。也就是说你在主程序中完成了某个中断的触发条件时,当达到这个条件时程序就会跳转到中断服务函数中去,执行完中断服务函数中的程序后再返回主程序中继续循环执行。你说的调用其实不太正确,中断服务函数只能触发,它是由单片机内特定的某些寄存器的标志位控制的,当这些满足触发条件的时候,标志位被硬件置1,然后自动执行你编写的中断服务函数。
说的不是很清楚,请见谅,中断是单片机内最重要的功能之一,与之对应的还有定时器(这是单片机的心脏),这些内容在51里面都是很简单的,但是到了32位单片机里面会变得特别复杂。
希望这些内容能给你一些帮助。
B. 关于一个mcs-51单片机的程序,有个地方不懂,请教一下大家。
MOV 10H,#5 ;向地址为10H(也就是工作寄存器区2的R0)的内部RAM中写入立即数5
MOV 11H,#16 ;向地址为11H(也就是工作寄存器区2的R1)的内部RAM中写入立即数16(16进制的10H)
刚才只看了你最后的提问,没搞清你的意思。
DISP子程序中,前三句是查表获得LED数码管段码的数据。
MOV DPTR,#DISPC
MOV A,@R0
MOVC A,@A+DPTR
由于开始时R0的内容是10H,间接寻址就将10H的内容05H送给A,第三句就得到了码表中的数92H,也就是字符“5”;循环一次R1变为11H,第三句得到0BFH,也就是“-”。
所以这两句就是送初值的。
不好意思。
C. mcs-51单片机用户主程序一般不应占用哪段程序存储区域,为什么
不应占用的是0003H 至002FH这段区域。因MCS-51单片机五个中断源所对应的入口地址都分布在这段区域,分别为:0003H(外部中断0)、000BH(定时器0)、0013H(外部中断1)、001BH(定时器1)、0023H(串行)。
D. MCS51单片机。简述P0口作为I/O使用时的数据输入输出过程。
摘要 多路开关:在51单片机中,当内部的存储器够用(也就是不需要外扩展存储器时,这里讲的存储器包括数据存储器及程序存储器)时,P0口可以作为通用的输入输出端口(即I/O)使用,对于8031(内部没有ROM)的单片机或者编写的程序超过了单片机内部的存储器容量,需要外扩存储器时,P0口就作为‘地址/数据’总线使用。那么这个多路选择开关就是用于选择是做为普通I/O口使用还是作为‘数据/地址’总线使用的选择开关了。大家看上图,当多路开关与下面接通时,P0口是作为普通的I/O口使用的,当多路开关是与上面接通时,P0口是作为‘地址/数据’总线使用的。
E. 简述MCS51单片机中程序状态寄存器PSW各位的含义。
PSW即程序状态寄存器,Program
Status
Word。
PSW各位的定义如下:
Cy(PSW.7):即PSW的D7位,进位、借位标志。进位、借位CY=1;否则CY=0.
AC(PSW.6):即PSW的D6位,辅助进位、借位标志。当D3向D4有借位或进位时,AC=1;否则AC=0.
F0(PSW.5及PSW.1):即PSW的D5位,用户标志位;
RS1及RS0(PSW.4及PSW.3):即PSW的D4、D3位,寄存器组选择控制位;
OV(PSW.2):溢出标志。有溢出OV=1,否则OV=0;
F1(PSW·1):保留位,无定义;
P(PSW·0):奇偶校验标志位,由硬件置位或清0;存在ACC中的运算结果有奇数个1时P=1,否则P=0。
F. MCS-51单片机查表程序
16和7是查表指令时的PC与数据表格之间的字节数
MOV A ,@R0 ;取R0指向的地址中的数据到A
ANL A,#0FH ;高四位清零
ADD A,#16 ;加16
MOVC A, @A+PC ;查表,表的首地址为绝对地址PC+A
MOVC A,@A+PC就需要1个字节啊
查表指令距离表首地址的长度是字节数
用DPTR的汇编程序:
ORG 0100H
MOV 30H,#12H
MOV 31H,#34H
MOV 32H,#56H
MOV 33H,#78H
LCALL SUBRTE
ORG 1000H
SUBRTE: MOV R0,#30H ; ;置地址指针R0初值
MOV R1,#40H ; ;置地址指针R1初值
MOV R2,#4 ; ;置字节数
LOOP: MOV A,@R0 ; ;取16进制数
ANL A,#0FH ; ;屏蔽高4位
MOV DPTR,#TABLE ; ;
MOVC A,@A+DPTR ; ;查表低4位转换为ASCⅡ码
MOV @R1,A ; ;送结果
INC R1 ; ;修改指针
MOV A,@R0 ; ;从新取16进制数
SWAP A ; ;高4位与低4位互换
ANL A,#0FH ; ;取高4位
ADD A,#7
MOVC A,@A+PC ; ;查表高4位转换为ASCⅡ码
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
DEC R1
RET
TABLE: DB '012345678'
DB '9ABCDEF'
END
G. MCS_51单片机编制程序,时钟周期,题目如下
#include "reg51.h"
void initTimer(void)
{
TMOD=0x1; // 你提出的问题 在这里。 50ms采用定时方式1.
TH0=0x9e;
TL0=0x58;
}
void timer0(void) interrupt 1
{
TH0=0x9e;
TL0=0x58;
//这里添加你的代码
}
void main(void)
{
initTimer();
TR0=1;
ET0=1;
EA=1;
}
H. MCS-51单片机程序设计
周期2ms,占空比1:2,,也就是说高电平667us,低电平1333us,你的定时器参数分别为:
TGH=(65536-667)/256;
TGL=(65536-667)%256;
TDH=(65536-1333)/256;
TDL=(65536-1333)%256;
在中断服务程序里交替用这两个参数给TH0和TL0赋值,对P1.0取反就可以了。
#include<reg51.h>
#define uchar unsigned char
uchar tgh,tgl,tdh,tdl;
bit flag;
sbit p10=P1^0;
void t0isr() interrupt 1
{
if(flag)
{
TH0=tgh;
TL0=tgl;
p10=0;
flag=~flag;
}
if(!flag)
{
TH0=tdh;
TL0=tdl;
p10=1;
flag=~flag;
}
}
main()
{
TMOD=0x01;
tgh=(65536-667)/256;
tgl=(65536-667)%256;
tdh=(65536-1333)/256;
tdl=(65536-1333)%256;
TH0=tdh;
TL0=tdl;
TR0=1;
ET0=1;
EA=1;
while(1);
}
I. 51单片机的程序其他单片机可以用吗
MCS51内核的单片机程序,是不能在非MCS51内核的单片机上使用的,同属MCS51内核的单片机,有部分型号的程序是可以通用的。
因为不同内核架构的单片机,其存储区分配、寄存器地址、中断地址、程序入口、堆栈等均不相同,编译器对程序的处理也有差别。
如果想要将将MCS51单片机的程序移植到其他单片机上,通常需要按照如下步骤:
1.
更换相对应的编程软件、编译环境(视实际情况,有很多编程软件支持很多不同的单片机,如51的程序移植到stm32,keil也可实现,不用更换编程软件);
2.
修改底层操作部分的代码,如寄存器配置、中断入口等,同时尽量保证程序各函数名、接口名等与原来的一致;
3.
拷贝逻辑部分代码,根据不同的单片机功能,调整控制逻辑、顺序等,同时确保时钟、堆栈等符合程序要求;
4.
软硬件仿真、上机测试、debug等。。。
因单片机间肯定有很多差异,移植程序时,需要对两张单片机均匀一定程度的了解,避免未知因素影响。
J. MCS-51单片机的程序储存器地址是如何划分的分别如何访问片内、片外程序储存器
MCS-51单片机的片内程序储存器和片外程序存储器地址是受EA引脚控制的,如果EA引脚接地,则只能访问片外程序存储器,如果EA接高电平,则先访问片内程序存储器,当地址高于片内程序存储器地址(0FFFH)时,自动访问片外程序存储器