久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2656|回復: 11
打印 上一主題 下一主題
收起左側

51單片機想做個類似秒表的功能,就是不自增 附程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:918402 發表于 2022-4-7 01:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
跟著教程學習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--);

}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:624769 發表于 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;
}

評分

參與人數 1黑幣 +12 收起 理由
xiazhiyu1979 + 12

查看全部評分

回復

使用道具 舉報

板凳
ID:960157 發表于 2022-4-7 06:49 | 只看該作者
是否沒有進入定時中斷?
回復

使用道具 舉報

地板
ID:310441 發表于 2022-4-7 07:38 來自手機 | 只看該作者
樓上凌晨給的代碼可以試試。先解決第一步問題。
回復

使用道具 舉報

5#
ID:310441 發表于 2022-4-7 07:41 來自手機 | 只看該作者
dis在兩個地方賦值,有可能出問題。
回復

使用道具 舉報

6#
ID:584814 發表于 2022-4-7 08:12 | 只看該作者
既然是不自增,且直接賦值顯示正常,那么就在主程序中寫上自增,將中斷不用試試。
如果可以,就是中斷問題,可參見器件手冊上中斷的寫法改了就好。
回復

使用道具 舉報

7#
ID:844772 發表于 2022-4-7 08:42 | 只看該作者
1、你是不是算錯了,不是秒表嗎?那應該500ms進一次中斷, 應該改成TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;   
2、你原來不自增的原因,可能是因為由于顯示用時長,num自增的很快在顯示的時候就超過了20,所以這句    if(num==20)永遠通過不了。可以用if(20<=num) 修改。
回復

使用道具 舉報

8#
ID:918402 發表于 2022-4-7 09:43 | 只看該作者
glinfei 發表于 2022-4-7 08:42
1、你是不是算錯了,不是秒表嗎?那應該500ms進一次中斷, 應該改成TH0=(65536-50000)/256;
    TL0=(6553 ...

帶小數點的,所以有兩個數組,最一位數是個位數,是從0.00-9.99循環的,所以自增是10個毫秒一次
回復

使用道具 舉報

9#
ID:918402 發表于 2022-4-7 09:48 | 只看該作者
188610329 發表于 2022-4-7 04:17
while(1)
         {
         display(dis);

謝謝,數字至少跳動起來了,我再研究下,現在顯示效果不好,我再看看原因,謝謝了
回復

使用道具 舉報

10#
ID:918402 發表于 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++;
回復

使用道具 舉報

11#
ID:121859 發表于 2022-4-7 14:06 | 只看該作者
       if(num>=20)
       {
        num=0;            
        if(dis>=1000)
        dis=0;
        dis++;         

       }           
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av免费 | 韩国毛片一区二区三区 | 久久久久国产精品 | 91精品国产手机 | 欧美一区二区在线看 | 午夜在线小视频 | 一级做a爰片久久毛片 | 亚洲欧美综合 | 综合国产 | 国产激情自拍视频 | 日韩欧美亚洲 | 永久av| 欧洲成人 | 日韩欧美手机在线 | 色狠狠一区 | 黄色播放 | 欧美一区二区小视频 | 国产精品视频网站 | 日韩电影在线一区 | 久久国内精品 | 中文字幕免费在线观看 | 国产精品激情在线 | 久久不卡区 | 国产不卡视频 | 国产精品九九九 | 黄色一级免费看 | 91视频在线 | 欧美性久久 | 欧洲一级毛片 | 久久国产一区二区三区 | 成人h片在线观看 | 最新超碰 | 亚洲精品一区国语对白 | 久久精品青青大伊人av | jlzzjlzz国产精品久久 | 成人免费一区二区三区牛牛 | 欧美黄色免费网站 | av电影一区二区 | 精品三区| 久久久久久久一区 | 在线免费观看毛片 |