
看看下面的程序,是不是最简单:
ORG 0000H
SETB TR0 启动T0
MOV R2, #250 定时计数初值
LOOP:
MOV TH0, #(8192 - 8000) / 32 定时8ms
MOV TL0, #(8192 - 8000) MOD 32
JNB TF0, $ 等待8ms
CLR TF0
DJNZ R2, LOOP 每隔8ms,R2减一次一
CPL P1.0 R2为0则LED亮灭转换
LJMP 0000H
END
本程序,已经实验成功。
我来试试吧,用汇编语言编写:ORG 0
JMP MAIN
MAIN:SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
JMP MAIN
DELAY:MOV R1,#10 500ms的延时子程序
MOV TMOD,#1 定时器0方式1
AGAIN:MOV TL0,#LOW(65536-50000)装载计数初值的低位
MOV TH0,#HIGH(65536-50000) 装载计数初值的高位
SETB TR0 启动
LOOP1:JBC TF0,LOOP2查询并清除溢出位
JMP LOOP1
LOOP2:DJNZ R1,AGAIN
CLR TR0
RET
END
刚才我拿51的测试板编译了一下,下载后可以正常运行,你直接拷贝应该就能用,嘻嘻
你的注释有的有错误,现重新更正如下ORG 0000H
AJMP START
ORG 001BH 外中断1入口地址
AJMP INT_T1
ORG 0100H
START:
MOV SP,#60H;设置堆栈深度
MOV TMOD,#10H 置T1为方式1
MOV TL1,#00H 延时50mS的时间常数
MOV TH1,#4BH
MOV R0,#00H;表格计数器
MOV R1,#20;1s计数器即20*50ms=1000ms=1s,得到所需要定时时间1s
SETB TR1;打开定时器1
SETB ET1:允许定时器1中断
SETB EA 开总中断
SJMP $:等待
INT_T1: T1中断服务子程序
PUSH ACC 保护现场
PUSH PSW
PUSH DPL
PUSH DPH
CLR TR1 关定时器
MOV TL1,#00H 重新载入计数初值
MOV TH1,#4BH
SETB TR1 再次打开定时器
DJNZ R1,EXIT;判断是否到达20个50ms,如果没有则继续循环
MOV R1,#20 重新载入1s计数值
MOV DPTR,#DATA 置常数表首地址 MOV A,R0 置常数表偏移量
MOVC A,@A+DPTR 读常数表
MOV P1,A 这里中的A决定是什么花色,也就是显示什么
INC R0;指向下一个数
ANL 00,#07H;
EXIT:
POP DPH 恢复现场
POP DPL
POP PSW
POP ACC
RETI
LED显示常数表
DATA: DB 0FAH,0F5H,0AFH,05FH,0AAH,55H,00H,0FFH
END
总的来说显示什么样的花色是由你提前计算好,然后将对应的值放入表格中。比方说,你的led是共阴极接法,那么你要L1和L3亮就要给p1口送00000110B,这个值放到表格中等你用的时候从表格中取出来就行了
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)