欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機想做個類似秒表的功能,就是不自增 附程序 [打印本頁]

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

單片機源程序如下:
/*********************************************************************

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

/*
**********************************************************************
*                       本地數據類型/宏定義
**********************************************************************
*/
//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位無符號長整型

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


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

/*********************************************************************
*函數名稱:main
*函數功能:主函數
*函數調用:
*參數列表:無
*返 回 值:無
*結    果:
*備    注:
*********************************************************************/
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    時間: 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    時間: 2022-4-7 06:49
是否沒有進入定時中斷?
作者: DoneDone    時間: 2022-4-7 07:38
樓上凌晨給的代碼可以試試。先解決第一步問題。
作者: DoneDone    時間: 2022-4-7 07:41
dis在兩個地方賦值,有可能出問題。
作者: man1234567    時間: 2022-4-7 08:12
既然是不自增,且直接賦值顯示正常,那么就在主程序中寫上自增,將中斷不用試試。
如果可以,就是中斷問題,可參見器件手冊上中斷的寫法改了就好。
作者: glinfei    時間: 2022-4-7 08:42
1、你是不是算錯了,不是秒表嗎?那應該500ms進一次中斷, 應該改成TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;   
2、你原來不自增的原因,可能是因為由于顯示用時長,num自增的很快在顯示的時候就超過了20,所以這句    if(num==20)永遠通過不了。可以用if(20<=num) 修改。
作者: xiazhiyu1979    時間: 2022-4-7 09:43
glinfei 發表于 2022-4-7 08:42
1、你是不是算錯了,不是秒表嗎?那應該500ms進一次中斷, 應該改成TH0=(65536-50000)/256;
    TL0=(6553 ...

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

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

按照兄弟的程序,可以跑動起來了,經過調試,改為65536-9200,時間基本無誤差,程序后來也改成        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    時間: 2022-4-7 14:06
       if(num>=20)
       {
        num=0;            
        if(dis>=1000)
        dis=0;
        dis++;         

       }           

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





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