用51单片机并行口设计显示一个数码的电路,使数码管循环显示“0”~“F”。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用51单片机并行口设计显示一个数码的电路,使数码管循环显示“0”~“F”。相关的知识,希望对你有一定的参考价值。

这是共阳极的数码管,至于你要显示0~F这个在编程实现

参考技术A

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar code DSY_CODE[]=

  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff

;

void DelayMS(uint x)

  uchar t;

while(x--)

for(t=120;t>0;t--);

void main()

  uchar i=0;

P0=0x00;

while(1)

  P0=~DSY_CODE[i];

i=(i+1)%16;/*显示0-f*/

DelayMS(400);

数码管按键定时器的应用

利用 8051 单片机设计秒表,包括 3 个按键、3 位数码管。按键分别用于启动、暂停、
显示学号,时间用数码管显示。开始后显示学号后 3 位。按启动键下后,显示 0.00 以 0.01
秒的频率从 0.00 递增,期间按暂停键时暂停,再次按暂停继续递增,当递增到 9.99 以后循
环。按显示学号键,显示学号。

1、仿真电路:

技术图片

 

 

 2、程序设计:

(1)目录结构:

技术图片

 

 

 (2)主函数:

#include <reg52.h>
#include<display.c>
#include<key.c>
unsigned int cp;
void display(void);
void key(void);
/*Timer0中断服务函数*/
void timer0_isr(void) interrupt 1
{
    TH0=(65535-2000)/256;         //重装初值
    TL0=(65535-2000)%256;         //重装初值
    cp++;    //2000代表2ms,1000ms=1s
    if(mode == 2)cp=0;//按下暂停按键后,mode为2
    else{
        if(cp>=5)                      //0.01s到了
    {
         cp=0;
        xiaoshu++;
    }
    if(xiaoshu>=100)                 //1s到了
    {
        xiaoshu=0;
        sec++;                          //秒+1
        flash=~flash;
    }
    if(sec>=10)    sec=0;              //10S到了
    }
    
    P0=0xff;                
    display();                 //调用display函数
} 

/*******timer0初始化函数********/
void timer0_init(void)
{
    TMOD=0x01;                     //T0工作方式1
    TH0=(65535-2000)/256;         //对机器脉冲计数2000个积满溢出引发中断
    TL0=(65535-2000)%256;
    EA=1;   //开总中断
    ET0=1;   //开T0中断
    TR0=1;    //启动定时器
}

/******主函数********/
void main()
{
    
    timer0_init();                 //调用timer0_init 中断函数

    while(1)
    {
        
        key();                         //调用按键函数    
    }
    
    
}

(3)显示函数:

不同的mode值对应不同的显示(学号OR秒显示)

#include <reg52.h>
unsigned char i,j,xuehao = 113,xiaoshu = 0,sec = 0,flash,mode;
unsigned char code seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  
void display(void)
{
      if(mode == 0)//mode初始化默认为零,显示学号
      {
        switch(i)
        {
            case 0:P0 = seven_seg[xuehao%10];P1 = 0x04;break;//个位
            case 1:P0 = seven_seg[xuehao/10%10];P1 = 0x02;break;//十位
            case 2:P0 = seven_seg[xuehao/100];P1 = 0x01;break;//
        }
        i++;
        if(i>=3)i = 0;
      }
        
      if(mode == 1)
      {
        switch(j)
        {
            case 0:P0 = seven_seg[xiaoshu%10];P1 = 0x04;break;
            case 1:P0 = seven_seg[xiaoshu/10];P1 = 0x02;break;
            case 2:P0 = seven_seg[sec]&(0x7F | flash);P1 = 0x01;break;
        }
        j++;
        if(j>=3)j = 0;
      }
        
      if(mode == 2)
      {
        switch(j)
        {
            case 0:P0 = seven_seg[xiaoshu%10];P1 = 0x04;break;
            case 1:P0 = seven_seg[xiaoshu/10];P1 = 0x02;break;
            case 2:P0 = seven_seg[sec]&(0x7F | flash);P1 = 0x01;break;
        }
        j++;
        if(j>=3)j = 0;
      }
}

(4)按键:

按键的主要作用是使mode得知改变,通过修改mode的值,使display执行相应的显示函数

#include <reg52.h>
sbit key1 =  P2^3; //启动
sbit key2 =  P2^4;//暂停
sbit key3 =  P2^5;//显示学号
unsigned char mode;
void delay(unsigned int x)//delay函数实现短暂的延时(不精确,通过程序的执行次数累积出延时的时间)
{
    while(x--);
}

void key(void)//采用按键按下有效的方式
{
    if(key1 == 0)      //启动键(如果按键按下)
    {
        delay(400);              //消抖
        if(key1 == 0)//消抖后,如果确定按键真的按下了
        {
            mode=1;
        }
        while(key1 == 0);//再按,不起作用,一直执行while
    }
    
    if(key2 == 0)      //暂停键
    {
        delay(400);              //消抖
        if(key2 == 0)
        {
            mode = 2;        
        }
        while(key2 == 0);//再按,不起作用
    }
    
    if(key3 == 0)      //显示学号
    {
        delay(400);              //消抖
        if(key3 == 0)
        {
            mode = 0;
        }
        while(key3 == 0);//再按,不起作用
    }
}

以上是关于用51单片机并行口设计显示一个数码的电路,使数码管循环显示“0”~“F”。的主要内容,如果未能解决你的问题,请参考以下文章

基于51单片机的电子秒表

基于51单片机的电子秒表

画出单片机连接两位LED数码管显示器的硬件电路,说明显示原理。

利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开始每1秒钟加1。

基于51单片机的按键计数设计,4位,0到9999

单片机与数码管驱动芯片连接问题