找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2571|回復: 2
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機數(shù)碼管閃爍的問題

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:847202 發(fā)表于 2021-2-4 16:52 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用數(shù)碼管做了數(shù)字鐘,運行沒有什么問題,但是加了流水燈之后,數(shù)碼管會閃爍,這是怎么回事?應(yīng)該怎么解決?求大佬指教!
代碼如下:#include<regx51.h>
#define uint unsigned int
#define uchar unsigned char
sbit s1 = P3^2;//鬧鐘開關(guān)
sbit s2 = P3^3;//設(shè)置
sbit s3 = P3^4;//小時鍵
sbit s4 = P3^5;//分
sbit s5 = P3^6;//退出鍵
sbit fs = P3^0;//蜂鳴器
sbit d = P3^1;//小燈
unsigned char m,f,s,w;//秒,分,時,計數(shù)器
uchar f_nao,s_nao;//鬧鐘分,時
bit flag_nao;//鬧鐘標志
void zuo();
void you();
void delay(uint i);
//void ledscan(uchar h,uchar m,uchar s);
void alarm();
void tiaojie();
void delay(uint i)
{
        while(i--);
               
}
void zuo()
{unsigned char d;
        unsigned char a = 0x01;
        for(d = 0;d<8;d++)
                {
                P0 = ~a;
                delay(1);
          a = a<<1;
    }
                if(a == 0)
                {
                        a = 0x01;
                }
}
void ledscan(uchar h,uchar m,uchar s) reentrant
{
        uchar LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint j;
P1 = LED[s%10];
P2 = 0x7f;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[s/10];
P2 = 0xbf;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = 0x40;
P2 = 0Xdf;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[m%10];
P2 = 0xef;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[m/10];
P2 = 0xf7;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = 0x40;
P2 = 0xfb;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[h%10];
P2 = 0xfd;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[h/10];
P2 = 0xfe;
for(j = 0;j<100;j++);
P2 = 0xff;
}
void tiaojie()
{
        if(s3 == 0)
        {
                ledscan(s,f,m);
                if(s3 == 0)
                {
                        if(s == 23)
                                s = 0;
                                else
                                        s++;
                                        while(!s3)ledscan(s,f,m);
                        }
        }
        else if(s4 == 0)
        {
                ledscan(s,f,m);
                if(s4 == 0)
                {
                        if(f == 59)
                                f = 0;
                                else
                                        f++;
                                        while(!s4)ledscan(s,f,m);
                        }
        }
}void alarm()
{
        //uchar a;
        if(flag_nao)
        {
                if(f==f_nao&&s==s_nao)
                {
                        while(m<=5&&flag_nao)
      {
                                fs = ~fs;
                                ledscan(s,f,m);}
                }
        }
}
void t0() interrupt 1
{
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
        w++;
        if(w == 20)
        {
                w = 0;
                m++;
                if(m == 60)
                {
                        f++;
                        m = 0;
                        if(f == 60)
                        {s++;
                                f = 0;
                                if(s == 24)
                                        s = 0;}
                }
        }zuo();
}
void guan_naozhong() interrupt 0
{
        flag_nao = ~flag_nao;
        d = ~d;
        while(!s1)ledscan(s,f,m);
}
void naozhong()interrupt 2
{
        f_nao = f;
        s_nao = s;
        while(s5)
        {
                ledscan(s_nao,f_nao,0);
                if(s3 == 0)
                {
                        ledscan(s_nao,f_nao,0);
                        if(s3 == 0)
                        {
                                if(s_nao == 24)s_nao =0;
                                else s_nao++;
                                }
                        while(!s3) ledscan(s_nao,f_nao,0);
                }
                else if(s4 == 0)
                {
                        ledscan(s_nao,f_nao,0);
                        if(s4 == 0)
                        {
                                if(f_nao == 59)f_nao =0;
                                        else f_nao++;
                                }
                        while(!s4)
                                ledscan(s_nao,f_nao,0);
                }
        }
}
void main()
{
        TMOD = 0X01;
        TH0 =(65536 - 50000)/256;
        TL0 =(65536 - 50000)%256;
        TR0 = 1;
        ET0 = 1;
        IT1 = 1;
        IT0 = 0;
        EX1 = 1;
        EX0 = 1;
        PT0 = 1;
        EA = 1;
        f = 0;
        m = 0;
        fs = 0;
        flag_nao = 0;
        while(1)
        {
                ledscan(s,f,m);
                tiaojie();
                alarm();
                //zuo();
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:275826 發(fā)表于 2021-2-4 21:02 | 只看該作者
是因為數(shù)碼管刷新時間變長了
回復

使用道具 舉報

板凳
ID:390416 發(fā)表于 2021-2-4 23:34 | 只看該作者
我都不用看 你肯定是用了死等延遲。如果你還沒有學定時器,那么唯一的辦法 就是使用計數(shù)方式來分配時間點,也就是我們說的框架式編程方式,具體的 你可以搜索  人人學會單片機
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表