找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4248|回復(fù): 8
收起左側(cè)

單片機定時器倒數(shù)完畢,不能停止,求高手幫忙

[復(fù)制鏈接]
ID:112693 發(fā)表于 2018-11-10 22:09 | 顯示全部樓層 |閱讀模式
60.JPG

這個是 仿真圖

求助(1):定時器倒數(shù)完畢后,不能停止。
求助(2):還想加一個LED,倒計時完畢,LED開啟。

求高手幫助。。。。。!萬分感謝。。。!

下面是 C程序:

#include<reg52.h>

#define uint unsigned int
#define uchar unsigned char

uchar code table[]={0xc0,0xf9,0xa4,
                    0xb0,0x99,0x92,
                    0x82,0xf8,0x80,
                    0x90};
sbit gew=P2^1;
sbit shiw=P2^0;

sbit k1=P1^0;
sbit k2=P1^1;

uchar num,num1,time,shi,ge;

void Init()                             //初始化子函數(shù)
{
    TMOD=0X01;                        //設(shè)定定時器0的工作方式為1
    TH0=(65536-50000)/256;            //定時器裝初值一個周期50ms
    TL0=(65536-50000)%256;
    EA=1;                            //開總中斷
    ET0=1;                            //開定時器0中斷
    TR0=1;                            //啟動定時器0

}

void delay(uint xms)                //延時子函數(shù)
{
    uint i,j;
    for(i=xms;i>0;i--)
    for(j=110;j>0;j--);
}

void scankey()                        //鍵盤檢測子函數(shù)
{
   
    if(k1==0)                        //檢測鍵是否被按下
    {
        delay(5);                    //延時消除抖動
        if(k1==0)                    //重新讀取k2的值
        {                           
            while(!k1);                //等待按鍵釋放
            {        
                TR0=1;
                    {
                    num1=5;        //K1為5秒倒計時
                    }
            }
        }
    }
   
   
    if(k2==0)                        //檢測鍵是否被按下
    {
        delay(5);                    //延時消除抖動
        if(k2==0)                    //重新讀取k2的值
        {                           
            while(!k2);                //等待按鍵釋放
            {                          
                TR0=1;
                    {
                    num1=10;      //K2為10秒倒計時
                    }
            }
        }
    }
}

void main()                           

{
    Init();   
    TR0=0;                         //初始化子函數(shù)調(diào)用
    while(1)
    {
        scankey();                     //不斷鍵盤掃描
        gew=1;                         //打開數(shù)碼管個位位選                     
        P0=table[ge];                 //數(shù)碼管個位賦值
        delay(1);                     //延時 送入數(shù)據(jù)的反應(yīng)時間
        gew=0;                         //關(guān)閉數(shù)碼管個位位選
        delay(1);

        shiw=1;                          //打開數(shù)碼管十位位選   
        P0=table[shi];                  //送入數(shù)據(jù)
        delay(1);                     
        shiw=0;                          //關(guān)閉數(shù)碼管十位位選
        delay(1);
        
    }
}

void Timer0()interrupt 1
               
{
    TH0=(65536-50000)/256;              //定時器重裝初值
    TL0=(65536-50000)%256;
    num++;
    if(num==20)                          //定時器每進行一個周期num加1,運行20個周期即為1s
    {
        num=0;                          //到1秒,num清0重新開始
        num1--;                          //倒計時1秒
        if(num1==0)
        num1=time;
        shi=num1/10;                  //兩位數(shù)分離賦給數(shù)碼管十位顯示
        ge=num1%10;                      //兩位數(shù)分離賦給數(shù)碼管個位顯示
    }
}


/*END*/



回復(fù)

使用道具 舉報

ID:112693 發(fā)表于 2018-11-10 23:58 | 顯示全部樓層
還想加一個LED,倒計時完畢,LED開啟。
回復(fù)

使用道具 舉報

ID:112693 發(fā)表于 2018-11-11 09:32 | 顯示全部樓層
求幫助.............
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2018-11-11 09:36 | 顯示全部樓層
dragon19790000 發(fā)表于 2018-11-10 23:58
還想加一個LED,倒計時完畢,LED開啟。

給你改了一下,按鍵按下時間長短不影響倒計時時間。
#include<reg52.h>

#define uint unsigned int
#define uchar unsigned char
uchar code table[]={//共陽數(shù)碼管段碼"0~f-."
                0xc0,0xf9,0xa4,0xb0,
                0x99,0x92,0x82,0xf8,
                0x80,0x90,0x88,0x83,
                0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
sbit gew=P2^1;
sbit shiw=P2^0;
sbit k1=P1^0;
sbit k2=P1^1;
sbit LED=P3^0;
uchar num=0,num1=0;
bit sign1=0,sign2=0;
void Init()                             //初始化子函數(shù)
{
        TMOD=0x01;                        //設(shè)定定時器0的工作方式為1
        TH0=(65536-50000)/256;            //定時器裝初值一個周期50ms
        TL0=(65536-50000)%256;
        EA=1;                            //開總中斷
        ET0=1;                            //開定時器0中斷
        TR0=0;                            //關(guān)閉定時器0
}
void delay(uint xms)                //延時子函數(shù)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
void scankey()                        //鍵盤檢測子函數(shù)
{   
        if(k1==0)                        //檢測鍵是否被按下
        {
                delay(5);                    //延時消除抖動
                if((k1==0)&&(sign1==0))       //重新讀取k1的值/自鎖值
                {                           
                        sign1=1;//自鎖
                        LED=1;//滅
                        num1=5;                                //K1為5秒倒計時
                        TR0=1;//開定時器
//                        while(!k1);                //等待按鍵釋放      
                }
        }
        else sign1=0;//按鍵釋放

        if(k2==0)                        //檢測鍵是否被按下
        {
                delay(5);                    //延時消除抖動
                if((k2==0)&&(sign2==0))    //重新讀取k2的值/自鎖值
                {                           
                        sign2=1;//自鎖
                        LED=1;//滅
                        num1=10;                                      //K2為10秒倒計時
                        TR0=1;//開定時器
//                        while(!k2);                //等待按鍵釋放
                }
        }
        else sign2=0;//按鍵釋放
}
void main()                           
{
        Init();   
//        TR0=0;
        LED=0;//亮
        while(1)
        {
                scankey();                     //不斷鍵盤掃描

                P0=table[num1%10];                 //數(shù)碼管個位賦值
                gew=1;                         //打開數(shù)碼管個位位選        
                delay(1);                     //延時 送入數(shù)據(jù)的反應(yīng)時間
                gew=0;                         //關(guān)閉數(shù)碼管個位位選
               
                P0=table[num1/10];                  //送入數(shù)據(jù)
                shiw=1;                          //打開數(shù)碼管十位位選
                delay(1);                     
                shiw=0;                          //關(guān)閉數(shù)碼管十位位選       
        }
}
void Timer0()interrupt 1              
{
        TH0=(65536-50000)/256;              //定時器重裝初值
        TL0=(65536-50000)%256;
        num++;
        if(num==20)                          //定時器每進行一個周期num加1,運行20個周期即為1s
        {
                num=0;                          //到1秒,num清0重新開始
                num1--;                          //倒計時1秒
                if(num1==0)
                {
                        TR0=0;//關(guān)閉定時器
                        LED=0;//亮
                }
//                num1=time;
//                shi=num1/10;                  //兩位數(shù)分離賦給數(shù)碼管十位顯示
//                ge=num1%10;                      //兩位數(shù)分離賦給數(shù)碼管個位顯示
        }
}
回復(fù)

使用道具 舉報

ID:418425 發(fā)表于 2018-11-11 09:39 | 顯示全部樓層
num1=time;這條語句你看看,是不是錯了,我一直沒看明白這個語句的意思,time變量是什么,如果你要在加一個led,你可以在定時器中num1==0,后led=0;。
回復(fù)

使用道具 舉報

ID:94031 發(fā)表于 2018-11-11 10:11 | 顯示全部樓層
修改了你的程序:
#include<reg52.h>

#define uint unsigned int
#define uchar unsigned char

uchar code table[]={0xc0,0xf9,0xa4,
                    0xb0,0x99,0x92,
                    0x82,0xf8,0x80,
                    0x90};
sbit gew=P2^1;
sbit shiw=P2^0;

sbit k1=P1^0;
sbit k2=P1^1;

uchar num,num1,time,shi,ge;
uchar t0s;
uchar k1zt,k2zt;
char miao;                                                                               

/*void Init()                             //初始化子函數(shù)
{
    TMOD=0X01;                        //設(shè)定定時器0的工作方式為1
    TH0=(65536-50000)/256;            //定時器裝初值一個周期50ms
    TL0=(65536-50000)%256;
    //EA=1;                            //開總中斷
    ET0=1;                            //開定時器0中斷
    TR0=1;                            //啟動定時器0
}*/

void delay(uint xms)                //延時子函數(shù)
{
    uint i,j;
    for(i=xms;i>0;i--)
    for(j=110;j>0;j--);
}

void scankey()                        //鍵盤檢測子函數(shù)
{
        if(k1==0)                        //檢測鍵是否被按下
        {
                delay(5);                    //延時消除抖動
                if(k1==0)                    //重新讀取k2的值
                {                           
                        while(!k1);                //等待按鍵釋放
                        {        
                                TR0=1;
                                num1=5;        //K1為5秒倒計時
                                k1zt=1;//保存狀態(tài)
                        }
                }
        }

        if(k2==0)                        //檢測鍵是否被按下
        {
                delay(5);                    //延時消除抖動
                if(k2==0)                    //重新讀取k2的值
                {                           
                        while(!k2);                //等待按鍵釋放
                        {                          
                                TR0=1;
                                num1=10;      //K2為10秒倒計時
                                k2zt=1;//保存狀態(tài)
                        }
                }
        }
}

void xianshi(uchar shi,uchar ge)                //延時子函數(shù)
{
    //個位顯示
                gew=1;                         //打開數(shù)碼管個位位選                     
                P0=table[ge];                 //數(shù)碼管個位賦值
                delay(1);                     //延時 送入數(shù)據(jù)的反應(yīng)時間
                gew=0;                         //關(guān)閉數(shù)碼管個位位選
                //delay(1);

                //十位顯示
                shiw=1;                          //打開數(shù)碼管十位位選   
                P0=table[shi];                  //送入數(shù)據(jù)
                delay(1);                     
                shiw=0;                          //關(guān)閉數(shù)碼管十位位選
                //delay(1);
}

void main()                           

{
        k1zt=0;k2zt=0;//鍵狀態(tài)初始化
       
        while(1)
        {
                num++;//循環(huán)數(shù)
               
                /*if(num==250) //定時器每進行一個周期num加1,運行20個周期即為1s
          {
                        miao++;//秒減數(shù)
                        if(miao>99){miao=0;num=0;}
                        num=0;
                }*/
                scankey();        //鍵盤掃描
                if(k1zt==1)
                {
                        k1zt=0;
                        miao=5;
                }
                if(k2zt==1)
                {
                        k2zt=0;
                        miao=10;
                }
               
                if(num==250) //
          {
                  miao--;if(miao<0){miao=0;}
                        num=0;
                }
                num1=miao;
                shi=num1/10;      //兩位數(shù)分離賦給數(shù)碼管十位顯示
                ge=num1%10;       //兩位數(shù)分離賦給數(shù)碼管個位顯示
                xianshi(shi,ge);  //顯示
        }
}

void Timer0()interrupt 1

{
        TH0=(65536-50000)/256;              //定時器重裝初值
        TL0=(65536-50000)%256;
       
        num++;
}


/*END*/

回復(fù)

使用道具 舉報

ID:408178 發(fā)表于 2018-11-11 15:12 | 顯示全部樓層
為什么要在進入while前有一個TR0=0,這是關(guān)閉定時器
回復(fù)

使用道具 舉報

ID:112693 發(fā)表于 2018-11-11 18:26 | 顯示全部樓層
yf15966844335 發(fā)表于 2018-11-11 09:39
num1=time;這條語句你看看,是不是錯了,我一直沒看明白這個語句的意思,time變量是什么,如果你要在加一個 ...

time是由key1和key2控制的時間
比如key1是倒計時30秒,key2倒計時50秒
回復(fù)

使用道具 舉報

ID:112693 發(fā)表于 2018-11-11 22:00 | 顯示全部樓層
謝謝高手們的幫助,問題已解決。  謝謝。!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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