极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: Ansifa

STC学习笔记2-按键实验

[复制链接]
发表于 2012-2-19 22:23:37 | 显示全部楼层 |阅读模式
STC学习笔记2-按键实验


本实验演示STC15F104E如何识别按键事件

按按钮一次,LED灯就翻转一次亮灭状态。然后等待下一次按钮事件。

材料:
STC15F104E一片
一个LED
一个220Ω电阻
一个按键开关

电路图:
解析:220Ω电阻用于限流,由于STC输入端默认是上拉的,所以我们对开关不用加拉电阻,直接接地即可。


程序:[pre lang="cpp" line="1"]/*
STC15F104E按键实验
Ansifa
2012-2-19

硬件连接方法:
一个LED串联一个220Ω电阻,接到VCC和P3.3引脚。
一个按钮接到P3.2与GND之间。
*/

#include "reg51.h"
sbit key = P3 ^ 2;  //按钮
sbit LED = P3 ^ 3;  //灯

void DelayMS(n)                //@5MHz 软件延时n毫秒函数
{
        unsigned char i, j;
        i = 5*n;
        j = 218;
        do
        {
                while (--j);
        } while (--i);
}


void main()
{   LED=1;     //LED=0是亮,1是灭,初值灭灯
    while(1)  //制造一个死循环
    {
         //先检测高电平,等待30ms后检测是否低电平,就能把下降沿检测出来,这个是下降沿触发电路,有防抖功能。
        if(key == 1)   //因为按钮接key端和GND,所以是下降沿触发。
        {
            DelayMS(30);
            if(key == 0)
            {
                                LED = !LED;  //翻转LED亮灭状态
            }
        }
    }
}[/code]Keil uVersion2工程文件:
(Keil 下载地址:http://www.doyoung.net/DOC/KeilC51uV2_PS.zip


实物视频:
由于一下找不到按钮开关,所以用一条电线接触GND引脚暂时代替。

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2012-3-19 17:09:27 | 显示全部楼层
有个问题:
  1.         unsigned char i, j;
  2.         i = 5*n;
  3.         j = 218;
  4.         do
  5.         {
  6.                 while (--j);
  7.         } while (--i);
  8. }
复制代码
中,wihile(--j) 在第一次do while循环就会把J的值耗至0,那当--i 的时候,j一直是0 ,那你的延时函数基本上只能真正延时 0.2毫秒吧,是不是???
回复 支持 反对

使用道具 举报

发表于 2012-3-19 17:12:30 | 显示全部楼层
是不是应该:

  1.      do {
  2.                 while(--j);
  3.                  j = 218;
  4.        } while (--i);
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-8-13 23:13:23 | 显示全部楼层
那个电阻是起什么作用的?不接会怎样?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-15 09:55:00 | 显示全部楼层
340 发表于 2013-8-13 23:13
那个电阻是起什么作用的?不接会怎样?

电阻做限流防止LED太亮损坏
回复 支持 反对

使用道具 举报

发表于 2013-8-26 15:43:53 | 显示全部楼层
楼主延时函数为什么是char?不是int或者long?解释一下啊,而且如沙发说的,第一次就会把j变成0,我这延时无论i是多少都闪的很快
回复 支持 反对

使用道具 举报

发表于 2013-12-23 22:59:26 | 显示全部楼层
我也来写1个,比这简单。。

  1. #include "reg51.h"
  2. #include "intrins.h"
  3. sbit led=P3^3;
  4. sbit key=P3^2;
  5. void main(){
  6. led=1;key=1;
  7. while(1){
  8. if(key == 0) {
  9. led=~led;
  10. while(key == 0);
  11. }}}
复制代码
回复 支持 反对

使用道具 举报

发表于 2014-3-29 23:01:50 | 显示全部楼层
很详细,工程文件都有,方便学习,比葫芦画瓢
回复 支持 反对

使用道具 举报

发表于 2014-10-6 19:02:24 | 显示全部楼层
340 发表于 2013-8-13 23:13
那个电阻是起什么作用的?不接会怎样?

电阻是限流的,防止流过LED的电流 I 太大使其烧毁。一般 I 取10mA 即可,现在高亮LED的电流 I 取3~5mA就很亮啦!
回复 支持 反对

使用道具 举报

发表于 2017-3-7 23:29:53 | 显示全部楼层
xinhoujue 发表于 2014-10-6 19:02
电阻是限流的,防止流过LED的电流 I 太大使其烧毁。一般 I 取10mA 即可,现在高亮LED的电流 I 取3~5mA就 ...

那是不是就说用stc15l系列3v供电就不需要了?
回复 支持 反对

使用道具 举报

发表于 2017-3-10 17:58:57 | 显示全部楼层
340 发表于 2017-3-7 23:29
那是不是就说用stc15l系列3v供电就不需要了?

那未必,要用STC系列3V至少也要配个150欧姆的电阻。
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-11 22:08:58 | 显示全部楼层
xinhoujue 发表于 2017-3-10 17:58
那未必,要用STC系列3V至少也要配个150欧姆的电阻。

两节1.5v干电池或纽扣电池供电不加电阻会不会有什么问题?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 21:39 , Processed in 0.043874 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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