您现在的位置是:首页 >技术交流 >STC51案例操作网站首页技术交流

STC51案例操作

weixin_58038206 2025-03-22 12:01:03
简介STC51案例操作

案例 1:LED 闪烁

功能描述:通过操作 P1 口寄存器,让连接在 P1.0 引脚的 LED 以一定间隔闪烁。

#include <reg51.h>

// 延时函数
void delay(unsigned int time) {
    unsigned int i, j;
    for (i = 0; i < time; i++)
        for (j = 0; j < 123; j++);
}

void main() {
    while (1) {
        P1 = P1 & 0xFE;  // P1.0 置 0,点亮 LED
        delay(500);      // 延时
        P1 = P1 | 0x01;  // P1.0 置 1,熄灭 LED
        delay(500);      // 延时
    }
}

代码解释

  • delay 函数用于产生一定的延时,通过嵌套的 for 循环实现。
  • 在 main 函数中,使用 P1 = P1 & 0xFE 将 P1.0 引脚置为低电平,点亮 LED;使用 P1 = P1 | 0x01 将 P1.0 引脚置为高电平,熄灭 LED。每次操作后调用 delay 函数进行延时,从而实现 LED 闪烁。

案例 2:按键检测控制 LED

功能描述:检测连接在 P3.2 引脚的按键状态,根据按键状态控制连接在 P1.0 引脚的 LED 亮灭。

#include <reg51.h>

void main() {
    while (1) {
        if (P3 & 0x04 == 0) {  // 检测 P3.2 是否为低电平(按键按下)
            P1 = P1 & 0xFE;    // P1.0 置 0,点亮 LED
        } else {
            P1 = P1 | 0x01;    // P1.0 置 1,熄灭 LED
        }
    }
}

代码解释

  • 在 main 函数的无限循环中,通过 P3 & 0x04 == 0 检测 P3.2 引脚是否为低电平。如果是低电平,表示按键被按下,将 P1.0 引脚置为低电平,点亮 LED;否则,将 P1.0 引脚置为高电平,熄灭 LED。

案例 3:定时器实现 LED 闪烁

功能描述:使用定时器 0 实现 LED 每隔 1 秒闪烁一次。

#include <reg51.h>

unsigned char count = 0;  // 定时器溢出次数计数器

void main() {
    TMOD = 0x01;  // 设置定时器 0 为方式 1(16 位定时器)
    TH0 = (65536 - 50000) / 256;  // 定时器初值,定时 50ms
    TL0 = (65536 - 50000) % 256;
    ET0 = 1;  // 允许定时器 0 中断
    EA = 1;   // 允许总中断
    TR0 = 1;  // 启动定时器 0

    while (1);
}

// 定时器 0 中断服务函数
void timer0_isr() interrupt 1 {
    TH0 = (65536 - 50000) / 256;  // 重新加载定时器初值
    TL0 = (65536 - 50000) % 256;
    count++;
    if (count == 20) {  // 50ms * 20 = 1s
        P1 = ~P1;       // 取反 P1 口状态,实现 LED 闪烁
        count = 0;      // 计数器清零
    }
}

代码解释

  • TMOD = 0x01 将定时器 0 设置为方式 1(16 位定时器)。
  • TH0 和 TL0 计算并设置定时器 0 的初值,使其定时 50ms。
  • ET0 = 1 和 EA = 1 分别允许定时器 0 中断和总中断。
  • TR0 = 1 启动定时器 0。
  • 定时器 0 中断服务函数 timer0_isr 中,每次定时器溢出时重新加载初值,并对计数器 count 加 1。当 count 达到 20 时(即经过 1 秒),取反 P1 口的状态,实现 LED 闪烁,并将计数器清零。

案例 4:串口通信发送数据

功能描述:使用串口以 9600bps 的波特率发送字符 'A'。

#include <reg51.h>

// 初始化串口
void uart_init() {
    SCON = 0x50;  // 设置串口为方式 1,允许接收
    TMOD |= 0x20; // 设置定时器 1 为方式 2(8 位自动重装)
    TH1 = 0xFD;   // 波特率 9600bps 对应的初值
    TL1 = 0xFD;
    TR1 = 1;      // 启动定时器 1
    ES = 1;       // 允许串口中断
    EA = 1;       // 允许总中断
}

// 发送一个字符
void uart_send_char(unsigned char ch) {
    SBUF = ch;    // 将字符放入发送缓冲区
    while (TI == 0); // 等待发送完成
    TI = 0;       // 清除发送完成标志
}

void main() {
    uart_init();  // 初始化串口
    while (1) {
        uart_send_char('A');  // 发送字符 'A'
    }
}

代码解释

  • uart_init 函数用于初始化串口,设置串口工作方式、定时器 1 的工作方式和初值,启动定时器 1,并允许串口中断和总中断。
  • uart_send_char 函数将字符放入发送缓冲区 SBUF,然后等待发送完成标志 TI 置 1,最后清除该标志。
  • 在 main 函数中,调用 uart_init 初始化串口,然后进入无限循环,不断发送字符 'A'。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。