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);
		
	}

}

相关推荐
szpc16213 小时前
100V宽压输入反激隔离电源,适用于N道沟MOSFET或GaN或5V栅极驱动器,无需光耦合
c语言·开发语言·人工智能·单片机·嵌入式硬件·生成对抗网络·fpga开发
凌盛羽7 小时前
Bitmap(BMP)图像信息分析主要说明带压缩的形式
c++·stm32·单片机·物联网·proteus·嵌入式实时数据库
逝灮8 小时前
【蓝桥杯——物联网设计与开发】基础模块9 - PWM
stm32·单片机·嵌入式硬件·物联网·蓝桥杯·pwm
芳菲菲其弥章8 小时前
线性直流电流
单片机
嵌入式小强工作室8 小时前
STM32 FLASHdb
stm32·单片机·嵌入式硬件
挥剑决浮云 -9 小时前
STM32学习之EXTI外部中断(以对外式红外传感器 / 旋转编码器为例)
c语言·笔记·stm32·单片机·嵌入式硬件·学习
黑果果的思考10 小时前
TouchGFX软件介绍 基本控件,交互设计与仿真(2)
嵌入式硬件
沐欣工作室_lvyiyi11 小时前
基于单片机的无线智能台灯(论文+源码)
stm32·单片机·嵌入式硬件·物联网·毕业设计
小嵌同学13 小时前
Linux RTC 驱动框架
linux·arm开发·驱动开发·嵌入式硬件
不能只会打代码13 小时前
32单片机从入门到精通之硬件架构——总线系统(二)
单片机·嵌入式硬件·硬件架构·32单片机