文章目录
例题1:写一个常用延时程序
ORG 00H //起始位置
LCALL YASH20 //调用子程序
SJMP $ //死循环
YASH20: MOV R7, #100 //100->R7,外循环
AA0: MOV R6, #49 //49->R7,内循环
AA1: NOP //空指令延时
NOP
DJNZ R6, AA1 // -1如果R6不为0,跳转到 AA1
NOP
DJNZ R7, AA0 // -1如果R7不为0,跳转到 AA0
NOP
RET //返回
END
例题2:写一个查表程序
ORG 00H
MOV R0, #0BH ; //设(R0)=0BH,索引
MOV A, R0 ; //读数据
ANL A, #0FH ; //屏蔽高4位
MOV DPTR, #TAB ; //置表格首地址
MOVC A, @A+DPTR ; //查表
MOV R0, A ; //回存
SJMP $ //循环
ORG 50H
TAB: DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H, 38H, 39H ; //0~9的ASCII码
DB 41H, 42H, 43H, 44H, 45H, 46H ; //A~F的ASCII码
END
例题3:利用定时/计数器 T0 从 P1.0 输出周期为 1s,脉宽为 20ms 的正脉冲信号,晶振频率 为 12MHz,试设计程序。
TMOD格式
分析
-
选择T0,即低4位控制
-
设置定时器 ---- C/T* = 0
-
工作方式1 ---- M1/M0 = 01H
-
内部中断 ---- GATE = 0
所以TMOD设置为01H
计算初值:(2^16– X)× 12 ÷ 晶振频率 = 定时时间(默认单位us)
X = 65536 - 20000 = 45536 = 4E20H
ORG 0000H
AJMP MAIN //跳转主程序
ORG 0030H
MAIN: MOV TMOD, #01H //T0工作方式1
MOV TH0, #4EH //装入初值
MOV TL0, #20H
LP0: SETB P1.0 //高电平产生脉冲信号
ACALL NT0 //跳转NTO
CLR P1.0 //结束正脉冲信号
MOV R7,#49H //设置循环49次
LP1: ACALl NT0 //跳转NT0
DJNZ R7,LP1 //-1,若不为0,则跳回LP1
JNB LP0 //P1.0不为1,跳回LP0
NT0: MOV TH0,#4EH //延时20ms
MOV TL0,#20H
SETB TR0 //启动定时器T0
JNB TF0,$ // 等待T0溢出,继续执行指令
CLR TR0 //停止定时器 T0
CLR TF0 //清除定时器 T0 的溢出标志
RET
END
例题4:要求从P1.1引脚输出1000Hz方波,晶振频率为12MHz,试设计程序
分析:
- 定时器T0 — 低4位控制
- 设置定时器 ---- C/T* = 0
- 方式1 ------- M1/M0 = 01H
- 内部中断 -----GATE =0
TMOD设置为01H
计算初值:(2^16– X)× 12 ÷ 晶振频率 = 定时时间(默认单位us)
周期为 1ms ,方波一个周期内,高低电平各站50%,所以延时0.5ms = 500us
X = 65536 - 500 = 65036 = FE0CH
ORG 0000H
AJMP MAIN //跳转主程序
ORG 000BH //T0中断入口
LJMP DVT0 //跳转中断服务程序DVT0
ORG 0030H
MAIN: MOV TMOD, #01H //工作方式1
MOV TH0,#FEH //装入初值
MOV TL0,#OCH
SETB ET0 // T0中断开启
SETB EA //全局中断开启
SETB TR0 //启动T0定时器
SJMP $ //等待中断
DVT0: CPL P1.1 //反转引脚
MOV TH0,#0FEH
MOV TL0,#0CH
SETB TR0
RETI
END
例题5:试用定时器/计数器T1对外部时间计数,要求每计数100,就将T1改为定时器,控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数器模式,如此反复,设晶振频率为12MHz。
分析:
选择T1计数器工作在方式2
TMOD = 60H
选择T1定时器工作在方式1
TMOD = 10H
计算定时器初值:(65536 - X)* 12 ÷ 晶振频率 = 10000
X = 55536 = D8F0H
计算计数器初值:X = 256 - 100 = 156 = 9CH
ORG 0000H
AJMP MAIN
ORG 001BH
LJMP DVT1
ORG 0030H
MAIN: MOV TMOD, #60H //设置计数器T1工作方式2
MOV TH1, 9CH //装入初值
MOV TL1, 9CH
CLR P1.7 //清零
SETB ET1 // 打开T1中断
SETB EA // 打开总中断
SETB TR1 // 启动T1
SJMP $ //等待中断
DVT1: SETB P1.7 //脉冲信号
CLR ET1 // 关闭T1中断
CLR TR1 // 关闭T1
MOV TMOD, #10H //设置定时器T1工作在方式1
MOV TH1, 0D8H //装入初值
MOV TL1, 0D8H
SETB TR1 //开启T1
JNB TF1, $ //查询等待10ms
CLR TF1 //溢出位清零
CLR TR1 //关闭T1
CLR P1.7 // 反转引脚
MOV TMOD, #60H //T1工作于方式2
MOV TH1, 9CH //装入初值
MOV TL1, 9CH
SETB ET1 //开启T1中断
SETB TR1 //启动T1
RETI //中断停止
END