51单片机使用定时器进行数码管动态扫描程序_基于51单片机的七段数码管_jzj1993的博客-程序员秘密

技术标签: 单片机相关  

数码管是51单片机学习中比较基础的一个模块,为简化电路连接,提高系统可靠性,降低制造成本,多位数码管广泛采用动态扫描的方式进行显示。如果程序编写不当,数码管动态扫描容易出现亮度不均匀、亮度过低、重影等现象。很多初学者会在主函数中使用while(1)循环,结合delay函数不断扫描,但这样得不断调用display扫描,如果单片机还要执行别的程序时,就会由于扫描不及时,导致各种问题。此外,在控制段选位选的先后顺序上,如果程序不当,则会造成显示重影等问题。在此给出一个稳定可靠的程序方案。


电路连接:P1口通过两个74HC573分别连接到八位数码管的段选和片选,段选、位选由P3.4和P3.5控制,低电平锁存

#include <reg52.h>
 
 #define DIGI_PORT P1 // 宏定义数码管端口,如果端口改变,只需修改这一句即可
 #define DIGI_NUM 8 // 宏定义数码管个数
 
 sbit DULA = P3^4;
 sbit WELA = P3^5;
 
 unsigned char digiBuf[DIGI_NUM]; //数码管缓冲区
 
 unsigned char code DigiTable[] = {
 	0x3F,/*0*/
 	0x06,/*1*/
 	0x5B,/*2*/
 	0x4F,/*3*/
 	0x66,/*4*/
 	0x6D,/*5*/
 	0x7D,/*6*/
 	0x07,/*7*/
 	0x7F,/*8*/
 	0x6F,/*9*/
 	0x00,/* */
 };
 
 /* 
 初始化定时器0,方式1,11.0592MHz晶振时,每5ms进一次中断,
 如果只有4位数码管,10ms即可,间隔长度根据实际情况调整,
 在保证不闪烁的情况下,尽可能加长间距以减小对CPU资源的消耗
 */
 void initDigi()
 {
     TMOD = 0x01;
     TH0 = 0xEE;
     TL0 = 0x00;
     EA = 1;
     ET0 = 1;
     TR0 = 1;
 }
 
 void main()
 {
 	digiBuf[0] = 10; // 为10则该位不显示
 	digiBuf[1] = 1;
 	digiBuf[2] = 2;
 	digiBuf[3] = 3;
 	digiBuf[4] = 4;
 	digiBuf[5] = 5;
 	digiBuf[6] = 6;
 	digiBuf[7] = 7;
 	initDigi();
 	while(1);
 }
 
 // 定时器0函数每隔一段时间运行一次
 void displayTimer0() interrupt 1
 {
 	static unsigned char digiPos = 0; // 当前需要显示的数码管,此处使用静态局部变量,或者全局变量,不可使用默认局部变量
     TH0 = 0xEE;
     TL0 = 0x00;
 	// 位选关闭所有数码管,否则可能出现重影(下面段选改变之后,位选改变之前,上一次已经位选打开的数码会显示错误的信息)
 	DIGI_PORT = 0xFF;	//这一句如果和下一句位置交换,可能产生重影,具体见http://blog.csdn.net/jzj1993/article/details/8563337
 	WELA = 1;
 	WELA = 0;
 	// 这里进行段选(此时所有数码管都已关闭,不会显示错误信息)
 	DIGI_PORT = DigiTable[digiBuf[digiPos]];
 	DULA = 1;
 	DULA = 0;
 	// 这里根据digiPos进行位选
 	switch(digiPos) {
 		case 0:	DIGI_PORT = ~(1 << 0); break; // 打开第0个数码管
 		case 1:	DIGI_PORT = ~(1 << 1); break; // 打开第1个数码管
 		case 2:	DIGI_PORT = ~(1 << 2); break; // 打开第2个数码管
 		case 3:	DIGI_PORT = ~(1 << 3); break; // 打开第3个数码管
 		case 4:	DIGI_PORT = ~(1 << 4); break; // 打开第4个数码管
 		case 5:	DIGI_PORT = ~(1 << 5); break; // 打开第5个数码管
 		case 6:	DIGI_PORT = ~(1 << 6); break; // 打开第6个数码管
 		case 7:	DIGI_PORT = ~(1 << 7); break; // 打开第7个数码管
 	}
 	WELA = 1;
 	WELA = 0;
 	// 改变digiPos值,为下一次进入此函数做准备
 	digiPos++;
 	if(digiPos == DIGI_NUM)
 		digiPos = 0;
 }

Proteus仿真通过



源码及Proteus仿真文件点此链接下载


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jzj1993/article/details/8572476

智能推荐

springcloud-sleuth & zipkin 初步配置_或许没看到的博客-程序员秘密

Sleuth &amp; zipkin分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将 一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。SleuthSpring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可。Span:基本工作单元,例如,在一个新建的span中发送一个R

Xshell连接不上虚拟机centos7_xshell可以ping,但是连接失败_妙趣生花的博客-程序员秘密

描述:下午饶有兴趣的在学linux命令 然后视频中版本是6 自己是7 就想着看也看了 上手试试吧 然后 就出现了下面一系列的问题......主机ping不通虚拟机、ping通了Xshell连接不上,我淦 气死我了!!!!!莫名奇妙的就好了 下面就缕缕自己试错的那些方法吧一、解决方式1.1 是否有网络测试虚拟机是否有网络 即打开火狐浏览是否能访问百度页面如果不能编辑——虚拟编辑器更改设置——选择NAT模式(勾选将主机虚拟适配器连接到此网络、使用本地DHCP服...

c语言图书馆管理系统(功能非常之多)_奋斗中的代码猿--刘同学的博客-程序员秘密

主要代码运行截图下面有小白第一次写的望大家测试下里面有啥bug没鼓励一下我哟#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#include&lt;string.h&gt;/*数据存储问题可以以文件的形式保存 然后标准化读取*//*读取后每次重写以a+方式重写文件即可*//*标准化读取fprint();fscanf();*///记录下标//记录书籍的下标int count=0;int countS=0;//记录学生信息的下

MM主要的表和主要字段_SAP_森林木的博客-程序员秘密

MM相关的表:Materials Management TablesEINA:采购信息记录Purchasing Info Record- General Data     主要字段:采购记录、商品、供应商、促销员、创建者、创建日期EINE :采购信息记录 - 采购组织数据Purchasing Info Record- Purchasing Organization Data主要字段:

leetcode338(比特位计数:动态规划)_I an的博客-程序员秘密

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]题解:动态规划&amp;nbsp从小到大遍历范围中的数字,当前二进制数中1的个数,就是除去最低位后剩下的二进制数中1的个数加上1(最低位是1)或0(最低位是0)...

51Nod 1087 1 10 100 1000 ( 二分_+82(0)7081767711_Yishui_Blog的博客-程序员秘密

规律很容易可以观察到 主要是数据范围很大,需要二分查询位置即可#include &amp;amp;lt;bits/stdc++.h&amp;amp;gt;using namespace std;#define ls st&amp;amp;lt;&amp;amp;lt;1#define rs st&amp;amp;lt;&amp;amp;lt;1|1#define LL long longconst int MAXN= (int) 1e5+10;int arr[MA...

随便推点

vi编辑器显示行号_vi 行号_不倒翁Jason的博客-程序员秘密

1.临时显示在用vi编辑器编辑文本时输入:set nu取消显示输入:set nonu2.永久显示1)mac系统vi ~/.vimrc在最后一行添加set number2)centos系统vi /etc/virc在最后一行添加set nu3)ubuntu系统vi /etc/vim/vimrc在最后一行添加set nu...

Linux 学习一 搭建环境系列之二 安装 python3.6、setuptools、pip_孙大侠~2015的博客-程序员秘密

参考网址: https://www.cnblogs.com/kimyeee/p/7250560.htmlLinux下安装Python3.6和第三方库如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境,比如yum!!!!!不要动现有的python2环境!一、安装python3.61. 安装依赖环境  # yum -y i...

写一个“特殊”的查询构造器 - (前言)_weixin_34221332的博客-程序员秘密

文章目录写一个“特殊”的查询构造器 - (前言)写一个“特殊”的查询构造器 - (一、程序结构,基础封装)写一个“特殊”的查询构造器 - (二、第一条语句)写一个“特殊”的查询构造器 - (三、条件查询)写一个“特殊”的查询构造器 - (四、条件查询:复杂条件)写一个“特殊”的查询构造器 - (五、聚合函数、分组、排序、分页)...

git push 却 403错误 解决方案_gitlab push 403_巷雨微若的博客-程序员秘密

原文地址:https://blog.csdn.net/sdoyuxuan/article/details/79077794解决方法 1.在代码的.git/config文件内[remote “origin”]的url的gitlab域名前添加gitlab注册时的“用户名:密码@”  2.这个用户要在对应项目下的角色是Owner或Master才行,如果是Guest、Reporter、Develo...

mysql展开解释_MySQL函数sum使用场景解读_weixin_39653733的博客-程序员秘密

文章简介今天分享一下MySQL中的sum函数使用。该函数已经成为大家操作MySQL数据库中时常用到的一个函数,这个函数统计满足条件行中指定列的和,想必肯定大家都知道了,本身就没什么讲头了,这篇文章主要是通过几个小案例深入了解一下该函数,以及在做MySQL查询时如何使用sum函数做优化。语法分析SUM([DISTINCT] expr) [over_clause]Returns the sum of ...

vc6.0不用鼠标拖动CSplitterWnd的分割条,用代码改变分割窗口_hityct1的博客-程序员秘密

使用vc6.0。mfc单文档程序。效果:初始时,有上下两个窗口,但只有下面的窗口显示;点击分割条,上窗口显示;再点击分割条,上窗口隐藏。 1)建立CSplitterWnd的派生类CMySptWnd。class CMySptWnd : public CSplitterWnd并定一个成员变量bool m_bIs;,初始化为false 2)分割成上下两个窗口。 BOOL CMai