单片机原理及应用:数码管定时秒表和LED计数器

先前我们介绍了定时器/计数器的概念与作用原理,下面我通过两个应用案例来分别演示定时器和计数器的用法。

第一个案例是用数码管配合定时器中断制作秒表,同理也可以自己改变时间单位制作不同精度的电子钟,修改方式我已经附在代码注释中了。

#include <reg52.h>
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C};
unsigned char Dat[]={0,0}; //用数组储存数码管要显示的数字
unsigned char Second,t;void Delay()			   //为了消影需要延时函数,可以忽略延时带来的定时误差
{unsigned char i;for(i=0;i<50;i++);
}void main()
{EA = 1;            //总中断允许ET0 = 1;           //允许T0中断TMOD =0x01;       //计时器0工作方式1TH0 = -50000/256; //高位赋初值,用表达式减少了计算的麻烦TL0 = -50000%256;	//低位赋初值TR0 = 1; 			//开启计时器0while(1){					  //进行数据分割Dat[0]=Second/10; //累计时间的十位存入数组Dat[1]=Second%10; //累计时间的各位存入数组P0=Tab[Dat[0]];	  //读取数码管相应的数字段码P1=0xfe;		  //位选开启十位数码管,注意仿真图,十位接在P1.0上Delay();P1=0xff;		  //消影P0=Tab[Dat[1]];	  //个位同理P1=0xfd;Delay();P1=0xff;}
}void intserv1 (void) interrupt 1 using 1
{TH0= -50000/256; 	//减法赋值的简写TL0= -50000%256;t++;				//记录1s的二十分之一if(t==20)			//累积到1s后置零,秒数加1{					//如果要更改秒表的精确程度,修改这里再添加一个用于显示精确位数的数码管即可/*if(t==2)		//比如改为t==2,就是每0.1s在数码管显示一次,输出时再加一个用于显示十分位的数码管{t=0;			//同时将second的归零值改为100,不过要注意两件事情num++;			//一是变量在命名second容易出现语意不明,应改为num加注释说明if(Second>=600) Second=0;}*/				//二是带小数点显示的段码与先前用到的不同,需要重新设置数组t=0;Second++;if(Second>=60) Second=0; //到一分钟后重新开始}
}

仿真效果如下,为了让输出的电平更稳定,笔者采用了74LS245芯片,它是8路同相三态双向总线收发器,用来驱动LED或者其他的设备,可双向传输数据。

数码管定时秒表

为了不浪费太多时间,我在演示视频中剪去了中间计数的一部分,大家主要看1分钟自动置零的效果就可以了。

第二个案例是计数器,要求是双击按键切换灯光,再次双击切换另一种灯光。

#include <reg51.h>
unsigned char F=0;void Delay(unsigned int i)		
{	unsigned int j;		for(;i>0;i--)			for(j=0;j<125;j++);		}
void  main( )	{					//顺序可以调换,记住要配置TMOD、TCON、IE和初值TMOD=0x50;	    //设置定时器T1工作方式1TH1=0xff;		//向TH1写入初值的高8位TL1=0xfe;		//向TL1写入初值的低8位EA=1;    		//开启总中断允许ET1=1;   		//定时器T1中断允许  TR1=1;   		//启动定时器T1while(1){if(F==1)		   //第一次双击,灯光标志位为1,进入模式1		{	P1=0xff;	   //LED全部闪烁	Delay(500) ;		P1=0x00;			Delay(500); 		 }if(F==2)		   //第二次双击,灯光标志位为2,进入模式2		{	P1=0xaa;	   //LED奇偶位交替闪烁 	Delay(500) ;		P1=0x55;			Delay(500); }if(F==3)		  //第三次双击,清空标志位,关闭灯光{	F=0;P1=0xff;}	}}void T1_int(void)  interrupt 3  	//计数器T1中断服务函数
{TH1=0xff;		//重新赋值TL1=0xfe;		F++;			//灯光执行标志+1,中断只做赋值,不执行具体程序,可以有效减少运行时间			
}

大家可以自行改变按键对应的执行程序,与其他外设组合,比如让数码管显示不同的图案,也可以更改标志位的复制逻辑,单双击赋予不同的意义。总的来说思路都相同,只是需要注意在中断服务函数里应尽量少执行操作,将重点的操作置于主函数内部,通过改变标志位的数值来执行不同的程序。 

按键计数器控制LED点亮

今天和大家分享了两个定时器/计数器的应用,因为笔者所学专业对单片机要求不高,亟待分享的内容只剩下几个类似的应用,这个专栏也快要走到尾声了,感谢大家一路的陪伴,我们明天再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/340573.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis:原理速成+项目实战——Redis实战7(优惠券秒杀+细节解决超卖、一人一单问题)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战6&#xff08;封装缓存工具&#xff08;高级写法&#xff09;&&缓存总…

VMware Workstation——安装VMware Workstation Pro 17

目录 一、下载 二、安装 1、双击安装 2、安装向导 3、最终用户许可协议 4、自定义安装 5、用户体验设置 6、快捷方式 7、准备升级 8、正在安装 9、安装完成 10、输入许可证密钥 11、激活成功 12、桌面图标 一、下载 下载 VMware Workstation Pro 二、安装 1、双…

odoo16 销售中订单价格的设置

odoo16 销售中订单价格的设置 产品设置好销售价格后&#xff0c;在建销售订单时&#xff0c;却不显价格&#xff0c;需在设置中把价格表选上 不选客户时&#xff0c;价格表显示空白 每次如何设置默认价格呢&#xff0c;如你去改程序或其它法&#xff0c;就不对了&#xff0c…

权限维持篇

一、Windows 1、 不死马权限维持 1.1 概述 <?php ignore_user_abort(); //关掉浏览器&#xff0c;PHP脚本也可以继续执行. set_time_limit(0);//通过set_time_limit(0)可以让程序无限制的执行下去 $interval 5; // 每隔*秒运行 do { $filename test.php; if(file_exi…

C++I/O流——(1)I/O流的概念

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 勤奋&#xff0c;机会&#xff0c;乐观…

低代码的应用场景

Gartner 在 2019 年的低代码调研报告中&#xff0c;曾经绘制过一张用来阐述低代码适用场景的“应用金字塔”&#xff0c;如下图所示&#xff1a; 应用级别划分&#xff1a;从下往上&#xff0c;分别为工作组级(Workgroup Class)、部门级(Departmental Class)、企业级(Enterpris…

力扣日记1.10-【二叉树篇】701. 二叉搜索树中的插入操作

力扣日记&#xff1a;【二叉树篇】701. 二叉搜索树中的插入操作 日期&#xff1a;2024. 参考&#xff1a;代码随想录、力扣 —————————————————————— 天哪&#xff0c;上次打开力扣还是2023&#xff0c;转眼已经2024&#xff1f;&#xff01; 两个星期过去…

base64与BytesIO图片进行编码、解码;api调用

base64与BytesIO简单介绍 io.BytesIO 和 Base64 编码都是用于在内存中处理二进制数据的方法&#xff0c;但它们的目的和使用场景有所不同。 1&#xff09; io.BytesIO io.BytesIO 是 Python io 库中的一个类&#xff0c;它提供了一个在内存中处理二进制数据的接口&#xff0…

Vue入门五(Vue-CLI项目搭建|vue项目目录介绍|vue项目开发规范|es6导入导出语法)

文章目录 一、Vue-CLI 项目搭建介绍node环境搭建1) 下载与安装2&#xff09;测试是否安装成功 安装vue-cli安装vue脚手架 创建Vue项目1&#xff09;使用命令创建项目2&#xff09;使用图形化界面创建项目 二、vue项目目录介绍1.命令行运行vue项目2.Pycharm中运行项目3.目录结构…

【Web】CTFSHOW PHP文件包含刷题记录(全)

温故知新。 目录 web78 web79 web80 web81 web82 web83 web84 web85 web86 web87 web88 web78 伪协议base64编码直接读出文件内容就行 ?filephp://filter/convert.base64-encode/resourceflag.php web79 一眼data伪协议包含php脚本 ?filedata://text/plain,<…

Linux基础开发工具--vim

2.vim 代码编辑器 vim共有3种模式&#xff1a; ​ ​ 命令模式&#xff1a; $:将光标定位在当前行最右侧 ^:将光标定位在当前行最左侧 shiftg:将光标移到文本结尾 nshiftg:将光标移到文本第n行 gg:将光标移到文本开始 h:左 j:下 k:上 l:右 nyy:复制当前行/或复制多…

Logstash应用-同步ES(elasticsearch)到HDFS

1.场景分析 现有需求需要将elasticsearch的备份至hdfs存储&#xff0c;根据以上需求&#xff0c;使用logstash按照天级别进行数据的同步 2.重难点 数据采集存在时间漂移问题&#xff0c;数据保存时使用的是采集时间而不是数据生成时间采用webhdfs无法对文件大小进行设置解决…