案例 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'。