51单片机实验4-计时器设计(LED灯实现二进制计数,简易计数报警,呼吸灯)

该文介绍了三个实训项目,分别是使用AT89C51通过定时器实现二进制计数并显示在LED上,利用计数器设计简易计数报警系统,以及运用PWM技术创建呼吸灯效果。程序涉及定时器配置、计数器操作和延时函数的应用。
摘要由CSDN通过智能技术生成

实训目的:

1、编写程序通过定时器完成二进制计数,并通过LED灯显示结果

2、编程程序利用计数器,完成简易计数报警。

实训步骤:

(一)控制LED灯实现二进制计数

电路连接如下:

 主要器件:AT89C51、RES、LED-GREEN、BUTTON

程序代码如下:(每次按下K1键计数加一)

#include<reg51.h>
void main()
{	TMOD=0x06;      // 设置定时器 T0 为方式 2,16位计数器模式
	TH0=0;          // 初始化高位寄存器 TH0 为 0
	TL0=0;          // 初始化低位寄存器 TL0 为 0
	TR0=1;          // 开启定时器 T0
	while(1)
	{	P1=~TL0;      // 取反 TL0 寄存器的值,将其赋值给 P1 端口
	}
}
//每次按下按键计数+1,我钱没懂原理

(二)简易计数报警

电路连接:

 程序代码如下:(K1按下代表密码错误,3次错误后LED点亮3秒)

#include<reg51.h>
sbit LED=P1^0;                  // 定义 LED 引脚,位于 P1 口的第 0 个端口
void t1_50ms(unsigned char i)   // 延时函数,通过定时器 T0 实现,在输入参数 i 的控制下延时,每次延迟 50 毫秒
{	
	unsigned char k; 
	for(k=0;k<i;k++)
	{	
		TH0=(65536-50000)/256;      // 计算并设置 TH0 和 TL0 的值
		TL0=(65536-50000)%256;
		TR0=1;                        // 开启定时器 T0 进行计时
		while(!TF0);                  // 等待 TF0 标志位变为 1,表示计时结束
		TF0=0; 
		
	}
}
void main()
{	
	LED=1;                            // 初始化 LED 为高电平
	TMOD=0x61;                        // 设置定时器 T1 方式为 1(16 位自动重装载模式)
	TH1=256-3;                        // 初始化 TH1 和 TL1 的值为 253
	TL1=256-3;
	TR1=1;
	while(1)
	{	 
		while(!TF1);                    // 等待 TF1 标志位变为 1,表示延时结束
		TF1=0;
		LED=0;                           // LED 变为低电平
		t1_50ms(60);                     //调用 t1_50ms() 函数进行 60 次 50 毫秒的循环延时
		LED=1;                           // LED 变回高电平,重复以上步骤实现 LED 间隔 50ms 的闪烁效果
	}
}

(三)呼吸灯

提示:

1、了解PWM的驱动方式;

2、使灯光由暗逐渐变亮,在从亮逐渐变暗。

电路连接如下:代码如下:

#include<reg51.h>
sbit LED=P1^0;  
unsigned int i,j;             // 定义 LED 引脚为 P1.0
void T0_100us(unsigned int i) // 定义函数 T0_100us,用于延时指定的微秒数
{	
	unsigned int k;
	for(k=0;k<i;k++)
	{
		TL0 = 0x9C;                // 设置计时器 T0 的低 8 位初始值,以实现 100 微秒延时  0x9C=为10011100
		TH0 = 0xFF;                // 设置计时器 T0 的高 8 位初始值  0xFF=1111 1111
		TR0 = 1;                   // 启动计时器 T0
		while(!TF0)                // 等待计时器 T0 溢出
		TF0 = 0;
	}
}
void main()
{	
	TMOD = 0x01;                  // 设置计时器 T0 的工作模式为 16 位自动重装载模式

	while(1)                      // 进入死循环,反复输出闪烁效果
	{	
		for(i=0;i<100;i++)          // 循环 100 次,逐渐增加 LED 亮度
		{	
			LED=0;                    // LED 输出低电平,点亮 LED
			T0_100us(i);              // 延时 i*100 微秒,随着 i 增加而逐渐变亮
			LED=1;                    // LED 输出高电平,熄灭 LED
			T0_100us(100-i);          // 延时 (100-i)*100 微秒,随着 i 增加而逐渐变亮
			}
		for(j=0;j<100;j++)         	// 循环 100 次,逐渐减少 LED 亮度
		{	
			LED=1;                    // LED 输出高电平,熄灭 LED
			T0_100us(j);              // 延时 j*100 微秒,随着 j 增加而逐渐变暗
			LED=0;                    // LED 输出低电平,点亮 LED
			T0_100us(100-j);          // 延时 (100-j)*100 微秒,随着 j 增加而逐渐变暗
			}
		}
	}

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值