280 likes | 524 Views
START-C51 กับดินแดนมหัศจรรย์. บริษัท ศิลารีเสิร์ช จำกัด Sila Research Co.,Ltd. วิทยากร รองศาสตราจารย์ธีรวัฒน์ ประกอบผล. การพัฒนางานทางด้านไมโครคอนโทรลเลอร์. Hardware Single Board เน้นการเรียนรู้ Embedded Board เน้นการนำไปใช้งาน Software ภาษา Assembly ภาษา C.
E N D
START-C51 กับดินแดนมหัศจรรย์ บริษัท ศิลารีเสิร์ช จำกัด Sila Research Co.,Ltd. วิทยากร รองศาสตราจารย์ธีรวัฒน์ ประกอบผล
การพัฒนางานทางด้านไมโครคอนโทรลเลอร์การพัฒนางานทางด้านไมโครคอนโทรลเลอร์ • Hardware • Single Board เน้นการเรียนรู้ • Embedded Board เน้นการนำไปใช้งาน • Software • ภาษา Assembly • ภาษา C
ขั้นตอนการพัฒนาด้วยภาษาซีขั้นตอนการพัฒนาด้วยภาษาซี 1. เขียนชุดคำสั่งบนโปรแกรม Editor ให้มีนามสกุลเป็น .C 2. กำหนดพรีโพรเซสเซอร์ (preprocessor) สำหรับคอมไพล์โปรแกรม 3. คอมไพล์โปรแกรม จะได้ไฟล์นามสกุล .OBJ ออกมา 4. เชื่อมต่อกับชุดคำสั่งเสริม (Link) จะได้ออปเจกต์ไฟล์ที่สมบูรณ์ออกมา 5. แปลงไฟล์ให้เป็น Hexadecimal file ในที่นี้ใช้ ในที่นี้จะใช้โปรแกรม UVW51.EXE และโปรแกรม HEXSEND.EXE
#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); } โครงสร้างของภาษาซี
ตัวแปรและค่าคงที่ การประกาศตัวแปร ประเภทของข้อมูล ชื่อตัวแปร[,…..,]; ตัวอย่าง char x; int y,z; unsigned int m; คำสงวน (keywords) ตัวอย่างคำสงวน idata sfr interrupt sfr16 bdata bit pdata code xdata data sbit
กระทำกับตัวแปรตัวเดียวกระทำกับตัวแปรตัวเดียว - ลบ ~ กลับค่าลอจิกของบิตข้อมูล ! กลับค่าลอจิก ++ เพิ่มขึ้นหนึ่งค่า -- ลดลงหนึ่งค่า * ตัวดำเนินการพอยน์เตอร์ & ตำแหน่งหน่วยความจำตัวแปร กระทำกับตัวแปรหลายตัว = กำหนดค่าในประโยค + , - , * , / && การแอนด์ || การออร์ & การแอนด์แบบบิตต่อบิต = = ทดสอบว่าเท่าหรือไม่ != ทดสอบว่าไม่เท่าหรือไม่ > ทดสอบว่ามากกว่าหรือไม่ ตัวดำเนินการ
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; } ประโยคควบคุม
#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
อาร์เรย์ การประกาศอาร์เรย์สามารถทำได้ดังนี้ ประเภทของข้อมูล ชื่ออาร์เรย์[ขนาดอาร์เรย์] ประเภทของข้อมูล ชื่ออาร์เรย์[ขนาดอาร์เรย์][ขนาดอาร์เรย์] ตัวอย่าง char x[8]; unsigned char a[ ] = {0x8,0x9,0x5,0x6};
#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
โปรแกรมย่อยหน่วงเวลาอาจเขียนได้ดังนี้โปรแกรมย่อยหน่วงเวลาอาจเขียนได้ดังนี้ 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; } }
แมโครแทนหน่วยความจำ • CODEแทนหน่วยความจำโปรแกรมภายนอก • DATA แทนหน่วยความจำข้อมูลภายใน 128 ไบต์แรก • IDATA แทนหน่วยความจำข้อมูลภายใน 256 ไบต์ • BDATA แทนหน่วยความจำระดับบิต 128 บิต (20H - 2FH) • XDATAแทนตำแหน่งหน่วยความจำภายนอก • PDATA แทนตำแหน่งหน่วยความจำภายนอก 256 ไบต์แรก • XBYTE,XWORD แทนไบต์หรือเวิร์ดของหน่วยความจำภายนอกทั้งหมด • PBYTE,PWORD ไบต์หรือเวิร์ดของหน่วยความจำภายนอก 256 ไบต์แรก แมโครทั้งหมดเก็บอยู่ใน absacc.h
ตัวอย่าง การประกาศพอร์ตที่อยู่ที่ตำแหน่ง 0x8000 สามารถทำได้ดังนี้ #define port8 XBYTE[0x8000] เป็นการประกาศตัวแปร port8 ด้วยหน่วยความจำภายนอกตำแหน่ง 8000H ถ้าต้องการส่งข้อมูล 0FFH ออกไปทางพอร์ตทำได้ดังนี้ port8 = 0x0FF; ถ้าต้องการอ่านข้อมูลจากตำแหน่ง 8000H ทำได้ดังนี้ char x; x = port8;
พอร์ต 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]
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; }
การแสดงเลขฐานสิบทาง 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; }
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
ไดอะแกรมเวลา • Start เป็น ‘1’ D0 - D2 ใช้เลือกอินพุต
การเชื่อมต่อกับ 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
การส่งรหัสควบคุมให้ชิปการส่งรหัสควบคุมให้ชิป 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 ครั้ง
การอ่านข้อมูลดิจิตอล 12 บิต เลื่อนไป 13 ครั้ง MASK คำตอบเริ่มต้น ถ้าค่าที่รับเข้ามาเป็น 1 ให้นำ MASK กับคำตอบมา OR กัน ถ้าไม่เท่ากับ 1 ใช้ค่าบิตเดิม
เขียนโปรแกรมส่งข้อมูลเข้าชิปเขียนโปรแกรมส่งข้อมูลเข้าชิป 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; } }
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) } เขียนโปรแกรมอ่านข้อมูล