| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 614 人关注过本帖
标题:新手刚学单片机,求大神帮下 怎么在只有开始 暂停 复位的基础上 让秒表实现 ...
只看楼主 收藏
某年丿某月
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-3-1
结帖率:0
  已结贴   问题点数:5  回复次数:6   
新手刚学单片机,求大神帮下 怎么在只有开始 暂停 复位的基础上 让秒表实现多(3)次计数并可以查询的 如体育秒表
#include <REGX51.H>
#define uchar unsigned char
sbit P20=P2^1;      
sbit P21=P2^0;
sbit KS=P2^5;      //启动按键
sbit KP=P2^6;      //暂停按键
sbit KC=P2^7;      //复位按键
int ge,shi;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,
                  0x6d,0x7d,0x07,0x7f,0x6f};   
void delay_ms(unsigned int ms)        //延时
{
 uchar a;
 while(ms--)
 for(a=123;a>0;a--);
}

void display()        //显示
{
  P20=0;
  P0=tab[ge];
  delay_ms(1);
  P20=1;
  P21=0;
  P0=tab[shi];
  delay_ms(1);
  P21=1;
}

void T0_ISR() interrupt 1     //定时器T0中断
{
  uchar time;                 
  TH0=(65536-50000)/256;     //定时初值
  TL0=(65536-50000)%256;
  time++;
  if(time==20)                 //0.05s*20=1s
  {
    time=0;
    ge++;
  }
}

void main()                   //主函数
{  
  TMOD=0x01;               //定时器T0方式1
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  EA=1;                      //总开关
  ET0=1;                  //允许T0溢出中断
  
  while(1)                  //死循环
  {
     display();
     while(!KS)
     {
       display();
       if(KS)
       TR0=1;
     }
     while(!KP)
     {
       display();
       if(KP)
       TR0=0;
     }
     while(!KC)
     {
       display();
       if(KC)
       TR0=0;
       shi=0;
       ge=0;
     }
     if(ge==10)
     {
       ge=0;
       shi++;
     }
     if(shi==10)
     {
       shi=0;
     }
  }
}
搜索更多相关主题的帖子: display  单片机  include  
2017-06-19 17:01
wlrjgzs
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:67
专家分:429
注 册:2017-4-10
  得分:2 
什么叫“多(3)次计数”?麻烦描述清楚
2017-06-20 14:04
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:316
帖 子:10956
专家分:41506
注 册:2006-5-13
  得分:2 
大概是至少3次吧。

活到老,学到老! http://www.qs98.com E-mail:hu-jj@21cn.com
2017-06-21 07:33
huangwen987
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2017-6-21
  得分:2 
#include <REGX51.H>
#define uchar unsigned char
sbit P20=P2^1;      
sbit P21=P2^0;
sbit KS=P2^5;      //启动按键
sbit KP=P2^6;      //暂停按键
sbit KC=P2^7;      //复位按键
int ge,shi;
//int aa;
//uchar code tab1[6];            //记录三次时间
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,        // 0-9
                  0x6d,0x7d,0x07,0x7f,0x6f};
/*
void Record()            //记时函数
{
    if(aa<=3)                //前三次记时
    {
        switch(aa)
        {
            case 1:tab1[0]=tab[ge];tab1[1]=tab[shi];break;
            case 2:tab1[2]=tab[ge];tab1[3]=tab[shi];break;
            case 3:tab1[4]=tab[ge];tab1[5]=tab[shi];break;
        }
    }
    if(aa>3)                //kp浏览三次记时结果
    {
        TR0=0;                //停下定时器,停止显示刷新
        int aa1;
        aa1=aa%3;
        switch(aa1)
        {
            case 1:tab1[ge]=tab[0];tab1[shi]=tab[1];break;
            case 2:tab1[ge]=tab[2];tab1[shi]=tab[3];break;
            case 3:tab1[ge]=tab[4];tab1[shi]=tab[5];break;
        }
    }
}
*/  
void delay_ms(unsigned int ms)        //延时
{
 uchar a;
 while(ms--)
     for(a=123;a>0;a--);
}

void display()        //显示
{
  P20=0;
  P0=tab[ge];
  delay_ms(1);
  P20=1;
  P21=0;
  P0=tab[shi];
  delay_ms(1);
  P21=1;
}

void T0_ISR() interrupt 1     //定时器T0中断
{
  uchar time;                 
  TH0=(65536-50000)/256;     //定时初值
  TL0=(65536-50000)%256;
  time++;
  if(time==20)                 //0.05s*20=1s
  {
    time=0;
    ge++;
  }
}

void main()                   //主函数
{  
  TMOD=0x01;               //定时器T0方式1
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  EA=1;                      //总开关
  ET0=1;                  //允许T0溢出中断
  //aa=0;                    //aa赋初值
  
  while(1)                  //死循环
  {
       //void Record()        //记时函数
     display();
     while(!KS)
     {
       display();
       if(KS)
       TR0=1;
     }
     while(!KP)
     {
       display();
       if(KP)
      //这句不要 TR0=0;
       //aa++;
     }
     while(!KC)
     {
       display();
       if(KC)
       TR0=0;
       shi=0;
       ge=0;
       //aa=0            //复位时把aa回零
     }
     if(ge==10)
     {
       ge=0;
       shi++;
     }
     if(shi==10)
     {
       shi=0;
     }
  }
}
2017-06-22 00:05
huangwen987
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2017-6-21
  得分:0 
复制到编程软件上看可以看到我加注释的改动地方,只是大概思路,没实践,有问题@我看看
ps:我也是新人。
2017-06-22 00:07
huangwen987
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2017-6-21
  得分:0 
#include <reg51.h>
#define u8 unsigned char
#define u16 unsigned int
sbit wei1=P1^0;
sbit wei2=P1^1;
sbit wei3=P1^2;
sbit key1=P1^3;
sbit key2=P1^4;
sbit key3=P1^5;
u16 aa,aa1,ge,shi;
u8 tab1[6];
void dis();
u8 code tab[]={0x3f,0x06,0x5b,0x4f,0x66,        // 0-9
                  0x6d,0x7d,0x07,0x7f,0x6f};
void da()                        //数据操作
{
    if(aa<=3)                    //前三次记时
    {
        switch(aa)
        {
            case 1:tab1[0]=ge;tab1[1]=shi;break;
            case 2:tab1[2]=ge;tab1[3]=shi;break;
            case 3:tab1[4]=ge;tab1[5]=shi;break;
        }
    }
    if(aa>3)                //三次之后显示
    {
        TR0=0;                //停下时钟
        aa1=aa%3;
        switch(aa1)
        {
            case 1:ge=tab1[0];shi=tab1[1];break;
            case 2:ge=tab1[2];shi=tab1[3];break;
            case 0:ge=tab1[4];shi=tab1[5];break;
        }
    }
}
void timing()                //按键操作
{
    while(!key1)
    {
        dis();
        if(key1)
        {
            TR0=1;
        }
    }
    while(!key2)
    {
        dis();
        if(key2)
        {
            aa++;
        }
    }
    while(!key3)
    {
        dis();
        if(key3)
        {
            TR0=0;
            aa=0;
            ge=0;
            shi=0;
        }
    }
}
void T0_ISR() interrupt 1     //定时器T0中断
{
  u8 time;                 
  TH0=(65536-50000)/256;     //定时初值
  TL0=(65536-50000)%256;
  time++;
  if(time==20)                 //0.05s*20=1s
  {
    time=0;
    ge++;
  }
  if(ge==10)
        {
            shi++;
            ge=0;
        }
}
delayms(u16 x)                //延时
{
    u16 i,j;
    for(i=x;i>0;i--)
        for(j=110;j>0;j--);
}
void dis()                //显示时钟
{
    P0=0x00;
    wei1=0;
    wei2=0;
    wei3=0;
    P0=tab[ge];
    delayms(10);
    P0=0x00;
    wei1=1;
    wei2=0;
    wei3=0;
    P0=tab[shi];
    delayms(10);
   
}
void main()
{
    TMOD=0x01;               //定时器T0方式1
    TH0=(65536-50000)/256;
      TL0=(65536-50000)%256;
      EA=1;                      //总开关
      ET0=1;                  //允许T0溢出中断
    TR0=0;
    ge=0;
    shi=0;
    aa=0;
    while(1)
    {
        key1=1;
        key2=1;
        key3=1;
        dis();
        timing();
        da();   
        if(ge==10)
        {
            shi++;
            ge=0;
        }
    }
}
亲测有效,就是有点小瑕疵
2017-06-22 18:33
杨阳11111
Rank: 2
等 级:论坛游民
威 望:1
帖 子:20
专家分:59
注 册:2017-5-4
  得分:0 
感觉我学了段时间,还是没有学的太好,只是把最基本的学了。还得继续深入研究。
2017-07-22 16:03









关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035424 second(s), 8 queries.
Copyright©2004-2017, BCCN.NET, All Rights Reserved