单片机/MCUwilliam hill官网
直播中

Zack

未满1年用户 3经验值
擅长:嵌入式技术 模拟技术
私信 关注
[问答]

求助大佬,多位数码管如何同时亮并间隔一段时间再灭?``` ‸

下面是我的程序,是不是只有时钟和中断才能实现呢?
#include <REGX52.H>
void Delay(unsigned int xms)//@11.0592MHz
{
unsigned char data i, j;
while(xms--)
{i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};//数码管显示数字断码
void Nixie(unsigned char Location,Number)//第几个数码管,显示的数字
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];//调用第几个断码
Delay(1);
P0=0x00;
}
void main()
{
while(1)
{
Nixie(8,6);Nixie(7,6);Nixie(6,6);
//第八个晶体管,显示6//第七个晶体管,显示6//第六个晶体管,显示6
}
}
/*********************************************************
是普中的A2开发板
89c52rc
下面是数码管和译码器的原理图

屏幕截图 2024-09-19 005402.png

回帖(1)

艾玛

2024-9-19 17:39:52
为了实现多位数码管同时亮并间隔一段时间再灭,可以使用定时器和中断来实现。下面是修改后的程序:

```c
#include

void Delay(unsigned int xms) {
    unsigned char i, j;
    while (xms--) {
        i = 2;
        j = 199;
        do {
            while (--j);
        } while (--i);
    }
}

unsigned char NixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67}; // 数码管显示数字断码

void Nixie(unsigned char Location, unsigned char Number) {
    switch (Location) {
        case 1:
            P2_4 = 1;
            P2_3 = 1;
            P2_2 = 1;
            break;
        case 2:
            P2_4 = 1;
            P2_3 = 1;
            P2_2 = 0;
            break;
        case 3:
            P2_4 = 1;
            P2_3 = 0;
            P2_2 = 1;
            break;
        case 4:
            P2_4 = 0;
            P2_3 = 1;
            P2_2 = 1;
            break;
    }
    P0 = NixieTable[Number]; // 显示数字
    Delay(1); // 延时1ms
    switch (Location) {
        case 1:
            P2_4 = 0;
            P2_3 = 0;
            P2_2 = 0;
            break;
        case 2:
            P2_4 = 0;
            P2_3 = 0;
            P2_2 = 1;
            break;
        case 3:
            P2_4 = 0;
            P2_3 = 1;
            P2_2 = 0;
            break;
        case 4:
            P2_4 = 1;
            P2_3 = 0;
            P2_2 = 0;
            break;
    }
}

void Timer0_Init() {
    TMOD = 0x01; // 定时器0工作模式1
    TH0 = 0xFC;  // 定时器初值
    TL0 = 0x18;
    ET0 = 1;     // 使能定时器0中断
    EA = 1;      // 使能全局中断
    TR0 = 1;     // 启动定时器0
}

void Timer0_ISR() interrupt 1 {
    TH0 = 0xFC;  // 重新加载定时器初值
    TL0 = 0x18;
    static unsigned char count = 0;
    count++;
    if (count >= 1000) { // 1000次中断,约1秒
        count = 0;
        P2 = 0xFF; // 关闭所有数码管
    }
}

void main() {
    unsigned char i;
    Timer0_Init(); // 初始化定时器0
    while (1) {
        for (i = 1; i <= 4; i++) {
            Nixie(i, i); // 显示数字i
        }
    }
}
```

这个程序使用了定时器0和中断来实现数码管的显示。首先,初始化定时器0,设置为工作模式1,定时器初值为0xFC18,使能定时器0中断和全局中断,然后启动定时器0。在定时器0的中断服务程序中,重新加载定时器初值,并通过一个静态变量`count`来计数。当计数达到1000次(约1秒)时,关闭所有数码管。

在主函数中,使用一个循环来依次显示数字1到4。每次调用`Nixie`函数时,会根据传入的数码管位置和数字来显示相应的数字。这样,数码管会依次显示数字1到4,然后间隔一段时间(约1秒)再灭。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分