【Proteus仿真】定时器控制系列仿真——LED小灯闪烁/流水灯/LED灯带控制/LED小灯实现二进制

发布于:2025-09-08 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

0案例视频效果展示

0.1例子1:基于AT89C51单片机的定时器控制小灯闪烁

0.2例子2:基于AT89C51单片机的定时器T0流水灯

0.3例子3:基于AT89C51单片机的定时器控制LED灯带

0.4例子4:基于AT89C51单片机的定时器控制LED闪烁

0.5例子5:基于AT89C51单片机的定时器LED实现二进制计数

1基础知识补充

1.1 AT89C52的3个定时器

1.2定时器在单片机里的 4 大作用

1.3 四种工作方式(T0/T1)

1.4使用步骤(以T0方式12 MHz 晶振产生 1 ms 中断为例)

1.4.1 算初值计算

1.4.2 寄存器配置

2例子1:基于AT89C51单片机的定时器控制小灯闪烁

2.1电路原理图

2.1.1电路组成及接线

2.2控制程序

2.2.1控制程序步骤

2.2.3源代码

3例子2:基于AT89C51单片机的定时器T0流水灯

3.1电路原理图

3.1.1电路组成及接线

3.2控制程序

3.2.1控制程序步骤

3.2.3源代码

4例子3:基于AT89C51单片机的定时器控制LED灯带

4.1电路原理图

4.1.1电路组成及接线

4.2控制程序

4.2.1控制程序步骤

4.2.3源代码

5例子4:基于AT89C51单片机的定时器控制LED闪烁

5.1电路原理图

5.1.1电路组成及接线

5.2控制程序

5.2.1控制程序步骤

5.2.3源代码

6例子5:基于AT89C51单片机的定时器LED实现二进制计数

6.1电路原理图

6.1.1电路组成及接线

6.2控制程序

6.2.1控制程序步骤

6.2.3源代码

  7 硬件工程师笔试面试相关文章链接(部分链接)


摘要:本文介绍了基于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


网站公告

今日签到

点亮在社区的每一天
去签到