找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1509|回复: 2
打印 上一主题 下一主题
收起左侧

单片机定时器控制按键秒表程序 暂停之后无法进行其他操作

[复制链接]
跳转到指定楼层
楼主
单片机程序里只定义了一个按键,但是用发的开发板做实物,另一个按键却可以暂停秒表,暂停之后无法进行其他操作,只能按总开关复位


#include <stc15.h>
#include "delay.h"
sbit DS = P1^1; //串行数据
sbit SH = P1^3; //移位寄存器时钟
sbit ST = P1^2; //存储寄存器时钟
sbit K1=P3^2;//按键开关
sbit LED=P5^5;
unsigned char code SEG[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //带小数点的 共阳极管码
unsigned char count,m,n,i,a,b,second,flag;
void Timer0Init(void)                //10毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xF0;                //设置定时初始值
        TH0 = 0xD8;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
}
void Timer2Init(void)                //50毫秒@12.000MHz
{
        AUXR &= 0xFB;                //定时器时钟12T模式
        T2L = 0xB0;                //设置定时初始值
        T2H = 0x3C;                //设置定时初始值
}
//595发送数据
void Send(unsigned char n)//传送数据函数
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                if(n&0x80)//取数据n的最高位
                        DS=1;
                else
                        DS=0;
                n<<=1;//左移数据n
                SH=0;//移入数据
                SH=1;
        }
}

/*主函数*/
void main()
{
  Send(0xff);Send(0xff);ST=0;ST=1;//一开始熄屏
        LED=1;
  EA=1;ET0=1;EX0=1;IT0=1;EX1=1;IT1=1;//开INT0.INT1,T0中断 切INT0,INT1为下降沿有效
  IE2|=0X04;//开T2的中断
  PT0=1;//设T0的优先级比INT0高 也就是优先级T0>INT0>INT1
  Timer0Init();Timer2Init();//定时器初始化
        while(1);
}

        


//中断函数
void INT0(void) interrupt 0
{
        Delay10ms();//延时消抖
        if(K1==0)
        {
                LED=0;
                second=0;//为下一次长按进行初始化
                TR0=1;//定时器0开始计时
                i++;//记录按键次数
        }
        
        while(K1==0);//等待按键释放
        {
                TR0=0;//定时器0暂停计时
                LED=1;
        }

        if(second>50)//表示长按2s
        {
                AUXR &= ~0x10;//定时器2暂停计时
                Send(0xff);Send(0xff);ST=0;ST=1;//熄屏
                m=0;n=0;i=0;//重新初始化
                flag=1;//长按标志位
                LED=1;
        }
        if(i==1)//按下一次 启动计时
                {
                        AUXR |= 0x10;//定时器2开始计时
                        LED=0;
                }
                if(i==2)//再按一下暂停计时
                {
                        AUXR &= ~0x10;//定时器2暂停计时
                        LED=1;
                }
                if(i==3)//按下一次 启动计时
                {
                        AUXR |= 0x10;//定时器2开始计时
                        LED=0;
                        i=1;
                }
}
void Timer0(void) interrupt 1
{
        second++;
}
        
        
        void Timer2(void) interrupt 12
{
        count++;
        if((count%2==0)&&flag==0)//计时2*50ms=0.1s时
        {
                Send(SEG[m]);Send(SEG[n]&0x7f);ST=0;ST=1;//传送数据给数码管 m:个位 n:十位
                m++;
                if(m%10==0)//m>10时向n进位
                {
                        n++;
                        m=0;
                }
                if(n>9)//n>9时清零
                        n=0;
        }
        if(flag==1)
        {
                flag=0;//为下一次长按进行初始化
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2022-12-9 08:57 | 只看该作者
做一个标记:BJ。你的计时程序依据BJ计时,BJ=1就计时,BJ=0就不计时。
这样做暂停,只有将BJ清0,即可。不影响其它东东。而恢复计时呢?就将BJ置1。
切记:不要用按键直接决定计时,因为你的功力不够,逻辑不清。用个BJ做控制,就简单了,清晰了。
回复

使用道具 举报

板凳
ID:77589 发表于 2022-12-9 10:01 | 只看该作者
其它地方没去看,你实现按键功能的中断函数应该可以优化一下,也不知道能不能行,但可以试试
void INT0(void) interrupt 0
{
    Delay10ms();//延时消抖
    if(K1 == 0) {
        LED = 0;
        second = 0;//为下一次长按进行初始化
        TR0 = 1;   //定时器0开始计时
    }
        else {
                return;
        }
    //等待按键释放   
    while(K1 == 0) {
        LED = 1;
    }
    //表示长按2s
    if(second > 50) {
        AUXR &= ~0x10;//定时器2暂停计时
        Send(0xff);
                Send(0xff);
                ST = 0;
                ST = 1;       //熄屏        
                m = 0;
                n = 0;
                i = 0;        //重新初始化
                flag = 1;     //长按标志位
        LED = 1;
                return;
    }
       
        i++;       //记录按键次数
        //按下一次 启动计时
    if(i == 1) {
        AUXR |= 0x10;    //定时器2开始计时
        LED = 0;
    }
        //再按一下暂停计时
    if(i == 2) {
        AUXR &= ~0x10;   //定时器2暂停计时
        LED = 1;
                i = 0;
    }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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