Thông báo

Collapse
No announcement yet.

Mạch on/off điểm chạm điện dung

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Mạch on/off điểm chạm điện dung

    Hi mọi người. Gần đây đọc được tài liệu hướng dẫn của anh F về mTouch thấy hay quá.
    http://dientuvietnam.net/forums/showthread.php?t=18026
    Bèn lần mò làm thử. Thấy kết quả vượt mức mong đợi. Tiếp điểm chạm rất nhẹ nhàng và rất nhạy nên up lên để anh em có thể sử dụng riêng cho mình. Em không có ý định múa rừu qua mắt thợ mà chỉ là thêm kiến thức thêm học hỏi , ít nhất là cho nhưng người còn gà như em. Mong được sự chỉ bảo của mọi người.
    Ah còn vấn đề làm sao để quét ma trận phím Touch này nữa, mong mọi người cho ý kiến
    Em dùng AT89S52 va trình dịch Keil C
    Touch là đồng xu 500đ bọc một lớp băng dính. Đã thử nghiệm cảm biến tốt qua 20 lớp giấy vở

    PHP Code:
    /**********************************************************************************
                        NGO THANH BINH KS CLC K52
                        Giao tiep keypad Touch
    ***********************************************************************************/
    /*********************    define hardware    *******************************************
        AT89S52,    LCD 16x2,Key Touch
        P2(0-6)    :    LCD
    ***********************************************************************************/
    #include "LCD4BIT.H"
    #include <AT89X52.H>
    #define LED P3_1
    #define    SIGN    P3_4
    #define    TH_1    0xb1
    #define TL_1    0xdf     //    2000 vong lap - 2ms
    #define    TIME_PRESS 20
    unsigned int count_old;
    bit PRESS 0;
    void Timer_1(voidinterrupt 3
    {
        
    unsigned int count;
        
    TR0 0;
        
    TH1 TH_1;
        
    TL1 TL_1;
        
    count=TL0|((TH0&0x00ff)<<8);     //    get data
        //****************************************************
        
    if(count_old >count+TIME_PRESS)    //    nhan phim
        
    {
            
    PRESS 1;
        }
        else
        {
            
    PRESS 0;
            
    count_old=count;
        } 

        
    //**********************************************************
    //EXIT:
        
    TL0 0;
        
    TH0 0;
        
    TR0 1;
    }
    //===============================    main    ========================================
    void main(void)
    {
        
    LCD_Init();
        
    TMOD 0x10|0x05;    // TIMER 1 CHE DO 16 BIT& timer 0 16 bit count    
        
    IE 0x88;        //    NGAT TRAN T0
        
    TH1 TH_1;
        
    TL1 TL_1;
        
    TH0 0;
        
    TL0 0;
        
    SIGN 1;
        
    LED =0;
        
    count_old=0;
        
    TR0 1;
        
    TR1 1
        while(
    1)
        {
            if(
    PRESS)
            {
                
    LCD_Delay(600);
                if(
    PRESS)
                {
                    while(
    PRESS){};
                    
    LED = !LED;
                }
            }
    // phan hien thi lcd gia tri count_lod va trang thai light
            
    LCD_Clear();
            if(
    LEDLCD_PrString("On light");
            else 
    LCD_PrString("OFF light");
            
    LCD_PutCmd(0xc0);
            
    LCD_PrInteger(count_old);
            
    LCD_Delay(200);
        }

    Hàm LCD_Delay
    PHP Code:
    void LCD_Delay(unsigned long time)
    {
       while(
    time--){};

    Last edited by binhfile; 28-01-2010, 01:31.

  • #2
    [QUOTE=binhfile;238601]Hi mọi người. Gần đây đọc được tài liệu hướng dẫn của anh F về mTouch thấy hay quá.
    http://dientuvietnam.net/forums/showthread.php?t=18026
    Bèn lần mò làm thử. Thấy kết quả vượt mức mong đợi. Tiếp điểm chạm rất nhẹ nhàng và rất nhạy nên up lên để anh em có thể sử dụng riêng cho mình. Em không có ý định múa rừu qua mắt thợ mà chỉ là thêm kiến thức thêm học hỏi , ít nhất là cho nhưng người còn gà như em. Mong được sự chỉ bảo của mọi người.
    Ah còn vấn đề làm sao để quét ma trận phím Touch này nữa, mong mọi người cho ý kiến
    Em dùng AT89S52 va trình dịch Keil C
    Touch là đồng xu 500đ bọc một lớp băng dính. Đã thử nghiệm cảm biến tốt qua 20 lớp giấy vở


    Gởi luôn files incude LCD4BIT.H và files mô phỏng Protues cho anh em test thử bạn. Đừng keo như thế chứ.

    Email:
    Tel: 0983.497.310

    Comment


    • #3
      Nguyên văn bởi binhfile Xem bài viết
      Hi mọi người. Gần đây đọc được tài liệu hướng dẫn của anh F về mTouch thấy hay quá.
      http://dientuvietnam.net/forums/showthread.php?t=18026
      Bèn lần mò làm thử. Thấy kết quả vượt mức mong đợi. Tiếp điểm chạm rất nhẹ nhàng và rất nhạy nên up lên để anh em có thể sử dụng riêng cho mình. Em không có ý định múa rừu qua mắt thợ mà chỉ là thêm kiến thức thêm học hỏi , ít nhất là cho nhưng người còn gà như em. Mong được sự chỉ bảo của mọi người.
      Ah còn vấn đề làm sao để quét ma trận phím Touch này nữa, mong mọi người cho ý kiến
      Em dùng AT89S52 va trình dịch Keil C
      Touch là đồng xu 500đ bọc một lớp băng dính. Đã thử nghiệm cảm biến tốt qua 20 lớp giấy vở

      PHP Code:
      /**********************************************************************************
                          NGO THANH BINH KS CLC K52
                          Giao tiep keypad Touch
      ***********************************************************************************/
      /*********************    define hardware    *******************************************
          AT89S52,    LCD 16x2,Key Touch
          P2(0-6)    :    LCD
      ***********************************************************************************/
      #include "LCD4BIT.H"
      #include <AT89X52.H>
      #define LED P3_1
      #define    SIGN    P3_4
      #define    TH_1    0xb1
      #define TL_1    0xdf     //    2000 vong lap - 2ms
      #define    TIME_PRESS 20
      unsigned int count_old;
      bit PRESS 0;
      void Timer_1(voidinterrupt 3
      {
          
      unsigned int count;
          
      TR0 0;
          
      TH1 TH_1;
          
      TL1 TL_1;
          
      count=TL0|((TH0&0x00ff)<<8);     //    get data
          //****************************************************
          
      if(count_old >count+TIME_PRESS)    //    nhan phim
          
      {
              
      PRESS 1;
          }
          else
          {
              
      PRESS 0;
              
      count_old=count;
          } 

          
      //**********************************************************
      //EXIT:
          
      TL0 0;
          
      TH0 0;
          
      TR0 1;
      }
      //===============================    main    ========================================
      void main(void)
      {
          
      LCD_Init();
          
      TMOD 0x10|0x05;    // TIMER 1 CHE DO 16 BIT& timer 0 16 bit count    
          
      IE 0x88;        //    NGAT TRAN T0
          
      TH1 TH_1;
          
      TL1 TL_1;
          
      TH0 0;
          
      TL0 0;
          
      SIGN 1;
          
      LED =0;
          
      count_old=0;
          
      TR0 1;
          
      TR1 1
          while(
      1)
          {
              if(
      PRESS)
              {
                  
      LCD_Delay(600);
                  if(
      PRESS)
                  {
                      while(
      PRESS){};
                      
      LED = !LED;
                  }
              }
      // phan hien thi lcd gia tri count_lod va trang thai light
              
      LCD_Clear();
              if(
      LEDLCD_PrString("On light");
              else 
      LCD_PrString("OFF light");
              
      LCD_PutCmd(0xc0);
              
      LCD_PrInteger(count_old);
              
      LCD_Delay(200);
          }

      Hàm LCD_Delay
      PHP Code:
      void LCD_Delay(unsigned long time)
      {
         while(
      time--){};

      Đó chính là phương pháp dùng bộ dao động tạo bởi tụ điện và điện trở, đối với mTouch dùng Comparator hay Comparator SR Latch thì dùng bộ dao động Relaxation OSC tạo bởi module Comparator tích hợp trong chip và một tụ (Pad đồng) và 1 điện trở. Khi tụ thay đổi thì tần số dao động cũng thay đổi.

      Tuy nhiên cách làm của bản chỉ có thể đúng với điều kiện lý tưởng, khi điều kiện môi trường thay đổi (độ ẩm tăng, dính nước ...) thì nó sẽ không còn chính xác hay sẽ nhạy hơn, kém nhạy hơn bình thường.
      Về phần thiết kế phần cứng bạn làm như vậy là được rồi, về phần mềm bạn xem lại thuật toán tính trung bình để nó tự Calibrate khi môi trường thay đổi.
      Tham khảo: http://www.microchip.com/stellent/id...pnote=en531257
      Diễn đàn Vi điều khiển:

      Comment


      • #4
        PHP Code:
        #ifndef __LCD4BIT_H__
        #define __LCD4BIT_H__
        /*==============================================================================*/
        /*                                FUNCTIONS                                        */
        /*==============================================================================*/
        #include <AT89X52.H>
        void LCD_Init();
        void LCD_PutChar(char);
        void LCD_PrString(char*);
        void LCD_Position(unsigned charunsigned char);
        void LCD_PrInteger(int);
        void LCD_Clear();

        void LCD_PutCmd(char);
        void LCD_Delay(unsigned long);
        void LCD_XoaDong(char line);
        void WaitReady();
        void write_char(char);
        void LCD_Init_Write(char);
        /*****************************************************************************
            define Hardware address
            Ket Noi LCD che do 4 bit
            RS = Port^0
            RW = Port^1
            EN = Port^2
            DATA = Port^(4,5,6,7)
        *****************************************************************************/
        #define LCD_PORT    P2        
        sbit LCD_RS LCD_PORT^0;
        sbit LCD_RW    LCD_PORT^1;
        sbit LCD_EN LCD_PORT^2;

        #define ReadCommand        {LCD_RS = 0; LCD_RW = 1;}
        #define WriteCommand    {LCD_RS = 0; LCD_RW = 0;}
        #define WriteData        {LCD_RS = 1; LCD_RW = 0;}
        #define LatchData        {LCD_EN = 1; LCD_EN = 0;}

        /****************************************************************************
            define LCD command
        *****************************************************************************/
        #define LCD_CLEAR            0x01    // Clear display
        #define LCD_HOME            0x02      // return cursor and LCD to home position
        #define LCD_OFF             0x08    // turn off display and cursor
        #define LCD_DISPLAY_ON        0x0C    // turn on display and turn off cursor
        #define LCD_CURSOR_ON        0x0A     // turn on cursor and turn off display
        #define LCD_BLINK_CURSOR     0x0E    // turn on display and blink cursor
        #define LCD_FONT_8BIT        0x38    // set interace length: 8bits, 2 lines, font 5x8
        #define LCD_FONT_4BIT        0x28    // set interace length: 4bits, 2 lines, font 5x8    
        #define LCD_MOVE_CURSOR        0x06    // Entry mode set: set increments mode, not shift (cursor)
        #define LCD_MDRIGHT            0x1C    // Move display to the right
        #define LCD_MDLEFT            0x18    // Move display to the left
        /*=============================================================================
        unsigned char LCD_Read(){
            unsigned char r_data;

            LCD_PORT |= 0xF0;        // Be sure to release datalines (set outputlatches to '1') 
            LCD_EN = 1;                 
            r_data = LCD_PORT;        // Read first part of the return value (high nibble)
            LCD_EN = 0;
            r_data &= 0xF0;             // Only high nibble is usable
            LCD_EN = 1;
            r_data |= (LCD_PORT >> 4);    // Read second part of the return value (low nibble)
            LCD_EN = 0;

            return (r_data);
        }
        */
        void LCD_XoaDong(char line)
        {
            
        char i;
            if(
        line==0)
            {    
        LCD_PutCmd(0x80);
                for(
        i=0;i<16;i++)
                {
                    
        LCD_PutChar(' ');
                }
                
        LCD_PutCmd(0x80);
            }
            else
            {
                
        LCD_PutCmd(0xc0);
                for(
        i=0;i<16;i++)
                {
                    
        LCD_PutChar(' ');
                }
                
        LCD_PutCmd(0xc0);
            }
        }
        //=================================================================
        void WaitReady()
        {
            
        bit lcd_busy 1;
            
        ReadCommand;
            
        LCD_PORT |= 0x80;                // set outputlatches to '1' set bit 6
            
        while(lcd_busy){
                
        LCD_EN 1;                    // read high nibble    
                
        lcd_busy 1;
                
        lcd_busy LCD_PORT 0x80;    // return bit 7
                
        LCD_EN 0;    
                
        LCD_EN 1;                    // read low nibble
                
        LCD_EN 0;
            }
        }

        //==============================================================================
        void write_char(char c)
        {
            
        char temp;
            
        temp 0xF0;            // Don't affect bits 0-2
            
        LCD_PORT &= 0x0f;            // Bits 4..7 <- 0
            
        LCD_PORT |= temp;             // High nibble to display
            
        LatchData;

            
        temp = (<< 4) & 0xF0;        // Prepare to send low nibble
            
        LCD_PORT &= 0x0f;             // Bits 4..7 <- 0
            
        LCD_PORT |= temp;               // Low nibble to display
            
        LatchData;
        }            

        /*****************************************************************************/
        void LCD_Init_Write(char cmd)
        {
            
        WaitReady();
            
        WriteCommand;
            
        LCD_PORT cmd;
            
        LatchData;
        }
         
        /****************************************************************************
            LCD_PutCmd function
            Write a control byte to LCD
            Input : control byte
        *****************************************************************************/
        void LCD_PutCmd(char cmd)
        {
            
        WaitReady();          // Wait for LCD ready
            
        WriteCommand;        // set LCD to send mode
            
        write_char(cmd);    // send command
        }

        /****************************************************************************
            LCD_PutChar function
            Write a ASCII symbol to LCD
            Input: ASCII symbol
        *****************************************************************************/
        void LCD_PutChar(char ch)
        {
            
        WaitReady();
            
        WriteData;
            
        write_char(ch);
        }

        /*****************************************************************************
            LCD_PrString function
            Write a string to LCD
            Input: string
        ******************************************************************************/
        void LCD_PrString(char *str)
        {
            while(*
        str!='\0'){
                
        LCD_PutChar(*str);
                ++
        str;
            }
        }

        /*****************************************************************************
            LCD_Position function
            Set the position of cursor on LCD
            Input: row, column
        ******************************************************************************/
        void LCD_Position(unsigned char rowunsigned char col)
        {
            
        LCD_PutCmd( (1<<7)|(row<<6)|col );
        }

        /*****************************************************************************
            LCD_Clear function
            Clear LCD
        ******************************************************************************/
        void LCD_Clear()
        {
            
        LCD_PutCmd(LCD_CLEAR);    
        }

        /*****************************************************************************
            LCD_Init function
            Prepare for display content. Must be called at first
        ******************************************************************************/
        void LCD_Init()
        {
        //    LCD_Init_Write(0x30);                // Data length setting, 8 bits
        //    LCD_Init_Write(0x30);                // Data length setting, 8 bits
        //    LCD_Init_Write(0x30);                // Data length setting, 8bits

            
        LCD_Init_Write(LCD_FONT_4BIT);  // set a 5x8 dot character font
            
        LCD_PutCmd(LCD_FONT_4BIT);        // and 4 bits data bus
            
        LCD_PutCmd(LCD_DISPLAY_ON);        // 0x0C, Display on and cursor off
            
        LCD_PutCmd(LCD_MOVE_CURSOR);    // 0x06
            
        LCD_Clear();                    //    xoa man hinh
            
        LCD_PutCmd(0x0f);                //    nhap nhay con tro
        //    LCD_PutCmd(LCD_BLINK_CURSOR);    // Blink cursor
        }

        /****************************************************************************
            LCD_PrInteger function
            Display a integer decimal number to LCD
            Input: a integer number
        *****************************************************************************/
        void LCD_PrInteger(int num)
        {
            
        int temp;
            
        unsigned char i 0c[5];
            
        temp num;    
            if (
        temp != 0) {
                if (
        temp 0){
                    
        LCD_PutChar('-');
                    
        temp = - temp;    
                }
                while(
        temp){
                    
        c[i++] = temp%10
                    
        temp /= 10;
                } 
                while(
        iLCD_PutChar(c[--i] + '0');
            }
            else 
        LCD_PutChar('0');
        }
        /**************************************************************************
                    DELAY
        ***************************************************************************/
        void LCD_Delay(unsigned long time)
        {
            while(
        time--){};

        }
        /**************************************************************************
                    Effect Begin    
        ***************************************************************************/
        #endif
        /************************* END OF FILE *******************************/ 
        Thanks
        Hix xin lỗi mình không up file được lên diễn đàn. Còn đây là file LCD4BIT.H
        Protues thì mình không mô phỏng được. chỉ cần lắp mạch và chỉnh TIME_PRESS thôi.

        Comment


        • #5
          hello tất cả mọi người
          Tôi mới vào diễn đàn này
          thấy sơ đồ rất thú vị và hữu ích của các mạch

          cảm ơn
          Latest news on

          Comment


          • #6
            Cái này hay và hấp dẫn quá!!!
            @tienhuypro: sơ đồ proteus bạn post cũng là sơ đồ bạn làm mạch thật luôn đúng không?
            Last edited by vodangks; 15-03-2010, 08:37.

            Comment

            Về tác giả

            Collapse

            binhfile Tìm hiểu thêm về binhfile

            Bài viết mới nhất

            Collapse

            Đang tải...
            X