51 单片机流水灯、定时器中断测试代码例程
我的公众号目前已搁置(临近注销),所以我将以前所写的文章转移到博客园。
此篇公众号文章创建于 2019-11-23 16:39,内容后期无修改。
不会创建工程的可以跳转:Keil C51 工程的创建(新手向)
例程可能只适用于我购买的单片机开发板,并不完全适合所有 51 单片机,使用测试例程前请检查该程序是否和您的单片机符合,若不符合请根据您的单片机具体情况更改程序。
流水灯测试例程
例程效果:无需解释,就是流水灯
C 语言代码
#include <intrins.h> // 需要用到左右移函数
#include <reg52.h>
#define LED P2
// 延时函数
void delay(unsigned int i) {
while (i--);
}
void main(void) {
unsigned char i;
LED = 0xfe; // 1111 1110
delay(50000);
while (1) {
for (i = 0; i < 7; i++) {
LED = _crol_(LED, 1); // 左移
delay(50000);
}
for (i = 0; i < 7; i++) {
LED = _cror_(LED, 1); // 右移
delay(50000);
}
}
}
汇编代码
ORG 0000H
MOV A, #0FEH
MAIN: MOV P2, A ; LED1 亮
ACALL DELAY
WHILE: MOV B, #7 ; 赋值移动次数 7 次
LEFT: RL A ; 左移
MOV P2, A
ACALL DELAY ; 调用延时
DJNZ B, LEFT
MOV B, #7 ; 再次赋值 7 次
RIGHT: RR A ; 右移
MOV P2, A
ACALL DELAY ; 调用延时
DJNZ B, RIGHT
AJMP WHILE ; 循环
DELAY: MOV R0, #0FFH ; 延时
DL2: MOV R1, #0FFH
DL1: NOP
NOP
DJNZ R1, DL1
DJNZ R0, DL2
RET
END
定时器中断测试例程
例程效果:和上述流水灯效果很类似,只不过这个是单向流水灯
C 语言代码
#include "reg52.h"
#include "intrins.h"
#define LED P2
void main(void) {
LED = 0xFE; // 最低位 led 亮
TMOD |= 0X10; // 定时器 1 方式 1
TH1 = 0X3C;
TL1 = 0XB0;
ET1 = 1;
EA = 1; // 开启总中断开关
TR1 = 1; // 开启 T1 开关
while(1);
}
void Timer1() interrupt 3 {
TH1 = 0X3C;
TL1 = 0XB0;
LED = _crol_(LED, 1); // 左移
}
汇编代码
ORG 0000H
MAIN: MOV A, #0FEH
WHILE: MOV P2, A
MOV TMOD, #010H ; 定时器 1 方式 1
MOV TH1, #03CH
MOV TL1, #0B0H
SETB TR1 ; 启动 T1 工作
WAIT: JBC TF1, START ; 等于 1 时,则清零并跳转
SJMP WAIT
START: RL A
SJMP WHILE
END