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

}

相关推荐
m0_739312872 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章3 小时前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频
TeYiToKu3 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
基极向上的三极管4 小时前
【AD】3-4 在原理图中放置元件
嵌入式硬件
徐嵌4 小时前
STM32项目---水质水位检测
stm32·单片机·嵌入式硬件
徐嵌4 小时前
STM32项目---畜牧定位器
c语言·stm32·单片机·物联网·iot
lantiandianzi4 小时前
基于单片机的老人生活安全监测系统
单片机·嵌入式硬件·生活
东胜物联5 小时前
探寻5G工业网关市场,5G工业网关品牌解析
人工智能·嵌入式硬件·5g
stm32发烧友5 小时前
基于STM32的智能家居环境监测系统设计
stm32·嵌入式硬件·智能家居
hairenjing112312 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word