51单片机是经典的微控制器平台之一,广泛应用于各类电子项目、实验和竞赛中。以下是一个51单片机的案例及相关项目源码,包括实验和竞赛内容。
项目简介
该项目展示了如何使用51单片机控制LED闪烁和按键输入。通过这个项目,您将学会如何配置51单片机的GPIO引脚,并处理按键中断。
目录结构
css 复制代码51_mcu_project/
├──
main.c
├──
keil_project.uvproj
└──
README.md
硬件要求
-
51单片机开发板(如STC89C52)
-
LED灯
-
按键
-
面包板和跳线
接线图
rust 复制代码LED -> P1.0
Button -> P3.2 (
外部中断
0)
main.c
c 复制代码#include <reg52.h>
//
定义
LED
和按键引脚
sbit LED = P1^0;
sbit Button = P3^2;
//
函数声明
void init();
void delay(unsigned int ms);
//
主函数
void main() {
init();
while(1) {
LED = ~LED; // LED
状态翻转
delay(500); //
延时
500ms
}
}
//
初始化函数
void init() {
//
设置外部中断
0
IT0 = 1; //
下降沿触发
EX0 = 1; //
使能外部中断
0
EA = 1; //
全局中断使能
//
初始化
LED
状态
LED = 0;
}
//
外部中断
0
服务函数
void external0_interrupt() interrupt 0 {
LED = 0; //
按键按下时关闭
LED
}
//
简单延时函数
void delay(unsigned int ms) {
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 123; j++);
}
README.md
markdown 复制代码# 51
单片机项目
本项目展示了如何使用
51
单片机控制
LED
闪烁和按键输入。
##
硬件要求
- 51
单片机开发板(如
STC89C52
)
- LED
灯
-
按键
-
面包板和跳线
##
接线图
LED -> P1.0 Button -> P3.2 (外部中断0)
markdown 复制代码##
编译和下载
1.
打开
Keil uVision
,创建一个新的项目。
2.
将
`main.c`
文件添加到项目中。
3.
配置项目,选择正确的
51
单片机型号(如
STC89C52
)。
4.
编译项目并将生成的
HEX
文件下载到单片机。
##
功能描述
-
按键按下时,
LED
熄灭。
-
按键松开后,
LED
继续闪烁。
##
实验与竞赛扩展内容
###
实验内容
1. **
定时器控制
LED
闪烁
**
:使用定时器中断而不是简单延时函数控制
LED
闪烁。
2. **
多按键控制
**
:增加多个按键,实现不同按键控制不同
LED
的功能。
3. **PWM
控制
LED
亮度
**
:使用
PWM
(脉宽调制)控制
LED
亮度。
###
竞赛内容
1. **
智能家居
**
:设计一个智能家居控制系统,可以通过按键或遥控控制多个设备(如灯光、风扇等)。
2. **
自动报警系统
**
:设计一个自动报警系统,当检测到特定事件(如烟雾、火焰)时,自动发出报警信号。
3. **
机器人控制
**
:设计一个简单的机器人,可以通过按键控制其移动和动作。
实验内容详解
1. 定时器控制LED闪烁
在此实验中,我们将使用定时器中断代替简单延时函数来控制LED闪烁。定时器可以更准确地控制时间,且不会阻塞其他任务的执行。
修改main.c
:
c 复制代码#include <reg52.h>
//
定义
LED
引脚
sbit LED = P1^0;
//
函数声明
void init();
void delay(unsigned int ms);
//
主函数
void main() {
init();
while(1) {
//
主循环不再进行延时
}
}
//
初始化函数
void init() {
//
设置外部中断
0
IT0 = 1; //
下降沿触发
EX0 = 1; //
使能外部中断
0
EA = 1; //
全局中断使能
//
初始化定时器
0
TMOD |= 0x01; //
设置定时器
0
为模式
1
(
16
位定时器)
TH0 = 0xFC; //
设置初值高字节
TL0 = 0x66; //
设置初值低字节
ET0 = 1; //
使能定时器
0
中断
TR0 = 1; //
启动定时器
0
//
初始化
LED
状态
LED = 0;
}
//
外部中断
0
服务函数
void external0_interrupt() interrupt 0 {
LED = 0; //
按键按下时关闭
LED
}
//
定时器
0
中断服务函数
void timer0_interrupt() interrupt 1 {
TH0 = 0xFC; //
重装初值高字节
TL0 = 0x66; //
重装初值低字节
LED = ~LED; // LED
状态翻转
}
//
简单延时函数
void delay(unsigned int ms) {
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 123; j++);
}
2. 多按键控制
在此实验中,我们将增加多个按键,实现不同按键控制不同LED的功能。
修改main.c
:
c 复制代码#include <reg52.h>
//
定义
LED
和按键引脚
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit Button1 = P3^2;
sbit Button2 = P3^3;
//
函数声明
void init();
void delay(unsigned int ms);
//
主函数
void main() {
init();
while(1) {
//
主循环不再进行延时
}
}
//
初始化函数
void init() {
//
设置外部中断
0
和外部中断
1
IT0 = 1; //
下降沿触发
IT1 = 1; //
下降沿触发
EX0 = 1; //
使能外部中断
0
EX1 = 1; //
使能外部中断
1
EA = 1; //
全局中断使能
//
初始化定时器
0
TMOD |= 0x01; //
设置定时器
0
为模式
1
(
16
位定时器)
TH0 = 0xFC; //
设置初值高字节
TL0 = 0x66; //
设置初值低字节
ET0 = 1; //
使能定时器
0
中断
TR0 = 1; //
启动定时器
0
//
初始化
LED
状态
LED1 = 0;
LED2 = 0;
}
//
外部中断
0
服务函数
void external0_interrupt() interrupt 0 {
LED1 = 0; //
按键
1
按下时关闭
LED1
}
//
外部中断
1
服务函数
void external1_interrupt() interrupt 2 {
LED2 = 0; //
按键
2
按下时关闭
LED2
}
//
定时器
0
中断服务函数
void timer0_interrupt() interrupt 1 {
TH0 = 0xFC; //
重装初值高字节
TL0 = 0x66; //
重装初值低字节
LED1 = ~LED1; // LED1
状态翻转
LED2 = ~LED2; // LED2
状态翻转
}
3. PWM控制LED亮度
在此实验中,我们将使用PWM(脉宽调制)控制LED亮度。
修改main.c
:
c 复制代码#include <reg52.h>
//
定义
LED
引脚
sbit LED = P1^0;
//
函数声明
void init();
void delay(unsigned int ms);
// PWM
占空比
unsigned char duty_cycle = 50;
//
主函数
void main() {
init();
while(1) {
unsigned char i;
for (i = 0; i < 100; i++) {
if (i < duty_cycle)
LED = 1;
else
LED = 0;
delay(1);
}
}
}
//
初始化函数
void init() {
//
设置外部中断
0
IT0 = 1; //
下降沿触发
EX0 = 1; //
使能外部中断
0
EA = 1; //
全局中断使能
//
初始化
LED
状态
LED = 0;
}
//
外部中断
0
服务函数
void external0_interrupt() interrupt 0 {
duty_cycle += 10; //
增加
PWM
占空比
if (duty_cycle > 100) duty_cycle = 0;
}
//
简单延时函数
void delay(unsigned int ms) {
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 123; j++);
}
竞赛内容示例
-
智能家居:设计一个智能家居控制系统,可以通过按键或遥控控制多个设备(如灯光、风扇等)。
-
自动报警系统:设计一个自动报警系统,当检测到特定事件(如烟雾、火焰)时,自动发出报警信号。
-
机器人控制:设计一个简单的机器人,可以通过按键控制其移动和动作。
以上案例展示了如何使用51单片机进行简单的硬件控制,包括LED闪烁、按键输入和PWM控制。通过这些实验,您可以掌握51单片机的基本使用方法,并为更复杂的项目和竞赛打下基础。