点道为止 发表于 2018-12-20 19:04:10

51做了个秒表,出现了问题不知道怎么改了,求指点

#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int


#define PIN0 P0;//数码管段选端
#define PIN1 P1;//数码管位选端

uint cnt=0;   //1s的次数的计数值
uint num=0;   //进入中断次数的计数值(一次50ms)
uint num1=0;                //0.001s的次数的计数值
uint haomiaou=0;

uchar code table[]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
//不带小数点的共阴极数码管段码0-9

uchar code table1[]={0xbf,0x86,
0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//带小数点的共阴极数码管段码0-9

char code table2[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//不带小数点的共阳极数码管段码0-9
uint a,b,c,d,e,f,g,w;

void Display(uint a,uint b,uint c,uint d,uint e,uint f,uint g,uint w);//声明显示函数
void InitTimer0();//声明定时器初始化函数
void Delayms(uint x);//声明延时函数

void main ()
{
        uint haomiao,haomiao1,haomiao2,s,s1,min,min1,minu=0,shi,shiu=0;
        //分别是毫秒的个位,毫秒的十位,毫秒的百位,
        //秒的个位,秒的十位,分的个位,分的十位,时的各位
       
           InitTimer0();          //初始化定时器
   while(1)                        //进入死循环
       {
                //Delayms(20);        //延时消抖
    num=0;                  //进入中断次数的计数值(一次50ms)
                num1=0;                //进入中断次数值清0
                haomiaou=0;        //毫秒的计数值清0
                cnt=0;                //秒的计数值清0
                minu=0;                //分的计数值清0
                shiu=0;    //时的计数值清0
       }
       if(num1>=200)         //检测是否达到0.1s,(两百个50ms)
       {
               num1=0;                //进入中断次数值清零
               haomiao++;                //毫秒秒的个位的计数值加1
               if(haomiao>=10)//若毫秒的个位计数值达到10
               {
                       haomiao=0;       //清零毫秒的个位的计数值
                       num1=0;//进入中断次数值置0
               }
       }
       
      if(num>=20)//判断计时时间是否达到1s(20个50ms)
                        {
                                                cnt++;               //秒的计数值加1
                                                if(cnt>=60) //判断是否达到60s
                                                {
                                                                cnt=0;                //若达到60s,将秒的计数值置零
                                                                        minu++;                        //分的计数值加1
   
                                                        TR0=!TR0;                        //达到60分钟则关闭定时器并清零所有的计数值
                                                        num1=0;
                                                        num=0;
                                                haomiao=0;
                                                cnt=0;               
                                        minu=0;
                                                }
                                }

haomiao=haomiaou%10;   //从毫秒的计数值里面分离毫秒的个位
        haomiao1=haomiaou/10;   //从毫秒的计数值里面分离毫秒的十位
        haomiao2=haomiaou/100;   //从毫秒的计数值里面分离毫秒的百位
        s=cnt%10;        //从秒的计数值里面分离秒的个位
        s1=cnt/10;         //从秒的计数值里面分离秒的十位
        min=minu%10;        //从分的计数值里面分离分的个位
        min1=minu/10;        //从分的计数值里面分离分的十位
        Display(haomiao,haomiao1,haomiao2,s,s1,min,min1,shi);//显示这8个数
}

void InitTimer0() //定时器初始化函数
{
        TMOD=0x10; //选择定时器1的工作方式1
        TH0=(65536-45872)/65536;//装初值(定时50ms),晶振11.0592MHz
        TL0=(65536-45872)%65536;
        EA=1;                //打开总中断
        ET0=1;        //打开定时器中断
        TR0=0;        //先不要启动定时器
}

void TI_time()interrupt 1//定时器中断服务函数
{
        TH0=(65536-45872)/65536;//重装初值
        TL0=(65536-45872)%65536;
        num++;                //让进入中断次数值加1,用于判断是否达到1s
        num1++;                //让进入中断次数值加1,用于判断是否达到0.1s
}
void Delayms(uint x)   //延时xms
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=110;j>0;j--);
}
void Display(uint a,uint b,uint c,uint d,uint e,uint f,uint g,uint w) //定义显示函数
{
        PIN0 = table;                //毫秒的个位的段选
        PIN1 = 0x7f;               //毫秒的个位的位选
        Delayms(5);
       
        PIN0=table1;                //毫秒的十位的段选
        PIN1=0xbf;               //毫秒的十位的位选
        Delayms(5);      
       
        PIN0=table1;                //毫秒的百位的段选
        PIN1=0xdf;               //毫秒的百位的位选
        Delayms(5);         
       
        PIN0=table; //秒的个位的段选
        PIN1=0xef;               //秒的个位的位选
        Delayms(5);                       
       
        PIN0=table1;//秒的十位的段选
        PIN1=0xf7;                        //秒的十位的位选
        Delayms(5);
       
        PIN0=table;//分的个位的段选(带小数点)
        PIN1=0xfb;                       //分的个位的位选
        Delayms(5);
               
        PIN0=table1;                //分的十位的段选
        PIN1=0xfd;                                //分的十位的位选
        Delayms(5);       
       
        PIN0=table;                //时的个位的段选
        PIN1=0xfe;               //时的个位的位选
        Delayms(5);            
}

TyCk 发表于 2018-12-21 08:32:53

楼主,不要只放代码,直接把问题出在哪里说清楚。

pheron 发表于 2018-12-21 08:53:37

什么样的问题?显示错误还是计时错误?

我是大甲鱼 发表于 2018-12-21 10:41:13

你的TR0一直等于0,是怎么让num++的,中断都没进去。

点道为止 发表于 2018-12-23 18:59:25

已经改好了 多谢
页: [1]
查看完整版本: 51做了个秒表,出现了问题不知道怎么改了,求指点