Loading

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
posted @ 2023-03-29 15:34  滑稽果  阅读(112)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end