8051 APPLICATIONS

คีย์บอร์ด

             เป็นลักษณะของการประยุกต์ใช้งานที่สำคัญเป็นการอินเทอร์รัพท์ระหว่างเครื่องคอมพิวเตอร์กับมนุษย์ โปรแกรมที่ดี
จะต้องจำกัดข้อบกพร่องอันเกิดจากพฤติกรรมของมนุษย์อันได้แก่การกดซ้ำ และความสงสัยต่อการ ทำงานของเครื่อง โดยอาจ
จะบอกให้ผู้ใช้รู้ถึงการกดคีย์และการตอบรับการกดคีย์ อาจจะแสดงในรูปของแสงไฟ หรือเสียง และอื่นๆ ตามกรณีของการใช้
งานองค์ประกอบต่างๆ ที่เกี่ยวกับการประยุกต์ใช้งานกับคีย์บอร์ด องค์ประกอบอันเกิดจากมนุษย์ ในการประยุกต์ใช้งานคีย์
บอร์ด จะต้องป้องกันและกำจัดเหตุการณ์ต่างๆ ที่อาจเกิดขึ้นได้ ดังนี้
                           - การกดมากกว่าหนี่งคีย์
                           - ปุ่มถูกกดและค้างไว้
                           - การกดปล่อยคีย์อย่างรวดเร็ว องค์ประกอบอันเกิดจากสวิตช์คีย์               คีย์โดยทั่วไปหน้าสัมผัสจะมีการสั่นทั้งขณะเปิดและขณะปิดซึ่งมีเวลาเป็นมิลลิวินาที เมื่อมีการกดปล่อย อย่างรวด
เร็ว พัลส์ที่เกิดขึ้น จะต้องตรวจสอบได้ด้วยไมโครคอนโทรลเลอร์ คีย์อาจทำงานเพียงสัมผัส หรือสร้าง สัญญาณการกดคีย์ด้วย R-S flipflop หรือซอฟต์แร์ โปรแกรมสำหรับคีย์บอร์ด โปรแกรมที่ดีจะต้องทำให้การทำงานของมนุษย์ผ่านทางคีย์บอร์ด โดย
ทำตามนี้
               (ก) การกดปล่อยคีย์เวลาที่ใช้หน่วงจะมีระยะเวลานานกว่าข้อรายละเอียดจากโรงงานที่ผลิตเพื่อรอคาบการกด
ปล่อยทั้งสองทิศทาง
               (ข) สำหรับคีย์หลายๆตัว คีย์ที่ได้รับการกดก่อนเท่านั้นจะได้รับการอ่านค่าคีย์
               (ค) การค้างของคีย์ คีย์ที่กดก่อนจะได้รับการอ่านค่าหลังจบเวลาการกดคีย์จะไม่มีคีย์ใดได้รับการอ่านค่า จนกว่า
จะพบว่าคีย์ทั้งหมดกลับสู่สถานะเดิม
               (ง) การกดปล่อยคีย์อย่างรวดเร็ว ในการออกแบบคีย์จะได้รับการกวาดด้วยอัตราที่สูกว่าปฏิกิริยาการกระทำของ
มนุษย์
            ลักษณะของโปรแกรมที่สำหรับอ่านค่าคีย์มีอยู่สองลักษณะ คือ
               (ก) การหน่วงเวลาโดยใช้โปรแกรมลูปเพื่อรอรับค่าคีย์ (Software polled)
               (ข) การอ่านจะมีขึ้นก็ต่อเมื่อมีการกดคีย์เท่านั้น (Interrupt driven) โดยทั่วไปคีย์บอร์ดที่มีขนาดเล็ก
(ใช้คีย์ชนิดอิสระ หรือคีย์แบบรหัส) สามารถใช้ได้ทั้งสองวิธี ขั้ว Common อาจต่อกับกราวน์ รูปแบบการอ่านที่เป็นคาบ
ซึ่งตรวจสอบค่า "0" ที่เรากดในแต่ละคีย์ หารนำสัญญาณจาก คีย์ต่างๆ มาทำการ "AND"

จอแสดงผล
                เป็นการประยุกต์ใช้งานเพื่อแสดงเอาท์พุทของมนุษย์ Display สามารถแบ่งออกได้ดังนี้
                        1. Single light (S)
                        2. Single character (S)
                        3. Intelligent alphanumeric Single light display เป็นหลอดไฟแบบใสและ LED ซึ่งแสดงค่าทางไบนารี่ ซึ่งจะติดหรือดับจาก โปรแกรม ตัวอย่างการใช้งานเช่น ตัวแสดง Seven segment ไฟแสดงผลหน้าปัดรถยนต์ ฯลฯ จอแสดงผล seven segment ประกอบด้วย LED ต่อกันเป็นรูปเลข 8 มีขาคอมมอน 1 ขา (มีทั้งคอมมอนคาโธดและคอมมอนอาโนด) และขาของ LED แต่ละตัวดังรูปที่ 8.6 แสดงถึงรูปร่างและวงจรเสมือน ซึ่งจะใช้ในตัวอย่างนี้เป็น Common cathode ถ้ามีการใช้มากกว่า 1 อัน เราต้องใช้วิธีการสแกนด้วยความถี่สูงจนการมองเห็นของมนุษย์ไม่สามารถจับการ กระพริลได้ อัตราการกวาดในแต่ละครั้งจะหน่วงไว้ 10 ms หรือมากกว่า และค่าจะถูกหารด้วยจำนวน Display ที่ใช้ เพื่อหาช่วงเวลาที่ใช้ทำให้หลอดสว่างของแต่ละอัน

รูปที่ 8.6 รูปแสดงวงจรแสดงผล Seven segment led ตัวอย่างที่ใช้ในหัวข้อนี้ ใช้ตัวแสดงผล Sevent segment 4 อัน โดยแต่ละขาจะถูกต่อกับพอร์ต 1 และ ขาคอมมอนคาโธดของแต่ละอันจะถูกนำมาต่อกับพอร์ต 3.2 ถึง 3.5 ซึ่งแต่ละขีดจะสว่าง ขึ้นก็ต่อเมื่อขาของขี้นั้นได้สัญญาณเป็น High "1" และคอมมอนคาโธดเป็น low "0" ทรานซิสเตอร์จะถูกใช้ในการขับกระแสให้เพียงพอกับ LET (มีค่าประมาณ 10 mA/ขีด หรือ 70 mA/อัน) ซึ่งค่านี้เป็นค่าเฉลี่ย แต่ค่าสูงสุดจริงๆนั้นจะมีค่าประมาณ 4 เท่า สำหรับการกำหนดให้สว่างเป็นเวลา 215 ms ในโปรแกรมจะถูกอินเทอร์รัพท์จาก T0 เช่นเดียวกับที่ใช้ในโปรแกรม "Big key" โปรแกรมการ อินเทอร์รัพท์นี้จะทำให้เกิดการเลือกขาคาโธดที่จะทำการแลทช์ จากพอร์ต 3 โปรแกรมหลักที่ใช้ในการค้นตารางเพื่อ แสดงแปลงค่าฐาน 16 ไปเป็นข้อมูลที่จะแสดงที่ ตัวแสดงผล Sevent segment "Svnseg" โปรแกรม SVNSEG รูปแบบที่แสดงที่ตัวแสดงผลทั้ง 4 อันจะถูกเก็บไว้ในหน่วยความจำที่ชี้โดย CH1ถึง CH4 พอร์ต 1 จะค้างสถานะต่างๆ เอาไว้ ค่าของบิทในไบต์ต่ำของ CH ของพอร์ต 3 จะค้างสถานะของคาโนดเอาไว้ และจากค่าในไบต์สูงของ CHx ค่า Timer T0 จะหน่วงเวลา ไว้ 2.5 ms ซึ่งเป็นช่วงเวลาระหว่างที่การแสดงผลของตัว Seven segment แต่ละอัน โปรแกรมหลักที่ใช้ในการค้น ตารางเพื่อแปลงขอ้ฒุลเป็นเลขฐาน 16 ให้เป็นรูปแบบที่จะถูกนำมาแสดงบน Display และ R0 ในตำแหน่งที่ 1 จะถูก ใช้เพื่อบ่งชี้รูปแบบที่จะแสดงบน Display ข้อสังเกต การใช้แบงค์ที่ 1 ของหน่วยความจำ สำหรับการอินเทอร์รัพท์รูทีน สำหรับการ PUSH และ POP แบงค์ที่ 1 จะถูกใช้ในการกระทำข้อมูลบน Register แบงค์ 0 จะสังเกตได้ว่าสถานะขณะรีเซต ตัวชี้ R0 ของแบงค์ 1 สามารถเปลี่ยนตำแหน่งไปที่อื่นก็ได้ และความเข้มของตัว Display ก็สามารถปรับได้โดยค่า T0 การแสดงตัวอักษรด้วยจอ LCD ในหัวข้อนี้เราจะใช้ตัวแสดงผลแบบ LCD 2 บรรทัด ขนาด 20 ตัวอักษร/บรรทัด อินเทอร์รัพท์เฟสกับ 8051 โดยที่รูปแบบที่กำหนดแสดงไว้ดังรูปที่ 8.8

รูป 8.8 แสดงวงจรแสดงผล Intelligent LCD สำหรับโปรแกรม "Lcdisp" ตัว Display จะประกอบไปด้วยรีจิสเตอร์ 2 ตัว ตัวหนึ่งสำหรับคำสั่ง (RS = 0) และอีกกันหนี่งสำหรับ รูปที่ต้องการแสดงบนดิสเพลย์ (RS = 1) สำหรับพื้นที่หน่วยความจำที่ใช้งานเราสมารถโปรแกรมให้แสดงผลออกมา ได้ตามที่เราต้องการ โดยใช้รูปแบบของ Dot matrix ในการที่จะแยกให้ได้ว่าข้อมูลทั้ง 2 ส่วนเป็นค่าอะไรนั้น เราจะใช้ค่า 80H เป็นตัวบ่งชี้ว่าเป็นตำแหน่งข้อมูลของดิสก์เพลย์ที่ถูกเลือก พอร์ต 1 จะถูกใช้ในการส่งคำสั่ง / ข้อมูล และพอร์ต 3.2 ถึว 3.4 จะเป็นตัวกำหนดค่า RS และ R/w การวัดพัลส์ เซนเซอร์ถูกใช้ในการควบคุมในระบบอุตสาหกรรม บ่อยครั้งที่เอาท์พุทของเซนเซอร์เป็นพัลส์ที่ประกอบ ด้วยข้อมูลอยู่ด้วย การแปรเปลี่ยนของความถี่เอาท์พุทของเซนเซอร์ ซึ่งมีค่าดิวตี้ไซเคิลคงที่ เป็นการบอกการเปลี่ยน แปลงของค่าตัวแปรที่วัดได้ การวัดความถี่ ไทม์เมอร์ T0 และ T1 ถูกใช้เพื่อวัดความถี่ภายนอก อันหนึ่งใช้สำหรับทำการนับจำนวนพัลส์ ส่วนอีก ตัวหนึ่งใช้จับเวลาช่วงเวลาหนึ่ง ความถี่ = จำนวนพัลส์ที่นับได้/เวลา ตัวอย่าง ถ้านับพัลส์ได้ 200 ลูก ในเวลา 0.1 วินาที เพราะฉะนั้น ความถี่ = 200/0.1 = kHz จากข้างต้นจะบอกว่ามีข้อจำกัดคือ วัดความถึ่ได้ช่วงหนึ่ง พัลส์ที่วัดจะเปลี่ยนสถานะจาก 1 เป็น 0 ไม่เกิน ช่วง 2 แมชชีนไซเคิล (f/24) จึงจะวัดได้ ดังนั้นหากใช้คริสตอลความถี่ 16 MHz ความถี่สูงสุดที่สามารถวัดได้เท่ากับ 667 kHz ความถี่ต่ำสุดที่สามารถวัดได้ถูกจำกัดโดยช่วงเวลาของการจับเวลา ซึ่งอาจมากเท่าใดก็ได้ ถ้าใช้หน่วย ความจำทั้งหมดในการตั้งเวลา (49.15 msec * 232786) ซึ่งทำให้ในการปฏิบัติไม่มีการจำกัดความถึ่ต่ำสุดที่วัดได้ โดยทั่วไปตัวเซนเซอร์จะสร้างสัญญาณในช่วง 0 ถึง 667 kHz โดยปกติจะอยู่ในช่วง 1 kHz ถึง 10 kHz ในตัวอย่างนี้ เราใช้เซนเซอร์ที่วัดดีซีดวลเตจจาก 0 ถึง 5 โวลท์ ที่ 0V เซนเซอร์ให้เอาท์พุทเป็น 1 kHz และที่เต็มสเกล หรือ 5 V เป็น 6 kHz ดังนั้นอัตราส่วนเป็น 1 โวลต์ต่อ 1 kHz และเราก็คาดที่จะวัดแรงดันที่เข้าใกล้ 0.1 V หรือความถี่ 10 Hz ช่วงการจับเวลาเป็น 1 วินาที ทำให้ความถี่ที่ต่ำสุดวัดได้เท่ากับ 1 Hz ดังนั้นช่วงเวลา 0.1 วินาที ยังคงให้ค่าที่ถูกต้องสำหรับความถี่เข้าใกล้ 10 Hz อีกทางหนึ่งที่จะใช้ในการเลือกค่าเวลา T นี้เพื่อให้ค่าที่ถูกต้อง ให้พิจารณาดังต่อไปนี้ 0.01V/5V = 0.002 = 1/512 = 1/29 และผ่านการนับเป็น T*fmin ถึง T*fmax หรือย่าน T(fmax-fmin) จากศูนย์ถึงเต็มสเกล ดังนั้นความถูกต้องในการนับของแต่ละบิทของเคาท์เตอร์เป็น LSB = T*(fmax-fmin)/2n เมื่อ n คือค่าจำนวนบิทที่ต้องการให้อยู่ย่านความถูกต้องที่กำหนด เช่น T = 512/ 5000 = 0.1024 วินาที ซึ่งค่า 0.1 วินาที่จะถูกนำมาใช้ซึ่งการกำหนดค่าในไทม์เมอร์ โปรแกรม "Flag" ใช้ไทม์เมอร์ T0 ในการนับจำนวนลูกคลื่นภายนอกซึ่งมีค่าอยู่ในช่วง 1 kHz ถึง 6 kHz T1 ใช้ในการตั้ง เวลา มีค่า 192 us ซึ่งจะทำการนับโดยใช้รีจิสเตอร์ R4 และ R5 ของแบงค์ 1 จนกว่าจะเกิดโอเวอร์โฟล์ 521 ครั้ง ทำให้ได้เวลาหน่วงทั้งหมด 0.100032 วินาที ข้อสังเกต เวลาที่ใช้ในการนับยาวนานกว่านี้ จะทำให้มีความถูกต้องสูงขึ้น และ T0 จะโอเวอร์ดฟล์ที่ 65535 หรือที่ ช่วงเวลานาน 10.92 วินาที มีความถี่สูงสุดซึ่งถูกสร้างใน T1 และ R4,R5 ในกรณีนี้ความถูกต้องมีค่าเข้า ใกล้ 0.09 Hz หรือ 0.0001 โวลท์ ถ้าต้องการหน่วงเวลาที่ใกล้ค่า 0.1 วินาที มากกว่าที่ใช้ในโปรแกรม ให้ลดค่าคาบเวลาใน T1 ให้สั้นลง และ T1 จะถูกนับจำนวนโอเวอร์โฟล์ค่าใน R4,R5 ดังนั้นการลดค่าในรีจิสเตอร์ R4,R5 จะทำให้คาบเวลาน้อยลงได้ การวัดความกว้างของพัลส์ ถ้าอินพุทเป็นสัญญาณ 4 เหลี่ยมที่สมบูรณ์ ความถี่ของพัลส์สามารถวัดได้จากการหาช่วงเวลาที่สัญญาณมี สถานะเป็น 1 (TH) ความถี่จะเท่ากับ UF = 1/(TH*2) เช่า ถ้า TH มีค่า 200 usec จะได้ UF เป็น 2500 Hz ค่าความถูกต้องจะลดลง ถ้าค่าดิวตี้ไซเคิล คลาดเคลื่อนจากค่า 50% ไทม์เมอร์ X จะถูกกำหนดลักษณะการทำงาน โดยนับสัญญาณนาฬิกาจากภายใน ในลักษณะนี้ ขาอินเทอร์รัพท์จากภายนอก INTX' มีลักษณะเป็น "1" ด้วยการเซตค่าบิท gatex ใน TMOD ความถูกต้องของการวัดจะอยู่ภายในค่าประมาณของครึ่งคาบของสัญญาณนาฬิกาหรือ 0.37 us สำหรับ คริสตอลขนาด 16 MHz ในการวัดจะเริ่มเมื่อสัญญาณอินพุทมีสถานะ "0" และหยุดเมื่อสัญญาณอินพุพถัดไปเป็น "0" สำหรับพัลส์ที่มีความกว้างมากกว่าความจุของวงจรนับจะนับได้ (มีค่า 49.152 ms) สำหรับคริสตอลขนาด 16 MHz จะถูกวัดด้วยการนับจำนวนครั้งของการเกิดโอเวอร์โฟล์ และค่าที่นับได้ในวงจรนับรวมกัน สำหรับในตัวอย่างนี้ เซนเซอร์ที่จะใช้วัดในย่าน 0 ถึง 5 โวลท์ มีความถึ่คลที่ไว้ที่ 1 KHz หรือช่วงคาบเวลา 1 ms สำหรับสัญญาณอินพุท 0V เซนเซอร์จะให้สัญญาณทีมีคาบเวลาที่เป็น "1" เป็นเวลา 400 us และสถานะ "0" เป็นเวลา 600 us และเมื่ออินพุท เป็น 5V เซนเซอร์จะให้สัญญาณที่มีสถานะเป็น "1" เป็นเวลา 900 us และสถานะ "0" เป็นเวลา 100 us แต่ละค่า แรงดันจะแทนคาบเวลาของความกว้างพัลส์ 100 us ค่าความถูกต้องเป็น 10.00325V ซึ่งอยู่ภายในข้อกำหนดไว้ 0.01 V ในการที่จะทำการวัดได้นั้น T0 จะถูกกำหนดนับสัญญาณนาฬิกาภายใน เมื่อสัญญาณ INT0' มีสถานะเป็น "1" การวัดจะยังคงไม่เริ่มจนกว่าสัญญาณที่ INT0' เปลี่ยนสถานะจาก "1" เป็น "0" ดังนั้นการนับจะนับความกว้าง ของพัลส์ที่เริ่มเป็น "1" และกลับเป็น "0" อีกครั้ง กระบวนการทั้งหมดนี้สามารถถูกอินเทอร์รัพท์ด้วยการใช้อินเทอร์รัพท์ แฟลกที่สัมพันธ์กับสัญญาณ INT0' แฟลก IE0 สามารถถูกเซนเซอร์เป็น "1" เมื่อให้รับสัญญาณ INT0' (Port 3.2) ที่เปลี่ยนสถานะจาก "1" เป็น "0" (ค่า IE0 จะถูกเคลียร์ INT0' จะเป็นตัวบอกให้โปรแกรมเริ่มทำการนับความกว้าง พัลส์และหยุดการเปลี่ยนโปรแกรมมนี้ ในปัจจุบันการวัดความกว้างของใยสังเคราะห์ทำได้โดยการวัดเวลาของการสะท้อนจากการกวาดแสง เลเซอร์ โปรแกรม Width จะทำการวัดความกว้างของพัลส์ที่พอร์ต 3.2 (INT0') และพัลส์นี้มีค่าอยู่ในช่วง 400-500 us โปรแกรมจะเริ่มเมื่ออินเทอร์รัพท์แฟลก IE0 ถูกเซตและหยุดเมื่ออินเทอร์รัพท์ถูกเซตอีกครั้ง เพื่อเป็น การบอกว่าสัญญาณที่วัดคาบสมบูรณ์ 1 คาบคลื่น โปรแกรม ข้อสังเกต ถ้าพิจารณาสัญญาณรบกวนที่ปรากฏบนขา INT0' ค่าเฉลี่ยของความกว้างพัลส์หาได้จากการวัด ตาม ความกว้างของจำนวนพัลส์ที่ตามมา และวงจรนับจะเพิ่มค่าเมื่อจบการอ่านแต่ละคาบ ดังนั้นผลรวมของ ความกว้างพัลส์ที่วัดได้หารด้วยจำนวนคาบที่วัด จะเป็นค่าเฉลี่ยที่ได้ ค่าเฉลี่ยของสัญญาณรบกวนจะมี ค่าเป็น 0

ความถี่สามารถวัดได้ด้วยจำนวนครั้ง (M) ที่เปลี่ยนสถานะจาก "1" ไปเป็น "0" ของสัญญาณที่ขา INTX' การจับเวลาจะเริ่มที่คาบการเปลี่ยนสถานะและสิ้นสุดการนับที่เวลาที่นับได้ M+1 ครั้งของการเกปลี่ยนสถานะ ความถี่ที่ได้จะเท่ากับ UF = M/T เมื่อ T เป็นค่าในตัวตั้งเวลา


[ บทเรียน ] [ 204471 ] [ รายวิชา ]
[ ภาควิชาวิศวกรรมคอมพิวเตอร์ ] [ คณะวิศวกรรมศาสตร์ ] [ มหาวิทยาลัยเกษตรศาสตร์ ]