切换到宽版
  • 1957阅读
  • 17回复

[C51]关于15F104W的键盘扫描 [复制链接]

上一主题 下一主题
离线慕名而来

发帖
1545
M币
6357
专家
11
粉丝
62
只看该作者 10楼 发表于: 2017-04-07
如果楼主只是用两个按键控制一个灯,程序确实麻烦了些,你用的是8个I/O口查询的方式,另外这个设置也没用到:sbit led=P3^3;       //将 LED0 位定义为 P3.3引脚
很赞同6楼的控制方法,简洁明了,如果想移植到其他程序中,只要将主循环这些代码封装成一个函数即可。
离线rock666

发帖
120
M币
328
专家
3
粉丝
10
只看该作者 11楼 发表于: 2017-04-07
回 wulin 的帖子
wulin:两个独立按键控制一个LED亮灭,为什么写这么复杂?I/O口是可以直接位操作的。在你原程序基础上删改。注:15F104W 是1T单片机
#include<reg51.h>    //  包含 51单片机寄存器定义的头文件
sbit S1=P3^2;       .. (2017-04-07 08:14) 回 wulin 的帖子

因为要用在控制太阳能热水器的自动上水控制上,只用一个按钮开关的话有重复触发的可能。分成两个按钮控制的话,控制关闭的可靠性高一些;以前玩PLC的,现在想把一些小东西直接用小巧的单片机完成,刚开始学习,还请大神们多多指教!谢谢!
离线rock666

发帖
120
M币
328
专家
3
粉丝
10
只看该作者 12楼 发表于: 2017-04-07
由于大家对此程序用途有疑问,我大概说明一下,大家可以画龙点睛一下
老岳父家的 太阳能热水器由于水压太低,必须通过增压泵上水,但是经常忘记加水导致无热水可用,或者突然手动上水导致爆管。
热水器增压泵加满水后会有蜂鸣报警,然后要手动关闭增压泵的电源;
现在我的想法是分两步完成初级和高级两个版本
初级版:
单片机安装到插座里面,增压泵始终接在插座上,需要增压给太阳能加水时,就按下接通按钮,太阳能水慢后蜂鸣报警,在关闭按钮上加个光耦,光耦的发射端接一个声控模块(有蜂鸣报警时光耦导通,关闭按钮端口动作,增压泵关闭);这个初级版,人只需要定时按一下导通开关;
高级版:
在初级版的基础上增加定时扫描检测太阳能水量(太阳能有个有线控制板,按一下上面的开关,会有4个led灯显示当前储水量,分别是100%,80%,50%,缺水)
一路io定时(如一小时一次)接通有线控制板的开关,如果检测到水量在50%或者缺水,则启动增压泵,直到蜂鸣报警后自动断开增压泵电源,最后定时io再动作一次(关闭线控面板的储水量显示)
以上单片机和太阳能控制面板直接的通信都通过光耦完成,避免不同电源导致的问题(单片机由插座里面的5v电源供电;太阳能控制面板由主机的内部电路供电;)
离线bg4rff

发帖
1411
M币
1203
专家
8
粉丝
24
只看该作者 13楼 发表于: 2017-04-07
回 rock666 的帖子
rock666:由于大家对此程序用途有疑问,我大概说明一下,大家可以画龙点睛一下
老岳父家的 太阳能热水器由于水压太低,必须通过增压泵上水,但是经常忘记加水导致无热水可用,或者突然手动上水导致爆管。
热水器增压泵加满水后会有蜂鸣报警,然后要手动关闭增压泵的电源;
现在我的想法是分 .. (2017-04-07 10:45) 回 rock666 的帖子

不要单纯根据水量,还要结合水温。满箱水只有30度,还不如半箱水到50度。
加水一般在后半夜进行,这样不容易炸管,冬天可以先上半箱水,水温上来后再逐渐添加。
原来的程序也没啥大问题,就是使用过键值后要归零。
void main(void)  //主函数
{
    keyval=0;              //按键值初始化为 0,什么也不做
   while(1)
     {
       key_scan();  
      switch(keyval)
      {
            case 1:stop(); keyval=0;//这里有改
                   break;
            case 2: flash();
           default:keyval=0;//这里有改
           }
        
   }
}

程序没有那些大佬说的那么复杂,实际上用两组触点的继电器也行,一组用于控制水泵,一组触点自保,自保的回路在水满时失效
离线bg4rff

发帖
1411
M币
1203
专家
8
粉丝
24
只看该作者 14楼 发表于: 2017-04-07

这样是不是符合您初级的要求水位开关可以用常闭的干簧管加磁铁
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共1条打赏M币+1
离线zhxzhx

发帖
299
M币
21
专家
2
粉丝
6
只看该作者 15楼 发表于: 2017-04-07
#include <STC15F104.h>
sbit S1=P3^2;        //  
sbit S2=P3^1;
sbit led=P3^3;       //将 LED0 位定义为 P3.3引脚

void main()
{
    while(1)
    {
      if(S1==0) led=1;
      if(S2==0)led=0;
   }
}
本帖最近打赏记录:共1条打赏M币+1
离线yeliangcai
发帖
3
M币
756
专家
0
粉丝
1
只看该作者 16楼 发表于: 03-11
#include <STC15.H>;用官方头文件
配置IO口

/****************************************************************
* 函数名:IO_conf
* 描述  :引脚初始化
M1   M0   IO口模式
0    0    准双向口
0    1    推挽输出
1    0    高阻
1    1    开漏
离线ldy4747
发帖
326
M币
976
专家
8
粉丝
30
只看该作者 17楼 发表于: 03-11
直接用外部中断  翻转IO状态  
范列程序直接贴过去就能直接用

内容来自Android手机客户端