51单片机数码管

51单片机的数码管是一种常用的数字显示设备,用于在嵌入式系统中显示数字和一些特定的符号。数码管通常由七段LED组成,每个LED段可以显示数字0到9以及一些字母和符号。通过控制每个LED段的亮灭,可以显示不同的数字和字符。

在51单片机中,数码管通常连接到GPIO(通用输入/输出)引脚上,通过控制这些引脚的电平状态来控制数码管的显示。通过适当的硬件连接和软件编程,可以实现数码管的各种显示效果。

在软件编程中,可以通过扫描显示的方式来控制数码管的显示,即逐个显示每个数码管,并按照一定的时间间隔刷新显示内容,从而呈现出连续的数字或字符。此外,还可以通过PWM(脉冲宽度调制)技术来调节数码管的亮度,实现不同亮度的显示效果。

数码管在嵌入式系统中广泛应用于时钟、计数器、测量仪表、温度计等各种场合,它们提供了一种直观、便捷且低功耗的数字显示方式。因此,51单片机的数码管模块是嵌入式系统中常见的输出设备之一。

单个数码管共阴极数码管需要给正集高电平1点亮(目前我们在使用的是共阴极的数码管)

如何区分共阴极数码管和共阳极数码管:共阴极数码管的负极是接在CND(也就是地上的),共阳极数码管的正极是接在5v的电源上的,要想在单片机中驱动共阴极数码管工作需要给共阴极的数码管一个高电平,而共阳极的数码管则和共阴极数码管相反
四位数码管

锁存器:用于数据的锁存通常和数码管配合使用实现数据的锁存
锁存芯片:le表示的是选通端,如果选通端也就是LE为高电频那么输入端D无论输出什么输出端都是什么如果LE为低电频那么输入端都是锁存到上面的值

上拉电阻的作用:开漏状态表示的是可以输出低电平可以输出高电平

eg1:数码管的静态显示

cpp 复制代码
#include <REGX52.H>
#include <INTRINS.H>
sbit wei = P2^7; 		// 位选择器:根据自己的单片机板定义,不同的单片机产品管脚可能是不同的
sbit duan = P2^6;    // 段选择器
unsigned char leddata[]={ 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义

                         };

void Delay(unsigned int xms)		
{
	unsigned char i, j;
  while(xms){
		i = 2;
		j = 239;
		do{
		   while(--j);
		}while(--i);
	  xms--;
	}
}

void main(){
			// 打开锁存器
			duan = 1; 
			// 段选控制数码管显示什么值
			P0 = leddata[8];
			// 关闭锁存器
			duan = 0;	
			// 延迟函数
			Delay(5);
	

	    // 共阴极数码管加0的时候未选通
			// 打开位选择器
			wei = 1;
			// 数码管全部点亮
			P0 = 0;
			// 关闭段选择器
			wei = 0;
			while(1){
				 
			}
}

eg2:数码管的静态显示让数码管在第一位显示1 :延时函数编写在头文件中

c 复制代码
#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char 
	
sbit  beep = P2^3;
sbit wei  = P2^7; 		// 位选择器
sbit duan = P2^6;     // 段选择器

void main(){
	  // 打开位锁存器
    wei = 1;
	  P0 = 0xfe; // 高电平的16进制位0x06
	  //关闭位锁存器
	  wei = 0;
	  Delay(500);
	  // 打开段选择器
	  duan = 1;
	  P0 =0x06;
	  // 关闭段选择器
	  duan = 0;
	  // 延迟函数500毫秒
	  Delay(500);
	  // while循环一直循环条件为true
	  while(1){
		  

		}

}

eg3:数码管显示0-9循环显示间隔500毫秒

c 复制代码
#include <REGX52.H>
#include <INTRINS.H>
#include "Util.h"
// 初始化数组
unsigned char leddata[]={ 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x00  //自定义
 };
void main(){
	   // 使用for循环遍历数组
	   int i = 0;
	   // 计算数组的长度
	   int len = sizeof(leddata)/sizeof(leddata[0]);
	   for(i = 0; i< len; i++){
		         // 打开断选择器
			 duan = 1;
			 P0 = leddata[i];
			 duan = 0;
			 Delay(500);
			 // 打开位选择器
			 wei = 1;
			 P0 = 0;
			 wei = 0;	
		 }

}

eg4:数码管的动态显示

c 复制代码
#include <REGX52.H>
#include <INTRINS.H>
#include "Util.h"
// 初始化数组
unsigned char leddata[]={ 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x00  //自定义
 };
 // 创建位选择数组
unsigned char weiOption[] = {
        0x7F, 01111111
	      0xBF, 
				0xDF,
				0xEF,
		    0xF7, 
				0xFB, 
				0xFD, 
				0xFE,
				0x00
 };
void main(){ 
	   int i = 0;
		 int j = 0;
     int lenght = sizeof(leddata)/sizeof(leddata[0]);
     int weiNum = sizeof(weiOption)/sizeof(weiOption[0]);
     while(i < lenght && j < weiNum){
		    wei = 1;
			  P0 = weiOption[j]; // 点亮第一个数码管
			  wei = 0;
			  Delay(1000);
			  // 锁存
			  duan = 1;
			  P0 = leddata[i];
			  duan = 0;
			 	j++;
			  i++;
		 }	
}

eg5:数码管的动态显示:1-4

c 复制代码
#include <REGX52.H>
#include <INTRINS.H>
#include "Util.h"
// 初始化数组
unsigned char leddata[]={ 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x00  //自定义
 };


void main(){ 
            // 第一位数码管
              wei = 1;
              P0 = 0xfe;
              wei = 0;
              duan = 1;
              P0 = leddata[1];
              duan = 0;
            Delay(500);
              // 第二位数码管
              wei = 1;
              P0 = 0xfd;
              wei = 0;
              duan = 1;
              P0 = leddata[2];
              duan = 0;
              Delay(500);
                // 第三位数码管
              wei = 1;
              P0 = 0xfb;
              wei = 0;
              duan = 1;
              P0 = leddata[3];
              duan = 0;
                Delay(500);
              // 第四位数码管
              wei = 1;
              P0 = 0xf7;// 11110111
              wei = 0;
              duan = 1;
              P0 = leddata[4];
              duan = 0;
                Delay(500);
	  
	
}

eg6:循环显示1 , ,3

c 复制代码
#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char 
	
sbit  beep = P2^3;
sbit wei  = P2^7; 		// 位选择器
sbit duan = P2^6;     // 段选择器

void main(){
	 

	  while(1){
			    // 清除断码
			    P0 = 0xff;
					// 打开位锁存器
					wei = 1;
					P0 = 0xfe; // 高电平的16进制位0x06
					//关闭位锁存器
					wei = 0;
					// 打开段选择器
					duan = 1;
					P0 =0x06;
					// 关闭段选择器
					duan = 0;
					// 延迟函数500毫秒
					Delay(500);
					// while循环一直循环条件为true
			
			    // 清除断码
			    P0 = 0xff;
			    // 打开位锁存器
					wei = 1;
					P0 = 0xfd; // 高电平的16进制位0x06
					//关闭位锁存器
					wei = 0;
					// 打开段选择器
					duan = 1;
					// 显示数字二
					P0 = 0x5B;
					// 关闭段选择器
					duan = 0;
					// 延迟函数500毫秒
					Delay(500);
					// while循环一直循环条件为true
					
					// 清除断码
			    P0 = 0xff;
					// 打开位锁存器
					wei = 1;
					P0 = 0xFB; // 1111 1011高电平的16进制位0x06
					//关闭位锁存器
					wei = 0;
					// 打开段选择器
					duan = 1;
					// 显示数字三
					P0 = 0x4F;
					// 关闭段选择器
					duan = 0;
					// 延迟函数500毫秒
					Delay(500);
					// while循环一直循环条件为true
			
		}

}

eg6:数码管动态显示效果

c 复制代码
#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char 
sbit  beep = P2^3;
sbit wei  = P2^7; 		// 位选择器
sbit duan = P2^6;     // 段选择器
//数组的定义
unsigned char code leddata[]={ 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x00  //自定义
 };
// 功能函数
void diaplay(uchar i){
					uchar bai,shi,ge;
	        // 计算个位10位和百位
	        bai = i / 100; // 211 /100 = 2
	        shi = i % 100 / 10; // 211 % 100 / 10 = 1;
	        ge  = i % 10; // 211 % 10
	        

					// 清除断码
			    P0 = 0xff;
					// 打开位锁存器
					wei = 1;
					P0 = 0xfe; // 高电平的16进制位0x06
					//关闭位锁存器
					wei = 0;
					// 打开段选择器
					duan = 1;
					P0 =leddata[bai];
					// 关闭段选择器
					duan = 0;
					// 延迟函数500毫秒
					Delay(500);
					// while循环一直循环条件为true
			
			    // 清除断码
			    P0 = 0xff;
			    // 打开位锁存器
					wei = 1;
					P0 = 0xfd; // 高电平的16进制位0x06
					//关闭位锁存器
					wei = 0;
					// 打开段选择器
					duan = 1;
					// 显示数字二
					P0 = leddata[shi];
					// 关闭段选择器
					duan = 0;
					// 延迟函数500毫秒
					Delay(500);
					// while循环一直循环条件为true
					
					// 清除断码
			    P0 = 0xff;
					// 打开位锁存器
					wei = 1;
					P0 = 0xFB; // 1111 1011高电平的16进制位0x06
					//关闭位锁存器
					wei = 0;
					// 打开段选择器
					duan = 1;
					// 显示数字三
					P0 = leddata[ge];
					// 关闭段选择器
					duan = 0;
					// 延迟函数500毫秒
					Delay(500);
					// while循环一直循环条件为true

}

void main(){

复制代码
  while(1){
		  diaplay(233);
		
	}

}

相关推荐
cjy_Somnr4 小时前
keil5报错显示stm32的SWDIO未连接不能烧录
stm32·单片机·嵌入式硬件
Lay_鑫辰5 小时前
西门子诊断-状态和错误位(“轴”工艺对象 V1...3)
服务器·网络·单片机·嵌入式硬件·自动化
无垠的广袤7 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
雲烟9 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
泽虞9 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
田甲9 小时前
【STM32】 数码管驱动
stm32·单片机·嵌入式硬件
up向上up10 小时前
基于51单片机垃圾箱自动分类加料机快递物流分拣器系统设计
单片机·嵌入式硬件·51单片机
纳祥科技19 小时前
Switch快充方案,内置GaN,集成了多个独立芯片
单片机
资料,小偿19 小时前
4.1.2基于51单片机汇编语言出租车计价器proteus仿真出租车计价器,汇编语言51单片机
汇编·51单片机·proteus
单片机日志20 小时前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息