หน้าเว็บ

วันพุธที่ 23 ธันวาคม พ.ศ. 2558

LAB4 นับจำนวนการกดสวิตซ์

LAB 4
นับจำนวนการกดสวิตซ์

 เงื่อนไข
        เขียนโปรแกรมนับการกดสวิตซ์โดยให้แสดงค่าผ่านหลอด LED จำนวน 8 หลอดโดยแสดงเพิ่มทีละหลอดตามจำนวนที่กด เช่น กดสามครั้ง ก็ติดสามหลอด เป็นต้นเมื่อกดครั้งที่ 9 ให้กลับไปแสดงเหมือนครั้งที่ 1 และมีสวิตซ์สำหรับรีเซคค่าให้เป็น 0 (ดับหมด)
จงเขียนโปรแกรมควบคุม 16F887 และจำลองการทำงานของวงจรด้วย โปรแกรม Proteus

กำหนดขาอินพุตเอาต์พุต
ขา RC0 คือ สวิตซ์
ขา RC1 คือ สวิตซ์รีเซ็ต
ขา RDทั้งหมดเป็นเอาพุตท์

เริ่มต้นเขียน
#include<pic.h>
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
#define _XTAL_FREQ  20000000
void main(void)
{char countIN;
TRISC1=1;
TRISC2=1;
TRISD=0;
PORTD=0;
while(1)
{if(RC1==0)
{__delay_ms(200);
countIN=countIN+1;
if(countIN==9){countIN=1;}
if(countIN==1){RD7=0;RD6=0;RD5=0;RD4=0;RD3=0;RD2=0;RD1=0;RD0=1;}
if(countIN==2){RD7=0;RD6=0;RD5=0;RD4=0;RD3=0;RD2=0;RD1=1;RD0=1;}
if(countIN==3){PORTD=0b00000111;}
if(countIN==4){RD7=0;RD6=0;RD5=0;RD4=0;RD3=1;RD2=1;RD1=1;RD0=1;}
if(countIN==5){PORTD=0b00011111;}
if(countIN==6){PORTD=0b00111111;}
if(countIN==7){PORTD=0x7F;}
if(countIN==8){PORTD=255;}
while(!RC1);
}
if(RC2==0)
{countIN=0;
PORTD=0b00000000;
}
}
}

จำลองการทำงานโดย Proteus
จะคอยอัพเดทนะครับ



วันพฤหัสบดีที่ 26 พฤศจิกายน พ.ศ. 2558

LAB 3 โปรแกรมบวกเลขไม่เกิน 3 หลัก : samplemicro

LAB 3
โปรแกรมบวกเลขไม่เกิน 3 หลัก




เงื่อนไข 
            บวกเลขไม่เกิน 3 หลัก จากสวิตซ์แบบ Matrix ที่มีปุ่มตัวเลข 0,3,5 พร้อมปุ่มเครื่องหมาย "D", "+", "=" โดยกดตัวเลขได้ไม่เกิน 3 หลัก (น้อยกว่าได้และซ้ำเลขได้) ถ้าเกินต้องไม่ส่งผลใดๆ จากนั้นกดปุ่ม "+" แล้วกดเลขบวกไม่เกิน เช่น (น้อยกว่าได้และซำ้เลขได้) ถ้าต้องไม่ส่งใดๆและแสดงผลบวกเมื่อกดปุ่ม "=" เมื่อต้องการเริ่มใหม่ให้กดที่ปุ่ม "D" แสดงผลที่ LCD บรรทัดที่ 1 แสดงตัวเลขตัวตั้ง เครื่องหมาย  "+" (เมื่อกดปุ่มบวก) และเลขตัวบวก บรรทัดที่สองแสดงผลบวก โดยมีเครื่องหมาย "=" นำหน้า (เมื่อกดปุ่มเท่ากับ)
จงเขียนโปรแกรมควบคุม 16F887 และจำลองการทำงานของวงจรด้วย โปรแกรม Proteus

เริ่มต้นเขียน
#include<pic.h>
#include<stdio.h>
#include"LCD16F887.h"
__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);
#define _XTAL_FREQ 20000000
#define COL1 RC1
#define COL2 RC2
#define COL3 RC3
#define ROW1 RC5
#define ROW2 RC6
unsigned char key=0xFF;
unsigned char str[16];
unsigned char get_keypad()
{
unsigned char result=0xFF;
COL1=1; COL2=1; COL3=1;
COL1=0; COL2=1; COL3=1; //COL1
if(ROW1==0){ result='0'; }
else if(ROW2==0){ result='D'; }


COL1=1; COL2=0; COL3=1; //COL2
if(ROW1==0){ result='3'; }
else if(ROW2==0){ result='+'; }


COL1=1; COL2=1; COL3=0;         //COL3
if(ROW1==0){ result='5'; }
else if(ROW2==0){ result='='; }


return result;
}

void main(void)
{ char str[16];
lcd_init();
TRISC=0b11100001;TRISD0=0;
COL1=1; COL2=1; COL3=1;
lcd_puts(0x80,"AAA BBB");
lcd_puts(0xC0," ZZZZ");
int countIN=0,SUM=0,SUM1=0,SUM2=0,A=0,B=0,C=0,a=0,b=0,c=0;
while(1)
{ key=get_keypad();
if(key<0xFF)
{
if(key=='+')
{sprintf(str,"%c",key);
lcd_puts(0x83,str);
key=0xFF;
__delay_ms(100);
countIN=3;
}
if(key=='D')
{ countIN=0;SUM=0;SUM1=0;
SUM2=0;A=0;B=0;C=0;
a=0;b=0;c=0;
key=0xFF;
lcd_puts(0x80,"AAA BBB");
lcd_puts(0xC0," ZZZZ");
}
if((key<0xFF)&&(key!='D')&&(key!='='))
{ if((key<0xFF)&&(countIN==0))
{countIN=countIN+1;
if(key=='0'){A=0;}
if(key=='3'){A=3;}
if(key=='5'){A=5;}
sprintf(str,"%c",key);
lcd_puts(0x82,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==1))
{countIN=countIN+1;
if(key=='0'){B=0;}
if(key=='3'){B=3;}
if(key=='5'){B=5;}
sprintf(str,"%c",key);
lcd_puts(0x81,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==2))
{countIN=countIN+1;
if(key=='0'){C=0;}
if(key=='3'){C=3;}
if(key=='5'){C=5;}
sprintf(str,"%c",key);
lcd_puts(0x80,str);
key=0xFF;
__delay_ms(100);
}

if((key<0xFF)&&(countIN==3))
{countIN=countIN+1;
if(key=='0'){a=0;}
if(key=='3'){a=3;}
if(key=='5'){a=5;}
sprintf(str,"%c",key);
lcd_puts(0x86,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==4))
{countIN=countIN+1;
if(key=='0'){b=0;}
if(key=='3'){b=3;}
if(key=='5'){b=5;}
sprintf(str,"%c",key);
lcd_puts(0x85,str);
key=0xFF;
__delay_ms(100);
}
if((key<0xFF)&&(countIN==5))
{
if(key=='0'){c=0;}
if(key=='3'){c=3;}
if(key=='5'){c=5;}
sprintf(str,"%c",key);
lcd_puts(0x84,str);
key=0xFF;
__delay_ms(100);
}
}
if(key=='=')
{ countIN=10;
sprintf(str,"%c",key);
lcd_puts(0xC0,str);
key=0xFF;
__delay_ms(60);
SUM1=((A*1)+(B*10)+(C*100));
SUM2=((a*1)+(b*10)+(c*100));
SUM=SUM1+SUM2;
sprintf(str,"%4d",SUM);
lcd_puts(0xC1,str);
}
}
}
}

จำลองการทำงานโดย Proteus


ลิงค์ไลเบอร์รี LCD16F887 : http://www.4shared.com/rar/86K9OeIXba/LCD16F887.html

วันพุธที่ 25 พฤศจิกายน พ.ศ. 2558

LAB2 การควบคุมหลอด LED 2 ตัว ด้วยสวิตซ์ 4 ตัว : samplemicro

LAB 2 
ควบคุม
หลอด LED ด้วยสวิตซ์ 4 ตัว



เงื่อนไข 
  •  กดสวิตซ์ SW1 หลอด LED1 ติด และ LED2 ดับ
  •  กดสวิตซ์ SW2 หลอด LED1 ดับ และ LED2 ติด
  •  กดสวิตซ์ SW3 หลอด LED1 ติด และ LED2 ติด
  •  กดสวิตซ์ SW4 หลอด LED1 ดับ และ LED2 ดับ
จงเขียนโปรแกรมควบคุม 16F887 และจำลองการทำงานของวงจรด้วย โปรแกรม Proteus

การเขียนโปรแกรมด้วยภาษาซี
       กำหนดขา   INPUT , OUTPUT  
        SW1 คือ  input  กำหนดขา RC1   
        SW2  คือ  input  กำหนดขา RC2   
        SW3 คือ  input   กำหนดขา RC3  
        SW4 คือ  input   กำหนดขา RC4    
        RD1 คือ  output ที่ควบคุมหลอด LED1   
        RD2 คือ  output ที่ควบคุมหลอด LED2   
เริ่มต้นเขียน
#include<pic.h>
__CONFIG(FOSC_HS&WDTE_OFF&LVP_OFF);
#define _XTAL_FREQ 20000000 //ฟังก์ชันของการหน่วงเวลา
void main(void)
{
  TRISC1=1;   //ประกาศว่า ขา RC1 คือ input หาก = 1 จะเป็น input
  TRISC2=1;   //ประกาศว่า ขา RC2 คือ input หาก = 1 จะเป็น input
  TRISC3=1;   //ประกาศว่า ขา RC3 คือ input หาก = 1 จะเป็น input
  TRISC4=1;   //ประกาศว่า ขา RC4 คือ input หาก = 1 จะเป็น input
  TRISD1=0;   //ประกาศว่า ขา RD1 คือ output หาก = 0 จะเป็น output
  TRISD2=0;   //ประกาศว่า ขา RD2 คือ output หาก = 0 จะเป็น output
  RD1=0;   //ประกาศค่าเริ่มต้นของ RD1 ให้เท่ากับ 0  คือ LED ยังไม่ทำงานนั้นเอง
  RD2=0;   //ประกาศค่าเริ่มต้นของ RD2 ให้เท่ากับ 0  คือ LED ยังไม่ทำงานนั้นเอง
  while(1)
  {
      if(RC1==0)   //ถ้ากด SW1 RC1=0ไหม
      { __delay_ms(5);
         RD1=1;      //แล้วให้ RD1=1 คือให้ LED1 ติด
         RD2=0;      //แล้วให้ RD2=0 คือให้ LED2 ดับ
         while(!RC1);    //เมื่อกด SW1 ค้างไว้จะทำให้ค่าในลูป while เป็นจริงเมื่อปล่อยจึงเป็นเท็จ
      }
      if(RC2==0)   //ถ้ากด SW2 RC2=0ไหม
      { __delay_ms(5);
         RD1=0;     //แล้วให้ RD1=0 คือให้ LED1 ดับ
         RD2=1;     //แล้วให้ RD2=1 คือให้ LED2 ติด
         while(!RC2);//เมื่อกด SW2 ค้างไว้จะทำให้ค่าในลูป while เป็นจริงเมื่อปล่อยจึงเป็นเท็จ
      }
     if(RC3==0)   //ถ้ากด SW3 RC3=0ไหม
      { __delay_ms(5);
         RD1=1;      //แล้วให้ RD1=1 คือให้ LED1 ติด
         RD2=1;      //แล้วให้ RD2=1 คือให้ LED2 ติด
         while(!RC3);//เมื่อกด SW3 ค้างไว้จะทำให้ค่าในลูป while เป็นจริงเมื่อปล่อยจึงเป็นเท็จ
      }
      if(RC4==0)   //ถ้ากด SW4 RC4=0ไหม
      { __delay_ms(5);
         RD1=0;     //แล้วให้ RD1=0 คือให้ LED1 ดับ
         RD2=0;     //แล้วให้ RD2=0 คือให้ LED2 ดับ
         while(!RC4);//เมื่อกด SW4 ค้างไว้จะทำให้ค่าในลูป while เป็นจริงเมื่อปล่อยจึงเป็นเท็จ
      }
  }
}    

อัพเดทการทดลอง LAB2 พรุ่งนี้ 
( นำเสนอในรูปแบบของวีดีโอจะได้เข้าใจง่าย)

วันจันทร์ที่ 23 พฤศจิกายน พ.ศ. 2558

LAB1 ควบคุมหลอด LED : samplemicro

LAB 1 
ควบคุม
หลอด LED
เงื่อนไข 
  •  กดสวิตซ์ SW1 หลอด LED ติด
  • กดสวิตซ์ SW2 หลอด LED ดับ
จงเขียนโปรแกรมควบคุม 16F887 และจำลองการทำงานของวงจรด้วย โปรแกรม Proteus

การเขียนโปรแกรมด้วยภาษาซี
       กำหนดขา   INPUT , OUTPUT  
      SW1 คือ สวิตซ์ start  กำหนดขา RC1       
    SW2 คือ สวิตซ์ stop  กำหนดขา RC2     
#include<pic.h>
__CONFIG(FOSC_HS&WDTE_OFF&LVP_OFF);  //__ คือ under score 2 ตัว  _ คือ under score 1 ตัว
void main(void)
{
  TRISC1=1;   //ประกาศว่า ขา RC1 คือ input หาก = 1 จะเป็น input
  TRISC2=1;   //ประกาศว่า ขา RC2 คือ input หาก = 1 จะเป็น input
  TRISC0=0;   //ประกาศว่า ขา RC0 คือ output หาก = 0 จะเป็น output
  RC0=0;   //ประกาศค่าเริ่มต้นของ RC0 ให้เท่ากับ 0  คือ LED ยังไม่ทำงานนั้นเอง
  while(1)
  {
      if(RC1==0)   //ถ้ากด SW1 RC1=0ไหม
      {
         RC0=1;      //แล้วให้ RC0=1 คือให้ LED ติด
      }
      if(RC2==0)   //ถ้ากด SW2 RC2=0ไหม
      {
         RC0=0;     //แล้วให้ RC0=0 คือให้ LED ดับ
      }
  }
}
จำลองการทำงานด้วยโปรแกรม Proteus


             

การจำลองและทดลองไมโครคอนโทรลเลอร์ : samplemicro

     

    แนะนำ


         เนื่องจากในการทดลองและลงมือปฏิบัติ  การเขียนโปรแกรมมีความยากหากไม่เข้าใจหลักการพื้นฐาน  การต่อวงจรไมโครคอนโทรนเลอร์เข้ากับอุปกรณ์ต่างๆต้องหาซื้ออุปกรณ์จึงเกิดความไม่สะดวกขึ้น
ดังนั้น ผมจึงสร้างเว็บนี้ขึ้นมาเพื่อให้บุคคลที่สนใจได้ศึกษา  เอาหลักการพื้นฐานทฤษฎีและการต่อวงจรเบื้องต้น ไปประยุกต์ใช้กับชีวิตประจำวันหรือสิ่งที่ตนสนใจ ซึ่งในที่นี้จะใช้ Microcontroller 16F887 ในการศึกษา
      โปรแกรมที่ใช้ในการจำลอง
  1. MPLAB IDE 
  2. Proteus 8 
-   MPLAB IDE 
     การติดตั้ง

1. MPLAB IDE  สามารถดาวน์โหลดได้ ที่นี่


2. CCS C ตัว Complier มีลิขสิทธิ์ สามารถดาวน์โหลด ใช้ฟรี 45 วัน ได้ที่ http://www.ccsinfo.com/ccsfreedemo.php

-    Proteus 8
      การติดตั้ง
        สามารถดาวน์โหลดที่นี่