目录
0.3例子3:基于AT89C51单片机的定时器控制LED灯带
0.4例子4:基于AT89C51单片机的定时器控制LED闪烁
0.5例子5:基于AT89C51单片机的定时器LED实现二进制计数
1.4使用步骤(以T0方式12 MHz 晶振产生 1 ms 中断为例)
6例子5:基于AT89C51单片机的定时器LED实现二进制计数
摘要:本文介绍了基于AT89C51单片机的5种定时器控制LED应用案例,包括小灯闪烁、流水灯、LED灯带控制、LED闪烁和二进制计数。详细讲解了每种案例的电路原理、程序设计及实现方法,并补充了定时器的基础知识,包括工作方式、计算方法和应用场景。文中提供了完整的源代码,并阐述了硬件连接方式,最后附有硬件工程师笔试面试相关文章的链接。这些案例展示了AT89C51单片机定时器在LED控制中的多样化应用,可作为单片机学习者的实践参考。
0案例视频效果展示
0.1例子1:基于AT89C51单片机的定时器控制小灯闪烁
例子29:基于AT89C51单片机的定时器控制小灯闪烁
0.2例子2:基于AT89C51单片机的定时器T0流水灯
例子30:基于AT89C51单片机的定时器T0流水灯
0.3例子3:基于AT89C51单片机的定时器控制LED灯带
例子31:基于AT89C51单片机的定时器控制LED灯带
0.4例子4:基于AT89C51单片机的定时器控制LED闪烁
例子32:基于AT89C51单片机的定时器控制LED闪烁
0.5例子5:基于AT89C51单片机的定时器LED实现二进制计数
例子33:AT89C51单片机定时器控制LED实现二进制计数
1基础知识补充
频率单位:赫兹(Hz)
1赫兹(Hz):每秒1次 周期:1s
1千赫兹(Hz):每秒1000次 周期:1ms
1兆赫兹(Hz):每秒1000000次 周期:1us
1吉兹(Hz):每秒1000000000次 周期:1ns
机器周期(Machine Cycle)是 8051 单片机 执行一条指令的基本时间单位。理解它对于计算延时、定时器初值、波特率等都非常关键。
总结:
8051 的机器周期 = 12 × 时钟周期
12MHz 晶振下,1 机器周期 = 1μs
1.1 AT89C52的3个定时器
3个16位可编程定时/计数器:T0、T1、T2
T0、T1:标准 8051 兼容(方式 0~3)
T2:8052 专有,功能更强(可 16 位自动重装、捕获、波特率发生等)
1.2定时器在单片机里的 4 大作用
产生精确定时(1 ms、10 ms、1 s……)
对外部脉冲计数(T0/T1 脚当计数输入)
生成波特率(UART 方式 1、3 时)
做PWM/脉冲测量/电机测速(配合 T2 捕获功能)
1.3 四种工作方式(T0/T1)
方式 |
位数 |
特点 |
典型用途 |
0 |
13 位 |
早期兼容,少用 |
特殊场合 |
1 |
16 位 |
一次溢出重装 |
1 ms、50 ms 基时 |
2 |
8 位自动重装 |
低字节自动回装 |
波特率、高频中断 |
3 |
T0 分成两个 8 位 |
T1 失去中断 |
特殊应用 |
1.4使用步骤(以T0方式12 MHz 晶振产生 1 ms 中断为例)
1.4.1 算初值计算
机器周期 = 1 µs(12 MHz/12)
1 ms 需计数 1000 次 → 初值 = 65536 − 1000 = 64536 = 0xFC18
定时器T0设置
TMOD &= 0xF0; // 清零 T0 位
TMOD |= 0x01; // T0 方式 1
定时周期(1ms)
TH0 = 0xFC; // 高 8 位
TL0 = 0x18; // 低 8 位
1.4.2 寄存器配置
定时器T0
TMOD &= 0xF0; // 清零 T0 位
TMOD |= 0x01; // T0 方式 1
TH0 = 0xFC; // 高 8 位
TL0 = 0x18; // 低 8 位
TR0 = 1; // 启动 T0
ET0 = 1; // 允许中断
EA = 1; // 总中断
定时器T0中断服务函数
void Timer0_ISR(void) interrupt 1
{
TH0 = 0xFC; // 重装初值
TL0 = 0x18;
/* 用户代码:计数、刷新显示、产生 PWM 等 */
}
2例子1:基于AT89C51单片机的定时器控制小灯闪烁
实现功能:LED在定时器的中断例程控制下不断闪烁。
本质:定时器中断周期性地翻转LED引脚电平。
2.1电路原理图
2.1.1电路组成及接线
名称 |
接线 |
AT89C51单片机 |
XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P1.0—>共阳极LED灯 |
复位电路 |
|
晶振电路 |
|
共阳极LED灯 |
2.2控制程序
2.2.1控制程序步骤
库文件与引脚定义
主程序(小灯闪烁)
INT0中断函数
2.2.3源代码
//功能:LED在定时器的中断例程控制下不断闪烁。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED=P1^0;
uchar T_Count=0;
//主程序
void main()
{
TMOD=0x00; //定时器0工作方式0
TH0=(8192-5000)/32; //5ms定时
TL0=(8192-5000)%32;
IE=0x82; //允许T0中断
TR0=1;
while(1);
}
//T0中断函数
void LED_Flash() interrupt 1
{
TH0=(8192-5000)/32; //恢复初值
TL0=(8192-5000)%32;
if(++T_Count==100) //0.5s开关一次LED
{
LED=~LED;
T_Count=0;
}
}
3例子2:基于AT89C51单片机的定时器T0流水灯
实现功能:TIMER0控制流水灯:定时器控制P0、P2口的LED滚动显示。
本质:TIMER0定时中断轮流移位点亮P0、P2口LED,形成滚动流水效果。
3.1电路原理图
3.1.1电路组成及接线
名称 |
接线 |
AT89C51单片机 |
XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>流水灯 P2.0-P2.7—>流水灯 |
复位电路 |
|
晶振电路 |
|
两排流水灯 |
3.2控制程序
3.2.1控制程序步骤
库文件
主程序(定时器控制实现流水灯)
3.2.3源代码
//功能:TIMER0控制流水灯:定时器控制P0、P2口的LED滚动显示。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//主程序
void main()
{
uchar T_Count=0;
P0=0xfe;
P2=0xfe;
TMOD=0x01; //定时器0工作方式1
TH0=(65536-40000)/256; //40ms定时
TL0=(65536-40000)%256;
TR0=1; //启动定时器
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=(65536-40000)/256; //恢复初值
TL0=(65536-40000)%256;
if(++T_Count==5)
{
P0=_crol_(P0,1);
P2=_crol_(P2,1);
T_Count=0;
}
}
}
}
4例子3:基于AT89C51单片机的定时器控制LED灯带
实现功能:定时器T0定时控制上一组条形LED,滚动速度较快定时器T1定时控制下一组条形LED,滚动速度较慢
本质:T0快中断“扫”上条灯,T1慢中断“扫”下条灯,双速分时滚动。
4.1电路原理图
4.1.1电路组成及接线
名称 |
接线 |
AT89C51单片机 |
XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>LED灯带 P2.0-P2.7—>LED灯带 |
复位电路 |
|
晶振电路 |
|
LED灯带 |
4.2控制程序
4.2.1控制程序步骤
库文件
主程序
T0中断函数
T1中断函数
4.2.3源代码
//功能:定时器T0定时控制上一组条形LED,滚动速度较快定时器T1定时控制下一组条形LED,滚动速度较慢
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar tc0=0,tc1=0;
//主程序
void main()
{
P0=0xfe;
P2=0xfe;
TMOD=0x11; //定时器0、定时器1均工作于方式1
TH0=(65536-15000)/256; //定时器0:15ms
TL0=(65536-15000)%256;
TH1=(65536-50000)/256; //定时器1:50ms
TL1=(65536-50000)%256;
IE=0x8a;
TR0=1; //启动定时器
TR1=1;
while(1);
}
//T0中断函数
void Time0() interrupt 1
{
TH0=(65536-15000)/256; //恢复定时器0初值
TL0=(65536-15000)%256;
if(++tc0==10) //150ms转换状态
{
tc0=0;
P0=_crol_(P0,1);
}
}
//T1中断函数
void Time1() interrupt 3
{
TH0=(65536-50000)/256; //恢复定时器1初值
TL0=(65536-50000)%256;
if(++tc1==10) //500ms转换状态
{
tc1=0;
P2=_crol_(P2,1);
}
}
5例子4:基于AT89C51单片机的定时器控制LED闪烁
实现功能:4只LED在定时器控制下滚动闪烁。
本质:定时器中断依次移位点亮4只LED,形成滚动闪烁。
5.1电路原理图
5.1.1电路组成及接线
名称 |
接线 |
AT89C51单片机 |
XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.3—>LED电路 |
复位电路 |
|
晶振电路 |
|
LED灯电路 |
5.2控制程序
5.2.1控制程序步骤
库文件与引脚定义
主程序(小灯闪烁控制)
T0中断函数
5.2.3源代码
//功能:4只LED在定时器控制下滚动闪烁。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit B1=P0^0;
sbit G1=P0^1;
sbit R1=P0^2;
sbit Y1=P0^3;
uint i,j,k;
//主程序
void main()
{
i=j=k=0;
P0=0xff;
TMOD=0x02; //定时器0工作方式2
TH0=256-200; //200us定时
TL0=256-200;
IE=0x82;
TR0=1; //启动定时器
while(1);
}
//T0中断函数
void LED_Flash_and_Scroll() interrupt 1
{
if(++k<35) return; //定时中断若干次后执行闪烁
k=0;
switch(i)
{
case 0: B1=~B1;break;
case 1: G1=~G1;break;
case 2: R1=~R1;break;
case 3: Y1=~Y1;break;
default:i=0;
}
if(++j<300) return; //每次闪烁持续一段时间
j=0;
P0=0xff; //关闭显示
i++; //切换到下一个LED
}
6例子5:基于AT89C51单片机的定时器LED实现二进制计数
实现功能:对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了计数器,连接在T0引脚的按键每次按下时,会使计数寄存器的值递增其值通过LED以二进制形式显示
本质:把按键当计数脉冲源接T0脚,启用计数器0,每按一次TL0/TH0自增,无需任何中断或查询,CPU只管随时把计数值送LED二进制显示。
6.1电路原理图
6.1.1电路组成及接线
名称 |
接线 |
AT89C51单片机 |
XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P1.0-P1.7—>LED灯 P2.0-P2.7—>LED灯 |
复位电路 |
|
晶振电路 |
|
LED灯 |
6.2控制程序
6.2.1控制程序步骤
库文件
主程序(实现LED的二进制)
6.2.3源代码
//功能:对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了计数器,连接在T0引脚的按键每次按下时,会使计数寄存器的值递增其值通过LED以二进制形式显示
#include<reg51.h>
//主程序
void main()
{
TMOD=0x05; //定时器0为计数器,工作方式1,最大计数值65535
TH0=0; //初值为0
TL0=0;
TR0=1; //启动定时器
while(1)
{
P1=TH0;
P2=TL0;
}
}
7 硬件工程师笔试面试相关文章链接(部分链接)
更多文章可前往主页观看
1、硬件工程师笔面试真题汇总(2025版本)_硬件工程师面试题-CSDN博客https://blog.csdn.net/XU157303764/article/details/140742900?spm=1011.2415.3001.5331硬件工程师笔试面试高频考点汇总——(2025版)_电容或者电感对锁存器的影响-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1488349782、硬件工程师笔试面试汇总(2025版本)_硬件工程师面试题-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1419048583、硬件工程师笔试面试学习汇总——器件篇目录(2025版本)_【【硬件工程师炼成之路】器件篇(更新中。。。)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/142316204
硬件工程师笔记——电子器件汇总大全-CSDN博客https://blog.csdn.net/XU157303764/article/details/147342935?spm=1011.2415.3001.5331Multisim14使用教程详尽版--(2025最新版)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/147197406?spm=1011.2415.3001.5331