สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
8051 (หรือที่เรียกว่า MCS-51) คือการออกแบบ MCU จากยุค 80 ที่ยังคงได้รับความนิยมในปัจจุบัน ไมโครคอนโทรลเลอร์รุ่นใหม่ที่เข้ากันได้กับ 8051 มีจำหน่ายจากผู้จำหน่ายหลายราย ในรูปทรงและขนาดทั้งหมด และมีอุปกรณ์ต่อพ่วงที่หลากหลาย ในคำแนะนำนี้เราจะดู AT89C2051 MCU จาก Atmel
AT89C2051 เป็นไมโครคอนโทรลเลอร์ขนาดเล็ก (2Kbyte Flash, 128byte RAM) ราคาถูก (~ 1.40 เหรียญต่อชิป) ไมโครคอนโทรลเลอร์ คุณสมบัติ:
- 2.7-6V การทำงาน
- 15 สาย I/O
- 2 ตัวจับเวลา (16 บิต)
- การขัดจังหวะภายในและภายนอก
- UART
- เครื่องเปรียบเทียบอนาล็อกบนชิป
- สูงสุด 2MIPS พร้อมนาฬิกา 24MHz
ขั้นตอนที่ 1: ข้อกำหนด
ความต้องการ:
- Linux PC (ซอฟต์แวร์ที่จำเป็น: Arduino IDE, git, make, sdcc)
- Arduino UNO
- ชิป AT89C2051 (แพ็คเกจ DIP20)
- ซ็อกเก็ต ZIF 20 พิน
- ออปโตคัปเปลอร์ (ควรเป็นเอาต์พุต MOSFET)
- ชิลด์สร้างต้นแบบ Arduino
- แหล่งจ่ายไฟ 12V
- แหล่งจ่ายไฟ 5V
- คริสตัลออสซิลเลเตอร์ 16MHz
- ตัวเก็บประจุ 2x 30pF
- ตัวเก็บประจุ 100nF
- ไดโอด (เช่น: 1N400X)
- ตัวต้านทาน (1K, 3K3)
- โปรโตบอร์ด
- จัมเปอร์
- ลวดทองแดง
ตรวจสอบซอฟต์แวร์ที่จำเป็น:
ซึ่ง python3
ซึ่งทำให้ sdcc ใดที่ git
ขั้นตอนที่ 2: การสร้างโปรแกรมเมอร์
ส่วนนี้จะสั้น ๆ เนื่องจากฉันได้สร้างเกราะป้องกันการเขียนโปรแกรมมาระยะหนึ่งแล้ว ฉันได้แนบแผนผังและรูปภาพของบอร์ดที่ประกอบแล้ว PDF ของแผนผังสามารถพบได้ในที่เก็บ
คุณจะต้องตั้งโปรแกรมบอร์ดโปรแกรมเมอร์:
1. โคลนที่เก็บ
โคลน git
2. เปิดไฟล์ AT89C2051_programmer/AT89_prog/AT89_prog.ino ใน Arduino IDE
3. สร้างและอัปโหลดภาพร่างจาก Arduino IDE
ขั้นตอนที่ 3: การติดตั้งซอฟต์แวร์โปรแกรมเมอร์
1. สร้างสภาพแวดล้อมเสมือนของหลาม
python3 -m venv venv
. venv/bin/เปิดใช้งาน
2. ติดตั้ง at89overlord at89overlord เป็นโปรแกรมเมอร์โอเพ่นซอร์สสำหรับชิป AT89C2051 ที่เขียนโดยฉัน สามารถดูซอร์สโค้ดได้ที่นี่
pip ติดตั้งที่89overlord
3. ตรวจสอบการติดตั้ง
at89overlord -h
ขั้นตอนที่ 4: การเขียนโปรแกรมชิป
1. โคลนโครงการกะพริบตาอย่างง่าย
ซีดี ~
โคลน git https://github.com/piotrb5e3/hello-8051.git cd hello-8051/
2. สร้างแอปพลิเคชัน
ทำ
3. เชื่อมต่อ Arduino กับพีซี ต่อแหล่งจ่ายไฟ 12V วางชิป AT89C2051 ลงในซ็อกเก็ต ZIF
4. ค้นหาพอร์ตอนุกรมของ Arduino
ls /dev/tty*
5. อัปโหลดไฟล์ IntelHex ที่สร้างขึ้นไปยังชิป หากพอร์ต Arduino ของคุณแตกต่างจาก /dev/ttyACM0 คุณต้องส่งค่าที่ถูกต้องด้วยพารามิเตอร์บรรทัดคำสั่ง -p
at89overlord -f./hello.ihx
ขั้นตอนที่ 5: การประกอบ
ประกอบวงจรตามแผนผัง เวอร์ชัน PDF สามารถพบได้ในที่เก็บ
คุณควรเห็นไฟ LED สีเขียวกะพริบที่ความถี่ประมาณ 0.5Hz
ขั้นตอนที่ 6: คำอธิบายโค้ด
#รวม
#รวม
เราเริ่มต้นด้วยการรวมส่วนหัว AT89X051 จาก sdcc มันมีมาโครสำหรับการโต้ตอบกับรีจิสเตอร์ราวกับว่าเป็นตัวแปร นอกจากนี้เรายังรวม stdint.h ซึ่งมีคำจำกัดความของประเภทจำนวนเต็ม uint8_t และ uint16_t
// สมมติว่าออสซิลเลเตอร์เป็น 16MHz
#define INTERRUPTS_PER_SECOND 5208
การขัดจังหวะเกิดขึ้นเมื่อ Timer0 ล้น มันถูกกำหนดค่าเป็นตัวจับเวลา 8 บิตตัวเดียว ดังนั้นสิ่งนี้จะเกิดขึ้นทุกๆ 2^8 รอบโปรเซสเซอร์ รอบโปรเซสเซอร์หนึ่งรอบใช้เวลา 12 รอบสัญญาณนาฬิกา ดังนั้นเราจึงมาถึง 16000000/12/2 ^ 8 = 5208.33333
ระเหย uint8_t led_state = 0;
ระเหย uint16_t timer_counter = INTERRUPTS_PER_SECOND;
เราประกาศการควบคุมสถานะนำและตัวแปรตัวนับขัดจังหวะ
โมฆะ Timer0_ISR (เป็นโมฆะ) _ ขัดจังหวะ (1) {
timer_counter--; ถ้า (timer_counter == 0) { led_state = !led_state; timer_counter = INTERRUPTS_PER_SECOND; } }
ทุกครั้งที่ Timer0 ล้น ตัวนับจะลดลง หากมีค่าเท่ากับศูนย์ ระบบจะรีเซ็ต และสถานะนำจะเปลี่ยนไป สิ่งนี้เกิดขึ้นประมาณหนึ่งครั้งต่อวินาที ส่งผลให้ความถี่ LED กะพริบ ~0.5Hz
int หลัก () {
TMOD = 0x3; // โหมดจับเวลา - 8 บิต, ไม่มีพรีสเกลเลอร์ ความถี่ = OSCFREQ/12/2^8 TL0 = 0; // ล้างตัวนับ TH0 = 0; // ล้างการลงทะเบียน TR0 = 1; // ตั้งเวลาให้ทำงาน ET0 = 1; // ตั้งค่าอินเตอร์รัปต์ อีเอ = 1; // ตั้งค่าอินเตอร์รัปต์ทั่วโลก ในขณะที่ (1) { ถ้า (led_state) { P1 = 0xFF; } อื่นๆ { P1 = 0x00; } } }
เรากำหนดค่าโมดูลตัวจับเวลาและรอการเปลี่ยนแปลงในตัวแปรควบคุมสถานะนำ TMOD คือการลงทะเบียนควบคุมโหมดตัวจับเวลา TL0 และ TH0 เป็นรีจิสเตอร์ควบคุม Timer0 ET0 เป็นบิต enable-timer0 ในการลงทะเบียนควบคุมตัวจับเวลา (TCON) TR0 และ EA เป็นบิตในการลงทะเบียนเปิดใช้งานการขัดจังหวะ (IE)
ขั้นตอนที่ 7: แหล่งข้อมูลเพิ่มเติม
- เอกสารข้อมูล AT89C2051:
- คอมไพเลอร์ C อุปกรณ์ขนาดเล็ก (sdcc):
- แหล่งข้อมูล 8051:
- ที่เก็บโปรแกรมเมอร์ AT89C2051:
- ที่เก็บ hello-8051: