打印
[51单片机]

独立按键控制继电器

[复制链接]
926|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小分子|  楼主 | 2016-7-31 21:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/***************************
        独立按键控制继电器
***************************/
#include <reg52.h>

#define uchar unsigned char

sbit KEY = P1 ^ 0;
sbit RelayEN = P0 ^ 0;                                   //定义继电器开启信号

void Timer0Init();                                           //声明定时器0初始化函数
void RelayProcess();                                   //声明断电器处理函数

uchar count = 0;                                           //计秒数

void main()                                                           //主函数
{
        RelayEN = 1;                                           //开机时关闭继电器,否则一上电继电器有动作;

        Timer0Init();
        RelayProcess();
       
}

void Timer0Init()                                           //定时器初始化函数
{
        TMOD |= 0x01;                                           //“|”使用多个定时器时不受影响
        TH0 = 0xFC;                                                   //定时1MS
        TL0 = 0x67;
        TR0 = 1;                                                   //开启定时器0
        EA = 1;                                                           //开启总中断
        ET0 = 1;                                                   //开启定时器0中断
}

void RelayProcess()                                          //继电器处理函数
{
        KEY = 0x01;                                                  //读外部状态时,先使端口输出高电平;
        while (1)
        {
                if(!KEY)                                          //判定有无按键按下
                {
                        if(count >= 20)                          //判定秒数是否达到20MS,即去抖
                        {
                                count = 0;
                                if(!KEY)
                                {
                                        RelayEN = ~RelayEN;//当按键按下时,改变继电器的状态
                                        while(!KEY);           //等待按键释放;
                                }
                        }
                }
        }
       
}

void Timer0() interrupt 1                                //定时器0中断函数
{
        TH0 = 0xFC;                                                        //重新赋值给定时器0
        TL0 = 0x67;
        count++;                                                        //计秒数
}


相关帖子

沙发
jackhwang| | 2016-7-31 22:22 | 只看该作者
你的程序初始化时,定时器0就已经打开了,count就不停在累加,不管按键有无按下。当你的按键在count大于20按下,无法实现去抖效果。

使用特权

评论回复
板凳
小分子|  楼主 | 2016-8-1 21:47 | 只看该作者
jackhwang 发表于 2016-7-31 22:22
你的程序初始化时,定时器0就已经打开了,count就不停在累加,不管按键有无按下。当你的按键在count大于20 ...

哥们,你说得太对了,我这自学的,只是一个演示肯定有很多不足,这样的程序也上不了项目。多谢指点

使用特权

评论回复
地板
小分子|  楼主 | 2016-8-2 07:48 | 只看该作者
小分子 发表于 2016-8-1 21:47
哥们,你说得太对了,我这自学的,只是一个演示肯定有很多不足,这样的程序也上不了项目。多谢指点 ...
/***************************
        独立按键控制继电器
***************************/
#include <reg52.h>

#define uchar unsigned char

sbit KEY = P1 ^ 0;
sbit RelayEN = P0 ^ 0;                                   //定义继电器开启信号

void Timer0Init();                                           //声明定时器0初始化函数
void RelayProcess();                                   //声明断电器处理函数

uchar count = 0;                                           //计秒数

void main()                                                           //主函数
{
        RelayEN = 1;                                           //开机时关闭继电器,否则一上电继电器有动作;

        Timer0Init();
        RelayProcess();
       
}

void Timer0Init()                                           //定时器初始化函数
{
        TMOD |= 0x01;                                           //“|”使用多个定时器时不受影响
        TH0 = 0xFC;                                                   //定时1MS
        TL0 = 0x67;
        EA = 1;                                                           //开启总中断
        ET0 = 1;                                                   //开启定时器0中断
}

void RelayProcess()                                          //继电器处理函数
{
        KEY = 0x01;                                                  //读外部状态时,先使端口输出高电平;
        while (1)
        {
                if(!KEY)                                          //判定有无按键按下
                {
                        TR0 = 1;                                  //按键按下开启定时器0,溢出后开启中断
                       
                        if (count >= 20)                  //判定秒数是否达到20MS,即去抖
                        {
                                count = 0;
                                if (!KEY)
                                {
                                        RelayEN = ~RelayEN;//当按键按下时,改变继电器的状态
                                        while(!KEY);           //等待按键释放;
                                }
                        }
                }
        }
       
}

void Timer0() interrupt 1          //定时器0中断函数
{
        count++;                                  //计秒数
        TR0 =0;                                          //关闭定时器,否则无按键按下也计数;
        TH0 = 0xFC;                                  //重新赋值给定时器0
        TL0 = 0x67;
                                                                        
}

使用特权

评论回复
5
xygyszb| | 2016-8-2 08:09 | 只看该作者
为啥不把处理函数放到定时器里面去?这样定时器还可以去处理其他的事情。

使用特权

评论回复
6
小分子|  楼主 | 2016-8-2 16:26 | 只看该作者
xygyszb 发表于 2016-8-2 08:09
为啥不把处理函数放到定时器里面去?这样定时器还可以去处理其他的事情。 ...

防止影响定时时间。

使用特权

评论回复
7
xygyszb| | 2016-8-3 08:22 | 只看该作者
小分子 发表于 2016-8-2 16:26
防止影响定时时间。

哦,你这个定时器不是系统配置的。是计数形式的。

使用特权

评论回复
8
小分子|  楼主 | 2016-8-3 11:21 | 只看该作者
xygyszb 发表于 2016-8-3 08:22
哦,你这个定时器不是系统配置的。是计数形式的。

还是有缺陷的。应该在键盘释放时,加一个计数清零

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

68

帖子

1

粉丝