1. 首页 > 科技

51单片机四位一体共阳极数码管显示编程? 单片机数码管0到99循环

51单片机四位一体共阳极数码管显示编程?单片机数码管0到99循环

四位一体共阳级数码管动态显示c语言编程

//满意请采纳

//这是一个四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止

//使用时需采用锁存器

#include <reg52.h>

#include"stdio.h"

unsigned char code LED[]={0xc0, 0xf9, 0xa4,0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

unsigned charLEDbuff[]={0xff,0xff,0xff,0xff};

//定义数码管的位选段

sbit SEG_bit_1 = P0^1;

sbit SEG_bit_2 = P0^2;

sbit SEG_bit_3 = P0^3;

sbit SEG_bit_4 = P0^4;

unsigned int cnt=0;

unsigned int sec =0;

unsigned int mini=0;

unsigned int  hour=0;

unsigned char i=0;

/*void delay(unsigned int z )

{

unsigned int  x,y;

 for(x=z;x>0;x--)

 for(y=110;y>0;y--);

}

*/

void interrupttimer0() interrupt 1 /*设置中断函数*/

{

         TH0=0xfc;

         TL0=0x18;

         cnt++;

         //P1=0x80;

         //delay(1);

         switch(i)

         {

                   case0: SEG_bit_1 = 0;SEG_bit_4 = 1;P1=LEDbuff[0];i++;break;

                   case1: SEG_bit_4 = 0;SEG_bit_3 = 1;P1=LEDbuff[1];i++;break;

                   case2: SEG_bit_3 = 0;SEG_bit_2 = 1;P1=LEDbuff[2]&;i++;break;

                   case3: SEG_bit_2 = 0;SEG_bit_1 = 1;P1=LEDbuff[3];i=0;break;

                   default:break;

         }

}

/************************************************

void serial_init()

 {

         //TMOD= 0x20;       //定时器T/C1工作方式2

         SCON= 0x50;   //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)

         TH1= 0xF3;      //定时器初值高8位设置

         TL1= 0xF3;       //定时器初值低8位设置

         PCON= 0x80;  //波特率倍频(屏蔽本句波特率为2400)

         TR1= 1;   //定时器启动   

  }

 **********************************************/

void main()

{       

   //serial_init();   //串口初始化

         //TMOD=0x21;/*设置定时器*/

         TMOD=0x01;

         TH0=0xfc;

         TL0=0x18;

         TR0=1;

         EA=1;/*设置中断*/

         ET0=1;

         while(1)

         {

                   if(0==TF0)

                   {

                            if(cnt>=1000)

                            {

                                     cnt=0;

                                     sec++;

                                     if(sec>=60) {

                                       sec=0;mini++;

                                       if (mini>=60) {

                                       mini=0;hour++;

                                       if (hour>=24) hour=0;

                                     }

                                     }

                                     LEDbuff[0]=LED[sec%10];//*设置数码管显示位*/

                                     LEDbuff[1]=LED[sec/10%10];

                                     LEDbuff[2]=LED[mini%10];

                                     LEDbuff[3]=LED[mini/10%10];

         //TI=1;    //使用printf函数前须先将发送标志位TI置1

   // printf("%4d %x ,%x %x\n ",sec,LEDbuff[0],LEDbuff[1],LEDbuff[2]);

   // TI=0;

                            }

                   }

         }                

}

四位共阳极 数码管电路图如图,如何编写51单片机程序让他显示四个不同数字,位选P2.0到P2.3,段选P0.0到P0.7

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

void delay(unchar i)

{

unchar j;

for(;i>0;i--)

for(j=0;j<250;j++);

}

void main()

{

while(1)

{

P2=0X08;

P0=0XC0;

delay(5);

P2=0X04;

P0=0XF9;

delay(5);

P2=0X02;

P0=0XA4;

delay(5);

P2=0X01;

P0=0XB0;

delay(5);

}

}

51单片机(四位数码管的显示)程序

下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!

#include<at89x52.h>

unsigned char code Dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管 0-F 代码

unsigned char k; //设置全局变量k 为键盘的键值

/************************************键盘延时函数****************************/

void key_delay(void) //延时函数

{

int t;

for(t=0;t<500;t++);

}

/************************************键盘扫描函数******************************/

void keyscan(void) //键盘扫描函数

{

unsigned char a;

P2 = 0xf0; //键盘初始化

if(P2!=0xf0) //有键按下?

{

key_delay(); //延时

if(P2!=0xf0) //确认真的有键按下?

{

P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平

key_delay();

a = P2; //a作为缓存

switch (a) //开始执行行列扫描

{

case 0xee:k=15;break;

case 0xde:k=11;break;

case 0xbe:k=7;break;

case 0x7e:k=3;break;

default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平

a = P2;

switch (a)

{

case 0xed:k=14;break;

case 0xdd:k=10;break;

case 0xbd:k=6;break;

case 0x7d:k=2;break;

default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平

a = P2;

switch (a)

{

case 0xeb:k=13;break;

case 0xdb:k=9;break;

case 0xbb:k=5;break;

case 0x7b:k=1;break;

default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平

a = P2;

switch (a)

{

case 0xe7:k=12;break;

case 0xd7:k=8;break;

case 0xb7:k=4;break;

case 0x77:k=0;break;

default:break;

}

}

}

break;

}

}

}

}

/****************************** ***主函数*************************************/

void main(void)

{

while(1)

{

keyscan(); //调用键盘扫描函数

switch(k) //查找按键对应的数码管显示代码

{

case 0:P0=Dig[0];break;

case 1:P0=Dig[1];break;

case 2:P0=Dig[2];break;

case 3:P0=Dig[3];break;

case 4:P0=Dig[4];break;

case 5:P0=Dig[5];break;

case 6:P0=Dig[6];break;

case 7:P0=Dig[7];break;

case 8:P0=Dig[8];break;

case 9:P0=Dig[9];break;

case 10:P0=Dig[10];break;

case 11:P0=Dig[11];break;

case 12:P0=Dig[12];break;

case 13:P0=Dig[13];break;

case 14:P0=Dig[14];break;

case 15:P0=Dig[15];break;

default:break; //退出

}

}

}

/**********************************end***************************************/

51单片机4个数码管显示程序

#include<reg52.h> //52系列单片机头文件

#define uchar unsigned char //宏定义

#define uint unsigned int

sbit dula=P2^6; //申明u1锁存器的锁存端

sbit wela=P2^7; // u2

uchar num1,num2;

uchar code table[]={ //数组定义

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar code aable[]={ //位选数组定义

0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void delays(uint); //子函数申明

void main()

{

while(1)

{

for(num1=0;num1<48;num1++)//6个数循环显示

{

wela=1;//打开u2锁存端

P0=aable[num1%6];//送入位选信号

wela=0;//关闭u2锁存端

//delays(1);

dula=1;//打开u1锁存端

P0=table[num1%16];//送入段选信号

dula=0;//关闭u1锁存端

delays(1);

}

}

}

/*---------主函数-----------------------------------------------*/

void delays(uint xs)

{

uint i,j,k;

for(i=xs;i>0;i--)

for(j=1000;j>0;j--)

for(k=110;k>0;k--);

}

/*----------------延时程序-----------------------------------------------*/