数码之家

 找回密码
 立即注册
搜索
查看: 4303|回复: 7

[C51] STC15W单片机组成的轻触开关程序

[复制链接]
发表于 2019-5-28 18:31:24 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
维修一个交流变压器220/110电源的轻触开关,原设计是用一片数字电路CD4069的两个非门做的,因为手里没有这种贴片数字芯片,决定用8引脚的STC15W204S代替,于是写了一段代码准备明天使用,但是总觉得代码太过简单,贴这里请大家看看这么弄靠谱不。
注:接线方式为(1)轻触按键连接在P3.3端口与GND之间。(2)P3.2口经过限流电阻连接S8550的b极经三极管控制继电器通断。
#include <STC15W.h>
#include <intrins.h>
sbit ky=P3^3;
sbit jk=P3^2;
//====20毫秒延时函数======
void delay_20ms()//12MHz&20ms
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 234;
k = 113;
do
{
  do
  {
  while (--k);
  } while (--j);
} while (--i);
}
//=======================
void main(void)
{
jk=1;
while(1)
{
if(ky==0)
delay_20ms();
if(ky==0)
jk=~jk;
}
}

发表于 2019-5-28 23:43:41 | 显示全部楼层
也可以这样写

//=======================
void main(void){
        RELAY=1;
        while(1){
                if(KEY==0){
                        Delay1ms(10);//delay 10 ms
                        while(KEY==0);
                        RELAY=~RELAY;
                }
        }
}

回复 支持 反对

使用道具 举报

发表于 2019-5-29 06:48:13 来自手机浏览器 | 显示全部楼层
楼主程序没有松手检测 这样的话 在按下按键后 端口会每20毫秒 改变一次状态!无法达到 描述功能
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-5-31 09:56:16 | 显示全部楼层
devcang 发表于 2019-5-28 23:43
也可以这样写

//=======================

多谢指点,我真的忘记了按键抬起这事了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 09:57:24 | 显示全部楼层
xueyunmichen 发表于 2019-5-29 06:48
楼主程序没有松手检测 这样的话 在按下按键后 端口会每20毫秒 改变一次状态!无法达到 描述功能 ...

是的,这段代码不行,已经弄好了,多谢指点楼下见。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 10:11:34 | 显示全部楼层
代码已经修改好了,变压器电源也通过这段程序修好了,使用效果不错的。应用代码如下:
//====代码拷贝于keil uv2窗口;粘贴复制即可使用=========
//----单片机:STC15W204S----Vcc=5V-----------
#include <STC15W.h>
#include <intrins.h>
sbit ky=P3^3;//接口与按键连接处、原电路中有10K电阻上拉且有0.1uF电容接地
sbit jk=P3^2;//低电平经1.5K电阻控制三极管S8550,三极管驱动5V继电器
//====20ms延时函数========
void delay_20ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 1;
        j = 234;
        k = 113;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
//====主函数=============
void main (void)
{
jk=1;
while(1)
{
if(ky==0)
        {
        delay_20ms();
        if(ky==0)
                {
                jk=~jk;//有按键按下就反转输出电平
                while(!ky);
                }
        }
else jk=jk;//无键按下就保持输出状态
}
}

回复 支持 反对

使用道具 举报

发表于 2019-6-7 08:40:31 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2019-5-31 10:11
代码已经修改好了,变压器电源也通过这段程序修好了,使用效果不错的。应用代码如下:
//====代码拷贝于kei ...

看楼主最后的程序应该是消抖以后“死等”按键松开,并且在按键松开后才起作用。如果有人长按不松则一直不起作用直到松开。有另一种办法可以按下直接响应,并且程序不会再按键处卡死死等:做个使能标志位默认为1,如果按键按下并且标志为1则消抖 触发一次继电器控制并且把标志清0,这样下一次再来因为不满足标志为1就不触发动作了。再写一个判断就是如果按键松开了 则重新使能按键(标志位置1)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-7 10:04:10 | 显示全部楼层
zky975576094 发表于 2019-6-7 08:40
看楼主最后的程序应该是消抖以后“死等”按键松开,并且在按键松开后才起作用。如果有人长按不松则一直不 ...

多谢指点,再弄时会借鉴的。目前这个按键使用还可以,按键按下就会首先改变输出状态,直到按键抬起才会判断按键的下一个状态,并不是等待按键抬起才转变状态的,所有没有出现卡死的现象,
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-12 10:06 , Processed in 0.234000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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