1 / 26

START-C51 กับดินแดนมหัศจรรย์

START-C51 กับดินแดนมหัศจรรย์. บริษัท ศิลารีเสิร์ช จำกัด Sila Research Co.,Ltd. วิทยากร รองศาสตราจารย์ธีรวัฒน์ ประกอบผล. การพัฒนางานทางด้านไมโครคอนโทรลเลอร์. Hardware Single Board เน้นการเรียนรู้ Embedded Board เน้นการนำไปใช้งาน Software ภาษา Assembly ภาษา C.

ella
Télécharger la présentation

START-C51 กับดินแดนมหัศจรรย์

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. START-C51 กับดินแดนมหัศจรรย์ บริษัท ศิลารีเสิร์ช จำกัด Sila Research Co.,Ltd. วิทยากร รองศาสตราจารย์ธีรวัฒน์ ประกอบผล

  2. การพัฒนางานทางด้านไมโครคอนโทรลเลอร์การพัฒนางานทางด้านไมโครคอนโทรลเลอร์ • Hardware • Single Board เน้นการเรียนรู้ • Embedded Board เน้นการนำไปใช้งาน • Software • ภาษา Assembly • ภาษา C

  3. ขั้นตอนการพัฒนาด้วยภาษาซีขั้นตอนการพัฒนาด้วยภาษาซี 1. เขียนชุดคำสั่งบนโปรแกรม Editor ให้มีนามสกุลเป็น .C 2. กำหนดพรีโพรเซสเซอร์ (preprocessor) สำหรับคอมไพล์โปรแกรม 3. คอมไพล์โปรแกรม จะได้ไฟล์นามสกุล .OBJ ออกมา 4. เชื่อมต่อกับชุดคำสั่งเสริม (Link) จะได้ออปเจกต์ไฟล์ที่สมบูรณ์ออกมา 5. แปลงไฟล์ให้เป็น Hexadecimal file ในที่นี้ใช้ ในที่นี้จะใช้โปรแกรม UVW51.EXE และโปรแกรม HEXSEND.EXE

  4. #include <reg52.h> void func1(void) void func2(int x) void main() { int a; P1 = 0x0FF; func1(); a = func2(4); P1 = a; } void func1(void) { ……………. } int func2(int x) { return (x*2); } โครงสร้างของภาษาซี

  5. ตัวแปรและค่าคงที่ การประกาศตัวแปร ประเภทของข้อมูล ชื่อตัวแปร[,…..,]; ตัวอย่าง char x; int y,z; unsigned int m; คำสงวน (keywords) ตัวอย่างคำสงวน idata sfr interrupt sfr16 bdata bit pdata code xdata data sbit

  6. ประเภทของข้อมูล

  7. กระทำกับตัวแปรตัวเดียวกระทำกับตัวแปรตัวเดียว - ลบ ~ กลับค่าลอจิกของบิตข้อมูล ! กลับค่าลอจิก ++ เพิ่มขึ้นหนึ่งค่า -- ลดลงหนึ่งค่า * ตัวดำเนินการพอยน์เตอร์ & ตำแหน่งหน่วยความจำตัวแปร กระทำกับตัวแปรหลายตัว = กำหนดค่าในประโยค + , - , * , / && การแอนด์ || การออร์ & การแอนด์แบบบิตต่อบิต = = ทดสอบว่าเท่าหรือไม่ != ทดสอบว่าไม่เท่าหรือไม่ > ทดสอบว่ามากกว่าหรือไม่ ตัวดำเนินการ

  8. If / Else รูปแบบ if(expression) statement; ตัวอย่าง if(P1 != 0) c = 0; ตัวอย่าง if(P1 != 11111110B) P2 = 0xF0; For ตัวอย่าง unsigned char x; for(x=0;x<=255;x++) P1 = x; while ตัวอย่าง while(1) { P1 = 0x55; P1 = 0x0AA; } ประโยคควบคุม

  9. #pragma code #include <reg51.h> void delay(int count); void main() { while(1) { P1 = 0x55; dealy(100); P1 = 0xAA; delay(100); } } void delay(int count) { int i,j; for(i=0;i<count;i++) for(j=0;j<500;j++); } ตัวอย่างที่ 1

  10. อาร์เรย์ การประกาศอาร์เรย์สามารถทำได้ดังนี้ ประเภทของข้อมูล ชื่ออาร์เรย์[ขนาดอาร์เรย์] ประเภทของข้อมูล ชื่ออาร์เรย์[ขนาดอาร์เรย์][ขนาดอาร์เรย์] ตัวอย่าง char x[8]; unsigned char a[ ] = {0x8,0x9,0x5,0x6};

  11. #include <reg52.h> void dmsec(unsigned int count); void main(void) { unsigned char x[ ] = {0x81,0x42,0x24, 0x18,0x18,0x24,0x42,0x81}; unsigned char i; while(1) { for(i=0;i<8;i++){ P1 = x[i]; dmsec(100); } } } void dmsec(unsigned int count) { unsigned char i; while (count) { for(I=1;i<=113;I++); count--; } } ตัวอย่างที่ 2

  12. โปรแกรมย่อยหน่วงเวลาอาจเขียนได้ดังนี้โปรแกรมย่อยหน่วงเวลาอาจเขียนได้ดังนี้ void time(unsigned char fiftyms) { unsigned char x; for(x=0;x<fiftyms;x++) { TH0 = 0x4c; TL0 = 0x00; TF0 = 0; TR0 = 1; while (TF0 == 0); TR0 = 0; } }

  13. แมโครแทนหน่วยความจำ • CODEแทนหน่วยความจำโปรแกรมภายนอก • DATA แทนหน่วยความจำข้อมูลภายใน 128 ไบต์แรก • IDATA แทนหน่วยความจำข้อมูลภายใน 256 ไบต์ • BDATA แทนหน่วยความจำระดับบิต 128 บิต (20H - 2FH) • XDATAแทนตำแหน่งหน่วยความจำภายนอก • PDATA แทนตำแหน่งหน่วยความจำภายนอก 256 ไบต์แรก • XBYTE,XWORD แทนไบต์หรือเวิร์ดของหน่วยความจำภายนอกทั้งหมด • PBYTE,PWORD ไบต์หรือเวิร์ดของหน่วยความจำภายนอก 256 ไบต์แรก แมโครทั้งหมดเก็บอยู่ใน absacc.h

  14. ตัวอย่าง การประกาศพอร์ตที่อยู่ที่ตำแหน่ง 0x8000 สามารถทำได้ดังนี้ #define port8 XBYTE[0x8000] เป็นการประกาศตัวแปร port8 ด้วยหน่วยความจำภายนอกตำแหน่ง 8000H ถ้าต้องการส่งข้อมูล 0FFH ออกไปทางพอร์ตทำได้ดังนี้ port8 = 0x0FF; ถ้าต้องการอ่านข้อมูลจากตำแหน่ง 8000H ทำได้ดังนี้ char x; x = port8;

  15. พอร์ต 8255 ของ START-C51 พอร์ต 8255 ของ START-C51 ถูกถอดรหัสไว้ที่แอดเดรสดังนี้ พอร์ต A 9000H พอร์ต B 9001H พอร์ต C 9002H พอร์ตควบคุม 9003H ดังนั้นในการเขียนโปรแกรมควบคุมอาจกำหนดตัวแปรพอร์ตได้ดังนี้ #define PORT_A XBYTE[0x9000] #define PORT_B XBYTE[0x9001] #define PORT_C XBYTE[0x9002] #define PORT_CON XBYTE[0x9003]

  16. การแสดงผลทาง LED 7 ส่วน

  17. LED 7 ส่วน บน START-C51 #define port_A XBYTE[0x0D000H] #define port_C XBYTE[0x0F000H] unsigned char DISBUF[4]; /* แสดง 4 หลัก */ unsigned char data_show[] = {0x3f,0x06,0x5b,0x4f,0x66, …... 0x6d,0x7d,0x07,0x7f,0x6f}; for(i=0;i<=3;i++) { port_A = DISBUF[i]; port_C = i; delay_scan(10); port_A = 0; }

  18. การแสดงเลขฐานสิบทาง LED 7 ส่วน 4 หลัก • ใช้วิธีการหารถอดตัวเลขออกมาทีละหลัก void SHOW_NUM(unsigned int Num) { unsigned int buf; DISBUF[0] = Num/1000; buf = Num%1000; DISBUF[1] = buf/100; buf = buf%100; DISBUF[2] = buf/10; DISBUF[3] = buf%10; }

  19. Input 8-Channel 12-bit resolution SPI serial interface Single supply operation: 2.7V - 5.5 V Low power CMOS technology ขาของไอซี VDD +2.7V ถึง 5.5V DGND Digital Ground AGND Analog Ground CH0-CH7 Analog Inputs CLK Serial Clock DIN Serial Data In DOUT Serial Data Out CS/SHDN Chip Select/Shutdown Input VREF Reference Voltage Input A/D Converters MCP3208

  20. ไดอะแกรมเวลา • Start เป็น ‘1’ D0 - D2 ใช้เลือกอินพุต

  21. การเชื่อมต่อกับ MCS-51 +5V VREF VDD CS DIN CH0 DOUT CLK 9 14 P3.2 P3.5 P3.4 P3.3 Analog Input ในโปรแกรมกำหนดดังนี้ sbit ADCS = P3^2; sbit DIN = P3^5; sbit DOUT = P3^4; sbit CLK = P3^3; GND

  22. การส่งรหัสควบคุมให้ชิปการส่งรหัสควบคุมให้ชิป Start SGL D2 D1 D0 ค่าที่ผู้ใช้กำหนด 1 1 0 0 0 ให้อ่าน Ch0 อินพุตเดียว กำหนดให้ Mask เป็น 1 0 0 0 0 ครั้งที่ 2 0 1 0 0 0 ครั้งที่ 3 0 0 1 0 0 ค่าที่ส่งออกไปยัง DIN เกิดจากการ AND ระหว่าง ค่าที่กำหนดให้กับ Mask จำนวน 5 ครั้ง

  23. การอ่านข้อมูลดิจิตอล 12 บิต เลื่อนไป 13 ครั้ง MASK คำตอบเริ่มต้น ถ้าค่าที่รับเข้ามาเป็น 1 ให้นำ MASK กับคำตอบมา OR กัน ถ้าไม่เท่ากับ 1 ใช้ค่าบิตเดิม

  24. เขียนโปรแกรมส่งข้อมูลเข้าชิปเขียนโปรแกรมส่งข้อมูลเข้าชิป void Output_Control(char TempChar) { unsigned char Mask = 0x10; unsigned char Count; for(Count = 0x00; Count < 0x05; Count++) /* ส่งเข้าชิป 5 บิต */ { DIN = 0; if(TempChar&Mask) DIN = 1; CLK = 1; Mask >>= 0x01; /* ส่งสัญญาณหนึ่งลูก */ CLK = 0; } }

  25. int Input_Data(void) { unsigned char Count; unsigned int Mask = 0x8000; unsigned int Result = 0x0000; CLK = 1; CLK = 0; for(Count = 0x00; Count < 0x0D; Count++) /*อ่านข้อมูลออกมา 12 + 1 บิต */ { if (DOUT) Result |= Mask; CLK = 1; Mask >>= 0x01; CLK = 0; } Result >>= 0x03; Result &= 0x0FFF; return(Result) } เขียนโปรแกรมอ่านข้อมูล

More Related