还是关于80C51单片机的问题!程序如下:我想知道运行出来的结果以及我的那些疑问!在这里先说句谢谢了……

2024-12-18 17:52:18
推荐回答(4个)
回答1:

建议你先去看几本书,首先是《微机原理》,里面有将单片机部分的,偏硬件一些,然后是《单片机C51程序设计》马忠梅版的,偏软件设计一些。就是先让你对单片机的片内结构有个认识,然后再说程序的事情。

ORG 0000H
LJMP MAIN (跳转到 MAIN 这个程序段)
ORG 0023H (确定了串行口的工作方式) 怎么才能确定?//这里不是确定了串行口的工作方式,是确定了串口中断的地址映射入口

//从这开始到MAIN前面是中断子程序
CLR RI (对 RI 进行清零 但作用是什么呢?//作用是手动清除接收中断标志位)
MOV A, SUBF (传送数据给累加器A)
MOV P2,A (再将A中的数据给 P2 口 ) 这是一个什么样的过程呢? //这个过程是单片机自己完成的,程序员不用关心,是通过数据总线走的
RETI
ORG 0040H (0040H 是怎么确定的?)//这里的40H是程序人工的定位到ROM里40H开始的地址单元处,你也可以定义在其他有效范围内
MAIN: MOV SP,#5FH (为什么要设置堆栈指针呢 作用又是什么呢?//单片机一般都有一个堆栈,作用是保存环境变量的,设置堆栈指针的作用是避免数据对冲了)
MOV TMOD,#20H (这是什么意思?//TMOD是寄存器)
MOV TH1,#0FDH (同上 //同上)
MOV TL1,#0FDH (同上 //同上)
MOV PCON,#00H (电源控制寄存器 复位?原因是什么//这里不能理解为复位,是设置串口波特率是否翻倍的,也是寄存器操作)
SETB TR1 (对TR1 置1设置 原因是? //去看寄存器的使用方法)
MOV SCON,#50H (不知道这是在干什么 //寄存器)
SETB EA (中断总开关置1)
SETB ES (对中断开关置1 )
SJMP $
END

回答2:

0023H 串行口中断入口地址,串行口中断时从此地址开始执行程序
CLR RI 清除接收中断
MOV P2,A 接收的数据送到A,再从A输出到P2口显示SUBF-A-P2
ORG 0040H主程序应该在中断入口程序以后,一般0030H以后就可以具体看你的中断程序用了多少空间
MOV SP,#5FH 堆栈指针这个程序好像没用到,设置谁防止用堆栈的时候把原来的数据覆盖掉,所以堆栈应该放到一个用不到的地方
MOV TMOD,#20H 计时器工作模式
MOV TH1,#0FDH 计时器初始值
SETB TR1开始计时
MOV SCON,#50H 串行口工作方式
其实所有内容书上都有,希望你会喜欢上单片机

回答3:

程序虽然简短,涉及面较广,在书里面,涵盖三~四章的内容。
开始觉得难,慢慢学,不用急。
下面的简单说明一下,楼主还是应该看书.

ORG 0000H ;0000H是开机复位后起始地址,这是固定的.
LJMP MAIN ;跳转到 MAIN 程序段.
;-------------------------------
ORG 0023H ;0023H是串行口中断的入口地址,这也是固定的.
;下面写的就是串行口中断程序.
CLR RI ;RI=1才发生的串口中断,必须清零,否则中断就没有个完了.
MOV A, SUBF ;取出串口收到的数据.
MOV P2,A ;送到P2口,外接LED就能显示.
RETI ;中断程序结束,返回主程序.
;-------------------------------以上几行是串口中断程序.

ORG 0040H ;0040H 是怎么确定的?,离开0023H几十字节即可.
MAIN:MOV SP,#5FH ;设置堆栈指针,为中断过程准备存储地址的空间.
;-------------------------------
MOV TMOD,#20H ;这是什么意思?这三条,是设置定时器的工作方式.
MOV TH1,#0FDH ;(同上) 用来控制波特率.
MOV TL1,#0FDH ;(同上).
SETB TR1 ;对TR1置1,即为启动定时器.
;-------------------------------以上四行,是针对定时器的.

MOV SCON,#50H ;设置串行口的工作方式.
;在这里指定了用定时器1,控制波特率.
MOV PCON,#00H ;这也是用来控制波特率的.
;-------------------------------以上二行,是针对串行口的.

SETB EA ;中断总开关置1,即开放总中断.
SETB ES ;串口中断开关置1,即开放串口中断.
;-------------------------------以上二行,是针对中断系统的.

SJMP $ ;等待中断的发生.
;如果串口收到数据,立即转到0023H.
;在0023H执行时,遇到RETI,就返回到这里.

END

回答4:

ORG 0000H
LJMP MAIN 跳转到 MAIN 这个程序段
ORG 0023H 串行中断入口地址
CLR RI 接收中断标志清零
MOV A, SUBF 从串口缓冲sbuf读数据
MOV P2,A 把读到的数据送到p2口
RETI
ORG 0040H 这个地址没特殊要求30H也可以
MAIN: MOV SP,#5FH 设置堆栈指针,因为sp初始化时指向07H,与工作寄存器组重合
MOV TMOD,#20H 定时器1工作方式1,设置串行通信波特率
MOV TH1,#0FDH (同上)
MOV TL1,#0FDH (同上)
MOV PCON,#00H smod位设成0,波特率不加倍
SETB TR1 开定时器1中断
MOV SCON,#50H 串行口工作方式1,10位异步
SETB EA 开总中断
SETB ES 开串行中断
SJMP $
END
程序功能就是从串口接收数据,放到p2口上。
建议楼主好好看看课本....