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