找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1481|回复: 7
打印 上一主题 下一主题
收起左侧

关于单片机计数程序,求解惑

[复制链接]
跳转到指定楼层
楼主
ID:693473 发表于 2020-3-25 19:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  实现目的是用单片机驱动四位一体的数码管计数从0~2000,程序如下,目前程序存在一个问题就是计数达到256之后就自动归零了,无法继续计数,实在找不到问题所在,特此来论坛求解,有没有大神解惑?

单片机源程序如下:
#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};//数码管码表
uchar num,t,kilobit,percentile,tenth,units;
void init();//定时器初始化子程序
void timer0();//
void display();//显示子程序
void delay(uchar); //延时子程序
sbit KEY1=P3^6;//设定开始键
sbit KEY3=P1^7;//设定暂停键
sbit KEY2=P3^7;//设定复位键
void main()
{
  init();//调用初始化程序
  while(1)
    {
      timer0();//查询时间
      display();//显示
      if(KEY1==0)//开始
        {
          if(TR0==0)//定时器没有打开的时候
            {
              t=0;
              num=0;
              TR0=1;   
            }
        }
      else if(KEY2==0)//复位
        {
          TR0=0;    //关闭定时器
          TF0=0;   //清除时间溢出标志位  
          t=0;
          num=0;
          TR0=1;
        }
          while(!KEY3)
            {
              TR0=~TR0;
                  delay(20);
                }                        
    }
}
void init()//定时器初始化部分
{
  num=t=0;                 //清除数据
  TMOD=0x01;              //定时器初始化,选择为0模式16位计数器
  TH0=0xEC;              //定时器赋初值,定时50ms,转化为16进制
  TL0=0x78;               //65536-5000=60536=0xEC78
  EA=1;                         //CPU中断允许
  ET0=1;                //置1允许T0中断(允许溢出请求)
}
void timer0()
{
  if(TF0==1)    //查询溢出的时间
   {
     TF0=0;     //清除溢出标志位
     t++;
     if(t==10) //累计时间到0.5S   
      {
        t=0;
        num++;
      }
   }
}
void display()              //显示
{
  if(num>2000)
    {
      num=0;  //数据显示限制
     // 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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:452950 发表于 2020-3-25 20:28 | 只看该作者
unsigned char取值范围(0~255)
回复

使用道具 举报

板凳
ID:235200 发表于 2020-3-25 20:35 | 只看该作者
把这一个变量定义的16位的uchar num 改为uint num
回复

使用道具 举报

地板
ID:401564 发表于 2020-3-25 20:55 | 只看该作者
uchar num
问题在这,自己去看一下C语言数据类型范围值是多少到多少
回复

使用道具 举报

5#
ID:213173 发表于 2020-3-25 21:14 | 只看该作者
num的数据类型uchar最大255,应该用uint数据类型。
回复

使用道具 举报

6#
ID:693473 发表于 2020-3-25 22:50 | 只看该作者
xxpp2011 发表于 2020-3-25 20:28
unsigned char取值范围(0~255)

谢谢,懂了
回复

使用道具 举报

7#
ID:693473 发表于 2020-3-25 22:51 | 只看该作者
谢谢各位,懂了
回复

使用道具 举报

8#
ID:367369 发表于 2020-3-26 16:00 | 只看该作者
看见你的256归零就知道定义的uchar类型的变量了;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表