找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1589|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)定時(shí)器控制按鍵秒表程序 暫停之后無(wú)法進(jìn)行其他操作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
單片機(jī)程序里只定義了一個(gè)按鍵,但是用發(fā)的開(kāi)發(fā)板做實(shí)物,另一個(gè)按鍵卻可以暫停秒表,暫停之后無(wú)法進(jìn)行其他操作,只能按總開(kāi)關(guān)復(fù)位


#include <stc15.h>
#include "delay.h"
sbit DS = P1^1; //串行數(shù)據(jù)
sbit SH = P1^3; //移位寄存器時(shí)鐘
sbit ST = P1^2; //存儲(chǔ)寄存器時(shí)鐘
sbit K1=P3^2;//按鍵開(kāi)關(guān)
sbit LED=P5^5;
unsigned char code SEG[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //帶小數(shù)點(diǎn)的 共陽(yáng)極管碼
unsigned char count,m,n,i,a,b,second,flag;
void Timer0Init(void)                //10毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0xF0;                //設(shè)置定時(shí)初始值
        TH0 = 0xD8;                //設(shè)置定時(shí)初始值
        TF0 = 0;                //清除TF0標(biāo)志
}
void Timer2Init(void)                //50毫秒@12.000MHz
{
        AUXR &= 0xFB;                //定時(shí)器時(shí)鐘12T模式
        T2L = 0xB0;                //設(shè)置定時(shí)初始值
        T2H = 0x3C;                //設(shè)置定時(shí)初始值
}
//595發(fā)送數(shù)據(jù)
void Send(unsigned char n)//傳送數(shù)據(jù)函數(shù)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                if(n&0x80)//取數(shù)據(jù)n的最高位
                        DS=1;
                else
                        DS=0;
                n<<=1;//左移數(shù)據(jù)n
                SH=0;//移入數(shù)據(jù)
                SH=1;
        }
}

/*主函數(shù)*/
void main()
{
  Send(0xff);Send(0xff);ST=0;ST=1;//一開(kāi)始熄屏
        LED=1;
  EA=1;ET0=1;EX0=1;IT0=1;EX1=1;IT1=1;//開(kāi)INT0.INT1,T0中斷 切INT0,INT1為下降沿有效
  IE2|=0X04;//開(kāi)T2的中斷
  PT0=1;//設(shè)T0的優(yōu)先級(jí)比INT0高 也就是優(yōu)先級(jí)T0>INT0>INT1
  Timer0Init();Timer2Init();//定時(shí)器初始化
        while(1);
}

        


//中斷函數(shù)
void INT0(void) interrupt 0
{
        Delay10ms();//延時(shí)消抖
        if(K1==0)
        {
                LED=0;
                second=0;//為下一次長(zhǎng)按進(jìn)行初始化
                TR0=1;//定時(shí)器0開(kāi)始計(jì)時(shí)
                i++;//記錄按鍵次數(shù)
        }
        
        while(K1==0);//等待按鍵釋放
        {
                TR0=0;//定時(shí)器0暫停計(jì)時(shí)
                LED=1;
        }

        if(second>50)//表示長(zhǎng)按2s
        {
                AUXR &= ~0x10;//定時(shí)器2暫停計(jì)時(shí)
                Send(0xff);Send(0xff);ST=0;ST=1;//熄屏
                m=0;n=0;i=0;//重新初始化
                flag=1;//長(zhǎng)按標(biāo)志位
                LED=1;
        }
        if(i==1)//按下一次 啟動(dòng)計(jì)時(shí)
                {
                        AUXR |= 0x10;//定時(shí)器2開(kāi)始計(jì)時(shí)
                        LED=0;
                }
                if(i==2)//再按一下暫停計(jì)時(shí)
                {
                        AUXR &= ~0x10;//定時(shí)器2暫停計(jì)時(shí)
                        LED=1;
                }
                if(i==3)//按下一次 啟動(dòng)計(jì)時(shí)
                {
                        AUXR |= 0x10;//定時(shí)器2開(kāi)始計(jì)時(shí)
                        LED=0;
                        i=1;
                }
}
void Timer0(void) interrupt 1
{
        second++;
}
        
        
        void Timer2(void) interrupt 12
{
        count++;
        if((count%2==0)&&flag==0)//計(jì)時(shí)2*50ms=0.1s時(shí)
        {
                Send(SEG[m]);Send(SEG[n]&0x7f);ST=0;ST=1;//傳送數(shù)據(jù)給數(shù)碼管 m:個(gè)位 n:十位
                m++;
                if(m%10==0)//m>10時(shí)向n進(jìn)位
                {
                        n++;
                        m=0;
                }
                if(n>9)//n>9時(shí)清零
                        n=0;
        }
        if(flag==1)
        {
                flag=0;//為下一次長(zhǎng)按進(jìn)行初始化
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2022-12-9 08:57 | 只看該作者
做一個(gè)標(biāo)記:BJ。你的計(jì)時(shí)程序依據(jù)BJ計(jì)時(shí),BJ=1就計(jì)時(shí),BJ=0就不計(jì)時(shí)。
這樣做暫停,只有將BJ清0,即可。不影響其它東東。而恢復(fù)計(jì)時(shí)呢?就將BJ置1。
切記:不要用按鍵直接決定計(jì)時(shí),因?yàn)槟愕墓αΣ粔,邏輯不清。用個(gè)BJ做控制,就簡(jiǎn)單了,清晰了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:77589 發(fā)表于 2022-12-9 10:01 | 只看該作者
其它地方?jīng)]去看,你實(shí)現(xiàn)按鍵功能的中斷函數(shù)應(yīng)該可以優(yōu)化一下,也不知道能不能行,但可以試試
void INT0(void) interrupt 0
{
    Delay10ms();//延時(shí)消抖
    if(K1 == 0) {
        LED = 0;
        second = 0;//為下一次長(zhǎng)按進(jìn)行初始化
        TR0 = 1;   //定時(shí)器0開(kāi)始計(jì)時(shí)
    }
        else {
                return;
        }
    //等待按鍵釋放   
    while(K1 == 0) {
        LED = 1;
    }
    //表示長(zhǎng)按2s
    if(second > 50) {
        AUXR &= ~0x10;//定時(shí)器2暫停計(jì)時(shí)
        Send(0xff);
                Send(0xff);
                ST = 0;
                ST = 1;       //熄屏        
                m = 0;
                n = 0;
                i = 0;        //重新初始化
                flag = 1;     //長(zhǎng)按標(biāo)志位
        LED = 1;
                return;
    }
       
        i++;       //記錄按鍵次數(shù)
        //按下一次 啟動(dòng)計(jì)時(shí)
    if(i == 1) {
        AUXR |= 0x10;    //定時(shí)器2開(kāi)始計(jì)時(shí)
        LED = 0;
    }
        //再按一下暫停計(jì)時(shí)
    if(i == 2) {
        AUXR &= ~0x10;   //定時(shí)器2暫停計(jì)時(shí)
        LED = 1;
                i = 0;
    }
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表