ในโครงการนี้เราจะแสดงให้เห็นถึงการทำนาฬิกา RTC 8051 โดยใช้ไมโครคอนโทรลเลอร์ หากคุณต้องการทำโปรเจ็กต์นี้กับ Arduino ให้ตรวจสอบนาฬิกาดิจิทัลนี้โดยใช้ Arduino องค์ประกอบหลักของโครงการนี้คือ DS1307 ซึ่งเป็น IC นาฬิกาดิจิตอลแบบเรียลไทม์ ช่วยให้ทราบรายละเอียดเกี่ยวกับ IC นี้
RTC DS1307:
นาฬิกา / ปฏิทินแบบเรียลไทม์แบบอนุกรม DS1307 (RTC) เป็นนาฬิกา / ปฏิทินที่ใช้รหัสฐานสิบสองรหัสไบนารี (BCD) ที่ใช้พลังงานต่ำและมี NV SRAM 56 ไบต์ ชิปนี้ทำงานบนโปรโตคอลI²C นาฬิกา / ปฏิทินให้ข้อมูลวินาทีนาทีชั่วโมงวันวันที่เดือนและปี วันที่สิ้นสุดของเดือนจะถูกปรับโดยอัตโนมัติสำหรับเดือนที่มีน้อยกว่า 31 วันรวมถึงการแก้ไขสำหรับปีอธิกสุรทิน นาฬิกาทำงานในรูปแบบ 24 ชั่วโมงหรือ 12 ชั่วโมงพร้อมไฟแสดงสถานะ AM / PM DS1307 มีวงจรรับรู้พลังงานในตัวที่ตรวจจับความล้มเหลวของไฟฟ้าและเปลี่ยนเป็นแหล่งจ่ายสำรองโดยอัตโนมัติ การบอกเวลาปกติจะดำเนินต่อไปในขณะที่ชิ้นส่วนทำงานจากแหล่งจ่ายสำรอง ชิป DS1307 สามารถทำงานได้อย่างต่อเนื่องจนถึง 10 ปี
นาฬิกาเรียลไทม์ที่ใช้8051เป็นนาฬิกาดิจิตอลที่แสดงเวลาจริงโดยใช้ RTC DS1307ซึ่งทำงานบนโปรโตคอล I2C นาฬิกาแบบเรียลไทม์หมายความว่าเครื่องทำงานแม้ไฟฟ้าดับ เมื่อเชื่อมต่อพลังงานอีกครั้งจะแสดงเวลาจริงโดยไม่คำนึงถึงเวลาและระยะเวลาที่อยู่ในสถานะปิด ในโครงการนี้เราได้ใช้โมดูล LCD 16x2 เพื่อแสดงเวลาในรูปแบบ - (ชั่วโมงนาทีวินาทีวันที่เดือนและปี) นาฬิกาแบบเรียลไทม์มักใช้ในคอมพิวเตอร์บ้านสำนักงานและอุปกรณ์อิเล็กทรอนิกส์ของเราเพื่อให้อัปเดตตามเวลาจริง
โพรโทคอ I2C เป็นวิธีการที่จะเชื่อมต่อสองคนหรือมากกว่าอุปกรณ์ที่ใช้สองสายจะเป็นระบบเดียวและเพื่อโปรโตคอลนี้จะเรียกว่าเป็น โปรโตคอลสองสายสามารถใช้เพื่อสื่อสารอุปกรณ์ 127 เครื่องกับอุปกรณ์หรือโปรเซสเซอร์เดียว อุปกรณ์ I2C ส่วนใหญ่ทำงานบนความถี่ 100Khz
ขั้นตอนสำหรับการเขียนข้อมูล master to slave (โหมดรับทาส)
- ส่งเงื่อนไขเริ่มต้นไปยังทาส
- ส่งที่อยู่ทาสไปยังทาส
- ส่งบิตเขียน (0) ไปยังทาส
- รับบิต ACK จากทาส
- ส่งคำที่อยู่ไปยังทาส
- รับบิต ACK จากทาส
- ส่งข้อมูลไปยังทาส
- รับบิต ACK จากทาส
- และล่าสุดส่งเงื่อนไข STOP ไปยังทาส
ขั้นตอนในการอ่านข้อมูลจาก Slave to Master (โหมดการส่งข้อมูลแบบ Slave)
- ส่งเงื่อนไขเริ่มต้นไปยังทาส
- ส่งที่อยู่ทาสไปยังทาส
- ส่งบิตอ่าน (1) ไปยังทาส
- รับบิต ACK จากทาส
- ได้รับข้อมูลจากทาส
- รับบิต ACK จากทาส
- ส่งเงื่อนไข STOP ไปยังทาส
แผนภาพวงจรและคำอธิบาย
ในวงจรเราใช้ส่วนประกอบส่วนใหญ่ 3 ชิ้น DS1307, AT89S52 และ LCD AT89S52 ใช้สำหรับอ่านเวลาจาก DS1307 และแสดงบนหน้าจอ LCD 16x2 DS1307 ส่งเวลา / วันที่โดยใช้ 2 บรรทัดไปยังไมโครคอนโทรลเลอร์
การเชื่อมต่อวงจรเป็นเรื่องง่ายที่จะเข้าใจและแสดงไว้ในแผนภาพด้านบน พินชิป DS1307 SDA และ SCL เชื่อมต่อกับพิน P2.1 และ P2.0 ของไมโครคอนโทรลเลอร์ 89S52 พร้อมตัวต้านทานแบบดึงขึ้นที่มีค่าเริ่มต้นสูงที่ข้อมูลและสายนาฬิกา และออสซิลเลเตอร์คริสตัล 32.768KHz เชื่อมต่อกับ DS1307chip เพื่อสร้างความล่าช้า 1 วินาทีที่แน่นอน และแบตเตอรี่ 3 โวลต์ยังเชื่อมต่อกับขา 3 rd (BAT) ของ DS1307 ซึ่งจะช่วยให้เวลาทำงานหลังจากไฟฟ้าขัดข้อง 16x2 LCD เชื่อมต่อกับ 8051 ในโหมด 4 บิต พินควบคุม RS, RW และ En เชื่อมต่อโดยตรงกับ 89S52 พิน P1.0, GND และ P1.1 และพินข้อมูล D0-D7 เชื่อมต่อกับ P1.4-P1.7 ของ 89S52
ปุ่มสามปุ่มคือ SET, INC / CHANGE และถัดไปใช้สำหรับตั้งเวลานาฬิกาให้ปักหมุด P2.4, P2.3 และ P2.2 ของ 89S52 (แอคทีฟต่ำ) เมื่อเรากด SET โหมดตั้งเวลาจะเปิดใช้งานและตอนนี้เราจำเป็นต้องตั้งเวลาโดยใช้ปุ่ม INC / CHANGE และปุ่มถัดไปใช้สำหรับย้ายไปที่ตัวเลข หลังจากตั้งเวลานาฬิกาทำงานอย่างต่อเนื่อง
คำอธิบายโปรแกรม
ในโค้ดเราได้รวมไลบรารีตระกูล 8051 และไลบรารีอินพุตเอาต์พุตมาตรฐาน และกำหนดพินที่เราใช้และนำตัวแปรบางตัวมาคำนวณ
# รวม
และฟังก์ชันที่กำหนดจะใช้สำหรับการขับ LCD
เป็นโมฆะ daten () {rs = 1; th = 1; ล่าช้า (1); th = 0; } โมฆะ lcddata (ถ่าน ch ที่ไม่ได้ลงชื่อ) {lcdport = ch & 0xf0; ข้อมูล (); lcdport = (ch << 4) & 0xf0; ข้อมูล (); } โมฆะ cmden (โมฆะ) {rs = 0; th = 1; ล่าช้า (1); th = 0; } โมฆะ lcdcmd (ถ่าน ch ที่ไม่ได้ลงชื่อ)
ฟังก์ชันนี้ใช้สำหรับเริ่มต้น RTC และอ่านเวลาและวันที่จากรูปแบบ RTC IC
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); วินาที = BCDToDecimal (I2CRead (1)); นาที = BCDToDecimal (I2CRead (1)); ชั่วโมง = BCDToDecimal (I2CRead (1)); วันที่ 1 = BCDToDecimal (I2CRead (1)); วันที่ = BCDToDecimal (I2CRead (1)); จันทร์ = BCDToDecimal (I2CRead (1)); ปี = BCDToDecimal (I2CRead (1)); I2CStop (); เวลาแสดง(); // แสดงเวลา / วันที่ / วันล่าช้า (1);
ฟังก์ชันเหล่านี้ใช้สำหรับการแปลงทศนิยมเป็น BCD และ BCD เป็นทศนิยม
int BCDToDecimal (ถ่าน bcdByte) {ถ่าน a, b, ธันวาคม; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); ธันวาคม = a + b; กลับธันวาคม; } ถ่าน DecimalToBCD (int decimalByte) {ถ่าน a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; กลับ bcd; }
ฟังก์ชันด้านล่างนี้ใช้สำหรับการสื่อสาร I2C
โมฆะ I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // ฟังก์ชัน "start" สำหรับสื่อสารกับ ds1307 RTC เป็นโมฆะ I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // ฟังก์ชัน "หยุด" สำหรับการสื่อสารด้วย ds1307 RTC ถ่านที่ไม่ได้ลงชื่อถ่าน I2CSend (ข้อมูลถ่านที่ไม่ได้ลงชื่อ) // ส่งข้อมูลไปยัง ds1307 {ถ่าน i; ถ่าน ack_bit; สำหรับ (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; อื่น SDA = 0; SCL = 1; ข้อมูล << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; กลับ ack_bit; } ถ่าน I2CRead ที่ไม่ได้ลงนาม (ถ่าน ack) // รับข้อมูลจาก ds1307 {ถ่านที่ไม่ได้ลงนาม i, Data = 0; SDA = 1; สำหรับ (i = 0; i <8; i ++) {Data << = 1; ทำ {SCL = 1;} ในขณะที่ (SCL == 0); ถ้า (SDA) Data- = 1; SCL = 0; } ถ้า (ack) SDA = 0; อื่น SDA = 1; SCL = 1; SCL = 0; SDA = 1; ส่งคืนข้อมูล; }
ฟังก์ชัน set_time ใช้เพื่อตั้งเวลาเป็นนาฬิกาและฟังก์ชัน show_time ด้านล่างใช้เพื่อแสดงเวลาบน LCD
โมฆะ show_time () // ฟังก์ชั่นเพื่อแสดงเวลา / วันที่ / วันบน LCD {char var; lcdcmd (0x80); lcdprint ("วันที่:"); sprintf (var, "% d", วันที่); lcdprint (var); sprintf (var, "/% d", จันทร์); lcdprint (var); sprintf (var, "/% d", ปี + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("เวลา:"); sprintf (var, "% d", ชั่วโมง); lcdprint (var); sprintf (var, ":% d", นาที); lcdprint (var); sprintf (var, ":% d", วินาที); lcdprint (var); lcdprint (""); // วัน (day1); lcdprint (""); }