8051单片机汇编程序设计例题(持续更新)

文章展示了五个编程示例,涉及延时、查表、定时脉冲生成以及使用定时器T0和T1进行外部计数与控制,通过定时/计数器功能实现不同周期和脉冲输出,适用于初学者了解基本的硬件操作和中断管理。
摘要由CSDN通过智能技术生成

文章目录


例题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
	  	  

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值