找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机定时器倒数完毕,不能停止,求高手帮忙

[复制链接]
跳转到指定楼层
楼主


这个是 仿真图

求助(1):定时器倒数完毕后,不能停止。
求助(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()                             //初始化子函数
{
    TMOD=0X01;                        //设定定时器0的工作方式为1
    TH0=(65536-50000)/256;            //定时器装初值一个周期50ms
    TL0=(65536-50000)%256;
    EA=1;                            //开总中断
    ET0=1;                            //开定时器0中断
    TR0=1;                            //启动定时器0

}

void delay(uint xms)                //延时子函数
{
    uint i,j;
    for(i=xms;i>0;i--)
    for(j=110;j>0;j--);
}

void scankey()                        //键盘检测子函数
{
   
    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;                         //初始化子函数调用
    while(1)
    {
        scankey();                     //不断键盘扫描
        gew=1;                         //打开数码管个位位选                     
        P0=table[ge];                 //数码管个位赋值
        delay(1);                     //延时 送入数据的反应时间
        gew=0;                         //关闭数码管个位位选
        delay(1);

        shiw=1;                          //打开数码管十位位选   
        P0=table[shi];                  //送入数据
        delay(1);                     
        shiw=0;                          //关闭数码管十位位选
        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;                  //两位数分离赋给数码管十位显示
        ge=num1%10;                      //两位数分离赋给数码管个位显示
    }
}


/*END*/



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

使用道具 举报

沙发
ID:112693 发表于 2018-11-10 23:58 | 只看该作者
还想加一个LED,倒计时完毕,LED开启。
回复

使用道具 举报

板凳
ID:112693 发表于 2018-11-11 09:32 | 只看该作者
求帮助.............
回复

使用道具 举报

地板
ID:213173 发表于 2018-11-11 09:36 | 只看该作者
dragon19790000 发表于 2018-11-10 23:58
还想加一个LED,倒计时完毕,LED开启。

给你改了一下,按键按下时间长短不影响倒计时时间。
#include<reg52.h>

#define uint unsigned int
#define uchar unsigned char
uchar code table[]={//共阳数码管段码"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()                             //初始化子函数
{
        TMOD=0x01;                        //设定定时器0的工作方式为1
        TH0=(65536-50000)/256;            //定时器装初值一个周期50ms
        TL0=(65536-50000)%256;
        EA=1;                            //开总中断
        ET0=1;                            //开定时器0中断
        TR0=0;                            //关闭定时器0
}
void delay(uint xms)                //延时子函数
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
void scankey()                        //键盘检测子函数
{   
        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];                 //数码管个位赋值
                gew=1;                         //打开数码管个位位选        
                delay(1);                     //延时 送入数据的反应时间
                gew=0;                         //关闭数码管个位位选
               
                P0=table[num1/10];                  //送入数据
                shiw=1;                          //打开数码管十位位选
                delay(1);                     
                shiw=0;                          //关闭数码管十位位选       
        }
}
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;//关闭定时器
                        LED=0;//亮
                }
//                num1=time;
//                shi=num1/10;                  //两位数分离赋给数码管十位显示
//                ge=num1%10;                      //两位数分离赋给数码管个位显示
        }
}
回复

使用道具 举报

5#
ID:418425 发表于 2018-11-11 09:39 | 只看该作者
num1=time;这条语句你看看,是不是错了,我一直没看明白这个语句的意思,time变量是什么,如果你要在加一个led,你可以在定时器中num1==0,后led=0;。
回复

使用道具 举报

6#
ID:94031 发表于 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()                             //初始化子函数
{
    TMOD=0X01;                        //设定定时器0的工作方式为1
    TH0=(65536-50000)/256;            //定时器装初值一个周期50ms
    TL0=(65536-50000)%256;
    //EA=1;                            //开总中断
    ET0=1;                            //开定时器0中断
    TR0=1;                            //启动定时器0
}*/

void delay(uint xms)                //延时子函数
{
    uint i,j;
    for(i=xms;i>0;i--)
    for(j=110;j>0;j--);
}

void scankey()                        //键盘检测子函数
{
        if(k1==0)                        //检测键是否被按下
        {
                delay(5);                    //延时消除抖动
                if(k1==0)                    //重新读取k2的值
                {                           
                        while(!k1);                //等待按键释放
                        {        
                                TR0=1;
                                num1=5;        //K1为5秒倒计时
                                k1zt=1;//保存状态
                        }
                }
        }

        if(k2==0)                        //检测键是否被按下
        {
                delay(5);                    //延时消除抖动
                if(k2==0)                    //重新读取k2的值
                {                           
                        while(!k2);                //等待按键释放
                        {                          
                                TR0=1;
                                num1=10;      //K2为10秒倒计时
                                k2zt=1;//保存状态
                        }
                }
        }
}

void xianshi(uchar shi,uchar ge)                //延时子函数
{
    //个位显示
                gew=1;                         //打开数码管个位位选                     
                P0=table[ge];                 //数码管个位赋值
                delay(1);                     //延时 送入数据的反应时间
                gew=0;                         //关闭数码管个位位选
                //delay(1);

                //十位显示
                shiw=1;                          //打开数码管十位位选   
                P0=table[shi];                  //送入数据
                delay(1);                     
                shiw=0;                          //关闭数码管十位位选
                //delay(1);
}

void main()                           

{
        k1zt=0;k2zt=0;//键状态初始化
       
        while(1)
        {
                num++;//循环数
               
                /*if(num==250) //定时器每进行一个周期num加1,运行20个周期即为1s
          {
                        miao++;//秒减数
                        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;      //两位数分离赋给数码管十位显示
                ge=num1%10;       //两位数分离赋给数码管个位显示
                xianshi(shi,ge);  //显示
        }
}

void Timer0()interrupt 1

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


/*END*/

回复

使用道具 举报

7#
ID:408178 发表于 2018-11-11 15:12 | 只看该作者
为什么要在进入while前有一个TR0=0,这是关闭定时器
回复

使用道具 举报

8#
ID:112693 发表于 2018-11-11 18:26 | 只看该作者
yf15966844335 发表于 2018-11-11 09:39
num1=time;这条语句你看看,是不是错了,我一直没看明白这个语句的意思,time变量是什么,如果你要在加一个 ...

time是由key1和key2控制的时间
比如key1是倒计时30秒,key2倒计时50秒
回复

使用道具 举报

9#
ID:112693 发表于 2018-11-11 22:00 | 只看该作者
谢谢高手们的帮助,问题已解决!!  谢谢!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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