当前位置: 首页 > news >正文

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,点亮 LEDdelay(500);      // 延时P1 = P1 | 0x01;  // P1.0 置 1,熄灭 LEDdelay(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;  // 定时器初值,定时 50msTL0 = (65536 - 50000) % 256;ET0 = 1;  // 允许定时器 0 中断EA = 1;   // 允许总中断TR0 = 1;  // 启动定时器 0while (1);
}// 定时器 0 中断服务函数
void timer0_isr() interrupt 1 {TH0 = (65536 - 50000) / 256;  // 重新加载定时器初值TL0 = (65536 - 50000) % 256;count++;if (count == 20) {  // 50ms * 20 = 1sP1 = ~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;      // 启动定时器 1ES = 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'。

http://www.mrgr.cn/news/89928.html

相关文章:

  • 【真一键部署脚本】——一键部署deepseek
  • web-XSS-CTFHub
  • Pygame介绍与游戏开发
  • 2025.2.5——一、BUU XSS COURSE 1 XSS漏洞|XSS平台搭建
  • Linux运维——文件内容查看编辑
  • Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问
  • “公路养护新利器!公路 AI 智慧巡检系统
  • cursor指令工具
  • JavaScript系列(66)--类型系统实现详解
  • 题海拾贝:【高精度】减法
  • 驱动开发系列34 - Linux Graphics Intel 动态显存技术的实现
  • 数据结构:算法复杂度
  • DeepSeek-R1论文细节时间线梳理
  • 0002-课前准备和课程基础
  • 开源项目介绍-词云生成
  • 源路由 | 源路由网桥 / 生成树网桥
  • 【GoLang】切片的面试知识点
  • jakarta EE学习笔记-个人笔记
  • python:如何播放 .spx 声音文件
  • Unity扩展编辑器使用整理(一)
  • python 语音识别方案对比
  • AI大模型零基础学习(1):大模型使用篇
  • JavaScript 复习
  • Linux ftrace 内核跟踪入门
  • 【算法】动态规划专题⑦ —— 多重背包问题 + 二进制分解优化 python
  • #渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞