Sa proyektong ito, ipapakita namin ang paggawa ng isang RTC Clock gamit ang 8051 microcontroller. Kung nais mong gawin ang proyektong ito sa Arduino, suriin ang digital na orasan na ito gamit ang Arduino. Ang pangunahing bahagi ng proyektong ito ay DS1307 na kung saan ay isang real time digital na orasan IC. Ipaalam sa detalyado ang tungkol sa IC na ito.
RTC DS1307:
Ang DS1307 serial real-time na orasan (RTC) ay isang mababang lakas, buong binary-code na decimal (BCD) na orasan / kalendaryo kasama ang 56 bytes ng NV SRAM. Gumagana ang chip na ito sa I²C na protokol. Ang orasan / kalendaryo ay nagbibigay ng segundo, minuto, oras, araw, petsa, buwan, at impormasyon sa taon. Ang pagtatapos ng petsa ng buwan ay awtomatikong nababagay sa loob ng maraming buwan na may mas kaunti sa 31 araw, kabilang ang mga pagwawasto para sa taon ng paglukso. Ang orasan ay tumatakbo sa alinman sa 24 na oras o 12-oras na format na may AM / PM na tagapagpahiwatig. Ang DS1307 ay may built-in na circuit ng power-sense na nakakakita ng mga pagkabigo sa kuryente at awtomatikong lumilipat sa backup na supply. Nagpapatuloy ang operasyon ng oras habang ang bahagi ay nagpapatakbo mula sa backup na supply. Ang DS1307 chip ay maaaring patuloy na tatakbo hanggang 10 taon.
Nakabatay sa 8051 na real time na orasan ay isang digital na orasan upang maipakita ang real time gamit ang isang RTC DS1307, na gumagana sa I2C protocol. Ang ibig sabihin ng real time na orasan ay tumatakbo ito kahit na pagkabigo ng kuryente. Kapag nakakonekta muli ang kuryente, ipinapakita nito ang totoong oras na hindi alintana ang oras at tagal na ito ay wala sa estado. Sa proyektong ito, gumamit kami ng isang 16x2 LCD module upang maipakita ang oras sa format na ((oras, minuto, segundo, petsa, buwan at taon). Ang mga real time na orasan ay karaniwang ginagamit sa aming mga computer, bahay, tanggapan at aparato ng electronics para mapanatili itong na-update gamit ang real time.
Ang I2C protocol ay isang pamamaraan upang ikonekta ang dalawa o higit pang mga aparato gamit ang dalawang wires sa isang solong system, at sa gayon ang protokol na ito ay tinatawag ding dalawang wire protocol. Maaari itong magamit upang maipaabot ang 127 mga aparato sa isang solong aparato o processor. Karamihan sa mga aparato ng I2C ay tumatakbo sa dalas ng 100Khz.
Mga hakbang para sa pagsulat ng master ng alipin sa mode (mode ng pagtanggap ng alipin)
- Nagpapadala ng simulang kondisyon sa alipin.
- Nagpapadala ng address ng alipin sa alipin.
- Magpadala ng sumulat ng kaunti (0) sa alipin.
- Natanggap ang ACK ng kaunti mula sa alipin
- Nagpapadala ng mga salita address sa alipin.
- Natanggap ang ACK ng kaunti mula sa alipin
- Nagpapadala ng data sa alipin.
- Natanggap ang ACK ng kaunti mula sa alipin.
- At huling nagpapadala ng kundisyon ng STOP sa alipin.
Mga hakbang para sa pagbabasa ng data mula sa alipin hanggang sa master (mode ng paglilipat ng alipin)
- Nagpapadala ng simulang kondisyon sa alipin.
- Nagpapadala ng address ng alipin sa alipin.
- Magpadala ng read bit (1) sa alipin.
- Natanggap ang ACK ng kaunti mula sa alipin
- Nakatanggap ng data mula sa alipin
- Natanggap ang ACK ng kaunti mula sa alipin.
- Nagpapadala ng kundisyon ng STOP sa alipin.
Circuit Diagram at Paglalarawan
Sa circuit nagamit namin ang 3 karamihan sa mga bahagi ng DS1307, AT89S52 at LCD. Dito ginagamit ang AT89S52 para sa oras ng pagbabasa mula sa DS1307 at ipakita ito sa 16x2 LCD screen. Nagpapadala ang DS1307 ng oras / petsa gamit ang 2 linya sa microcontroller.
Ang mga koneksyon sa circuit ay simple upang maunawaan at ipinakita sa diagram sa itaas. Ang DS1307 chip pin SDA at SCL ay konektado sa P2.1 at P2.0 na mga pin ng 89S52 microcontroller na may pull up risistor na humahawak ng default na halaga na TAAS sa mga linya ng data at orasan. At isang 32.768KHz crystal oscillator ay konektado sa DS1307chip para sa pagbuo ng eksaktong 1 segundong pagkaantala. At ang isang 3 volt na baterya ay konektado din sa pin 3 rd (BAT) ng DS1307 na nagpapanatili ng oras na tumatakbo pagkatapos ng pagkabigo ng elektrisidad. Ang 16x2 LCD ay konektado sa 8051 sa 4-bit mode. Ang control pin RS, RW at En ay direktang konektado sa 89S52 pin P1.0, GND at P1.1. At ang data pin na D0-D7 ay konektado sa P1.4-P1.7 ng 89S52.
Tatlong mga pindutan na ang SET, INC / CHANGE at Susunod ay ginagamit para sa pagtatakda ng oras ng orasan upang ma-pin ang P2.4, P2.3 at P2.2 ng 89S52 (aktibo na mababa). Kapag pinindot namin ang SET, nagsasaaktibo ang mode na itinakda ng oras at ngayon kailangan naming magtakda ng oras sa pamamagitan ng paggamit ng pindutan ng INC / CHANGE at Susunod na pindutan ang ginagamit para sa paglipat sa digit. Matapos ang pagtatakda ng oras na orasan ay nagpapatakbo ng patuloy.
Paglalarawan ng Programa
Sa code ay isinama namin ang 8051 family library at isang karaniwang input library ng output. At tinukoy na mga pin na ginamit namin, at kumuha ng ilang variable para sa mga kalkulasyon.
# isama
At ang ibinigay na pagpapaandar ay ginagamit para sa pagmamaneho ng LCD.
void daten () {rs = 1; tl = 1; antala (1); tl = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } walang bisa cmden (walang bisa) {rs = 0; tl = 1; antala (1); tl = 0; } walang bisa lcdcmd (unsigned char ch)
Ang pagpapaandar na ito ay ginagamit para sa pauna-unahang RTC at at basahin ang oras at petsa mula sa form RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); oras = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); petsa = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); taon = BCDToDecimal (I2CRead (1)); I2CStop (); show_time (); // oras ng pagpapakita / petsa / araw na pagkaantala (1);
Ang mga pagpapaandar na ito ay ginagamit para sa pag-convert ng decimal sa BCD at BCD sa Decimal.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = ((((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; bumalik dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; ibalik ang bcd; }
Ang ibinigay na mga pagpapaandar sa ibaba ay ginagamit para sa I2C Communication.
walang bisa I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" function para makipag-usap sa ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // function na "stop" para makipag-usap sa wit ds1307 RTC unsigned char I2CSend (unsigned char Data) // send data to ds1307 {char i; char ack_bit; para sa (i = 0; i <8; i ++) {kung (Data & 0x80) SDA = 1; iba SDA = 0; SCL = 1; Data << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; ibalik ang ack_bit; } unsigned char I2CRead (char ack) // makatanggap ng data mula sa ds1307 {unsigned char i, Data = 0; SDA = 1; para sa (i = 0; i <8; i ++) {Data << = 1; gawin ang {SCL = 1;} habang (SCL == 0); kung (SDA) Data- = 1; SCL = 0; } kung (ack) SDA = 0; iba SDA = 1; SCL = 1; SCL = 0; SDA = 1; ibalik ang Data; }
Ginagamit ang pagpapaandar na set_time upang maitakda ang oras sa orasan at ang function ng show_time sa ibaba ay ginagamit upang ipakita ang oras sa LCD.
walang bisa ang show_time () // function upang maipakita ang oras / petsa / araw sa LCD {char var; lcdcmd (0x80); lcdprint ("Petsa:"); sprintf (var, "% d", petsa); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", taon + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Oras:"); sprintf (var, "% d", oras); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sec); lcdprint (var); lcdprint (""); // day (day1); lcdprint (""); }