找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 1489|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)計數(shù)程序,求解惑

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:693473 發(fā)表于 2020-3-25 19:28 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  實(shí)現(xiàn)目的是用單片機(jī)驅(qū)動四位一體的數(shù)碼管計數(shù)從0~2000,程序如下,目前程序存在一個問題就是計數(shù)達(dá)到256之后就自動歸零了,無法繼續(xù)計數(shù),實(shí)在找不到問題所在,特此來論壇求解,有沒有大神解惑?

單片機(jī)源程序如下:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define LED P0
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數(shù)碼管碼表
uchar num,t,kilobit,percentile,tenth,units;
void init();//定時器初始化子程序
void timer0();//
void display();//顯示子程序
void delay(uchar); //延時子程序
sbit KEY1=P3^6;//設(shè)定開始鍵
sbit KEY3=P1^7;//設(shè)定暫停鍵
sbit KEY2=P3^7;//設(shè)定復(fù)位鍵
void main()
{
  init();//調(diào)用初始化程序
  while(1)
    {
      timer0();//查詢時間
      display();//顯示
      if(KEY1==0)//開始
        {
          if(TR0==0)//定時器沒有打開的時候
            {
              t=0;
              num=0;
              TR0=1;   
            }
        }
      else if(KEY2==0)//復(fù)位
        {
          TR0=0;    //關(guān)閉定時器
          TF0=0;   //清除時間溢出標(biāo)志位  
          t=0;
          num=0;
          TR0=1;
        }
          while(!KEY3)
            {
              TR0=~TR0;
                  delay(20);
                }                        
    }
}
void init()//定時器初始化部分
{
  num=t=0;                 //清除數(shù)據(jù)
  TMOD=0x01;              //定時器初始化,選擇為0模式16位計數(shù)器
  TH0=0xEC;              //定時器賦初值,定時50ms,轉(zhuǎn)化為16進(jìn)制
  TL0=0x78;               //65536-5000=60536=0xEC78
  EA=1;                         //CPU中斷允許
  ET0=1;                //置1允許T0中斷(允許溢出請求)
}
void timer0()
{
  if(TF0==1)    //查詢溢出的時間
   {
     TF0=0;     //清除溢出標(biāo)志位
     t++;
     if(t==10) //累計時間到0.5S   
      {
        t=0;
        num++;
      }
   }
}
void display()              //顯示
{
  if(num>2000)
    {
      num=0;  //數(shù)據(jù)顯示限制
     // if(TR0==1)
        TR0=0;
    }  
  kilobit=num/1000;   //取千位
  percentile=(num/100)%10;         //取十位
  tenth=(num/10)%10;
  units=num%10;
  P2=0X00;                //消隱
  P0=0XFF;
  P2=0x01;     //顯示第一位
  LED=tab[kilobit];
  delay(4);//延時
  P2=0X00;                 
  P0=0XFF;
  P2=0x02;   //顯示第二位
  LED=tab[percentile];
  delay(4);//延時
  P2=0X00;
  P0=0XFF;
  P2=0x04;   //顯示第三位
  LED=tab[tenth];
  delay(4);//延時
  P2=0X00;
  P0=0XFF;
  P2=0x08;   //顯示第四位
  LED=tab[units];
  delay(4);//延時
}
void delay(uchar x)
{                                          
  uint i,j;
  for(i=1;i<=x;i++)
  {
    for(j=0;j<=250;j++)
          ;
  }
}

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

使用道具 舉報

沙發(fā)
ID:452950 發(fā)表于 2020-3-25 20:28 | 只看該作者
unsigned char取值范圍(0~255)
回復(fù)

使用道具 舉報

板凳
ID:235200 發(fā)表于 2020-3-25 20:35 | 只看該作者
把這一個變量定義的16位的uchar num 改為uint num
回復(fù)

使用道具 舉報

地板
ID:401564 發(fā)表于 2020-3-25 20:55 | 只看該作者
uchar num
問題在這,自己去看一下C語言數(shù)據(jù)類型范圍值是多少到多少
回復(fù)

使用道具 舉報

5#
ID:213173 發(fā)表于 2020-3-25 21:14 | 只看該作者
num的數(shù)據(jù)類型uchar最大255,應(yīng)該用uint數(shù)據(jù)類型。
回復(fù)

使用道具 舉報

6#
ID:693473 發(fā)表于 2020-3-25 22:50 | 只看該作者
xxpp2011 發(fā)表于 2020-3-25 20:28
unsigned char取值范圍(0~255)

謝謝,懂了
回復(fù)

使用道具 舉報

7#
ID:693473 發(fā)表于 2020-3-25 22:51 | 只看該作者
謝謝各位,懂了
回復(fù)

使用道具 舉報

8#
ID:367369 發(fā)表于 2020-3-26 16:00 | 只看該作者
看見你的256歸零就知道定義的uchar類型的變量了;
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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