找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神,在做单片机秒表实验,就复位有问题

[复制链接]
ID:438852 发表于 2020-11-9 11:10 | 显示全部楼层 |阅读模式
#include "reg51.h"
unsigned char seg_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //数码管字模
unsigned char time=0;
unsigned char sec=20;
unsigned char min=60;
sbit P3_0=P3^0;                                                          //定义位变量
sbit P3_1=P3^1;
sbit key1=P1^0;                                                                 //清零
sbit key2=P1^1;                                                                                                                         //暂停
sbit key3=P1^2;                                                                                                                         //启动
unsigned char wei1;
unsigned char wei2;

void delay(unsigned int a)   //误差 0us
{
    unsigned int j;
    for(;a>0;a--)
        for(j=0;j<125;j++);

}


void timer0() interrupt 1         //T0中断函数
{   

     TH0=0x3c;                                          //计数初值
         TL0=0xb0;
         if(++time==sec)                      //1s
         {     
                  time=0;                                                   
              if(min==60)                            //60s循环
                  min=0;
                  wei1=min%10;                  //个位
                  wei2=min/10;                  //十位
                  min++;
         }                             
}





void main()
{
     TMOD=0x01;                                          //T0方式一
         TH0=0x3c;
         TL0=0xb0;
         TR0=0;                                                  //定时器打开
         EA=1;                                                  //开中断
         ET0=1;
         TR0=1;     
     while(1)
         {
                      if(key3==0)                  //启动
                     {        
                           TR0=1;
                     }
                          if(key2==0)                  //暂停
                {        
                       TR0=0;
                    }
                         if(key1!=0)                  //清零
                     {        
                           P3_1=1;
                       P2=seg_mod[wei2];                  //个位显示
                       P3_0=0;
                       delay(5);
                       P3_0=1;
                       P2=seg_mod[wei1];                  //十位显示
                       P3_1=0;
                       delay(5);
                     }
                         else
                         {
                           wei1=wei2=0;
                           P3_1=1;
                       P2=seg_mod[wei2];;                  //个位显示
                       P3_0=0;
                       delay(5);
                       P3_0=1;
                       P2=seg_mod[wei1];                  //十位显示
                       P3_1=0;
                       delay(5);
                         }
                  
                 
               
        
         }
         
}

回复

使用道具 举报

ID:438852 发表于 2020-11-9 11:11 | 显示全部楼层
按下按键显示清零,松开就返回原值。
回复

使用道具 举报

ID:158375 发表于 2020-11-9 12:44 | 显示全部楼层
在  wei1=wei2=0; 前边 加一行试试:
      min=0;
      wei1=wei2=0;
原因:定时器里面 min 没改变引起的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:332444 发表于 2020-11-9 12:58 | 显示全部楼层
清零时也要把中断停止试看。
回复

使用道具 举报

ID:140489 发表于 2020-11-9 14:43 | 显示全部楼层
void timer0() interrupt 1         //T0中断函数
{   

     TH0=0x3c;                                          //计数初值
         TL0=0xb0;
         if(++time==sec)                      //1s
         {     
                  time=0;                                                   
              if(min==60)                            //60s循环
                  min=0;
                  wei1=min%10;                  //个位
                  wei2=min/10;                  //十位
                  min++;
         }                             
}
////////////////////////////////
void timer0() interrupt 1         //T0中断函数
{   

     TH0=0x3c;                                          //计数初值
         TL0=0xb0;
         if(++time==sec)                      //1s
         {     
                  time=0;
                  min++;       //把min++写这里                          
              if(min==60)                            //60s循环
                  min=0;
                  wei1=min%10;                  //个位
                  wei2=min/10;                  //十位
           //       min++;
         }                             
}
回复

使用道具 举报

ID:438852 发表于 2020-11-9 22:56 | 显示全部楼层
#include "reg51.h"
unsigned char seg_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //数码管字模
unsigned char time=0;
unsigned char sec=20;
unsigned char min=60;
sbit P3_0=P3^0;                                                          //定义位变量
sbit P3_1=P3^1;
sbit key1=P1^0;                                                                 //清零
sbit key2=P1^1;                                                                                                                         //暂停
sbit key3=P1^2;                                                                                                                         //启动
unsigned char wei1;
unsigned char wei2;

void delay(unsigned int a)   //误差 0us
{
    unsigned int j;
    for(;a>0;a--)
        for(j=0;j<122;j++);
            
}


void timer0() interrupt 1         //T0中断函数
{   
   
     TH0=0x3c;                                          //计数初值
         TL0=0xb0;
         if(++time==sec)                      //1s
         {     
                  time=0;                                                   
              if(min==60)                            //60s循环
                  min=0;
                  wei1=min%10;                  //个位
                  wei2=min/10;                  //十位
                  min++;
         }                             
}





void main()
{
     TMOD=0x01;                                          //T0方式一
         TH0=0x3c;
         TL0=0xb0;
         TR0=0;                                                  //定时器打开
         EA=1;                                                  //开中断
         ET0=1;   
     while(1)
         {
                      if(key3==0)                  //启动
                     {       
                           TR0=1;
                     }
                          if(key2==0)                  //暂停
                {       
                       TR0=0;
                    }
                         if(key1!=0)                  //清零
                     {       
                           P3_1=1;
                       P2=seg_mod[wei2];                  //个位显示
                       P3_0=0;
                       delay(5);
                       P3_0=1;
                       P2=seg_mod[wei1];                  //十位显示
                       P3_1=0;
                       delay(5);
                     }
                         else
                         {
                          
                           TH0=0x3c;                                          //计数初值
                   TL0=0xb0;
                           min=0;
                           wei1=wei2=0;
                           P3_1=1;
                       P2=seg_mod[wei2];;                  //个位显示
                       P3_0=0;
                       delay(5);
                       P3_0=1;
                       P2=seg_mod[wei1];                  //十位显示
                       P3_1=0;
                       delay(5);
                         }
                  
                 
               
       
         }
          
}
回复

使用道具 举报

ID:438852 发表于 2020-11-9 22:56 | 显示全部楼层
已经改好,谢谢大神们
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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