รูปวงจร AT98C2051

       

  รูปที่3.9วงจร AT98C2051

ภาควงจรควบคุมการทำงานทั้งหมดของหุ่นยนต์ตรวจจับความเคลื่อนไหว เลือกใช้ไมโครคอนโทรเลอร์ AT 89C2051 ซึ่งในส่วนของวงจรต่อใช้งานได้มาจากคู่มือ โดยจะทำการต่อขาสัญญาณต่างๆตามความต้องการของไอซีที่บอกมาในคู่มือซึ่งขา XTAL 1 , XTAL 2 จะต่อกับ CRYTAL ค่า 3-24 MHz ( ในที่นี้ใช้ค่า 12 MHz ) เพื่อสร้างสัญญาณนาฬิกาให้กับไอซี ขา RESET ต่อกับสวิตซ์เพื่อใช้รีเซทไอซีในกรณีที่เกิดการทำงานผิดผลาดขึ้นหรือต้องการเริ่มต้นทำงานใหม่ รีเซทที่ Logic 1  EA ต่อกับ VCC ไว้เพื่อเป็นการบอกให้ไอซีทำการประมวลผลคำสั่งในหน่วยความจำโปรแกรมภายใน ( ขEA Active ลอจิก 0 จะเป็นการอ่านหน่วยความจำโปรแกรมภายนอก ) ส่วน Port ที่ใช้งานจะต้องต่อ R-Pull Up จากรูปจะใช้ IC  AT89C2051 ทำหน้าที่ควบคุมการทำงานของวงจรในชุดต่างๆ โดย Port   P1.1 - P1.4 จะต่อกับชุด CONTROL MOTOR  ส่วนPort  P3.0 จะต่อเข้ากับชุด ULTRASONIC  SENSERPort  P3.1 จะต่อเข้ากับชุด  PIR-Passive Infrared DedectorPort P3.7 จะกำหนดให้เป็นPort Outputแสดงผลทาง LED และ Buzzer

 

                                      

***************************************

                                                ROBOT

***************************************

 

                           UL_R               BIT   P3.0    กำหนดค่า bit ที่ Port P3.0 เป็นชุด Ultrasonic ทางด้านขวา

                           UL_L               BIT   P3.1     กำหนดค่า bit ที่ Port P3.1เป็นชุดUltrasonicทางด้านขวา                               

                           PIR                  BIT   P3.2      กำหนดค่า bit ที่ Port P3.2 เป็นชุด  PIR

                           CLK                BIT   P3.3     กำหนดค่า bit ที่ Port P3. 3 เป็นสัญญาณ Clock ที่ป้อนให้ชุดส่ง

                           BUZZ              BIT   P3.7     กำหนดค่า bit ที่ Port P3.7 ให้ Buzzer

                           MOTOR          EQU   P1

 

                           TOWARD  EQU   00000101B  กำหนดค่าให้ TOWARD ให้เท่ากับค่า 0101

                           TURN_R    EQU   00000110B  กำหนดค่าให้  TURN_R    ให้เท่ากับค่า 0110

                           TURN_L    EQU   00001001B  กำหนดค่าให้  TURN_L    ให้เท่ากับค่า 1001

                           STEP_B     EQU   00001010B  กำหนดค่าให้  TURN_B    ให้เท่ากับค่า 1010

 

                           _R               EQU   00000001B

                           _L               EQU   00000010B          ถ้ามีวัตถุผ่านจะให้ แรงดัน

                           _RL            EQU   00000011B     >>>>>NO OBJECT = LOW

                           _NO           EQU   00000000B

;-----------------------------------------------------------

 

                           ORG          0000H                               เรื่มต้นที่ Address 0000H

                           JMP           MAIN                               กระโดดไปทำงานที่ MAIN

                                                                           เว้นพื้นที่ไว้ในการ Interrupt จะใช้พี้นที่ 0003 H

                           ORG          000BH                               เป็น Address เริ่มต้นที่จะกระโดดไป Interrupt

                           JMP           T0_INT                             กระโดดไป ทำการ Interrupt

                          

;----------------------------------------------------

 

            MAIN:    MOV         TMOD,#02H       ;<<<<< MODE 2  AUTO RELOAD

                           MOV         TH0,#0F4H       ;<<<<< 12 uSEC

                           MOV         IE,#10000010B   เป็น Register Interrupt Enable Control 8 Bit

                           SETB         TR0                 

                           MOV         MOTOR,#00H      นำค่า  00 H เก็บไว้ใน MOTOR

                           CLR           BUZZ                    Cler Buzzer

                           MOV         R7,#5                    >>

GGG:  LCALL      DELAY                  >>  หน่วงเวลา 5 รอบ

                           DJNZ         R7,GGG               >>

;---------------------------------------------------------

                 YY0: MOV         MOTOR,#TOWARD           >>   สั่งให้ มอเตอร์เดินหน้า

                           MOV         A,P3                                  >>   นำค่าที่ Port P 3 เก็บไว้ใน A

                           ANL          A,#_RL                              >>   คูณกันผลลัพธ์เก็บใน A

                           CJNE         A,#_NO,YY1                   >>   เปรียบเทียบค่าถ้าไม่เท่ากันจะทำการกระโดด

                           JMP           YY0                                  >>   ถ้าค่าเท่ากันจะทำการวนที่ Loop ํํํYY0

 

                 YY1: CJNE    A,#_R,YY2                                      >> เปรียบเทียบค่าด้านขวาถ้าไม่เท่ากันจะกระโดด

                           LCALL            STOP                                   ถ้าเท่ากันจะกระโดดไปที่ Stop 3รอบ

                           LCALL            STOP

                           LCALL            STOP

                           LCALL            CHK_PIR                          ทำการกระโดดไปที่ Loop  CHK PIR

                           MOV               MOTOR,#TURN_L   สั่งให้มอเตอร์เลี้ยวซ้าย

                           LCALL            DELAY                               เวลาเลี้ยวซ้ายเท่ากับค่าของ Delay

                           MOV               A,P3                                     >>   นำค่าที่ Port P 3 เก็บไว้ใน A

                           ANL                A,#_R                                  >>   คูณกันผลลัพธ์เก็บใน A

                           CJNE               A,#_R,YYX                      >> เปรียบเทียบค่าด้านขวาถ้าไม่เท่ากันจะกระโดด

                           JMP                 YY1                                      กระโดยไป Loop YY1

 

                 YY2: CJNE               A,#_L,YY3                  >> เปรียบเทียบค่าด้านขวาถ้าไม่เท่ากันจะกระโดด

                           LCALL            STOP                          >ถ้าค่าเท่กันจะกระโดดไป Loop Stop 3 รอบ

                           LCALL            STOP

                           LCALL            STOP

                           LCALL            CHK_PIR                          กระโดดไปเช็ค PIR

                           MOV               MOTOR,#TURN_R    สั่งให้มอเตอร์หมุนขวา

                           LCALL            DELAY                               เวลาเลี้ยวขวาเท่ากับค่าของ Delay

                           MOV               A,P3                                     >>   นำค่าที่ Port P3 เก็บไว้ใน A

                           ANL                A,#_L                                   >>   คูณกันผลลัพธ์เก็บใน A

                           CJNE               A,#_L,YYX                      >> เปรียบเทียบค่าด้านขวาถ้าไม่เท่ากันจะกระโดด

                           JMP                 YY2                                      กระโดยไป Loop YY2

 

  YY3: CJNE               A,#_RL,YYX              >> เปรียบเทียบค่าด้านขวาถ้าไม่เท่ากันจะกระโดด

                           LCALL            STOP                          >ถ้าค่าเท่กันจะกระโดดไป Loop Stop 3 รอบ

                           LCALL            STOP

                           LCALL            STOP

                           LCALL            CHK_PIR                    กระโดดไปเช็ค PIR

                           MOV               MOTOR,#STEP_B     สั่งให้มอเตอร์หมุนถอยหลัง

                           LCALL            DELAY                               หน่วงเวลา

                           MOV               MOTOR,#TURN_R     สั่งให้มอเตอร์หมุนขวา

                           LCALL            DELAY                               หน่วงเวลา

                           LCALL            DELAY

                           MOV               A,P3                                     >>   นำค่าที่ Port P3 เก็บไว้ใน A

                           ANL                A,#_RL                               >>   คูณกันผลลัพธ์เก็บใน A

 

                           CJNE               A,#_RL,YYX                   >> เปรียบเทียบค่าด้านขวาถ้าไม่เท่ากันจะกระโดด

                           JMP                 YY3                                      กระโดยไป Loop YY3

 

 YYX : LCALL            STOP                          กระโดดไป Loop Stop

                           JMP                 YY0                             กระโดยไป Loop YY0

 

;----------------------------------

         CHK_PIR: JB      PIR,YYM                      กระโดยถ้า มี  1

                           SETB    BUZZ                 สั่งให้ Buzzer ทำงาน

                           MOV     R7,#3                                นำค่า 3 เก็บใน R7

 YYY: LCALL   DELAY                     กระโดดไปหน่วงเวลา

                           DJNZ    R7,YYY                      ลดค่า R7 ลงทีละ 1

                           CLR     BUZZ                          สั่งให้ Buzzer หยุดทำงาน

 YYM:RET                                                        กลับไปทำงานต่อ

;---------------------------------

    STOP:MOV     MOTOR,#0                    สั่งมอเตอร์ให้หยุด

                           LCALL   DELAY                           หน่วงเวลา 2 รอบ

                           LCALL   DELAY

                           RET                                                       กลับไปทำงานต่อ

                             ;---------------------------------

 

             DELAY:MOV  R0,#02H                               นำค่า 2 เกับไว้ใน R0

              LOOP1:MOV  R1,#0FFH                    นำค่า FF เก็บไว้ใน R1

              LOOP2:MOV  R2,#0FFH                    นำค่า FF เก็บไว้ใน R2

              LOOP3:DJNZ R2,LOOP3                   ลดค่า R2 ลงทีละ 1 และกระโดดไป Loop 3

                           DJNZ R1,LOOP2                    ลดค่า R1 ลงทีละ 1 และกระโดดไป Loop 2

                           DJNZ R0,LOOP1                    ลดค่า R0 ลงทีละ 1 และกระโดดไป Loop 1

                           RET                                         กลับไปทำงานต่อ

 

                 ;*******  INTERUPT SUB ************************

                  ;**********************************************

 

             T0_INT:CPL     CLK                            ทำการCompletment  Logic คือเปลี่ยน 0 เป็น 1 เปลี่ยน 1 เป็น 0

                           RETI                                        กลับไปทำการ Interrupt ต่อ

 

                   ;---------------------------------------------------------------

                           END

 

 

TMOD         TMODเป็นรีจีสเตอร์อยู่ในชุดของการควบคุม TIMER/COUNTER ใน MCS-51  โดยจะมี 8 bitโดยการที่เราป้อนค่า 02H หมายความว่า

 

GATE

C/T

M1

M0

GATE

C/T

M1

M0

 

 

-----                            -----------TIMER 1-----------------;------------TIMER 0 -----------------

                           ศูนย์ตัวแรกเป็นการกำหนดค่าให้ TIMER 1 ให้เป็น ศูนย์  ใน 4Bit ซ้าย ส่วนสองเป็นการกำหนด ให้ TIMER 0 ทำงาน

                        โดยจะให้ทำงานใน MODE 2  โดยการทำงานในโหมด 2  น้นเป็นการทำงานแบบ  8 Bit Auto Reload   Timer/ Counter

                     MOV  TH 0, 0F4 H หมายความว่า นำค่า 0F4

 

 

Crytal = 12 MHz           1 Mechine Cycle =  1 MHz         หาเวลา ( T ) = 1/F = 1us

 

ต้องการความถี่ของชุด Ultrasonic  40 KHz  

 หาค่าเวลา( T ) = 1/F =  1/40 KHz = 25 us 

เพราะฉะนั้น T/2 =12.5 us โดยประมาณค่า เท่ากับ 12 us 

หาค่า Mechine Cycle  =  12 us / 1us = 12 

เพราะฉะนั้นจะได้เท่ากับ  12 Mechine Cycle 

โดย  8 Bit =  FF =  256   

หาค่าที่ต้องป้อนให้ TH 0 จะมีค่าเท่ากับ = 256 – 12  = 244 : แปลงเป็นฐาน  16 = F4

MOV ,  IE,# 10000010 B

เป็นคำสั่งนำค่า 10000010 B  ไปเก็บไว้ใน Regiser IE โดย IE เป็น Register Interrupt Enable  8 bit

 

EA

X

ET2

ES

ET1

EX1

ET0

EX

TIMER                 โดยค่า 10000010 B เป็นการเปินใช้งานที่ EA จะเป็นการเปิด โหมดการ Interrupt และ ET0 จะเป็นการ SET การ Interrupt

                   ให้เกิดในTIMER 0

 

 

รายการอุปกรณ์

Resistor 10K 4ตัว
1K 1ตัว
Port 2ขา 4ตัว
4ขา 1ตัว
Capacitor 30pF 2ตัว
4.7uF 1ตัว
10uF 1ตัว
0.1uF 1ตัว
Switch on/off 1ตัว
LED on/off 2ตัว
Xtal 12MHz 1ตัว
IC LM7850 1ตัว
AT89C2051 1ตัว

 

BACK NEXT

Hosted by www.Geocities.ws

1