51单片机驱动数码管显示

1. 数码管介绍.

数码管可以看成是一个个LED,大家学的第一个关于单片机的第一个例程,应该就是点亮一个LED,而这个数码管就是有顺序的点亮某几个LED.在这里插入图片描述

2.数码管的段选

从上面图片可以看到有共阴极和共阳极两种数码管,所以当我们让其中几个数码管显示的时候,只需要让a、b、c、d、e、f、g、dp(这几段称为段选端)这8段中的其中几段点亮就ok了。

3.多个数码管并联

一般来说,使用数码管不会单单一个,当使用多个数码管一起使用的时候,这时候几个数码管的段选端会并联在一起。每一个的共阳或者共阴极不在直接和电源的正或者负极相连,而是成为位选端,当需要其点亮时让其接通
(下图中a~g、dp为段选端,1 ~4 为位选端)
在这里插入图片描述

4.如何驱动四位数码管显示数字。

①四位数码管有8个段选端,4个位选端,让单独一个数码管显示的时候只需要在段选端输入段码,并且接通该数码管的位选端;
②如果需要显示四位数字时,就需要动态显示了,因为人类的视觉暂留效应(自行百度)在很短时间内依次显示数字,因为时间很短,看起来就像是同时亮着。

亚龙某实验台上的四位数码管显示。

#include "reg52.h"				 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	 	 //对数据类型进行声明定义
typedef unsigned char u8;
//数码管位选
sbit seg1=	P2^0;//第一个数码管
sbit seg2= 	P2^1;//第二个数码管
sbit seg3=	P2^2;//第三个数码管
sbit seg4=	P2^3;//第四个数码管
u8 DisplayData[8];
//u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//自己开发板
u8 code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//学校平台使用
void delay(u16 i)
{
	while(i--);
}

/*******************************************************************************
* 函 数 名       : segdisplay()
* 函数功能		 : 数码管显示
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void segdisplay()
{
	int i;
	for(i=1;i<5;i++)
	{
		switch(i)
		{
			P0=0Xff;
			delay(5);	
			case 1:	 seg1=0;seg2=1;seg3=1;seg4=1; break;
			case 2:	 seg2=0;seg1=1;seg3=1;seg4=1; break;
			case 3:	 seg3=0;seg1=1;seg2=1;seg4=1; break;
			case 4:	 seg4=0;seg1=1;seg2=1;seg3=1; break;
		}
		
		P0=DisplayData[i];
		delay(100);
		P0=0XFF;
		delay(5);	
	}		
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{
 	while(1)
 	{
 		//显示带两位小数的数字,提前把数字乘100,四舍五入或者取整
		 DisplayData[1]=smgduan[temp /1000%10];//显示十位
    	 DisplayData[2]=smgduan[temp /100%10]&0x7f;//显示个位和小数点
    	 DisplayData[3]=smgduan[temp /10%10];//显示十分位
    	 DisplayData[4]=smgduan[temp /1%10];//显示百分位
    	 segdisplay();  
	}
}		

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很抱歉,我是一名自然语言生成AI,无法编写代码。不过我可以提供参考代码供您参考。以下是一个简单的秒表程序: ```c #include <reg51.h> // 51单片机头文件 sbit LED1 = P0^0; // 定义一号LED点亮控制引脚 sbit LED2 = P0^1; // 定义二号LED点亮控制引脚 sbit LED3 = P0^2; // 定义三号LED点亮控制引脚 sbit LED4 = P0^3; // 定义四号LED点亮控制引脚 void delay(int time); // 延时函数 void display(int number); // 数码显示函数 int main() { int count = 0; // 秒表计数变量 while(1) { display(count); // 显示计数 delay(1000); // 延时1秒 count++; // 计数加1 if(count == 10000) // 计数达到10000时复位为0 { count = 0; } } return 0; } void delay(int time) // 延时函数 { int i,j; for(i = 0;i < time;i++) for(j = 0;j < 120;j++); } void display(int number) // 数码显示函数 { int qian, bai, shi, ge; // 定义千百十个位变量 qian = number / 1000; // 计算千位数字 bai = number % 1000 / 100; // 计算百位数字 shi = number % 100 / 10; // 计算十位数字 ge = number % 10; // 计算个位数字 LED1 = 1; // 点亮第一个数码管 P2 = ~qian; // 显示千位数字 delay(5); // 延时5ms LED1 = 0; // 熄灭第一个数码管 LED2 = 1; // 点亮第二个数码管 P2 = ~bai; // 显示百位数字 delay(5); // 延时5ms LED2 = 0; // 熄灭第二个数码管 LED3 = 1; // 点亮第三个数码管 P2 = ~shi; // 显示十位数字 delay(5); // 延时5ms LED3 = 0; // 熄灭第三个数码管 LED4 = 1; // 点亮第四个数码管 P2 = ~ge; // 显示个位数字 delay(5); // 延时5ms LED4 = 0; // 熄灭第四个数码管 } ``` 该程序的原理是通过一个计数器变量来实现秒表功能,同时利用延时函数和数码显示函数控制程序的执行和数码管的显示。程序中的display函数实现了数码管的多位数显示,可以根据实际需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jun8086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值