【物联网专业】案例9_2:控制数码管(定时器中断)
·
0 文章介绍
对应定时器/计数器案例目标的实现
用计数器中断0(P3^4)控制数码管段选
P1^6)控制数码位选
1 仿真图

2 效果图

3 不完整代码
复制该代码,其中有7个补充点,补充点1-3自己思考,补充点567见下方图片
#include <reg52.h> // 包含51单片机特殊功能寄存器定义头文件
// 定义无符号整型类型别名
#define uint unsigned int
#define uchar unsigned char
// 数码管控制引脚定义
sbit dula = P3^4; // 段选锁存器控制引脚(U2锁存器),控制显示内容
sbit wela = P1^6; // 位选锁存器控制引脚(U3锁存器),控制显示位置
// 拆分后的时间显示变量(十位和个位)
uchar shi2, shi1; // 小时十位、个位
uchar fen2, fen1; // 分钟十位、个位
uchar miao2, miao1; // 秒钟十位、个位
// 当前时间变量(初始为11:12:13)
uchar shi = 11; // 当前小时
uchar fen = 12; // 当前分钟
uchar miao = 13; // 当前秒钟
uchar count; // 定时器计数变量(用于每秒计时,50ms × 20 = 1秒)
// 数码管段码表(无小数点),按0~9的显示编码,连接至段选锁存器
uchar code tabledula[] = {
【补充1】
};
// 数码管段码表(带小数点),用于显示冒号效果(通过点亮小数点位置)
uchar code tableduladian[] = {
【补充2】
};
// 数码管位选码(控制哪一位被选中)
// 依次对应数码管第1位~第6位(从左到右)
// 注意:这些值为逐位取0,低电平有效(共阴极数码管常见)
uchar code tablewela[] = {
【补充3】
};
// 简单延时函数(x 约等于 x 毫秒)
void delay(uchar x)
{
【补充4】
}
// 数码管动态显示函数:依次点亮6位数码管,显示“时:分:秒”
void display(uchar shi2, uchar shi1, uchar fen2, uchar fen1, uchar miao2, uchar miao1)
{
// 防止误触发,先清除锁存控制引脚
wela = 0;
dula = 0;
// 显示第1位:小时的十位
P0 = tablewela[0]; // 选中第1位
wela = 1; wela = 0; // 鎖存位选信号
P0 = tabledula[shi2]; // 发送段码(无小数点)
dula = 1; dula = 0; // 鎖存段选信号
delay(1); // 稍作延时(防止闪烁)
// 显示第2位:小时的个位(带小数点)
P0 = tablewela[1];
wela = 1; wela = 0;
P0 = tableduladian[shi1]; // 段码带小数点(模拟冒号)
dula = 1; dula = 0;
delay(1);
// 显示第3位:分钟的十位
wela = 0; dula = 0;
P0 = tablewela[2];
wela = 1; wela = 0;
P0 = tabledula[fen2];
dula = 1; dula = 0;
delay(1);
// 显示第4位:分钟的个位(带小数点)
P0 = tablewela[3];
wela = 1; wela = 0;
P0 = tableduladian[fen1]; // 带小数点,模拟冒号
dula = 1; dula = 0;
delay(1);
// 显示第5位:秒钟的十位
P0 = tablewela[4];
wela = 1; wela = 0;
P0 = tabledula[miao2];
dula = 1; dula = 0;
delay(1);
// 显示第6位:秒钟的个位
P0 = tablewela[5];
wela = 1; wela = 0;
P0 = tabledula[miao1];
dula = 1; dula = 0;
delay(1);
}
// 定时器0初始化函数(设置50ms中断)
void init()
{
【补充5】
}
// 主函数:程序入口
void main()
{
init(); // 初始化定时器
while (1)
{
// 主循环中不断刷新6位数码管的显示内容
display(shi2, shi1, fen2, fen1, miao2, miao1);
}
}
// 定时器0中断服务函数(每50ms进入一次)
void time0() interrupt 1
{
// 重装载定时器初值,确保下次50ms
【补充6】
count++; // 每50ms中断一次,累积20次为1秒
if (count >= 20)
{
count = 0; // 归零计数
miao++; // 秒钟+1
// 进位判断处理
if (miao >= 60)
{
miao = 0;
fen++; // 分钟+1
if (fen >= 60)
{
fen = 0;
shi++; // 小时+1
if (shi >= 24)
{
shi = 0; // 24小时制归零
}
}
}
}
// 将当前时间变量拆分为“十位”和“个位”数字,以便送入数码管显示
// 例如:shi = 11,将被拆为 shi2 = 1(十位),shi1 = 1(个位)
// miao = 13,将被拆为 miao2 = 1,miao1 = 3
【补充7】
}
补充点567
4 思考题
实现以下效果

更多推荐



所有评论(0)