应用1:设有51应用系统连接如附图。试说明该系统分别执行如下程序段A和程序段B时,与P1.0端口连接的LED如何显示变化?对应程序段A和程序段B的显示变化有何区别?
本文引用地址:https://www.eepw.com.cn/article/201611/321807.htm程序段A:
LP: CPL P1.0
MOV R0,#0
DJNZ R0,$
JMP LP
程序段B:
LP: SETB P1.0
DJNZ R0,$
CLR P1.0
DJNZ R0,$
DJNZ R0,$
JMP LP
答:对应程序段A和程序段B,LED都将周期性变换亮灭状态。每个亮灭变换周期内,对程序段A,LED持续亮的时间与持续灭的时间长度相同;对程序段B,LED持续亮的时间是持续灭的时间长度的2倍。程序段B时的LED亮灭周期约为程序段A时的LED亮灭周期的1.5倍。
应用2:设有51应用系统连接如应用1附图,且系统所用晶振频率为12MHz。试编写程序段应用51单片机的定时/计数器1实现连接在P1.0上的LED的显示状态每隔10秒钟翻转一次。
答:
MOV TMOD,#20H;T1定时方式2:8位自动重装入
MOV TH1,#(256-250) ;定时周期250us(对应12MHz晶振,每个机器周期=1us)
MOV TL1,TH1;
CLR TF1;清T1溢出标志
SETB TR1;启动T1计时
MOV R0,#0;R0用于累计T1溢出的次数
MOV R1,#0;R1用于累计R0达到200的次数
LP:JBC TF1,L1;如果TF1为1则清零TF1并转去进行溢出次数累计
JMP LP;循环等待T1溢出
L1:INC R0;累计T1溢出次数
CJNE R0,#200,LP;未达到200次则转去等待下一次溢出
MOV R0,#0;确保R0的值在0~199之间
INC R1;累计时间达到50ms的次数(250us*200=50ms)
CJNE R1,#200,LP;累计时间未达到10s则转去等待下一次溢出
MOV R1,#0;确保R1的值在0~199之间
CPL P1.0;累计时间已达到10s,则翻转P1.0状态1次(50ms*200=10s)
JMP LP;继续循环累计时间
评论