標(biāo)題: 定時器1實(shí)驗(yàn) 請大神幫忙指點(diǎn)哪里錯了 菜鳥在此拜謝 [打印本頁]

作者: bai850107    時間: 2017-9-20 23:19
標(biāo)題: 定時器1實(shí)驗(yàn) 請大神幫忙指點(diǎn)哪里錯了 菜鳥在此拜謝
/**************************************************************************************
*                              定時器1實(shí)驗(yàn)                                                                                                  *
實(shí)現(xiàn)現(xiàn)象:下載程序后數(shù)碼管最后一位間隔一秒循環(huán)顯示0-F。使用單片機(jī)內(nèi)部定時器可以實(shí)現(xiàn)準(zhǔn)確延時。
注意事項(xiàng):如果不想讓點(diǎn)陣模塊顯示,可以將74HC595模塊上的JP595短接片拔掉。                                                                                                                                                                  
***************************************************************************************/

#include <reg52.h>                         //此文件中定義了單片機(jī)的一些特殊功能寄存器

#define uchar unsigned char



sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
                                       
void smgplay();



/*******************************************************************************
* 函 數(shù) 名         : Timer1Init
* 函數(shù)功能                   : 定時器1初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer1Init()
{
        TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。

    TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        ET1=1;//打開定時器1中斷允許
        EA=1;//打開總中斷
        TR1=1;//打開定時器                       
}

/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{       
        LSA=0;
        LSB=0;
        LSC=0;
        Timer1Init();  //定時器1初始化
        while(1);               
}

void time1() interrupt 1
{
uchar num1;
Timer1Init();
if(num1==20)
{
num1=0;
num1++;
smgplay();
        }

        }

void smgplay()
{
while(1)
{
uchar num;
for(num=0;num<16;num++)
{
num=0;
num++;
P0=smgduan[num];
}
}
}


作者: HC6800-ES-V2.0    時間: 2017-9-21 08:54
你程序中的問題我已經(jīng)修改,在我的板子HC6800-ES-V2.0上可以正常顯示了。你對比一下,找找自己的問題。
/**************************************************************************************
*                              定時器1實(shí)驗(yàn)                                                                                                  *
實(shí)現(xiàn)現(xiàn)象:下載程序后數(shù)碼管最后一位間隔一秒循環(huán)顯示0-F。使用單片機(jī)內(nèi)部定時器可以實(shí)現(xiàn)準(zhǔn)確延時。
注意事項(xiàng):如果不想讓點(diǎn)陣模塊顯示,可以將74HC595模塊上的JP595短接片拔掉。                                                                                                                                                                  
***************************************************************************************/

#include <reg52.h>                         //此文件中定義了單片機(jī)的一些特殊功能寄存器

#define uchar unsigned char



sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
uchar num1=0;
uchar num=0;                                       
void smgplay();



/*******************************************************************************
* 函 數(shù) 名         : Timer1Init
* 函數(shù)功能                   : 定時器1初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer1Init()
{
        TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。

    TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        ET1=1;//打開定時器1中斷允許
        EA=1;//打開總中斷
        TR1=1;//打開定時器                        
}

/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{        
        LSA=0;
        LSB=0;
        LSC=0;
        Timer1Init();  //定時器1初始化
P0=0x00;
        while(1);               
}

void time1() interrupt 3
{
    TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;

num1++;
if(num1==20)
{
smgplay();
num1=0;
}

        }

void smgplay()
{

P0=smgduan[num];
num++;
if (num==16)
{
num=0;
}
}

作者: paradisers    時間: 2017-9-21 08:59
for(num=0;num<16;num++)
{
num=0;
num++;
P0=smgduan[num];
}
這個是什么東西,死循環(huán)啊,一直在里面出不來了
作者: GOD丿小男孩    時間: 2017-9-21 14:30
首先smg是死循環(huán),num會一直小于16,其次主函數(shù)里沒有放smg函數(shù),那這個函數(shù)不會運(yùn)行,還有你中斷函數(shù)里放初始化函數(shù)做甚
作者: bai850107    時間: 2017-9-21 21:19
HC6800-ES-V2.0 發(fā)表于 2017-9-21 08:54
你程序中的問題我已經(jīng)修改,在我的板子HC6800-ES-V2.0上可以正常顯示了。你對比一下,找找自己的問題。
/* ...

非常感謝,您讓我學(xué)到很多。對num與num1之間的邏輯關(guān)系似懂非懂,不知是否可以指點(diǎn)一下,在下愚鈍。
在我理解的基礎(chǔ)上稍微修改了一下,這樣是否也可以
如下:
/**************************************************************************************
*                              定時器1實(shí)驗(yàn)                                                                                                  *
實(shí)現(xiàn)現(xiàn)象:下載程序后數(shù)碼管最后一位間隔一秒循環(huán)顯示0-F。使用單片機(jī)內(nèi)部定時器可以實(shí)現(xiàn)準(zhǔn)確延時。
注意事項(xiàng):如果不想讓點(diǎn)陣模塊顯示,可以將74HC595模塊上的JP595短接片拔掉。                                                                                                                                                                  
***************************************************************************************/

#include <reg52.h>                         //此文件中定義了單片機(jī)的一些特殊功能寄存器

#define uchar unsigned char



sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
uchar num1=0;
uchar num=0;                                       
void smgplay();



/*******************************************************************************
* 函 數(shù) 名         : Timer1Init
* 函數(shù)功能                   : 定時器1初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer1Init()
{
        TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。

    TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        ET1=1;//打開定時器1中斷允許
        EA=1;//打開總中斷
        TR1=1;//打開定時器                        
}

/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{        
        LSA=0;
        LSB=0;
        LSC=0;
        Timer1Init();  //定時器1初始化
        P0=0x00;
        while(1);               
}

void time1() interrupt 3
{
        TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
                num1++;
if(num1==20)
{
smgplay();
num1=0;

}

        }

void smgplay()
{

for(num=0;num<16;num++)
{

P0=smgduan[num];


}

}
作者: bai850107    時間: 2017-9-21 21:20
paradisers 發(fā)表于 2017-9-21 08:59
for(num=0;num

非常感謝指點(diǎn)
我理解只是皮毛做了修改
void smgplay()
{

for(num=0;num<16;num++)
{

P0=smgduan[num];


}

}
作者: bai850107    時間: 2017-9-21 21:21
GOD丿小男孩 發(fā)表于 2017-9-21 14:30
首先smg是死循環(huán),num會一直小于16,其次主函數(shù)里沒有放smg函數(shù),那這個函數(shù)不會運(yùn)行,還有你中斷函數(shù)里放 ...

非常感謝您的指點(diǎn)
作者: jane_fly    時間: 2017-9-22 10:06
void smgplay()
{
while(1)
{
uchar num;
for(num=0;num<16;num++)
{
num=0;
num++;
P0=smgduan[num];
}
}
這段程序是一個死循環(huán);
單片機(jī)的中斷服務(wù)函數(shù)應(yīng)盡量剪短,不必要的函數(shù)不要放在中斷中;
例如,你在中斷里面進(jìn)行了數(shù)碼管顯示調(diào)用;建議主函數(shù)中進(jìn)行數(shù)碼管顯示調(diào)用。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1