51也玩电容触摸,哈哈

2020-01-22 12:13发布

废话少说,先上效果视频
http://v.youku.com/v_show/id_XMjg1MjcyMDMy.html

http://v.youku.com/v_show/id_XMjg1MjgzMzY4.html

再来张效果pp


(原文件名:触摸.jpg)

单片机选用stc12c5A60s2,1T的就可以,下面是原理图


(原文件名:原理图.jpg)

点击此处下载 ourdev_658261IV6PGT.pdf(文件大小:565K) (原文件名:核心板原理图.pdf)
程序贴出来,顺便工程一并上传上来
#include <reg52.H>
/*
P0.0为触摸按键
*/
sfr P0M1 = 0x93; //  
sfr P0M0 = 0x94; //
sbit TOUCH=P0^0;
sbit LED=P3^3;
void delay(void)
{
volatile int i=3553;
while(i--);
}
void main(void)
{
        P0M1=0X01;        //配置P0为开漏输出
        P0M0=0X01;        //配置P0为开漏输出

   while(1)
   {
              TOUCH=0;
                 delay();
   TMOD=0X00;         
   TH0=0;
   TL0=0;
   TR0=1;
           TOUCH=1;
           while(!TOUCH);
           TR0=0;
           delay();
                if(TL0>16||TL0<13)
                P1=~P1;
   }
}

点击此处下载 ourdev_658262VN5K05.rar(文件大小:19K) (原文件名:cool toutch.rar)
原理和stm8-discovery小板一样,拉低P0.0口,由于存在分布电容,P0.0口靠1兆上拉电阻上拉到TTL所认为的高电平,这段时间长短即是判断电容大小的依据,既然知道了时间长短,也就知道了按键是否按下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
78条回答
avr-arm
2020-01-25 00:52
整理了程序,添加注释,更容易懂
/***********************************************************************************************
*                                            Cool51
*                                         Cool51开发板例程
*
*  文件名称:main.c
*  摘    要:触摸按键实验,实验前请将Cool51核心板的"P0.0EN"处短路帽去掉,Cool51核心板左上角既是
*            电容触摸,实验需使用STC12C5A60S2单片机
*  作    者:苑臣芒
*
*  当前版本:1.1
*  完成日期:2011/07/023
*  版权所有:Rays_ele - Copyright (C) 2011
*
*************************************************************************************************/

/********引用的头文件*******/
#include<reg52.h> //开发51单片机必须包含的头文件,该文件定义了89c52单片机内部寄存器的地址

/***********宏定义**********/
#define uchar unsigned char
#define uint  unsigned int

/********硬件接口定义*******/
sbit TOUCH=P0^0;  //P0.0为触摸按键
sbit LED=P3^3;

/******特殊寄存器声明*******/
sfr P0M1 = 0x93;    //  
sfr P0M0 = 0x94;    // 两个寄存器控制P0口开漏状态,详见STC12C5A60S2手册

/*--------------------------------------------------------------------------------------
-函数名称:void Delay_ms(uint ms)
----------------------------------------------------------------------------------------
-函数功能:当晶振是11.0592Mhz时,函数延时大约是ms为单位的
-入口参数:uint ms 延时长度,比如需要延时100ms,则ms=100
-出口参数:无
---------------------------------------------------------------------------------------*/
void Delay_ms(uint ms)
{
   uchar t;
   while(ms--)
   {
   t=120;
   while(t--);
   }
}

/*--------------------------------------------------------------------------------------
-函数名称:bit Cool_Touch(void)
----------------------------------------------------------------------------------------
-函数功能:触摸按键,P0.0口,stc12c5A60S2,晶振是11.0592Mhz-12兆,使用定时器0资源
-入口参数:无
-出口参数:按键按下返回1,无按键返回0,此函数不阻塞
---------------------------------------------------------------------------------------*/
bit Cool_Touch(void)
{
uchar i=1;
        P0M1=0X01;        //配置P0为开漏输出
        P0M0=0X01;        //配置P0为开漏输出
    TOUCH=0;         //拉低TOUCH口
    Delay_ms(50);//延时一定时间,等待其一定为低
    TMOD = 0x02;//初始化定时器0为8位定时器,开始计数         
    TH0=0;                //初始化TH0为0
    TL0=0;                //初始化TH0为0
    TR0=1;                //启动定时器
        TOUCH=1;        //释放TOUCH口,此时TOUCH会慢慢升高电平
        while((!TOUCH)&&i++);//等待电平升高到单片机所认为的高电平,i控制溢出
        TR0=0;                //停止计数器
        if(TL0>16||TL0<13) //检查定时器计数时间,是否引脚电平上升时间发生变化,也相当于引脚所处分布电容发生变化
                return 1;
        else
                return 0;
}

/*--------------------------------------------------------------------------------------
-函数名称:void main(void)
----------------------------------------------------------------------------------------
-函数功能:主函数
-入口参数:无
-出口参数:无
---------------------------------------------------------------------------------------*/
void main(void)
{
   while(1)
   {
           if(Cool_Touch()==1)   
        P2++;
   }
}

一周热门 更多>