汇编程序

晶振6MHZ,要求AT89S51单片机的P1.1口输出周期为20ms的方波。(采用T0方式1)

//晶振6MHZ,Tcy=2us 
//T0方式1,T=20ms方波,计算初值X :(2^16-X)*2*10^(-6)=10*10*(-3)  		初值X=60536=EC78H
//T0方式1   MOV  	TMOD, #01H
中断方式:
ORG  0000H
AJMP	MAIN
ORG	000BH
AJMP	INT_T0
ORG 	0030H
MAIN:
MOV  TMOD,#01H	;T0方式1
MOV TH0,#0ECH	;加载初值
MOV TL0,#78H
SETB EA			;开CPU及T0中断
SETB T0
SETB TR0		;启动T0工作
SJMP $
INT_T0:
MOV TH0,#0ECH;
MOV TL0.#78H
CPL P1.1 		;P1.1输出,信号取反
RETI
END

查询方式:
MOV	TMOD,#01h
MOV TH0,#0ECH
MOV TL0,#78H
SETB TR0
WAIT:
JNB  TF0,WAIT
CLR TF0
CPL P1.1
SJMP WAIT

编程将AT89S51单片机外部RAM的4000H~40FFH单元,共256个单元清零

ORG  0000H
SJMP MAIN
ORG 0030H
MAIN:
MOV DPTR,#4000H
MOV R7,#00H
CLR A
LOOP:
MOVX DPTR,@A
INC DPTR
DJNZ R7,LOOP
SJMP	$  ;SJMP $的作用相当于C中的while(1)程序在 原地执行,SJMP占两个字节,SJMP rel;PC+2→PC然后PC+rel→PC这里rel是相对地址 编译器编译时会自动的算出他相对此时相对(PC)的地址,就如你说的SJMP $这里美元符号指的是当前的地址,就是说要跳转到当前地址,假设你SJMP的其实地址是1000H,同时这个指令时占两个字节所以执行后程序计数器指向了1002H那么现在我们的美元符号指在刚才的当前地址1000H,所以这里相对地址就应该是-2,这个编译器自动完成。
EMD

将外部RAM4000H~401FH单元,共32个字节传送到以40H为首地址的内部RAM中

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV DPTR,#4000H
MOV  R0,#40H
MOV R7,#32
LOOP:
MOVX A,@DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R7,LOOP
RET
END

6MHZ晶振,由P1.0输出周期为2ms方波,T0工作在方式2

//Tcy=2us,方式2最大定时为256*2*10^(-6)=512us,取500us为定时值
中断方式
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INT_T0
ORG 0030H
MAIN:
MOV TMOD,#02H
MOV TH0,#06H
MOV TL0,#06H
SETB EA
SETB ET0
SETB TR0
MOV R0,#00H
LOOP:
SETB P1.0
INC R0
SJMP $
INT_T0:
CJNE R0,#02H,LOOP
MOV TH0,#06H
MOV TL0,#06H
CPL P1.0 
RETI
END

晶振6MHZ,P1.0引脚输出T=2ms方波。(T0方式1)

//初值  (2^16-X)*10^(-6)=1*10^(-3)  X=65036→FE0C
ORG 0000H
AJMP MAIN
ORG 0013H
AJMP INT_T0
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#0FEH
MOV TL0,#0CH
SETB EA
SETB ET0
SETB TR0
SJMP $
INT_T0
MOV TH0,#0FEH
MOV TL0,#0CH
CPL P1.0
RETI
END
查询方式:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#0FEH
MOV TL0,#0CH
SETB TR0
LOOP:
JNB TF0,LOOP
CLR TR0
CLR TR0
CPL P1.0
SJMP MAIN
RET

晶振6MHZ,编写T0产生1s定时的程序

//方式0:最大定时16.384ms
//方式1:最大定时131.072ms
//方式2:最大定时512us
//采取方式1,每隔100ms中断一次,中断10次为1s
//计算初值: (65536-X)*2*10^(-6)=0.1  X=15536=3CB0H
ORG 0000H
AJMP MAIN
ORG 0013H
AJMP INT_T0
ORG 0030H
MOV SP,#60H      		  ;设置堆栈指针
MAIN: 
MOV R7,#0AH   		      ;设置循环次数
MOV TMOD,#01H			  ;T0方式1
MOV TH0,#3CH				;加载初值
MOV TL0,#B0H
SETB EA				;开中断
SETB TR0
SETB ET0
SJMP $					;原地等待
INT_T0: 				
MOV TH0,#3CH   	;初值重装载 
MOV TL0,#B0H
DJNZ R7,RETURN		;未记满10次中断返回
CLR TR0					;关T0
SETB F0				;标志位置1
RETURN:RETI

扩展一个负跳沿触发的外部中断源,把T0引脚作为外部中断请求输入端,溢出标志TF0作为外部中断请求标志

ORG 0000H
AJMP MAIN
ORG 0013H
AJMP INT_T0
ORG 0030H
MAIN:
MOV TMOD,#06H   ;计数器模式,方式2
MOV TH0,#0FFH	;加载初值
MOV TL0,#0FFH
SETB EA		;开中断
SETB TR0
SETB ET0
INT_T0:
......
中断服务函数
......
//当连在T0引脚的外部中断请求输入线上的电平发生负跳变时,TL0加1,产生溢出,TF0置1,向单片机发出中断请求

T0(P3.4)引脚发生负跳变时,作为P1.0引脚产生方波的启动信号,则开始从P1.0引脚上输出一个周期为1ms的方波。系统时钟6MHZ

//T0方式2,
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT_T0
ORG 001BH
AJMP T0_P
ORG 0030H
MAIN:
MOV SP,#60H
MOV TMOD,#26H		;T1方式二,定时模式;T0方式二,计数模式
MOV TH1,#06H		
MOV TL1,#06H
MOV TH0,#0FFH
MOV TL0,#0FFH
SETB EA
SETB EX0
SETB TR0
SJMP $
INT_T0:
MOV TH1,#06H
MOV TL1,#06H
SETB ET1
SETB TR1
SJMP $
RETI
T0_P:
MOV TH1,#06H
MOV TL1,#06H
CLP P1.0
RETI
END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值