实训目的:
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 增加而逐渐变暗
}
}
}