AT89C52+定时器实现流水灯

发布于:2025-02-11 ⋅ 阅读:(34) ⋅ 点赞:(0)

实现流水灯依次0.5s点亮,LED为共阳极

先前代码简易

晶振12MHZ

定时器0计数初值

设定时时间50ms(50000sus)

定时时间=(65536-X)*12/晶振振荡器频率

即50000=(65536-X)*12/12

x=15536

16进制为0x3cb0所以下图:

u

然后循环计数10次

#include <REGX52.H>

#define length 8
#define cycle 10
int tCount=0;
int order=0;
char disCode[length]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void init()
{
EA=1;
ET0=1;
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TR0=1;
}

void main()
{
init();
while(1)
	{

	}	

}

void timer0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
tCount++;
if(tCount>=cycle)
	{
	tCount=0;
	order++;
	order=order%length;
	P2=disCode[order];
    }
}


代码功能概述

该程序的主要功能是使用定时器 0 来实现对端口 P2 的循环输出控制。程序通过定时器 0 的中断服务函数,每隔一定时间间隔(由定时器初值决定)更新 P2 端口输出的数值,实现一种循环显示的效果。

代码详细分析

  1. 头文件和宏定义

收起

c

#include <REGX52.H>
#define length 8
#define cycle 10

  • #include <REGX52.H>:包含 8051 单片机的头文件,定义了单片机的寄存器和一些特殊功能寄存器。
  • #define length 8:定义了一个常量 length,表示数组 disCode 的长度。
  • #define cycle 10:定义了一个常量 cycle,表示定时器中断的周期数。

  1. 全局变量

收起

c

int tCount=0;
int order=0;
char disCode[length]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

  • tCount:用于记录定时器中断的次数。
  • order:用于记录当前要输出到 P2 端口的数组 disCode 的索引。
  • disCode:一个字符数组,存储了要输出到 P2 端口的数值。

  1. 初始化函数 init()

收起

c

void init()
{
EA=1;
ET0=1;
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TR0=1;
}

  • EA=1;:使能总中断。
  • ET0=1;:使能定时器 0 中断。
  • TMOD=0x11;:设置定时器 0 和定时器 1 工作在模式 1(16 位定时器 / 计数器)。
  • TH0=0x3c; 和 TL0=0xb0;:设置定时器 0 的初值,这两个值组合起来可以产生大约 50ms 的定时中断(具体时间取决于单片机的晶振频率)。
  • TR0=1;:启动定时器 0。

  1. 主函数 main()

收起

c

void main()
{
init();
while(1)
    {

    }	
}

  • init();:调用初始化函数。
  • while(1):一个无限循环,使程序停留在主循环中,等待定时器中断。

  1. 定时器 0 中断服务函数 timer0()

收起

c

void timer0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
tCount++;
if(tCount>=cycle)
    {
    tCount=0;
    order++;
    order=order%length;
    P2=disCode[order];
    }
}

  • TH0=0x3c; 和 TL0=0xb0;:重新设置定时器 0 的初值,以便下次定时中断。
  • tCount++;:每次中断时,tCount 加 1。
  • if(tCount>=cycle):当 tCount 达到 cycle 时,执行以下操作:
    • tCount=0;:重置 tCount
    • order++;order 加 1。
    • order=order%length;:确保 order 在数组 disCode 的有效范围内。
    • P2=disCode[order];:将 disCode[order] 的值输出到 P2 端口。

改进建议

  1. 增加注释:为了使代码更易读,建议在关键代码段添加注释,解释代码的功能和逻辑。
  2. 错误处理:目前代码没有对数组越界等可能的错误情况进行处理,可以考虑添加相应的错误处理代码。
  3. 优化代码结构:可以将一些功能模块化,例如将定时器初始化和中断处理部分封装成独立的函数,提高代码的可维护性。

希望这些分析和建议对你理解和优化这段代码有所帮助。如果有其他问题,请随时提问。


网站公告

今日签到

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