Šajā projektā mēs parādīsim RTC pulksteņa izgatavošanu, izmantojot 8051 mikrokontrolleru. Ja vēlaties veikt šo projektu ar Arduino, pārbaudiet šo digitālo pulksteni, izmantojot Arduino. Šī projekta galvenā sastāvdaļa ir DS1307, kas ir reālā laika digitālā pulksteņa IC. Sniedz sīkāku informāciju par šo IC.
RTC DS1307:
DS1307 sērijveida reāllaika pulkstenis (RTC) ir mazjaudīgs, pilna binārā koda decimāldaļu (BCD) pulkstenis / kalendārs plus 56 baiti NV SRAM. Šī mikroshēma darbojas pēc I²C protokola. Pulkstenis / kalendārs nodrošina sekundes, minūtes, stundas, dienu, datumu, mēnesi un gadu. Mēneša beigu datums tiek automātiski pielāgots mēnešiem, kas ir mazāki par 31 dienu, ieskaitot korekcijas par lēciena gadu. Pulkstenis darbojas vai nu 24 stundu vai 12 stundu formātā ar AM / PM indikatoru. DS1307 ir iebūvēta strāvas sensora shēma, kas nosaka strāvas padeves pārtraukumus un automātiski pārslēdzas uz rezerves barošanu. Laika uzskaites darbība turpinās, kamēr daļa darbojas no rezerves rezerves. DS1307 mikroshēma var pastāvīgi darboties līdz 10 gadiem.
Reāllaika pulkstenis, kura pamatā ir 8051, ir digitālais pulkstenis reālā laika attēlošanai, izmantojot RTC DS1307, kas darbojas uz I2C protokola. Reālā laika pulkstenis nozīmē, ka tas darbojas pat pēc strāvas padeves pārtraukuma. Kad barošana tiek pievienota atkārtoti, tā parāda reālo laiku neatkarīgi no laika un ilguma, kāds tas bija izslēgtā stāvoklī. Šajā projektā mēs esam izmantojuši 16x2 LCD moduli, lai parādītu laiku formātā (stunda, minūte, sekundes, datums, mēnesis un gads). Reāllaika pulksteņi parasti tiek izmantoti mūsu datoros, mājās, birojos un elektronikas ierīcēs, lai tos atjauninātu ar reāllaiku.
I2C protokols ir metode divu vai vairāku ierīču, izmantojot divus vadus, savienošanai ar vienu sistēmu, un tāpēc šo protokolu sauc arī par divu vadu protokolu. To var izmantot, lai sazinātos ar 127 ierīcēm ar vienu ierīci vai procesoru. Lielākā daļa I2C ierīču darbojas ar 100Khz frekvenci.
Datu rakstīšanas pamatsistēmas vergam darbības (vergu saņemšanas režīms)
- Nosūta vergam START nosacījumu.
- Nosūta verga adresi vergam.
- Nosūtīt rakstīšanas bitu (0) vergam.
- Saņemts ACK bits no verga
- Nosūta vārdus adrese vergam.
- Saņemts ACK bits no verga
- Nosūta datus vergam.
- Saņemts ACK bits no verga.
- Un pēdējais nosūta STOP nosacījumu vergam.
Darbības datu nolasīšanai no verga līdz galvenajam (vergu pārraides režīms)
- Nosūta vergam START nosacījumu.
- Nosūta verga adresi vergam.
- Nosūtīt lasāmajam bitam (1) vergu.
- Saņemts ACK bits no verga
- Saņemti dati no verga
- Saņemts ACK bits no verga.
- Nosūta STOP nosacījumu vergam.
Shēmas shēma un apraksts
Ķēdē mēs esam izmantojuši 3 lielākos komponentus DS1307, AT89S52 un LCD. Šeit AT89S52 tiek izmantots, lai nolasītu laiku no DS1307 un parādītu to uz 16x2 LCD ekrāna. DS1307 nosūta laiku / datumu, izmantojot 2 līnijas, mikrokontrollerim.
Kontūru savienojumus ir viegli saprast un parādīt iepriekšminētajā diagrammā. DS1307 mikroshēmas tapas SDA un SCL ir savienotas ar 89S52 mikrokontrollera P2.1 un P2.0 tapām ar pievilkšanas rezistoru, kas datu un pulksteņa līnijās tur noklusējuma vērtību HIGH. Un 32,768KHz kristāla oscilators ir savienots ar DS1307chip, lai ģenerētu precīzu 1 sekundes kavēšanos. Un 3 voltu akumulators ir arī saistīts ar pin 3 rd (BAT) no DS1307 kas uztur laiku darboties pēc elektroenerģijas neveiksmes. 16x2 LCD ir savienots ar 8051 4 bitu režīmā. Vadības tapa RS, RW un En ir tieši savienota ar 89S52 tapām P1.0, GND un P1.1. Un datu tapa D0-D7 ir savienota ar 89S52 P1.4-P1.7.
Trīs pogas, proti, SET, INC / CHANGE un Next, tiek izmantotas, lai iestatītu pulksteņa laiku, lai piespraustu 89S52 P2.4, P2.3 un P2.2 (aktīvs zems). Nospiežot SET, tiek aktivizēts laika iestatīšanas režīms, un tagad mums ir jāiestata laiks, izmantojot pogu INC / CHANGE, un poga Next tiek izmantota, lai pārietu uz ciparu. Pēc laika iestatīšanas pulkstenis darbojas nepārtraukti.
Programmas apraksts
Kodā esam iekļāvuši 8051 ģimenes bibliotēku un standarta ievades bibliotēku. Un definēja tapas, kuras mēs izmantojām, un aprēķiniem izmantojām dažus mainīgos.
# iekļaut
Dotā funkcija tiek izmantota LCD vadīšanai.
void daten () {rs = 1; lv = 1; kavēšanās (1); lv = 0; } void lcddata (neparakstīta char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } void cmden (void) {rs = 0; lv = 1; kavēšanās (1); lv = 0; } void lcdcmd (neparakstīta char ch)
Šo funkciju izmanto, lai inicializētu RTC un nolasītu laiku un datumu no formas RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); stunda = BCDToDecimal (I2CRead (1)); diena1 = BCDToDecimal (I2CRead (1)); datums = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); gads = BCDToDecimal (I2CRead (1)); I2CStop (); laiks izrādei(); // parādīt laika / datuma / dienas kavējumu (1);
Šīs funkcijas tiek izmantotas, lai decimāldaļu pārveidotu par BCD un BCD uz decimāldaļu.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; atgriezties dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimālāBait / 10) << 4); b = (decimālāBait% 10); bcd = ab; atgriešanās bcd; }
Tālāk norādītās funkcijas tiek izmantotas I2C komunikācijai.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" funkcija saziņai ar ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // "stop" funkcija saziņai ar ds1307 RTC neparakstīta char I2CSend (neparakstīta char dati) // nosūtīt datus uz ds1307 {char i; char ack_bit; par (i = 0; i <8; i ++) {ja (Dati & 0x80) SDA = 1; cits SDA = 0; SCL = 1; Dati << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; atgriezties ack_bit; } neparakstīta char I2CRead (char ack) // saņemt datus no ds1307 {neparakstīta char i, Data = 0; SDA = 1; par (i = 0; i <8; i ++) {Dati << = 1; veiciet {SCL = 1;}, kamēr (SCL == 0); ja (SDA) Dati = 1; SCL = 0; } ja (ack) SDA = 0; cits SDA = 1; SCL = 1; SCL = 0; SDA = 1; atgriezt datus; }
Funkcija set_time tiek izmantota, lai iestatītu laiku pulkstenī, un zemāk redzamā funkcija show_time tiek izmantota laika parādīšanai LCD.
void show_time () // funkcija, lai parādītu laiku / datumu / dienu LCD {char var; lcdcmd (0x80); lcdprint ("Datums:"); sprintf (var, "% d", datums); lcdprint (var); sprintf (var, "/% d", pirmdiena); lcdprint (var); sprintf (var, "/% d", gads + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Laiks:"); sprintf (var, "% d", stunda); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sek); lcdprint (var); lcdprint (""); // diena (diena1); lcdprint (""); }