51单片机使用定时器进行数码管动态扫描程序

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

 

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

 

#include 
 
 #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;
 }
 
关键字:51单片机  定时器  数码管  动态扫描程序 引用地址:51单片机使用定时器进行数码管动态扫描程序

上一篇:51单片机程序开发入门知识
下一篇:51单片机基础剖析(基于C语言)

推荐阅读最新更新时间:2024-03-16 14:54

51单片机实现BPC电波钟解码C程序
//使用STC12C5202单片机,晶振使用12M的,速度是12倍速的,电波钟模块引脚是接在单片机P3^2口的 //数码管是使用动态扫描的方式,四位数码管显示 #include reg51.h #define uchar unsigned char #define uint unsigned int uchar xiaoshi,fenzon; uchar tt=0; #define duan P1 uchar code tab ={ 0x12,/*0*/ 0xD7,/*1*/ 0x4A,/*2*/ 0x43,/*3*/ 0x87,/*4*/ 0x23,/*5*/ 0
[单片机]
STM8 互补 PWM TIM1定时器 输出成功
程序测试: #include iostm8s003f3.h void PWM_INIT() { CLK_PCKENR1 |= 0x80;//开启定时器1外设时钟 TIM1_EGR |= 0x01; //重新初始化TIM1 TIM1_CR1 = 0x00; //B7(0)可以直接写入 B65(00)边缘对齐模式B4(0)向上计数B3(0)计数器不停止发生更新事件 TIM1_RCR = 0x00; TIM1_PSCRH =0; //设定预分频为,16分频 1M TIM1_PSCRL =0x80; //PWM的时钟 影响周期 TIM1_CCER1 = 0x0F; //CC2ER1开
[单片机]
STM8 互补 PWM TIM1<font color='red'>定时器</font> 输出成功
基于8051单片机的电阻成型机设计
在电子产品生产过程中,通常需要在电阻或二极管焊接前对其进行成型处理,即对电阻或二极管的引脚进行剪切和折弯。传统的人工电阻成型方法效率低、形状不规则、成本高。虽然目前市场上手摇式电阻成型机,能有效地实现电阻成型,但不能对已加工电阻数量进行实时显示,并按数量需求生产电阻。设计通过光电传感器采集产品数量信息,然后把采集到的信号传送给单片机,信号经过单片机的运算处理后,将已经加工的电阻数量将通过液晶屏显示,当计数值与设定值相等时单片机输出控制信号结束生产,文中提出的设计方案计数准确、检测速度快、实用性强。 1 电阻成型机的组成和工作过程 1.1 电阻成型机的组成 文中电阻成型机主要由控制器和机械传动装置两部分组成,控制器包括单片机控
[单片机]
基于80<font color='red'>51单片机</font>的电阻成型机设计
MCS51单片机采用什么样的抗干扰技术
普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又没有集成WATCHDOS电路,那么普及型MCS-51单片机是采用什么样的抗干扰技术呢?如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位就是用一系列指令来模仿复位操作,这就是MCS-51系列单片机所特有的软件复位技术。
[单片机]
51单片机实现4个按键控制8个LED灯四种状态
电路图 元件清单 程序(C语言) #include reg51.h sbit p3_0=P3^0; sbit p3_1=P3^1; sbit p3_2=P3^2; sbit p3_3=P3^3; void delay(unsigned char i); void main() { unsigned char ledctr; P3=0xff; while(1) { ledctr=P3; switch(ledctr) { case 0xff:P1=0x00;break; case 0xfe:P1=0xff;break; case 0xfd:P1=0x55;delay(
[单片机]
<font color='red'>51单片机</font>实现4个按键控制8个LED灯四种状态
STM32基础7--通用定时器(PWM输出)
通用定时器框图 在通用定时器中,内部结构与基本定时器是不一样的。下面是通用定时器TIM10/TIM11 和 TIM13/TIM14的内部结构,可以看到它支持一个通(TIMx_CH1)道,其他的通用定时器内部结构不一样在于它们支持的通道数。 从图中可以看到,通用定时除了基本的定时(基本定时的作用)功能以外,还支持信号的输入,信号的输出,也多了一个捕捉比较寄存器。 PWM(Pulse Width Modulation—脉冲宽度调制技术) 在一个周期波形中,高电平占整个周期的比例称之为占空比,而高电平宽度通常被称为脉冲宽度。当我们在控制占空比,从而控制电路导通或者关闭时间,从而控制导通的有效电压。由于这个特性,我们在需要控制LE
[单片机]
STM32基础7--通用<font color='red'>定时器</font>(PWM输出)
基于51单片机的电梯控制系统
一.硬件方案 本次设计是采用开关控制实现上下到指定楼层,通过电机转动带动电梯箱上下运动,到达指定楼层。显示模块是显示此时的楼层,报警模块具有错误操作报警以及楼层到达的提示功能。 主要由51单片机+共阴数码管+红外发射和接收模块+按键+指示灯+蜂鸣器设计而成;如图: 二.设计功能 (1)通电后,系统默认电梯停在一层。 (2)按下不同的按键电梯可以到达不同的楼层,如果电梯在上行,下面的楼层有呼叫电梯会继续上行,直到上行完了才会下行。同样如果电梯在下行,上面的楼层有呼叫 电梯会继续上行 ,直到下行完了才会上行。 (3)如需上行,请按下所要到达楼层的上行呼叫按钮,电梯显示开始上行,所经楼层号用数码管进行显示,到达,楼层号持续显示,
[单片机]
基于<font color='red'>51单片机</font>的电梯控制系统
C8051单片机实现多目标超声波测距的设计
超声波测距传感器以其测量精度高、响应快和价格低廉而广泛应用在工业现场测距、移动机器人导航和定位等场合。超声波测距传感器常用的方式是1 个发射头对应1 个接收头,也有多个发射头对应1 个接收头。 它们共同之处是:每个接收头只测量一个位置,这个位置就是除盲区内因发射的超声波旁瓣引起的接收信号超声波包络峰值外,第1个接收信号超声波包络峰值对应的距离。 在机器人自主导航避障时,机器人只关心最近障碍物的距离,是能够完成自主避障的。 但是在机器人定位时,尤其在动态环境下,1 个接收头同时测量多个距离,能够更多地描述环境信息,这对机器人用超声波定位具有重要意义。 1 超声波 1. 1 超声波测距原理 超声波测距原理比较简单,一般是采用时差法
[单片机]
C80<font color='red'>51单片机</font>实现多目标超声波测距的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved