基于51单片机通过定时器中断实现六位数码管的动态显示

/**************************************************************************/
//            通过定时器中断,实现六位数码管的动态显示
/**************************************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar j = 0, sec,min,hour;
uint i;

bit flash;

sbit dop = P0^7;   //小数点段
code uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code uchar seven_bit[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void timer0_init(void)      //初始化
{
    TMOD = 0x01;
    TH0 = 0xf8;           //(65536 - 2000)/ 256;
    TL0 = 0x30;           //(65536 - 2000)% 256;
    TR0 = 1;
    EA  = 1;
    ET0 = 1;
}
void timer0_isr(void) interrupt 1          //中断
{
    TR0 = 0;
    EA = 0;
    TH0 = 0xf8;
    TL0 = 0x30;
    TR0 = 1;
    EA = 1;
    P0 = 0xff;        //让数码管不显示内容,防止信号串扰
    i++;
    if(i >= 500)       //刚好1秒
       {
        i = 0;
        sec++;
        flash = !flash;    //2秒改变一次状态,如果想让flash1秒改变一次状态怎样做?
    }
    if(sec >= 60)
     {
         sec = 0;
         min++;
     }
     if(min >= 60)
    {
        min = 0;
        hour++;
    }
    if(hour >= 24)
        hour = 0; 
    switch(j)
    {
        case 0: P0 = seven_seg[sec % 10]; break;    //显示秒个位
        case 1: P0 = seven_seg[sec / 10]; break;
        case 2: P0 = seven_seg[min % 10];dop = flash;break; 
        case 3: P0 = seven_seg[min / 10]; break;
        case 4: P0 = seven_seg[hour % 10];dop = flash; ;break;
        case 5: P0 = seven_seg[hour / 10]; break;    
    }
    P2 = seven_bit[j];    //每中断一次只显示一位数码管,显示停留时间为中断间隔
    j ++;
    if(j >= 6)    
    j=0;  //循环变量清零
}
void main(void)
{
    sec=30;
    min=30;
    hour=8;
    P2=0xff;
    timer0_init();
    while(1);
}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
为了实现51单片机数码管动态显示,需要按照以下步骤进行操作: 1.定义数码管的引脚,将其连接到单片机的相应引脚上。 2.定义一个数组,用于存储数码管显示的数字。 3.编写一个循环程序,将数组中的数字依次显示在数码管上,每个数字的显示时间为一段很短的时间,这样就可以实现动态显示的效果。 4.为了显示两数,需要将两个数码管的显示时间错开,例如先显示第一个数码管的数字,然后再显示第二个数码管的数字,这样就可以实现数的动态显示。 下面是一个简单的51单片机数码管动态显示数的程序示例: ```c #include <reg52.h> // 数码管引脚定义 sbit DIG1 = P2^0; sbit DIG2 = P2^1; sbit DIO = P1^0; sbit RCLK = P1^1; sbit SCLK = P1^2; // 数码管显示的数字 unsigned char num[2] = {1, 2}; // 数码管段码表 unsigned char code table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; // 数码管动态显示函数 void display() { unsigned char i, j; for (i = 0; i < 50; i++) { // 循环50次,每次循环显示一个数字 for (j = 0; j < 2; j++) { // 循环两次,分别显示两个数码管的数字 if (j == 0) { // 显示第一个数码管的数字 DIG1 = 0; P0 = table[num[0]]; delay(1); DIG1 = 1; } else { // 显示第二个数码管的数字 DIG2 = 0; P0 = table[num[1]]; delay(1); DIG2 = 1; } } } } // 延时函数 void delay(unsigned int t) { unsigned int i, j; for (i = 0; i < t; i++) { for (j = 0; j < 125; j++); } } // 主函数 void main() { while (1) { display(); // 数码管动态显示函数 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GJZGRB

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

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

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

打赏作者

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

抵扣说明:

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

余额充值