การทดลองที่ 1 I/O Port MCS-51

ในการทดลองตระกูล MCS-51 นี้ผมจะใช้เบอร์ 89S52 เป็นหลักเนื่องจากราคาไม่แพงและสามารถ Program ผ่านทาง ISP cable ได้ด้วย สำหรับตัว Program ISP ของเบอร์ 89S52 สามารถทำเองได้ตามเวบนี้ http://www.kmitl.ac.th/~kswichit/cheapcable/index.html ถ้าจะใช้เบอร์อื่นนอกจาก 89S52 ก็เลือก Device เป็นเบอร์อื่นไป

โครงสร้างของ PORT

PORT ของ MCS-51 ทั้ง 3 PORT เป็นแบบ 2 ทิศทาง (bidirectional) คือสามารถเป็นได้ทั้งอินพุตและเอาต์พุต PORT0 และ PORT2 เป็น PORT ที่ไว้ติดต่อกับหน่วยความจำภายนอก

เฉพาัะ P1.0, P1.1 และ PORT3 ทั้งหมด เป็น PORT แบบทำหน้าที่หลายอย่าง (multifunction) นอกจาก I/O ปกติ ในการใช้งานเราสามารถกำหนดได้ว่า PORT นี้ทำหน้าที่ปกติ หรือทำงานเป็นฟังก์ชันพิเศษ โดยการตั้งค่า initial ที่ Register

P1.0
T2 (Timer/Counter 2 external input)
P1.1
T2EX (Timer/Counter 2 Capture/Reload trigger)
P3.0
RXD (serial input port)
P3.1
RXD (serial output port)
P3.2
INT0 (external interrupt)
P3.3
INT1 (external interrupt)
P3.4
T0 (Timer/Counter 0 external input)
P3.5
T1 (Timer/Counter 1 external input)
P3.6
WR (external Data Memory write strobe)
P3.7
RD (external Data Memory read strobe)

  • PORT0

รูปที่ 1 PORT0

  • PORT1

รูปที่ 2 PORT1

  • PORT2

รูปที่ 3 PORT2

  • PORT3

รูปที่ 4 PORT3

ในการทดลองนี้เราจะต่อสวิตช์ 2 ตัวเป็นอินพุต เมื่อมีการกด SWLEFT LED จะวิ่งไปทางซ้ายและเมื่อมีการกด SWRIGHT LED จะวิ่งไปทางขวา เมื่อไม่มีการกดสวิตช์ LED จะติดค้าง

ในการรับอินพุตจากสวิตช์ จะต้องมีการหน่วงเวลาเล็กน้อย (~100mS) เพราะในที่สวิตช์กำลังจะสัมผัสหรือจากกัน หน้าสัมผัสของสวิตช์จะกระเพื่อมเล็กน้อย หรือที่เรียกว่า Bounce หลังจากที่เช็คได้ว่าสวิตช์มีการกดจึงต้องหน่วงเวลาแล้วเช็คอีกครั้งว่าสวิตช์มีการกดหรือเปล่าเพื่อให้แน่ใจว่าไม่ใช่ Bounce

null

รูปที่ 5 วงจรที่ใช้ในการทดลองที่ 1

รูปที่ 6 ภาพการทดลองในแผ่นปรินต์อเนกประสงค์

//************************************************************************//
//Project : LAB1IOPORT
//Description : I/O Port
//Device : 89S52
//XTAL : 11.0592 MHz
//By : ThaiEmbedded 2007
//************************************************************************//
#include <REGX51.H>sbit SWLEFT = P1^0;
sbit SWRIGHT = P1^1;unsigned char dat;

//————————————————————————//
// Delay (mSec)
//————————————————————————//
void dmsec(unsigned int cnt)
{
unsigned char i;
while(cnt)
{
for (i=1;i<=228;i++);
cnt–;
}
}
//————————————————————————//
// Check left switch
//————————————————————————//
bit press_swleft()
{
SWLEFT = 1;
if(SWLEFT)
return(0);
else
{
dmsec(100);
if(!SWLEFT) ????????????????????//Recheck bounce?
return(1);
}
return(0);
}
//————————————————————————//
// Check right switch
//————————————————————————//
bit press_swright()
{
SWRIGHT = 1;
if(SWRIGHT)
return(0);
else
{
dmsec(100);
if(!SWRIGHT) ????????????????????//Recheck bounce?
return(1);
}
return(0);
}
//————————————————————————//
// Main
//————————————————————————//
void main()
{
dat = 1;
while(1)
{
if(press_swright())
{
if(dat==0×01)
dat = 0×80;
else
dat >>= 1;
}
else if(press_swleft())
{
if(dat==0×80)
dat = 0×01;
else
dat <<= 1;
}
P0 = dat;
dmsec(300);
}
}

Download Code การทดลองที่ 1