news 2026/6/15 11:26:13

手把手玩转C51定时器三连击

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手玩转C51定时器三连击

C51定时器实验Proteus仿真C语言 一共三个程序 1. 实现0-59s的计时,每隔1S秒值加1并通过S1、S0两片数码管显示出来,当计时数据加到60时数值变为00,重新计时。 2. 定时器控制单只LED灯闪烁,点亮2s,再熄灭0.5s。 要求:采用查询法和中断法两种编程方式实现。 3. 编写0-99的手动计数程序,按下P3.5引脚上所接的负脉冲按钮,在S1和S0两片数码管上显示计数值,加到数值100则清零,继续从0加到99重复显示。

最近在折腾51单片机定时器的几个经典实验,用Proteus跑仿真的时候发现有些小坑。今天咱们直接上代码,边撸代码边聊实现细节,三个实验打包带走!


一、数码管60秒轮回计时

先来搞个基础款——0-59秒循环计时。核心思路是用定时器做1秒基准,配合数码管动态扫描。这里用定时器0模式1实现:

#include <reg51.h> #define uint unsigned int #define uchar unsigned char uchar code segment[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳段码 uchar count = 0, sec = 0; void timer0_init() { TMOD = 0x01; //模式1 TH0 = 0xFC; //1ms定时 TL0 = 0x66; ET0 = 1; EA = 1; TR0 = 1; } void display() { P2 = 0x01; //开个位 P0 = segment[sec%10]; for(uint i=0;i<500;i++); P2 = 0x02; //开十位 P0 = segment[sec/10]; for(uint i=0;i<500;i++); } void main() { timer0_init(); while(1) { display(); if(count >= 1000) { //累计1秒 sec++; count = 0; if(sec >= 60) sec = 0; } } } void timer0_isr() interrupt 1 { TH0 = 0xFC; //重装初值 TL0 = 0x66; count++; }

关键点解析

  1. 定时器中断里只做累加,主循环判断是否满1秒,避免在中断里处理复杂逻辑
  2. 动态扫描加了简单延时,实际项目建议用定时器控制刷新频率
  3. 段码表要根据实际数码管类型调整(共阳/共阴)

二、LED呼吸灯:两种姿势玩定时

姿势A:中断法(推荐)
#include <reg51.h> sbit LED = P1^0; uint flash_cnt = 0; bit state = 0; void timer0_init() { TMOD |= 0x01; TH0 = 0x3C; //50ms定时 TL0 = 0xB0; ET0 = 1; EA = 1; TR0 = 1; } void main() { timer0_init(); while(1); } void timer0_isr() interrupt 1 { TH0 = 0x3C; TL0 = 0xB0; if(++flash_cnt >= (state ? 40 : 10)) { //2s/0.5s state = !state; LED = ~state; flash_cnt = 0; } }
姿势B:查询法(适合简单场景)
void main() { TMOD = 0x01; while(1) { TH0 = 0x3C; TL0 = 0xB0; TR0 = 1; while(!TF0); //死等标志位 TF0 = 0; //...类似中断内的计数逻辑 } }

对比分析

  • 中断法CPU利用率高,适合多任务
  • 查询法会阻塞主程序,适合简单场景
  • 时间计算注意:50ms×40次=2s,50ms×10次=0.5s

三、手动计数器:按键的艺术

#include <reg51.h> sbit KEY = P3^5; uchar num = 0; void delay(uint i) { while(i--); } void check_key() { if(KEY == 0) { delay(1000); //消抖 if(KEY == 0) { num++; if(num >= 100) num = 0; while(!KEY); //等待松手 } } } void display() { //显示逻辑同实验一 } void main() { while(1) { check_key(); display(); } }

防抖秘籍

  1. 检测到低电平后延时10ms左右
  2. 再次确认按键状态
  3. 松手检测避免连击
  4. 实际项目建议用外部中断+定时器消抖

Proteus仿真Tips

  1. 数码管记得接限流电阻
  2. 按键加10k上拉电阻
  3. LED电流设置2-5mA
  4. 定时器初值可用工具计算(如STC-ISP)

这三个实验涵盖了定时器的基本玩法,搞明白之后可以衍生出各种定时应用。下次试试把这三个功能整合到一个系统里,加上模式切换按键,立马变身多功能电子表!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 14:16:15

windows系统下WSL2部署Image-to-Video指南

Windows系统下WSL2部署Image-to-Video指南 &#x1f680; 引言&#xff1a;在本地构建图像转视频的AI创作环境 随着生成式AI技术的快速发展&#xff0c;Image-to-Video&#xff08;图像转视频&#xff09;已成为内容创作者、设计师和开发者关注的热点方向。I2VGen-XL等先进模…

作者头像 李华
网站建设 2026/6/12 16:21:44

合规性审查要点:满足监管基本要求

合规性审查要点&#xff1a;满足监管基本要求 引言&#xff1a;AI生成内容的合规挑战与应对 随着生成式人工智能技术的快速发展&#xff0c;Image-to-Video图像转视频生成器等视觉内容生成工具正逐步从实验阶段走向实际应用。然而&#xff0c;这类高自由度的内容生成系统在带来…

作者头像 李华
网站建设 2026/6/15 9:31:54

显存不足怎么办?Image-to-Video模型轻量化部署策略

显存不足怎么办&#xff1f;Image-to-Video模型轻量化部署策略 &#x1f4cc; 问题背景&#xff1a;大模型时代的显存瓶颈 随着多模态生成技术的快速发展&#xff0c;Image-to-Video&#xff08;I2V&#xff09; 模型正成为内容创作、影视特效和虚拟现实领域的重要工具。以 I2V…

作者头像 李华
网站建设 2026/6/6 9:43:48

导师严选10个AI论文软件,专科生毕业论文轻松搞定!

导师严选10个AI论文软件&#xff0c;专科生毕业论文轻松搞定&#xff01; 论文写作的“隐形助手”&#xff1a;AI 工具如何成为你的得力伙伴 对于专科生而言&#xff0c;毕业论文不仅是一项学术任务&#xff0c;更是一次综合能力的考验。从选题到成文&#xff0c;每一个环节都可…

作者头像 李华
网站建设 2026/6/6 4:42:33

java异常处理,零基础入门到精通,收藏这篇就够了

目录 一. 异常概述、体系 什么是异常&#xff1f; 为什么要学习异常&#xff1f; 如何处理异常&#xff1f; 假设我们有一个接收String参数的方法&#xff0c;方法中会对该参数进行一些逻辑处理&#xff0c;正常的业务流程要求不允许null值出现&#xff0c;可如果调用者传…

作者头像 李华
网站建设 2026/6/5 23:34:54

Sambert-HifiGan语音合成质量影响因素分析

Sambert-HifiGan语音合成质量影响因素分析 引言&#xff1a;中文多情感语音合成的技术背景与挑战 随着智能客服、虚拟主播、有声阅读等应用场景的快速发展&#xff0c;高质量的中文多情感语音合成&#xff08;Text-to-Speech, TTS&#xff09; 成为自然语言处理领域的重要研究…

作者头像 李华