⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bringforthpulse.asm

📁 定时中断产生可调占空比方波脉冲,是用汇编语言编的
💻 ASM
字号:
/*本程序利用定时中断T0产生固定频率为200Hz的脉冲信号(在P1.1输出),通过示波器进行观察//
初始脉宽为高电平3ms,低电平2ms;占空比可通过按键循环调整,步进宽度为0.1ms//
编程思路:固定频率为200Hz的脉冲方波信号即脉冲周期为5毫秒,单片机采用12MHz
的晶体,T0用方式1,初始值高电平为65536-3000(即高电平持续时间为3毫秒),低电平为65536-2000(低电平持续2毫秒)
在单片机的P3.1上接一个高电平的持续时间增加的按键,在P3.5上接一个高电平持续时间
减小的按键,每按一次增加键时,高电平的定时初始值为65536-3000-100*按键的次数,
低电平的定时初始值为65536-2000+100*按键的次数;    每按一次减小键时,
高电平的定时初始值为65536-3000+100*按键的次数, 低电平的定时初始值为65536-2000-100*按键的次数;
用R0统计增加键按的次数,由于产生脉冲的周期是固定的最大为5毫秒,所以高定时的初始值最小也只
能为65536-5000,即当统计增加按键按下的次数超过20次时,就不能再统计了,同时将R1置0。
同理当用R1统计减小键按的次数时,当统计的次数超过30次时,就不能再统计了,同时将R0置0。
用R2作标志位,当R2==0时,定时器为高电平的定时时长,当R2不等于0时为低电平的定时量长
用30H,31H存放高电平的初始值(30H存高8位);用32H,33H存放低电平的初始值(33H为高8位)
 */

		org 0000h
		ajmp main
		org 000BH
		ajmp T0Interrupt
	   main:mov R0,#00H     ;用R0统计增加键按的次数
	        mov R1,#00H     ;用R1统计减小键按的次数
		mov R2,#00H     ;T0定时时长的标志位
		mov R3,#00H     ;用R3作按键标志,R3=1时,增加键按下,R3=2时减小键按下
		mov sp,#70H     ;将堆栈指针移位
                mov 30H,#48H    ;存放高电平定时初始值
		mov 31H,#0f4H
		mov 32H,#30H    ;存放低电平定时初始值
		mov 33H,#0f8H
	        call T0Init
	   loop:call key
		ajmp loop


                T0Init:             ;T0初始化子函数
		       setb ET0      ;为中断作准备
		       clr TF0       ;若采用中断模式,此语句可以不要
		       mov A,TMOD    ; T0模式设置为方式一,定时,不需外部控制,T1模式不变  
		       anl A,#0f0H
		       orl A,#01H
		       mov TMOD,A
                       mov A,31H      ;赋初始值,刚开始时,产生高电平(即65536-3000=62536)
		       mov TH0,A
		       mov A,30H
		       MOV TL0,A
		       setb P1.1          ;将P1.1输出置为高电平
		       setb TR0       ;定时计数器打开(即开始工作)
		       setb EA        ;中断打开
		       ret
	
         T0Interrupt:                ;T0的中断函数
                       clr EA         ;关中断
		       clr TR0        ;T0停止计数
		       mov A,R2       ;将R2的值取反
		       cpl A
		       mov R2,A
                       cjne R2,#00H,InfraPotential
                       mov A,31H      ;赋初始值,产生高电平
		       mov TH0,A
		       mov A,30H
		       MOV TL0,A
		       setb P1.1      ;P1.1输出高电平
		       ajmp  OkEnd
       InfraPotential: clr P1.1        ;P1.1输出低电平
                       mov A,33H      ;赋初始值,产生低电平
		       mov TH0,A
		       mov A,32H
		       MOV TL0,A
                 OkEnd:setb TR0       ;定时计数器打开(即开始工作)
		       setb EA        ;中断打开
		       reti

                  
                 key:  mov c,P3.1     ;按键子函数
                       jnc  R1INc00     ;如有按键跳到R1减1,如没有按键隹下继续检测P3.3
   	               mov c,P3.5     
                       jc  MidFinish      ;如有按键順序隹下执行对R0作加法,如没有按键则跳到子函数返回处
                       cjne R0,#1eH,R0Inc ;判断R0中的值是否加到30,没到30跳到R0Inc处执行
		       mov R0,#00H        ;R0中的值等于20将R0重新赋值为0 
		       mov 30H,#48H    ;存放高电平定时初始值
	 	       mov 31H,#0f4H
		       mov 32H,#30H    ;存放低电平定时初始值
		       mov 33H,#0f8H
		       ajmp waintKeyOpen0 ;跳到按键松开处
                R0Inc: inc R0             ;R0中的值加1
                       cjne R1,#00H,R1dec  ;2006.11.12增加的三条指令
                       ajmp R0Inc11
                R1dec: dec R1
		R0Inc11: mov B,#64H         
		       mov A,#01H  
		       mul AB             ;要将乘得的结果与30H,31H中值相加,32、33中的值减去乘得的结果
		       mov R7,A           ;将A中的值放入R7中,为作加减法作准备
		       mov R6,B           ;将B中的值放入R6中,为作加减法作准备
 ;*********************下面这一小段完成两个16位数加法
		       clr c
		       mov A,30H
		       add a,R7
		       mov 30H,A
                       mov A,31H
		       addc A,R6
		       mov 31H,A
 ;********************下面这一小段完成两个16位数减法
                       clr c
                       mov A,32H
		       subb A,R7
		       mov 32H,A
		       mov A,33H
                       subb A,R6
		       mov 33H,A
        waintKeyOpen0: mov c,P3.5         ;等待松开按键
	               jnc waintKeyOpen0
	     MidFinish:ajmp  finish    ;清0处理完毕跳到子函数返回处
             
   ;************下面这一小段对减法键按下进行处理 
	      R1INc00: cjne R1,#14H,INCR1 ;判断R1中的值是否加到30,没到30跳到DecR1处执行
	               mov R1,#00H        ;R1中的值等于30将R1重新赋值为0
                       mov 30H,#48H    ;存放高电平定时初始值
	 	       mov 31H,#0f4H
		       mov 32H,#30H    ;存放低电平定时初始值
		       mov 33H,#0f8H
		       ajmp waintKeyOpen1 ;跳到按键松开处
                INCR1: inc R1              ;R1中的值减1
                       cjne R0,#00H,R0dec  ;2006.11.12增加的三条指令
                       ajmp R1Inc
                R0dec: dec R0
		R1Inc: mov B,#64H 
		       mov B,#64H         
		       mov A,#01H  
		       mul AB             ;要将乘得的结果与30H,31H中值相加,32、33中的值减去乘得的结果
		       mov R7,A           ;将A中的值放入R7中,为作加减法作准备
		       mov R6,B           ;将B中的值放入R6中,为作加减法作准备
      ;*********************下面这一小段完成两个16位数加法
		       clr c
		       mov A,32H
		       add a,R7
		       mov 32H,A
                       mov A,33H
		       addc A,R6
		       mov 33H,A
 ;********************下面这一小段完成两个16位数减法
                       clr c
                       mov A,30H
		       subb A,R7
		       mov 30H,A
		       mov A,31H
                       subb A,R6
		       MOV 31H,A	                           
        waintKeyOpen1: mov c,P3.1     ;等待松开按键
	               jnc waintKeyOpen1    	               
               finish: ret             ;子程序返回
                  
  	               end 
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -