课程设计,我只放代码,代码借鉴网上某位师兄的,其中有些错误,做了修改,并自己写了很多注释,适合小白阅读。不熟悉汇编,可能有纰漏,不过代码亲测可用,在学校机房试过了。注释只供借鉴,请禁止抄袭,代码请随便用。为51单片机的
DIRLOP EQU 38H //显示字节数
DISP0 EQU 39H //串行显示寄存器0
DISP1 EQU 3AH //串行显示寄存器1
DISP2 EQU 3BH //串行显示寄存器2
LDAN EQU 58H //电灯亮度档值
T2H EQU 59H //T1高8位定时值存储器
T2D EQU 5AH //T1低8位定时值存储器
LAMP EQU P1.2 //电灯控制位
ORG 0000H
; 复位
; ORG 是汇编的伪指令 告诉编译器我的代码放在什么位置
; 在单片机复位的时候 在你没有做任何改变的时候 程序指针会是指向00000H的地址
; 所以我们把 START 卸载地址00H 让单片机复位后直接跳转到 START的程序段去执行
AJMP START
ORG 000BH
; 000BH是定时器T0中断源入口地址
LJMP TIME1 //T0中断程序(产生PWM基频)
ORG 001BH
; 001BH是定时器T1中断源入口地址
LJMP TIME2 //T1中断程序(控制脉冲宽度)
ORG 0030H
; ORG 30H 是你程序的代码开始地址,由于30H以前有中断向量入口和寄存器的地址,所以一般用户程序都是从30H开始的。
START:SETB LAMP //程序初始化
MOV A,#0
MOV LDAN,A
MOV DISP0,A
MOV DISP1,A
MOV DISP2,A
; 将电灯亮度档值、串行显示寄存器0、1、2的初始值都设置为0
MOV TMOD,#11H //设定两定时器为16位定时器
; 11H --> 0001 0001 TMOD,设置两个定时器,
; GATE为0,表示“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。
; C/T为0,为定时功能
; M1 M0 --> 0 1 ,为方式1,16位定时器/计数器
MOV IE,#10001010B //开启两定时器的中断请求
; 51单片机中断允许寄存器IE
; 设置为1,为开,设置为0,为关;
; D7:全局中断位,1,开; 1
; D6:无效位; 0
; D5:定时/计数2(52单片机) 0
; D4:串行口中断,0,关 0
; D3:定时/计数1,1,开 1
; D2:外部中断1,0,关