找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1041|回复: 6
收起左侧

有人能不能帮忙看一下这个数码管秒表为什么错了

[复制链接]
ID:435624 发表于 2018-12-26 22:19 | 显示全部楼层 |阅读模式
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int

#define PIN0 P0  //êyÂë1ü¶ÎÑ¡¶Ë
#define PIN1 P1  //êyÂë1üλѡ¶Ë

sbit start=P2^7;  //Æô¶ˉ/ÔYí£°′Å¥
sbit reset=P2^6;  //¸′λ°′Å¥

uint cnt=0;   //1sμÄ′ÎêyμļÆêyÖμ
uint num=0;     //½øèëÖD¶Ï′ÎêyμļÆêyÖ죨ò»′Î50ms£©

uchar code table[]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
//2»′øD¡êyμãμÄ12òõ¼«êyÂë1ü¶ÎÂë0-9


void Display(uint a,uint b,uint c,uint d);  //éùÃ÷ÏÔê¾oˉêy
void InitTimer0();  //éùÃ÷¶¨ê±Æ÷3õê¼»ˉoˉêy
void Delayms(uint x);  //éùÃ÷Ñóê±oˉêy

void main()
{
        uint g,s,b,q=0;
        //òà′ÎêǸöê®°ùǧ
        InitTimer0();          //3õê¼»ˉ¶¨ê±Æ÷
        while(1)                        //½øèëËàÑ-»·
{       
        if(start==0)   //¼ì2aÆô¶ˉ/ÔYí£¼üêÇ·ñ°′ÏÂ
                        Delayms(20); //Ñóê±Ïû¶¶
        {
                if(start==0)  //Ïû¶¶Ö®oóÔù′μì2a
                {
                        TR0=!TR0;                //¶¨ê±Æ÷μÄ¿ØÖÆλ衷′
                        while(!start);  //μè′y°′¼üêí·Å
                }
        }
       
if(reset==0)  //¼ì2a¸′λ¼üêÇ·ñ°′ÏÂ
{
        Delayms(20);        //Ñóê±Ïû¶¶
        if(reset==0)          //Ïû¶¶Ö®oóÔù′μì2a
        {
                num=0;               
                cnt=0;                //ÃëμļÆêyÖμÇå0
                while(!reset);                 //μè′y°′¼üêí·Å
        }
}
       
        if(num>=20)  //ÅD¶Ï¼Æê±ê±¼äêÇ·ñ′ïμ½1s£¨20¸ö50ms£©
        {
                num=0;     //½øèëÖD¶Ï′ÎêyÖμÖÃ0
                cnt++;                 //ÃëμļÆêyÖμ¼ó1
                if(cnt>=9999) //ÅD¶ÏêÇ·ñ′ïμ½9999s
                {
                        TR0=!TR0;                        //′ïμ½9999sÔò1رն¨ê±Æ÷2¢ÇåáãËùóDμļÆêyÖμ
                        num=0;
                        cnt=0;
                       
                }
        }       
        g=cnt%10;          //′óÃëμļÆêyÖμàïÃæ·ÖàëÃëμĸöλ
        s=cnt/10%10;         //′óÃëμļÆêyÖμàïÃæ·ÖàëÃëμÄê®Î»
        b=cnt/100%10;        //′ó·ÖμļÆêyÖμàïÃæ·Öàë·Öμĸöλ
        q=cnt/1000%10;
       
        Display(g,s,b,q);  //ÏÔê¾Õa4¸öêy
}       
}

void InitTimer0() //¶¨ê±Æ÷3õê¼»ˉoˉêy
{
       
        TMOD=0x01; //Ñ¡Ôñ¶¨ê±Æ÷0μÄ1¤×÷·½ê½1
        TH0=(65536-45872)/256;  //×°3õÖ죨¶¨ê±50ms£©,¾§Õñ11.0592MHz
        TL0=(65536-45872)%256;
        EA=1;                //′ò¿a×üÖD¶Ï
        ET0=1;        //′ò¿a¶¨ê±Æ÷ÖD¶Ï
        TR0=0;        //Ïè2»òaÆô¶ˉ¶¨ê±Æ÷
       
}

void TIMER0()  interrupt 1  //¶¨ê±Æ÷ÖD¶Ï·tÎñoˉêy
{
        TH0=(65536-45872)/256;  //ÖØ×°3õÖμ
        TL0=(65536-45872)%256;
        num++;                //èýøèëÖD¶Ï′ÎêyÖμ¼ó1£¬óÃóúÅD¶ÏêÇ·ñ′ïμ½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) //¶¨òåÏÔê¾oˉêy
{       
        PIN0=table[a]; //ÃëμĸöλμĶÎÑ¡
        PIN1=0x0e;                 //ÃëμĸöλμÄλѡ
        Delayms(5);                       
       
        PIN0=table[b];  //ÃëμÄê®Î»μĶÎÑ¡
        PIN1=0x0d;                        //ÃëμÄê®Î»μÄλѡ
        Delayms(5);
       
        PIN0=table[c];  //·ÖμĸöλμĶÎÑ¡
        PIN1=0x0b;                         //·ÖμÄ°ùλμÄλѡ
        Delayms(5);
               
        PIN0=table[d];                //·ÖμÄê®Î»μĶÎÑ¡
        PIN1=0x07;                                //·ÖμÄǧλμÄλѡ
        Delayms(5);               
               
}

回复

使用道具 举报

ID:210139 发表于 2018-12-27 09:14 | 显示全部楼层
void InitTimer0() //?¨ê±?÷3?ê??ˉoˉêy
{
        
        TMOD=0x01; //?????¨ê±?÷0μ?1¤×÷·?ê?1
        TH0=(65536-45872)/256;  //×°3??죨?¨ê±50ms£?,?§??11.0592MHz
        TL0=(65536-45872)%256;
        EA=1;                //′ò?a×ü?D??
        ET0=1;        //′ò?a?¨ê±?÷?D??
        TR0=0;        //?è2?òa???ˉ?¨ê±?÷
        
}
改为void InitTimer0() interrupt 1     //没有“interrupt ”
{        
    //    TMOD=0x01; //定时器的方式写在主函数里面,这里可以不用再写
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
   //     EA=1;               //总中断也是写在主函数里面
    //   ET0=1;        //′这些都应该写在主函数里面?
     //  TR0=0;        //写在主函数里面
        
}
回复

使用道具 举报

ID:210139 发表于 2018-12-27 09:17 | 显示全部楼层
void InitTimer0() //?¨ê±?÷3?ê??ˉoˉêy
{
        
        TMOD=0x01; //?????¨ê±?÷0μ?1¤×÷·?ê?1
        TH0=(65536-45872)/256;  //×°3??죨?¨ê±50ms£?,?§??11.0592MHz
        TL0=(65536-45872)%256;
        EA=1;                //′ò?a×ü?D??
        ET0=1;        //′ò?a?¨ê±?÷?D??
        TR0=0;        //?è2?òa???ˉ?¨ê±?÷
        
}
改为
void InitTimer0() interrupt 1  //“interrupt 1”是写中断函数必不可少的
{
        
        TMOD=0x01; //   方式应该写在主函数里面
        TH0=(65536-45872)/256;  //×°3??죨?¨ê±50ms£?,?§??11.0592MHz
        TL0=(65536-45872)%256;
        EA=1;                //′总中断也应该写在主函数里?
        ET0=1;        //写在主函数里面
        TR0=0;        //?写在主函数里面
        
}
回复

使用道具 举报

ID:210139 发表于 2018-12-27 09:20 | 显示全部楼层
具体是什么情况
回复

使用道具 举报

ID:393699 发表于 2018-12-27 11:01 | 显示全部楼层
大哥,能转换下编码再发上来吗?注释全都乱码,这样看很辛苦……
然后描述下具体现象?
回复

使用道具 举报

ID:357520 发表于 2018-12-27 11:41 | 显示全部楼层
if(reset==0)  
                {
                Delayms(20);      
                if(reset==0)         
                {
                        num=0;               
                        cnt=0;               
                    while(!reset);               
                }
既然是重设就应该将定时器关闭

if(start==0)   
        Delayms(20);
        {
                if(start==0)  
                {
                        TR0=!TR0;   
                        while(!start);
                }
        }
当在到这里时候本来定时器就开着,按一下开始键又给定时器关了

之前我也写过秒表的,其中延时函数也特别重要,延时不对也会造成各种困扰
回复

使用道具 举报

ID:449525 发表于 2018-12-27 12:44 | 显示全部楼层
把keil设置下,百度网上有,简体中文的在发上来给大家解决
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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