找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3306|回復(fù): 5
收起左側(cè)

單片機時鐘問題,仿真可以實物數(shù)碼管很暗,蜂鳴器不響

[復(fù)制鏈接]
ID:419540 發(fā)表于 2018-12-3 11:22 來自觸屏版 | 顯示全部樓層 |閱讀模式
1黑幣
時鐘數(shù)碼管顯示不完全,下面是代碼和圖,而且第二個數(shù)碼管不亮,最后一個數(shù)碼管很暗,蜂鳴器不響,仿真成功的,要實現(xiàn)的功能是按鍵按一次響一次,可以校時校分的

#include  "reg51.h"
#define char unsigned char
char code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                     0x80,0x90,0xff,0xbf};
//共陽極LED數(shù)碼管"0~9","滅"和"-"的字段碼
char code scan_con[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//位選擇碼
char data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
//顯示緩沖區(qū),時、分、秒初始為0,0x0b為"-"的編碼
char data timedata[3]={0x00,0x00,0x00};
//分別為秒、分和小時的值
char data ms50=0x00,con=0x00,con1=0x00,con2=0x00;

sbit  key0=P1^0;
sbit  key1=P1^1;
sbit  key2=P1^2;
sbit  beep=P1^7;

//1ms延時函數(shù)

delay1ms(int t)
{
int i,j;
for (i=0;i<t;i++)
        for (j=0;j<120;j++)
        ;
}

//按鍵處理函數(shù)

keyscan()
{
EA=0;
if (key0==0)
        {
        beep=0;
delay1ms(10);
           beep=1;
        while (key0==0);
        con++;
        TR0=0;
        ET0=0;
        if (con>=3)
                {
                con=0;
                TR0=1;
                ET0=1;}
        }
        if (con!=0)
                {
                if (key1==0)
                        {
                                beep=0;
                          delay1ms(10);
                           beep=1;
                        while (key1==0);
                        timedata[con]++;
                        if (con==2) con1=24;else con1=60;                        
if (timedata[con]>=con1)
                                {timedata[con]=0;}
                        }
                }
        if (con!=0)
                {
                if (key2==0)
                        {
                                beep=0;
                        delay1ms(10);
                            beep=1;
                        while (key2==0);
                        timedata[con]--;
                        if (con==2) con2=23;else con2=59;                        
                        if (timedata[con]<=0)
                                {timedata[con]=con2;}
                        }
                }
         EA=1;
        }

        //數(shù)碼管顯示函數(shù)

        scan()
        {
        char k;
        dis[0]=timedata[0]%10;dis[1]=timedata[0]/10;
    dis[3]=timedata[1]%10;dis[4]=timedata[1]/10;
    dis[6]=timedata[2]%10;dis[7]=timedata[2]/10;
    for (k=0;k<8;k++)
                {
                P0=dis_7[dis[k]];P2=scan_con[k];delay1ms(1);P2=0x00;
                }
        }
        
        //主函數(shù)

        main()
        {
        TH0=0x3c;
        TL0=0xb0;
        TMOD=0x01;
        ET0=1;
        TR0=1;
        EA=1;
        while (1)
                {
                scan();
                keyscan();
                }
}

//定時器/計數(shù)器T0中斷服務(wù)函數(shù)

void time_intt0(void) interrupt 1
{
    ET0=0;
    TR0=0;
    TH0=0x3c;
    TL0=0xb0;
    TR0=1;
    ms50++;
if (ms50==20)
        {
        ms50=0x00;timedata[0]++;
        if (timedata[0]==60)
                {
                        timedata[0]=0;timedata[1]++;
                        if (timedata[1]==60)
                        {
                        timedata[1]=0;timedata[2]++;
                        if (timedata[2]==24)
                                {
                                timedata[2]=0;
                                }
                        }
                }
        }
        ET0=1;
}

回復(fù)

使用道具 舉報

ID:316832 發(fā)表于 2018-12-3 14:54 | 顯示全部樓層
大概看了一下樓主的程序,當調(diào)用按鍵子函數(shù)的時候就停止顯示了,可能需要把顯示程序移入定時中斷自動掃描顯示這樣就不斷在掃描按鍵時中斷顯示了。外出搬磚去了,回來再研究一下
回復(fù)

使用道具 舉報

ID:316832 發(fā)表于 2018-12-3 20:44 | 顯示全部樓層

#include  "reg51.h"
#define char unsigned char
char code dis_7[12]={//我的實驗板引腳連接不規(guī)則,所以段碼也不一樣
                                0x21,  //"0"
                0xEB,  //"1"
                0x85,  //"2"
                0x83,  //"3"
                0x4B,  //"4"
                0x13,  //"5"
                0x11,  //"6"
                0xAB,  //"7"
                0x01,  //"8"
                0x03,  //"9"
                                0xFF,  //""0a
                0xDF,  //"-"0b
                     };//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共陽極LED數(shù)碼管"0~9","滅"和"-"的字段碼
char code scan_con[8]={0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f};//{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//位選擇碼
char data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
//顯示緩沖區(qū),時、分、秒初始為0,0x0b為"-"的編碼
char data timedata[3]={0,8,11};
//分別為秒、分和小時的值
char data ms50=0,con=0,con1=0,con2=0;

//char sec,min,hours;

sbit  key0=P1^6;
sbit  key1=P1^5;
sbit  key2=P1^4;
sbit  beep=P1^7;

//1ms延時函數(shù)

delay1ms(int t)
{
int i,j;
for (i=0;i<t;i++)
        for (j=0;j<120;j++)
        ;
}

//按鍵處理函數(shù)

keyscan()
{
EA=0;
if (key0==0)
        {
        beep=0;
        delay1ms(10);
           beep=1;
        while (key0==0);
        con++;
        TR0=0;
        ET0=0;
        if (con>=3)
                {
                con=0;
                TR0=1;
                ET0=1;}
        }
        if (con!=0)
                {
                if (key1==0)
                        {
                                beep=0;
                          delay1ms(10);
                           beep=1;
                        while (key1==0);
                        timedata[con]++;
                        if (con==2) con1=24;else con1=60;                        
if (timedata[con]>=con1)
                                {timedata[con]=0;}
                        }
                }
        if (con!=0)
                {
                if (key2==0)
                        {
                                beep=0;
                        delay1ms(10);
                            beep=1;
                        while (key2==0);
                        timedata[con]--;
                        if (con==2) con2=23;else con2=59;                        
                        if (timedata[con]<=0)
                                {timedata[con]=con2;}
                        }
                }
         EA=1;
        }

        //數(shù)碼管顯示函數(shù)

        scan()
        {
        char k;
        dis[0]=timedata[0]%10;dis[1]=timedata[0]/10;
    dis[3]=timedata[1]%10;dis[4]=timedata[1]/10;
    dis[6]=timedata[2]%10;dis[7]=timedata[2]/10;
    for (k=0;k<8;k++)
                {
                P0=dis_7[dis[k]];P2=scan_con[k];delay1ms(1);P2=0x00;
                }
        }
        
        //主函數(shù)

        main()
        {
        TH0=0x3c;
        TL0=0xb0;
        TMOD=0x01;
        ET0=1;
        TR0=1;
        EA=1;
        while (1)
                {
                scan();
                keyscan();
                }
}

//定時器/計數(shù)器T0中斷服務(wù)函數(shù)

void time_intt0(void) interrupt 1
{
    ET0=0;
    TR0=0;
    TH0=0x3c;
    TL0=0xb0;
    TR0=1;
    ms50++;
        if (ms50==10)//我是用6Mhz晶振
        {
        ms50=0x00;timedata[0]++;
        if (timedata[0]==60)
                {
                        timedata[0]=0;timedata[1]++;
                        if (timedata[1]==60)
                        {
                        timedata[1]=0;timedata[2]++;
                        if (timedata[2]==24)
                                {
                                timedata[2]=0;
                                }
                        }
                }
        }
        ET0=1;
}經(jīng)測試顯示正常

評分

參與人數(shù) 1黑幣 +12 收起 理由
zkele + 12 回帖助人的獎勵!以資鼓勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:316832 發(fā)表于 2018-12-3 20:45 | 顯示全部樓層
請參考,樓主請先確定你的數(shù)碼管是共陰還是共陽,段碼是否一致,晶振是多少M的,然后慢慢查原因,祝你成功

評分

參與人數(shù) 1黑幣 +12 收起 理由
zkele + 12 回帖助人的獎勵!以資鼓勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:433249 發(fā)表于 2018-12-3 20:49 | 顯示全部樓層
硬件圖呢?
回復(fù)

使用道具 舉報

ID:157238 發(fā)表于 2018-12-3 21:09 | 顯示全部樓層
先檢查一下硬件電路有沒有問題。單片機的io口的驅(qū)動能力是很弱的,輸出的電流很小,數(shù)碼管所需的電流較大,所以需要加三極管放大一下,這應(yīng)該就是你數(shù)碼管顯示很暗的原因,蜂鳴器的話你看看你使用的蜂鳴器是有源的還是無源的,有源蜂鳴器的話里面有振蕩源,通直流電的話會一直響,無源蜂鳴器的話里面沒有振蕩電源,所以只當通電的一瞬間會“嗶”的響一下,需要輸出脈沖波才能不斷的觸發(fā),不斷的響。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表