鱼C论坛

 找回密码
 立即注册
查看: 2072|回复: 4

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

[复制链接]
发表于 2018-12-20 19:04:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[a];                //毫秒的个位的段选
        PIN1 = 0x7f;                 //毫秒的个位的位选
        Delayms(5);
       
        PIN0=table1;                //毫秒的十位的段选
        PIN1=0xbf;                 //毫秒的十位的位选
        Delayms(5);        
       
        PIN0=table1[c];                //毫秒的百位的段选
        PIN1=0xdf;                 //毫秒的百位的位选
        Delayms(5);         
       
        PIN0=table[d]; //秒的个位的段选
        PIN1=0xef;                 //秒的个位的位选
        Delayms(5);                       
       
        PIN0=table1[e];  //秒的十位的段选
        PIN1=0xf7;                        //秒的十位的位选
        Delayms(5);
       
        PIN0=table[f];  //分的个位的段选(带小数点)
        PIN1=0xfb;                         //分的个位的位选
        Delayms(5);
               
        PIN0=table1[g];                //分的十位的段选
        PIN1=0xfd;                                //分的十位的位选
        Delayms(5);       
       
        PIN0=table[w];                //时的个位的段选
        PIN1=0xfe;                 //时的个位的位选
        Delayms(5);            
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-21 08:32:53 | 显示全部楼层
楼主,不要只放代码,直接把问题出在哪里说清楚。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 08:53:37 | 显示全部楼层
什么样的问题?显示错误还是计时错误?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 10:41:13 | 显示全部楼层
你的TR0一直等于0,是怎么让num++的,中断都没进去。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-23 18:59:25 | 显示全部楼层
已经改好了 多谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 15:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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