BASIC-51 COURSE Chapter4 (Thai)

Page 1

Proto Tech - Series

Embedded System ศักดิ์ชัย ผางสําเนียง

เรี ย น-เล น -ใช

ไมโครคอนโทรลเลอร MCS-51 ดวยโปรแกรมภาษาเบสิก µÍ¹·Õè 4 : 㪌 § Ò¹¾Íà µ ÍÔ ¹ ¾Ø µ àÍÒµ ¾Ø µ à¾×èÍÊÌҧâ¤Ã§§Ò¹à¡ÕèÂǡѺ LED Í‹ҧ§‹ÒÂ

¨Ò¡¼ÙŒà¢Õ¹ ผ า นพ น ช ว งเทศกาลป ใ หม ไ ทยบวกกั บ วั น หยุ ด ยาวกั น มา พอสมควร ผมเองไดมีโอกาสไปในสถานที่ทองเที่ยวหลายแหง ให มาสะดุดตากับการตกแตงดวยหลอดไฟวิ่งในลักษณะที่เรียกกัน วา ไฟดาวตก นับเปนไฟประดับที่มีความสวยงามและออนชอย ใน ระหวางที่สมองซีกขวากําลังเอิบอิ่มกับแสงของไฟดาวตก สมอง ซี ก ซ า ยของผมก็ เ ริ่ ม วิ เ คราะห ถึ ง ระบบการทํ า งานของมั น ว า มั น ทํ า งานอย า งไร จนตกผลึ ก มาเป น การทดลองที่ ส ามารถทํ า ได ง า ยๆ บนบอร ด TPE-51 โดยใช โ ปรแกรมภาษาเบสิ ก ที่ พั ฒ นา ดวย Bascom-8051 กอนที่จะทําไฟดาวตกเราควรทําความเขาใจ เกีย่ วกับกับการสัง่ งานพอรตของไมโครคอนโทรลเลอร MCS-51 กันกอน ¡Ò÷´Åͧ·Õ่ 3 ¡ÒÃ㪌 § Ò¹¢Ò¾Íà µ àÍÒµ ¾Ø µ ´Œ Ç Â¡ÒÃµÔ ´ µ‹ Í áºº¾Íà µà¾×่͢Ѻ LED 8 ´Ç§ การทดลองนี้เปนการสั่งงานขาพอรตของไมโครคอนโทรลเลอรใหเปน เอาตพุตและมีการสงผานขอมูลแบบไบตไปยังขาพอรตทั้ง 8 ขาเพื่อควบคุม การเปดปด LED ทั้ง 8 ดวงพรอมกัน (L3.1) ตอวงจรตามรูปที่ L3.-1 หรือจะนําบอรด miniLED8 ที่แนะนํา ใหสรางใน TPE ฉบับนี้มาเสียบเขากับจุดตอ PORT0 ก็ได

66

The Prototype Electronics

รูปที่ L3-1 วงจรสําหรับทดลองใชงาน PORT0 เปนเอาตพุตเพื่อควบคุม LED 8 ดวง (L3.2) เปดโปรแกรม Bascom-8051 ขึ้นมา เขียนโปรแกรมที่ L3-1 บันทึกชื่อเปน OutPort0.bas จากนั้นทําการคอมไพลและดาวนโหลด โปรแกรมลงบอรด TPE-51


โปรแกรมที่ L3-1 ไฟล OutPort0.bas โปรแกรมควบคุ ม พอร ต 0 เปนพอรตเอาตพุตอยางงาย (คําอธิบายโปรแกรมภาษาไทยไมตองพิมพ)

โปรแกรมที่ L4-1 ไฟล BinaryOutPort0.bas โปรแกรมแสดงคาเลขฐาน สองแบบ 8 บิตทีพ่ อรต 0 ของไมโครคอนโทรลเลอร P89V51RD2

$regfile = "89C51RD.DAT"

$regfile = "89C51RD.DAT"

$default Xram

$default Xram

$ramstart = 0

$ramstart = 0

$ramsize = 1024

$ramsize = 1024

$crystal = 11059200

$crystal = 11059200

Lamp Alias P0

Lamp Alias P0 Dim I As Byte

P0

Dim J As Byte

Do Lamp = 0

Do For I = 0 To 255

Waitms 500

J = I

Lamp = 255

J = Not J

Waitms 500

Lamp = J

Loop

Waitms 500 Next

(L3.3) รันโปรแกรมดวยการกดสวิตช RESET หากทุกอยางถูกตอง LED 8 ดวงตองติดดับสลับกันทั้ง 8 ดวง จาก โปรแกรมที่ L3-1 จะเห็นวา มีการใชคําสั่ง Lamp = 0 เพื่อให LED ติดทั้ง 8 ดวง และ Lamp = 255 เพื่อดับLED ทั้ง 8 ดวงเชนกัน ทานอาจ สงสัยวา ทําไมตองใชคําสั่ง Lamp = 255 เพื่อให LED ทั้ง 8 ดวงดับ นั่นเปน เพราะวา MCS-51 เปนไมโครคอนโทรลเลอรขนาด 8 บิต มีพอรตตอใชงาน 3 พอรต แตละพอรตมี 8 ขา ในตัวอยางนี้ใช P0 ซึ่งประกอบดวย P0.0, P0.1 ไลตามลําดับจนถึง P0.7 ดังนั้น เมื่อตองการให LED ติดหมด จึงตองทําใหทุกบิตเปน “0” จึง เขียนคา 0 ไปยังรีจิสเตอรของพอรต 0 และเมื่อตองการให LED ดับหมด จึง ตองทําใหทุกบิตเปน “1” จึงเขียนคา 11111111 ฐานสองหรือ 255 ฐานสิบ หรือ &HFF ไปยังรีจิสเตอรของพอรต 0 ¡Ò÷´Åͧ·Õ่ 4 áÊ´§¤‹ÒàÅ¢°Ò¹Êͧ´ŒÇ LED 8 ´Ç§¼‹Ò¹·Ò§ ¾Íà µ 0 ¢Í§äÁâ¤Ã¤Í¹â·ÃÅàÅÍà MCS-51 จากการทดลองที่แลวทําใหเราทราบถึงการสั่งงานขาพอรตแบบงายๆ กันแลว เพื่อใหเขาใจการทํางาน ในระบบการนับเลข และสั่งงานไปยังขาพอรตดวยคาของขอมูลที่มี ความหลากหลายมากขึ้น ในการทดลองนี้จะทําการนับเลข 0 ถึง 255 แลว นําไปแสดงผลที่พอรต 0 ในรูปแบบของเลขฐานสอง

Loop

(L4.3) รันโปรแกรมดวยการกดสวิตช RESET หากทุกอยางถูกตอง LED 8 ดวงต อ งติ ด หรื อ ดั บ เพื่ อ แสดงค า ของเลขฐานสอง 8 บิ ต ตั้ ง แต 00000000 ถึง 11111111 ซึ่งเทากับ 0 ถึง 255 ในเลขฐานสิบ จากการทดลองนี้ โปรแกรมจะนับคาตัวเลขฐานสิบ โดยเริ่มจากให ตัวแปร I เปน 0 และเพิ่มขึ้นครั้งละหนึ่งจนถึง 255 ในแตละครั้งที่คาเพิ่ม ขึ้นจะนําไปแสดงที่พอรต P0 ในรูปแบบเลขฐานสอง โดยมีตัวแปร J ทํา หนาที่กลับสถานะใหแสดงผลเปนเลขฐานสองอยางถูกตอง นั่นคือ LED ติดหมายถึงขอมูล “1” และ LED ดับคือ ขอมูล “0” ทั้งนี้เนื่องจากการขับ LED ที่ P0 เปนการขับแบบแอกตีฟลอจิก “0” หรือขับแบบกระแสซิงก หาก ไมมีการสลับคาการแสดงผลที่ LED จะมีผลกลับกัน นั่นคือ LED จะดับเมื่อ ขอมูลเปน “1” และ LED ติดเมื่อขอมูลเปน “0” ¡Ò÷´Åͧ·Õ่ 5 ½¹´Òǵ¡Í‹ҧ§‹Ò มาถึงเปาหมายของผมเสียที นั่นคือ การทดลองสรางวงจรฝนดาวตก แบบงายๆ ครับ วงจรยังคงใชแบบเดียวกับการทดลองที่ผานมาในรูปที่ L3-1 (L5.1) เปดโปรแกรม Bascom-8051 ขึ้นมา เขียนโปรแกรมที่ L5-1 บันทึกชื่อเปน MeteorShower.bas จากนั้นทําการคอมไพลและดาวนโหลด โปรแกรมลงบอรด TPE-51

(L4.1) ยังคงใชวงจรในรูปที่ L3.-1 ในการทดลอง (L4.2) เปดโปรแกรม Bascom-8051 ขึ้นมา เขียนโปรแกรมที่ L4-1 บันทึกชือ่ เปน BinaryOutPort0.bas จากนัน้ ทําการคอมไพลและดาวนโหลด โปรแกรมลงบอรด TPE-51

The Prototype Electronics

67


Embedded : Basic-51 Course

โปรแกรมที่ L5-1 ไฟล MeteorShower.bas โปรแกรมขับ LED ที่ พอรต P0 ของไมโครคอนโทรลเลอร P89V51RD2 ใหทํางานในรูป แบบฝนดาวตก $regfile = "89C51RD.DAT" $default Xram $ramstart = 0 $ramsize = 1024 $crystal = 11059200 Lamp Alias P0 Dim I As Byte Dim J As Byte Dim K As Byte Do J = &B00000001 Lamp = &B11111110 Waitms 300 For I = 0 To 7 Shift J , Left , 1 K = Not

J

Lamp = K Waitms 300 Next Loop

(L5.2) รันโปรแกรม จะเห็น LED ติดไลทีละดวงจากขา P0.0 คลายๆ กับฝนดาวตก เราสามารถปรับอัตราเร็วในการแสดงผลไดจากการเปลี่ยน คาเวลาที่คําสั่ง Waitms รวมถึงกําหนดรูปแบบการแสดงผลตั้งตนดวยการ กําหนคาของตัวแปร J และ Lamp ซึ่งตองกําหนดใหสัมพันธกันดวย อาทิ หากกําหนดคา J เทากับ 00000011 คาของ Lamp ตองเปน 11111100 เปนตน หากสังเกตจะพบวา คาของ Lamp จะเปนคาที่ตรงขามกับ J เสมอ ตัวอยางนี้มีคําสั่งใหม 2 คําสั่งคือ Shift และ For…Next สําหรับคําสัง่ แรกนัน้ คือคําสัง่ Shift โครงสรางของคําสัง่ ซึง่ เปนการเลือ่ นบิต ประกอบดวย Shift [ตัวแปรทีต่ อ งการ] , [LEFT ซาย หรือ RIGHTT ขวา] , [ จํานวน การเลือ่ นบิต ] สํ า หรั บ คํ า สั่ ง For..Next เป น การวนรอบแบบหนึ่ ง ต า งจาก Do…Loop ตรงทีเ่ ราสามารถกําหนดไดวา ใหวนรอบกีค่ รัง้ จึงจะออกจากลูป เช น จากตั ว อย า งโปรแกรมฝนดาวตกจะมี ก ารวนรอบอยู  8 ครั้ ง คือ จาก 0 ถึง 7 จากนั้นจึงออกจากลูปแลววนกลับไปทําซํ้าในตําแหนง หลัง Do กอนทีจ่ ะมาวนทํางานใน For …Next อีกครัง้ ¡Ò÷´Åͧ·Õ่ 6 ¢Ñº LED µÑÇàÅ¢ 7 ʋǹ ในการทดลองเพื่อใชงานพอรตเอาตพุตแบบไบตนั้นหากขาดการ ทดลองขับ LED ตัวเลข 7 สวนก็คงจะไมสมบูรณเปนแนแท LED ตัวเลข 7 สวนประกอบขึ้นจาก LED จํานวน 7 ตัวที่บรรจุอยูใน ตัวถังเดียวกันและไดรับการจัดเรียงเปนรูปตัวเลข LED แตละตัวจะถูกเรียก วา สวน หรือ เซกเมนต (segment) แตละสวนหรือเซกเมนตมีชื่อเรียกแตก ตางกันตามตําแหนงที่ไดรับการจัดวางคือ a, b, c, d, e, f และ g ดังแสดงใน รูปที่ L6-1 สวน dp เปน LED อีก 1 ตัวที่บรรจุอยูใน LED ตัวเลข 7 สวนนี้ใช เปนตัวแสดงจุดทศนิยมในกรณีที่มีการแสดงผลในลักษณะเลขที่มีทศนิยม 68

The Prototype Electronics

รูปที่ L6-1 รูปราง, การกําหนดชื่อเซกเมนตตางๆ, การจัดขา และชนิดของ LED ตัวเลข 7 สวน LED ตัวเลข 7 สวนมี 2 แบบคือ 1. แบบแคโทดรวม (common cathode) เปนการตอขาแคโทด ทั้งหมดของ LED เขาดวยกัน แลวขับ LED ใหสวางดวยการปอนสัญญาณ ลอจิก "1" เขาที่ขาแอโนดของแตละเซกเมนตตั้งแต a ถึง g และ dp (จุด) ไมโครคอนโทรลเลอรตองขับ LED แบบนี้ดวยวิธีการขับแบบกระแสซอรส 2. แบบแอโนดรวม (common anode) เปนการตอขาแอโนด ทั้งหมดของ LED เขาดวยกัน แลวขับ LED ใหสวางดวยการปอนสัญญาณ ลอจิก “0” เขาที่ขาแคโทดแทน ซึ่งตรงขามกับแบบแคโทดรวม ไมโคร คอนโทรลเลอรตองขับ LED แบบนี้ดวยการขับแบบกระแสซิงก จึงแนะนํา ใหเลือกใช LED ตัวเลข 7 สวนแบบนี้กับไมโครคอนโทรลเลอร MCS-51 สํ า หรั บ การเชื่ อ มต อ ไมโครคอนโทรลเลอร P89V51RD2 เพื่ อ ขั บ LED ตัวเลข 7 สวนมีวงจรตัวอยางแสดงในรูปที่ L6-2 โดยตอขาพอรต P0.0 เขาที่ขาเซกเมนต a ไลไปตามลําดับจนถึงขา P0.6 ตอกับขาเซก เมนต g และตอขา P0.7 เขากับขาของเซกเมนต dp หรือจุด ที่ขารวมหรือ common ของ LED ตัวเลข 7 สวนจะตอกับวงจรทรานซิสเตอร BC557 ซึ่ง เปนทรานซิสเตอรแบบ PNP มีการตอขาเบสของทรานซิสเตอรเขากับตัว ตานทานจํากัดกระแสลงกราวด ทําใหทรานซิสเตอร BC557 ทํางานทันทีที่ มีการจายไฟเลี้ยงใหวงจร สวน LED ตัวเลข 7 สวนจะติดสวางอยางไรขึ้นกับ ขอมูลหรือสัญญาณลอจิกที่ปอนใหแกขาเซกเมนต a ถึง g และ dp การกําหนดให LED ตัวเลข 7 สวนแสดงขอมูลเปนตัวเลขหรือเปน สัญลักษณใดๆ ก็ตาม ตองมีการกําหนดรูปแบบการแสดงผลของเซกเมนต ตางๆ ดวยขอมูลแตละบิตของไมโครคอนโทรลเลอรแลวใชวิธีการเปดตาราง หรือ look up table ดังแสดงตัวอยางตารางขอมูลของการแสดงผลตัวเลข ฐานสิบหกของ LED ตัวเลข 7 สวนในตารางที่ L6-1


จากโปรแกรมที่ L6-1 เป น การวนทํ า งานเพื่ อ นํ า ค า ที่ อ ยู  ใ นตาราง 7segment ออกมาแสดง โดยใช คํ า สั่ ง S = Lookup(i , 7segment) เนื่องจาก LED ตัวเลข 7 สวนมี 2 แบบคือ แคโทดรวมและแอโนดรวม จึง ต อ งมี ก ารกํ า หนดเงื้ อ นไขเล็ ก น อ ยเพื่ อ เลื อ กข อ มู ล ที่ เ หมาะสมไปแสดง ผล ในบรรทัด S = Not S เปนการกลับสถานะของขอมูลที่ไดจากตาราง 7segment ของโปรแกรมเพื่อใหใชกับ LED แบบแอโนดรวม แตถาหาก นําไปใชกับ LED ตัวเลข 7 สวนแบบแคโทดรวมใหตัดคําสั่งในบรรทัด S = Not S ออกไป โปรแกรมที่ L6-1 ไฟล 7segPort0.bas โปรแกรมขับ LED ตัวเลข 7 สวนแบบแอโนดรวมที่พอรต P0 ของไมโครคอนโทรลเลอร P89V51RD2 ใหทํางานในรูปแบบฝนดาวตก รูปที่ L6-2 วงจรเชื่อมตอไมโครคอนโทรลเลอร P89V51RD2 สําหรับทดลอง ใชงาน PORT0 เปนเอาตพุตเพื่อขับ LED ตัวเลข 7 สวนแบบแอโนดรวม

$regfile = “89C51RD.DAT” $default Xram $ramstart = 0 $ramsize = 1024 $crystal = 11059200 Dim I As Byte Dim S As Byte 7s Alias P0 Do For I = 0 To 16 S = Lookup(i , 7segment) S = Not S 7s = S Wait 1 Next Loop 7segment: Data &H3F Data &H06 Data &H5b Data &H4f Data &H66 Data &H6d Data &H7d

ตารางที่ L6-1 ตารางขอมูลของการแสดงผลตัวเลข 0-F ของ LED ตัวเลข 7 สวนแบบแอโนดรวม

Data &H27 Data &H7F Data &H6F

(L6.1) ตอวงจรในรูปที่ L6-3 เพื่อใชในการทดลอง หรือจะนําบอรด miniDisplay1 ที่ แ นะนํ า ให ส ร า งใน TPE ฉบั บ นี้ ม าเสี ย บเข า กั บ จุ ด ต อ PORT0 ก็ได (L6.2) เปดโปรแกรม Bascom-8051 ขึ้นมา เขียนโปรแกรมที่ L6-1 บันทึกชื่อเปน 7segPort0.bas จากนั้นทําการคอมไพลและดาวนโหลด โปรแกรมลงบอรด TPE-51 (L6.3) ทําการรันโปรแกรม จะเห็น LED ตัวเลข 7 สวนแสดงคาตัวเลข 0 ถึง F และจุด dp รวม 17 แบบ แลววนกลับมาที่ 0 ใหม

Data &H77 Data &H7C Data &H39 Data &H5E Data &H79 Data &H71 Data &H80

The Prototype Electronics

69


Embedded : Basic-51 Course

¡Ò÷´Åͧ·Õ่ 7 à¡ÁÅ١ൎÒẺµÑÇàÅ¢ ในระหว า งที่ ผ มกํ า ลั ง เขี ย นโปรแกรมเพี่ อ ทดลองขั บ LED ตั ว เลข 7 สวน ก็เกิดปง แวบกับไอเดียการทําของเลนแบบขําๆ นัน่ คือ การทําเกม ลูกเตาตัวเลขเสีย่ งทายแบบงายๆ โดยใชพนื้ ฐานมาจากการทดลองที่ 6 เพียง เพิม่ สวิตชกดติดลปอยดับเขาไปอีกหนึง่ ตัว ก็จะไดวงจรทดลองดังรูปที่ L7-1

รู ป ที่ L7-1 วงจรทดลองสํ า หรั บ สร า งเป น เกมลู ก เต า ตั ว เลขเสี่ ย งทาย อิเล็กทรอนิกส (L7.1) ตอวงจรในรูปที่ L7-1 เพื่อใชในการทดลอง หรือจะนําบอรด miniDisplay1 ที่ แ นะนํ า ให ส ร า งใน TPE ฉบั บ นี้ ม าเสี ย บเข า กั บ จุ ด ต อ PORT0 และ miniButton ตอเขาที่จุดตอ PORT2 โดยอาจเลือกตอเฉพาะ P2.0 ก็ได (L7.2) เปดโปรแกรม Bascom-8051 ขึ้นมา เขียนโปรแกรมที่ L7-1 บันทึกชื่อเปน 7segDice.bas จากนั้นทําการคอมไพลและดาวนโหลด โปรแกรมลงบอรด TPE-51 (L7.3) รันโปรแกรม แลวทดลองกดสวิตช S2 ที่พอรต P2.0 จะเห็น LED ตัวเลข 7 สวนแสดงคาตัวเลข 0 ถึง 9 ออกมาคาหนึ่ง และจะเปลี่ยนไป ในทุกครั้งที่กดสวิตชที่พอรต P2.0

โปรแกรมที่ L7-1 ไฟล 7segPort0.bas โปรแกรมขับ LED ตัวเลข 7 สวนแบบแอโนดรวมที่พอรต P0 ของไมโครคอนโทรลเลอร P89V51RD2 ใหทํางานในรูปแบบฝนดาวตก $regfile = "89C51RD.DAT" $default Xram $ramstart = 0 $ramsize = 1024 $crystal = 11059200 Dim S As Byte 7s Alias P0 Sw Alias P2.0 Do Debounce Sw , 0 , Random , Sub Loop Random: S = Rnd(9) S = Lookup(s , 7segment) S = Not S 7s = S Return 7segment: Data &H3F Data &H06 Data &H5b Data &H4f Data &H66 Data &H6d Data &H7d Data &H27 Data &H7F Data &H6F Data &H77 Data &H7C Data &H39 Data &H5E Data &H79 Data &H71 Data &H80

จากโปรแกรมที่ L7-1 การทํางานในสวนของการอานคาจากตารางใช หลักการเดียวกับโปรแกรมที่ L6-1 มีคําสั่งใหมเพิ่มเขามาในโปรแกรม นั่น คือ คําสั่ง RND เปนคําสั่งสุมตัวเลข มีโครงสรางดังนี้ ตัวแปรรับขอมูล = RND(คาขอบเขตดานสูงของการสุมตัวเลข) ตัวอยาง S = Rnd(9) หมายถึง เมื่อทําการสุมตัวเลข 0 ถึง 9 แลว นํา คาที่ไดเก็บไวในตัวแปร S www.tpemagazine.com

70

The Prototype Electronics

พอหอมปากหอมคอนะครับ สําหรับตัวอยางการทดลองใชงานพอรต เอาตพุตของไมโครคอนโทรลเลอร MCS-51 ที่นําเสอนผานตัวอยางแอป พลิเคชั่นอยางงายที่นําไปตอยอดไดจริง แลวพบกันตอนหนากับเรื่องราว ของการขับโมดูล LCD 16 ตัวอักษร 2 บรรทัดดวยโปรแกรมภาษาเบสิกกับ BASCOM-8051


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.