您现在的位置是:首页 >技术交流 >STC51案例操作网站首页技术交流
STC51案例操作
简介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'。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。