標(biāo)題: 51單片機(jī)想做個(gè)類似秒表的功能,就是不自增 附程序 [打印本頁]

作者: xiazhiyu1979    時(shí)間: 2022-4-7 01:19
標(biāo)題: 51單片機(jī)想做個(gè)類似秒表的功能,就是不自增 附程序
跟著教程學(xué)習(xí)51單片機(jī),在做練習(xí)的時(shí)候,碰到了難題,原本是想做個(gè)秒表功能,但是只可以一直顯示0.00,不能夠自增計(jì)數(shù)(設(shè)想是從1.00-9.99自增循環(huán)計(jì)數(shù)),搞到半夜也搞不定,測試過,直接賦值某個(gè)數(shù)字,是可以靜態(tài)顯示的,但就是不自增,只好求教各位前輩!能編譯,沒有錯(cuò)誤,有兩個(gè)警告

單片機(jī)源程序如下:
/*********************************************************************

**********************************************************************
程序名稱:
程序版本:V1.0
作    者:                  
編寫時(shí)間:2022年4月6日         
硬件支持:  
接口說明:
修改日志:
    N0.1:
**********************************************************************/
/*
**********************************************************************
*                        頭文件包含/SFR定義
**********************************************************************
*/
#include<reg52.h>

/*
**********************************************************************
*                       本地?cái)?shù)據(jù)類型/宏定義
**********************************************************************
*/
//typedef signed char int8;         //8位有符號字符型
//typedef signed int int16;         //16位有符號整型
//typedef signed long int32;        //32位有符號長整型
typedef unsigned char uchar;      //8位無符號字符型
typedef unsigned int uint;      //16位無符號整型
//typedef unsigned long ulong;     //32位無符號長整型

/*
**********************************************************************
*                        單片機(jī)IO口位定義
**********************************************************************
*/
sbit duan=P2^6;
sbit wei=P2^7;
/*
**********************************************************************
*                      本地全局變量/數(shù)組定義
**********************************************************************
*/
uchar code tableduan[]={0x3f,0x06,0x5b,0x4f,0x66,
                        0x6d,0x7d,0x07,0x7f,0x6f};
uchar code tableduana[]={0xbf,0x86,0xdb,0xcf,0xe6,  //帶小數(shù)點(diǎn)的數(shù)組0-9
                        0xed,0xfd,0x87,0xff,0xef};
uint num,dis;


/*
**********************************************************************
*                         函數(shù)原型聲明
**********************************************************************
*/
display(uint);
delay(uchar);

/*********************************************************************
*函數(shù)名稱:main
*函數(shù)功能:主函數(shù)
*函數(shù)調(diào)用:
*參數(shù)列表:無
*返 回 值:無
*結(jié)    果:
*備    注:
*********************************************************************/
void main(void)
{
    EA=1;
    ET0=1;
    TMOD=0x01;
    TH0=(65536-500)/256;
    TL0=(65536-500)%256;   
    TR0=1;

        while(1)
        {
       if(num==20)
       {
        num=0;            
        if(dis==1000)
        dis=0;
        dis++;         

       }           
        display(dis);

        }
}


void time0() interrupt 1
{
    TH0=(65536-500)/256;
    TL0=(65536-500)%256;  
    num++;

}

display(uint dis)
{

    wei=1;
    P0=0xff;
    wei=0;


    P0=tableduana[dis/100];
    duan=1;   
    duan=0;
    wei=1;
    P0=0xfe;
    wei=0;
    delay (10);


    P0=tableduan[dis%100/10];
    duan=1;   
    duan=0;
    wei=1;
    P0=0xfd;
    wei=0;
    delay (10);


    P0=tableduan[dis%100%10];
    duan=1;   
    duan=0;
    wei=1;
    P0=0xfb;
    wei=0;
    delay (10);   
}

delay(uchar x)
{
    uchar a,b;
    for(a=x;a>0;a--)
       for(b=200;b>0;b--);

}


作者: 188610329    時(shí)間: 2022-4-7 04:17

        while(1)
         {
         display(dis);
         }
}


void time0() interrupt 1
{
     TH0=(65536-1000)/256;
     TL0=(65536-1000)%256;  
    if(++dis>=1000)       dis=0;
}
作者: wskufo    時(shí)間: 2022-4-7 06:49
是否沒有進(jìn)入定時(shí)中斷?
作者: DoneDone    時(shí)間: 2022-4-7 07:38
樓上凌晨給的代碼可以試試。先解決第一步問題。
作者: DoneDone    時(shí)間: 2022-4-7 07:41
dis在兩個(gè)地方賦值,有可能出問題。
作者: man1234567    時(shí)間: 2022-4-7 08:12
既然是不自增,且直接賦值顯示正常,那么就在主程序中寫上自增,將中斷不用試試。
如果可以,就是中斷問題,可參見器件手冊上中斷的寫法改了就好。
作者: glinfei    時(shí)間: 2022-4-7 08:42
1、你是不是算錯(cuò)了,不是秒表嗎?那應(yīng)該500ms進(jìn)一次中斷, 應(yīng)該改成TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;   
2、你原來不自增的原因,可能是因?yàn)橛捎陲@示用時(shí)長,num自增的很快在顯示的時(shí)候就超過了20,所以這句    if(num==20)永遠(yuǎn)通過不了。可以用if(20<=num) 修改。
作者: xiazhiyu1979    時(shí)間: 2022-4-7 09:43
glinfei 發(fā)表于 2022-4-7 08:42
1、你是不是算錯(cuò)了,不是秒表嗎?那應(yīng)該500ms進(jìn)一次中斷, 應(yīng)該改成TH0=(65536-50000)/256;
    TL0=(6553 ...

帶小數(shù)點(diǎn)的,所以有兩個(gè)數(shù)組,最一位數(shù)是個(gè)位數(shù),是從0.00-9.99循環(huán)的,所以自增是10個(gè)毫秒一次
作者: xiazhiyu1979    時(shí)間: 2022-4-7 09:48
188610329 發(fā)表于 2022-4-7 04:17
while(1)
         {
         display(dis);

謝謝,數(shù)字至少跳動(dòng)起來了,我再研究下,現(xiàn)在顯示效果不好,我再看看原因,謝謝了
作者: xiazhiyu1979    時(shí)間: 2022-4-7 10:17
188610329 發(fā)表于 2022-4-7 04:17
while(1)
         {
         display(dis);

按照兄弟的程序,可以跑動(dòng)起來了,經(jīng)過調(diào)試,改為65536-9200,時(shí)間基本無誤差,程序后來也改成        while(1)
        {
//       if(num==20)
//       {
//        num=0;            
       if(dis>=1000)
        dis=0;
//       dis++;         
//      }           
        display(dis);

        }
}


void time0() interrupt 1
{
    TH0=(65536-9200)/256;
    TL0=(65536-9200)%256;  
//    if(++dis>=1000)      
//   dis=0;
    dis++;
作者: zhxiufan    時(shí)間: 2022-4-7 14:06
       if(num>=20)
       {
        num=0;            
        if(dis>=1000)
        dis=0;
        dis++;         

       }           

作者: yzwzfyz    時(shí)間: 2022-4-8 15:41
1、先寫一個(gè)程序W_XXX,能從某個(gè)寄存器XXX中取出一個(gè)數(shù)據(jù)顯示。
2、做一個(gè)10ms的定時(shí)器。
3、每次中斷將XXX+1,(進(jìn)行從1.00-9.99自增循環(huán)計(jì)數(shù))。
這樣就OK了。當(dāng)然顯示部分你未提,估計(jì)你會(huì)了,也就不說了。





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