ఈ ప్రాజెక్ట్లో, మేము 8051 మైక్రోకంట్రోలర్ను ఉపయోగించి ఆర్టీసీ క్లాక్ను తయారు చేయబోతున్నాం. మీరు ఈ ప్రాజెక్ట్ను ఆర్డునోతో చేయాలనుకుంటే, ఆర్డునో ఉపయోగించి ఈ డిజిటల్ గడియారాన్ని తనిఖీ చేయండి. ఈ ప్రాజెక్ట్ యొక్క ప్రధాన భాగం DS1307, ఇది రియల్ టైమ్ డిజిటల్ క్లాక్ IC. ఈ ఐసి గురించి వివరంగా తెలుసుకుందాం.
RTC DS1307:
DS1307 సీరియల్ రియల్ టైమ్ క్లాక్ (RTC) తక్కువ శక్తి, పూర్తి బైనరీ-కోడెడ్ దశాంశ (BCD) గడియారం / క్యాలెండర్ మరియు NV SRAM యొక్క 56 బైట్లు. ఈ చిప్ I²C ప్రోటోకాల్పై పనిచేస్తుంది. గడియారం / క్యాలెండర్ సెకన్లు, నిమిషాలు, గంటలు, రోజు, తేదీ, నెల మరియు సంవత్సర సమాచారాన్ని అందిస్తుంది. లీపు సంవత్సరానికి దిద్దుబాట్లతో సహా, 31 రోజుల కన్నా తక్కువ నెలలతో నెల తేదీ ముగింపు స్వయంచాలకంగా సర్దుబాటు చేయబడుతుంది. గడియారం AM / PM సూచికతో 24-గంటల లేదా 12-గంటల ఆకృతిలో పనిచేస్తుంది. DS1307 లో అంతర్నిర్మిత పవర్-సెన్స్ సర్క్యూట్ ఉంది, ఇది విద్యుత్ వైఫల్యాలను గుర్తించి స్వయంచాలకంగా బ్యాకప్ సరఫరాకు మారుతుంది. భాగం బ్యాకప్ సరఫరా నుండి పనిచేసేటప్పుడు సమయపాలన ఆపరేషన్ కొనసాగుతుంది. DS1307 చిప్ 10 సంవత్సరాల వరకు నిరంతరం నడుస్తుంది.
8051 ఆధారిత రియల్ టైమ్ క్లాక్ అనేది RTC DS1307 ను ఉపయోగించి నిజ సమయాన్ని ప్రదర్శించడానికి ఒక డిజిటల్ గడియారం , ఇది I2C ప్రోటోకాల్పై పనిచేస్తుంది. రియల్ టైమ్ క్లాక్ అంటే విద్యుత్ వైఫల్యం తర్వాత కూడా ఇది నడుస్తుంది. శక్తి తిరిగి కనెక్ట్ అయినప్పుడు, అది ఆఫ్ స్టేట్లో ఉన్న సమయం మరియు వ్యవధితో సంబంధం లేకుండా నిజ సమయాన్ని ప్రదర్శిస్తుంది. ఈ ప్రాజెక్ట్లో మేము సమయం (గంట, నిమిషం, సెకన్లు, తేదీ, నెల మరియు సంవత్సరం) ఆకృతిలో ప్రదర్శించడానికి 16x2 LCD మాడ్యూల్ని ఉపయోగించాము. రియల్ టైమ్ గడియారాలు సాధారణంగా మా కంప్యూటర్లు, ఇళ్ళు, కార్యాలయాలు మరియు ఎలక్ట్రానిక్స్ పరికరాల్లో వాటిని నిజ సమయంతో నవీకరించడానికి ఉపయోగిస్తారు.
I2C ప్రోటోకాల్ రెండు వైర్లను ఉపయోగించి రెండు లేదా అంతకంటే ఎక్కువ పరికరాలను ఒకే వ్యవస్థకు అనుసంధానించే పద్ధతి, కాబట్టి ఈ ప్రోటోకాల్ను రెండు వైర్ ప్రోటోకాల్ అని కూడా పిలుస్తారు. ఒకే పరికరం లేదా ప్రాసెసర్కు 127 పరికరాలను కమ్యూనికేట్ చేయడానికి దీనిని ఉపయోగించవచ్చు. చాలా I2C పరికరాలు 100Khz పౌన.పున్యంలో నడుస్తాయి.
డేటా రైట్ మాస్టర్ నుండి బానిస కోసం దశలు (బానిస స్వీకరించే మోడ్)
- START కండిషన్ను బానిసకు పంపుతుంది.
- బానిసకు బానిస చిరునామాను పంపుతుంది.
- బానిసకు వ్రాసే బిట్ (0) పంపండి.
- బానిస నుండి ACK బిట్ పొందింది
- పదాల చిరునామాను బానిసకు పంపుతుంది.
- బానిస నుండి ACK బిట్ పొందింది
- డేటాను బానిసకు పంపుతుంది.
- బానిస నుండి ACK బిట్ పొందింది.
- చివరిది STOP కండిషన్ను బానిసకు పంపుతుంది.
బానిస నుండి మాస్టర్ వరకు డేటా పఠనం కోసం దశలు (స్లేవ్ ట్రాన్స్మిటింగ్ మోడ్)
- START కండిషన్ను బానిసకు పంపుతుంది.
- బానిసకు బానిస చిరునామాను పంపుతుంది.
- రీడ్ బిట్ (1) ను బానిసకు పంపండి.
- బానిస నుండి ACK బిట్ పొందింది
- బానిస నుండి డేటాను స్వీకరించారు
- బానిస నుండి ACK బిట్ పొందింది.
- STOP కండిషన్ను బానిసకు పంపుతుంది.
సర్క్యూట్ రేఖాచిత్రం మరియు వివరణ
సర్క్యూట్లో మేము DS1307, AT89S52 మరియు LCD అనే 3 భాగాలను ఉపయోగించాము. ఇక్కడ AT89S52 DS1307 నుండి చదవడానికి సమయం ఉపయోగించబడుతుంది మరియు దానిని 16x2 LCD స్క్రీన్లో ప్రదర్శిస్తుంది. DS1307 మైక్రోకంట్రోలర్కు 2 పంక్తులను ఉపయోగించి సమయం / తేదీని పంపుతుంది.
సర్క్యూట్ కనెక్షన్లు అర్థం చేసుకోవడం సులభం మరియు పై రేఖాచిత్రంలో చూపబడింది. DS1307 చిప్ పిన్ SDA మరియు SCL 89S52 మైక్రోకంట్రోలర్ యొక్క P2.1 మరియు P2.0 పిన్లతో అనుసంధానించబడి ఉన్నాయి, ఇది డేటా మరియు క్లాక్ లైన్లలో డిఫాల్ట్ విలువ HIGH ని కలిగి ఉన్న పుల్ అప్ రెసిస్టర్తో ఉంటుంది. మరియు ఖచ్చితమైన 1 సెకండ్ ఆలస్యాన్ని ఉత్పత్తి చేయడానికి 32.768KHz క్రిస్టల్ ఓసిలేటర్ DS1307chip తో అనుసంధానించబడి ఉంది. మరియు 3 వోల్ట్ బ్యాటరీ DS1307 యొక్క పిన్ 3 rd (BAT) కు అనుసంధానించబడి ఉంది, ఇది విద్యుత్ వైఫల్యం తర్వాత సమయం నడుస్తుంది. 16x2 LCD 4-బిట్ మోడ్లో 8051 తో అనుసంధానించబడి ఉంది. కంట్రోల్ పిన్ RS, RW మరియు En నేరుగా 89S52 పిన్ P1.0, GND మరియు P1.1 లకు అనుసంధానించబడి ఉన్నాయి. మరియు డేటా పిన్ D0-D7 89S52 యొక్క P1.4-P1.7 కు అనుసంధానించబడి ఉంది.
89S52 యొక్క P2.4, P2.3 మరియు P2.2 ను పిన్ చేయడానికి గడియార సమయాన్ని సెట్ చేయడానికి SET, INC / CHANGE మరియు Next అనే మూడు బటన్లు ఉపయోగించబడతాయి (చురుకుగా తక్కువ). మేము SET నొక్కినప్పుడు, టైమ్ సెట్ మోడ్ సక్రియం అవుతుంది మరియు ఇప్పుడు మనం INC / CHANGE బటన్ను ఉపయోగించడం ద్వారా సమయాన్ని సెట్ చేయాలి మరియు అంకెకు తరలించడానికి నెక్స్ట్ బటన్ ఉపయోగించబడుతుంది. సమయం గడియారం సెట్ చేసిన తర్వాత నిరంతరం నడుస్తుంది.
ప్రోగ్రామ్ వివరణ
కోడ్లో మేము 8051 ఫ్యామిలీ లైబ్రరీ మరియు ప్రామాణిక ఇన్పుట్ అవుట్పుట్ లైబ్రరీని చేర్చాము. మరియు మేము ఉపయోగించిన పిన్లను నిర్వచించాము మరియు లెక్కల కోసం కొంత వేరియబుల్ తీసుకున్నాము.
# చేర్చండి
మరియు ఇచ్చిన ఫంక్షన్ LCD డ్రైవింగ్ కోసం ఉపయోగించబడుతుంది.
void daten () {rs = 1; en = 1; ఆలస్యం (1); en = 0; l శూన్యమైన lcddata (సంతకం చేయని చార్ ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } శూన్యమైన cmden (శూన్యమైనది) {rs = 0; en = 1; ఆలస్యం (1); en = 0; l శూన్యమైన lcdcmd (సంతకం చేయని చార్ ch)
ఈ ఫంక్షన్ RTC ను ప్రారంభించడానికి మరియు RTC IC ఫారం నుండి సమయం మరియు తేదీని చదవడానికి ఉపయోగించబడుతుంది.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1%); min = BCDToDecimal (I2CRead (1%); గంట = BCDToDecimal (I2CRead (1%); day1 = BCDToDecimal (I2CRead (1%); తేదీ = BCDToDecimal (I2CRead (1%); mon = BCDToDecimal (I2CRead (1%); సంవత్సరం = BCDToDecimal (I2CRead (1%); I2CStop (); షో_టైమ్ (); // ప్రదర్శన సమయం / తేదీ / రోజు ఆలస్యం (1);
ఈ విధులు దశాంశాన్ని BCD మరియు BCD ను దశాంశంగా మార్చడానికి ఉపయోగిస్తారు.
int BCDToDecimal (చార్ bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; రిటర్న్ డెక్; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((దశాంశబైట్ / 10) << 4); b = (దశాంశబైట్% 10); bcd = ab; తిరిగి bcd; }
క్రింద ఇవ్వబడిన విధులు I2C కమ్యూనికేషన్ కోసం ఉపయోగించబడతాయి.
శూన్య I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0; d // ds1307 RTC శూన్య I2CStop () తో కమ్యూనికేట్ చేయడానికి "ప్రారంభించు" ఫంక్షన్ {SDA = 0, SCL = 1, SDA = 1; wit // కమ్యూనికేట్ చేయడానికి "స్టాప్" ఫంక్షన్ ds1307 RTC సంతకం చేయని చార్ I2CSend (సంతకం చేయని చార్ డేటా) // ds1307 కు డేటాను పంపండి {char i; చార్ అక్_బిట్; (i = 0; i <8; i ++) {if (డేటా & 0x80) SDA = 1; else SDA = 0; ఎస్సీఎల్ = 1; డేటా << = 1; ఎస్సీఎల్ = 0; } SDA = 1, SCL = 1; ack_bit = SDA; ఎస్సీఎల్ = 0; తిరిగి ack_bit; } సంతకం చేయని చార్ I2CRead (చార్ అక్) // ds1307 నుండి డేటాను స్వీకరించండి {సంతకం చేయని చార్ i, డేటా = 0; SDA = 1; (i = 0; i <8; i ++) {డేటా << = 1; {SCL = 1;} అయితే (SCL == 0); if (SDA) డేటా- = 1; ఎస్సీఎల్ = 0; } if (అక్) SDA = 0; else SDA = 1; ఎస్సీఎల్ = 1; ఎస్సీఎల్ = 0; SDA = 1; రిటర్న్ డేటా; }
సమయాన్ని గడియారంలో సెట్ చేయడానికి set_time ఫంక్షన్ ఉపయోగించబడుతుంది మరియు దిగువ షో_టైమ్ ఫంక్షన్ LCD లో సమయాన్ని ప్రదర్శించడానికి ఉపయోగించబడుతుంది.
ఎల్సిడి {చార్ వర్లో సమయం / తేదీ / రోజు ప్రదర్శించడానికి శూన్యమైన షో_టైమ్ () // ఫంక్షన్; lcdcmd (0x80); lcdprint ("తేదీ:"); sprintf (var, "% d", తేదీ); lcdprint (var); sprintf (var, "/% d", mon); 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 (""); // రోజు (రోజు 1); lcdprint (""); }