Documente Academic
Documente Profesional
Documente Cultură
Sarcina: ……………………………………………………………………………….....3
Introducere……………………………………………………………………………….4
4. Codul programului…………………………………………………………………..18
1.
Coala
CEEE 6111 03 001 NE 3
Mod Coala № Docum. Semnatura Data
Introducere
Istoric, primelor calculatoare ce foloseau un microprocesor în rol de UCP li s-a
spus calculatoare pe bază de microprocesor, sau microcalculatoare. Toate
calculatoarele moderne sunt construite cu microprocesoare cu funcţia de UCP, unele
fiind bazate pe un sigur microprocesor (calculatoare uni-procesor), altele conţinând
mai multe microprocesoare în scopul creşterii puterii de calcul şi a vitezei de
prelucrare (calculatoare multi-procesor). Microprocesoarele, ca şi UCP de uz general,
sunt utilizate pentru aplicaţii de prelucrare de înaltă performanţă, fiind folosite pentru
construcţia calculatoarelor de uz general. Microprocesoarele sunt utilizate în PC-uri
(Personal Computers), staţii de lucru, servere, laptopuri, unde compatibilitatea
software, performanţa, generalitatea şi flexibilitatea sunt importante. Imediat după
apariţia primului microprocesor (1971) firma Intel a scos pe piaţă o familie de
microcontrolere numită MCS-48 (începând cu 1976) cu circuitele integrate 8048, 8035
şi 8748.
Aceste circuite nu erau destinate operaţiilor de prelucrare de uz general, ci celor
specifice pentru controlul unor aplicaţii din lumea externă circuitului. La momentul
apariţiei, circuitele au fost numite "microcalculatoare pe un chip", pentru că ele
includeau în aceeaşi capsulă de circuit integrat toate componentele unui calculator:
UCP, memorie şi sistem I/O. În momentul de faţă circuitele similare sunt numite
microcontrolere, pentru că, aşa cum sugerează şi numele sunt destinate aplicaţiilor de
control (nu calculului de uz general). Microcontrolerele sunt proiectate pentru a se
obţine o dimensiune redusă a chip-ului, pentru micşorarea costurilor şi includerea de
spaţiu de memorie şi interfeţe IO pe chip. Microcontrolerele sunt adesea “specializate
pe aplicaţii” în dauna flexibilităţii. Indiferent de ceea ce este controlat în lumea
externă (de exemplu controlul turaţiei unor motoare electrice, reglarea temperaturii
într-o incintă, comanda sistemului antiblocare a frânelor la automobil-ABS), sistemul
de comandă digitală este alcătuit din: UCP (nucleu microprocesor), memorie de date
şi program, interfeţe şi controlere de periferie. Ideea de bază la microcontrolere este
integrarea într-un singur circuit a tuturor acestor componente, prin simplificarea şi
micşorarea dimensiunilor diverselor unităţi funcţionale (de exemplu capacitate de
Coala
CEEE 6111 03 001 NE 4
Mod Coala № Docum. Semnatura Data
stocare în memorie mult mai mică faţă de calculator, interfeţe seriale cu lumea
externă etc.
-Sursa de alimentare – Are rolul de a alimenta toată schema, el este compus dintr-
un stabilizator de tensiune de 5V și o sursă de alimentare de 12V.
-Ceas de timp real – reprezintă un microcircuit ce timpul într-un anumit moment,
are scopul de a oferi datele despre ora și data când a fost înregistrat un utilizator nou,
precum și când utilizatorul solicită accesul în sistem. Microcircuitul este dotat cu bateria
pentru a continua să numeri timpul când dispozitivul este deconectat de la alimentare.
-Modulul de citire a amprentelor - reprezintă un dispozitiv care crează imaginea
amprentelor a utilizatorului când acesta aplică degetul pe suprafața de citire
-Speaker – reprezintă un mic difuzor, care semnalizează sonor în cazul când
utilizatorul este recunoscut.
-Led indicator – este utilizat pentru a informa utilizatorul despre faptul că de la el
este așteptată o acțiune (în cazul când are loc înregistrarea unui nou utilizator).
Coala
CEEE 6111 03 001 NE 5
Mod Coala № Docum. Semnatura Data
-Afișor – reprezintă un ecran LCD, care afișează ora și dată când utilizatorul intră
în sistem, precum și informația referitor la starea procesului (ex. ‘Record Deleted
successfully’ când are loc finisarea ștergerii datelor din memoria dispozitivului)
Coala
CEEE 6111 03 001 NE 6
Mod Coala № Docum. Semnatura Data
2 Descrierea principiului de funcționare
Coala
CEEE 6111 03 001 NE 7
Mod Coala № Docum. Semnatura Data
3 Argumentarea alegerii principalelor componente
3.1 Descrierea microcontrolerului Atmega32.
Coala
CEEE 6111 03 001 NE 8
Mod Coala № Docum. Semnatura Data
celelalte funcții ale cipului până la următoarea Întrerupere externă sau resetare
hardware. În modul de economisire a energiei, cronometrul asincron continuă să ruleze,
permițând utilizatorului să mențină o bază de cronometru în timp ce restul dispozitivului
doarme. Zgomotul ADC Modul de reducere oprește procesorul și toate modulele I / O,
cu excepția Asynchronous Timer și ADC, pentru a minimiza zgomot de comutare în
timpul conversiilor ADC. În modul de așteptare, oscilatorul de cristal / rezonator
funcționează în timp ce restul dispozitivului doarme. Acest lucru permite pornirea foarte
rapidă combinată cu consum redus de energie consum. În modul Extended Standby, atât
oscilatorul principal, cât și temporizatorul asincron continuă a alerga.
Dispozitivul este fabricat folosind tehnologia de memorie non-volatilă Atmel de
înaltă densitate. ISP-ul On-chip Flash permite reprogramarea memoriei programului în
sistem printr-o interfață serială SPI, prin intermediul unui programator convențional de
memorie nevolatilă sau de un program de pornire On-chip care rulează pe nucleul AVR.
Programul de boot poate utiliza orice interfață pentru a descărca programul de aplicație
în aplicația Flash memorie. Software-ul din secțiunea Boot Flash va continua să ruleze
în timp ce secțiunea Application Flash este actualizat, oferind o operațiune de citire-
scriere adevărată. Prin combinarea unui procesor RISC pe 8 biți cu sistemul integrat
Flash auto-programabil pe un cip monolitic, Atmel ATmega32A devine un
microcontroler puternic care oferă o soluție extrem de flexibilă și rentabilă pentru multe
aplicații de control încorporate.
Atmel AVR ATmega32A este acceptat cu o suită completă de instrumente de
dezvoltare de programe și sisteme inclusiv: compilatoare C, macro asamblatoare,
depanatoare / simulatoare de programe, emulatoare în circuit și truse de evaluare.
Coala
CEEE 6111 03 001 NE 9
Mod Coala № Docum. Semnatura Data
Caracteristici ATmega32
Nr. Pini 32
Flash (KB) 32
SRAM (KB) 1
EEPROM (KB) 23
Pinii I/O de uz general 1
SPI 1
TWI ( I 2C) 1
USART 10-bit, până la 76.9ksps
Canale ADC 8
Întârziere progragare AC
Temporizatoare / Contoare pe 8 biți 2
Temporizatore / Contoare pe 16 biți 1
PWM canale 4
Osccilator RC +/-3%
VREF bandgap
Voltaj operativ 2.7 – 5.5V
Fregvența maximală de operare 16MHz
Diapazonul de temperatură -55 °C la +125 °C
JTAG Da
Coala
CEEE 6111 03 001 NE 10
Mod Coala № Docum. Semnatura Data
Figura 3 - Schema bloc a microprocesorului
Coala
CEEE 6111 03 001 NE 11
Mod Coala № Docum. Semnatura Data
bază se adugă diferite tipuri de interfețe care folosesc în comun liniile I/O cu porturile
paralele de uz general.
Alegerea a căzut anume pe acest tip de programator datorită faptului că este una
dintre cele mai populare alegeri de tipul Atmel, care ne permite programarea a oricărui
microprocesor cu nucleu AVR prin portul serial SPI.
Coala
CEEE 6111 03 001 NE 12
Mod Coala № Docum. Semnatura Data
Caracteristici tehnice:
Coala
CEEE 6111 03 001 NE 14
Mod Coala № Docum. Semnatura Data
Figura 8 – Schema conexiunii
Coala
CEEE 6111 03 001 NE 15
Mod Coala № Docum. Semnatura Data
Figura 9 – Ceas de timp real DS1307
Coala
CEEE 6111 03 001 NE 17
Mod Coala № Docum. Semnatura Data
4 Codul programului
Codul programei este foarte voluminos și poate părea puțin complicat, de aceea el
va fi amplasat la sfârșitul paragrafului, iar unele blocuri vor fi explicate.
Pentru început trebuie de conectat fișierele de antet și de creat macrosurile
necesare:
1 void RTC_stp()
Coala
CEEE 6111 03 001 NE 18
Mod Coala № Docum. Semnatura Data
{
2 TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //остановить
3 взаимодействие
4 }
5
6 void RTC_read()
7 {
8 TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
9 while((TWCR&0x80)==0x00);
10 TWDR=0xD0; //RTC write (slave address)
11 TWCR=(1<<TWINT)|(1<<TWEN);
12 while(!(TWCR&(1<<TWINT)));
13 TWDR=0x00; //RTC write (word address)
14 TWCR=(1<<TWINT)|(1<<TWEN);
15 while(!(TWCR&(1<<TWINT)));
16 TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //start
17 RTC communication again
18 while ((TWCR&0x80)==0x00);
19 TWDR=0xD1; // RTC command to read
20 TWCR=(1<<TWINT)|(1<<TWEN);
21 while(!(TWCR&(1<<TWINT)));
}
Următorul pas, vom defini câteva funcții pentru lucru cu ecranul LCD, vom
interacționa în regim de 4 biți. Deasemenea vom defini câteva funcții pentru
inițializarea portului serial (UART), și schimbul de date dintre scanerul de amprente și
microprocesorului.
1 void serialbegin()
2 {
3 UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
4 UBRRH = (BAUD_PRESCALE >> 8);
5 UBRRL = BAUD_PRESCALE;
6 UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
7 sei();
8 }
9
10 ISR(USART_RXC_vect)
11 {
12 char ch=UDR;
13 buf[ind++]=ch;
14 if(ind>0)
Coala
CEEE 6111 03 001 NE 19
Mod Coala № Docum. Semnatura Data
15 flag=1;
16 //serial1Write(ch);
17 }
18
19 void serialwrite(char ch)
20 {
21 while ((UCSRA & (1 << UDRE)) == 0);
22 UDR = ch;
23 }
24
25 void serialprint(char *str)
26 {
27 while(*str)
28 {
29 serialwrite(*str++);
30 }
31 }
Urmează definirea a unui număr de funcții pentru portul serial UART, care se vor
utiliza pentru UART de program (software). El se va utiliza pentru transmiterea datelor
salvate în calculator.
1 void matchFinger()
2 {
3 // lcdwrite(1,CMD);
4 // lcdprint("Place Finger");
5 // lcdwrite(192,CMD);
6 // _delay_ms(2000);
7 if(!sendcmd2fp((char *)&f_detect[0],sizeof(f_detect)))
8 {
9 if(!sendcmd2fp((char *)&f_imz2ch1[0],sizeof(f_imz2ch1)))
10 {
11 if(!sendcmd2fp((char *)&f_search[0],sizeof(f_search)))
12 {
13 LEDHigh;
14 buzzer(200);
15 uint id= data[0];
16 id<<=8;
17 id+=data[1];
Coala
CEEE 6111 03 001 NE 21
Mod Coala № Docum. Semnatura Data
18 uint score=data[2];
19 score<<=8;
20 score+=data[3];
21 (void)sprintf((char *)buf1,"Id: %d",(int)id);
22 lcdwrite(1,CMD);
23 lcdprint((char *)buf1);
24 saveData(id);
25
26 _delay_ms(1000);
27 lcdwrite(1,CMD);
28 lcdprint("Attendance");
29 lcdwrite(192,CMD);
30 lcdprint("Registered");
31 _delay_ms(2000);
32 LEDLow;
33 }
1 void deleteFinger()
2 {
3 id=getId();
4 f_delete[10]=id>>8 & 0xff;
5 f_delete[11]=id & 0xff;
6 f_delete[14]=(21+id)>>8 & 0xff;
7 f_delete[15]=(21+id) & 0xff;
8 if(!sendcmd2fp(&f_delete[0],sizeof(f_delete)))
9 {
10 lcdwrite(1,CMD);
11 sprintf((char *)buf1,"Finger ID %d ",id);
12 lcdprint((char *)buf1);
13 lcdwrite(192, CMD);
14 lcdprint("Deleted Success");
15
16 }
17 else
18 {
19 lcdwrite(1,CMD);
20 lcdprint("Error");
21 }
22 _delay_ms(2000);
Coala
CEEE 6111 03 001 NE 22
Mod Coala № Docum. Semnatura Data
23 }
1 /*function to show attendence data on serial monitor using softserial pin PD7*/
2 void ShowAttendance()
3 {
4 char buf[128];
5 lcdwrite(1,CMD);
6 lcdprint("Downloding....");
7 SerialSoftPrintln("Attendance Record");
8 SerialSoftPrintln(" ");
9 SerialSoftPrintln("S.No ID1 ID2 Id3 ID4 ID5
10 ");
11 //serialprintln("Attendance Record");
12 //serialprintln(" ");
13 //serialprintln("S.No ID1 ID2 Id3
14 ID4 ID5");
15 for(int cIndex=1;cIndex<=8;cIndex++)
16 {
17 sprintf((char *)buf,"%d "
18 "%d:%d:%d %d/%d/20%d "
19 "%d:%d:%d %d/%d/20%d "
20 "%d:%d:%d %d/%d/20%d "
21 "%d:%d:%d %d/%d/20%d "
22 "%d:%d:%d %d/%d/20%d ",
23 cIndex,
24 eeprom_read((cIndex*6)),eeprom_read((cIndex*6)+1),eeprom_read((cIndex*6)
25 +2),eeprom_read((cIndex*6)+3),eeprom_read((cIndex*6)+4),eeprom_read((cIn
26 dex*6)+5),
27 eeprom_read((cIndex*6)+48),eeprom_read((cIndex*6)+1+48),eeprom_read((cI
28 ndex*6)+2+48),eeprom_read((cIndex*6)+3+48),eeprom_read((cIndex*6)+4+48
29 ),eeprom_read((cIndex*6)+5+48),
30 eeprom_read((cIndex*6)+96),eeprom_read((cIndex*6)+1+96),eeprom_read((cI
31 ndex*6)+2+96),eeprom_read((cIndex*6)+3+96),eeprom_read((cIndex*6)+4+96
32 ),eeprom_read((cIndex*6)+5+96),
33 eeprom_read((cIndex*6)+144),eeprom_read((cIndex*6)+1+144),eeprom_read((
34 cIndex*6)+2+144),eeprom_read((cIndex*6)+3+144),eeprom_read((cIndex*6)+
35 4+144),eeprom_read((cIndex*6)+5+144),
eeprom_read((cIndex*6)+192),eeprom_read((cIndex*6)+1+192),eeprom_read((
cIndex*6)+2+192),eeprom_read((cIndex*6)+3+192),eeprom_read((cIndex*6)+
4+192),eeprom_read((cIndex*6)+5+192));
Coala
CEEE 6111 03 001 NE 23
Mod Coala № Docum. Semnatura Data
SerialSoftPrintln(buf);
//serialprintln(buf);
}
lcdwrite(192,CMD);
lcdprint("Done");
_delay_ms(2000);
}
Următoarea funcție este utilizată pentru ștergerea datelor de acces din memoria
volatilă EEPROM a microprocesorului.
1 void DeleteRecord()
2 {
3 lcdwrite(1,CMD);
4 lcdprint("Please Wait...");
5 for(int i=0;i<255;i++)
6 eeprom_write(i,10);
7 _delay_ms(2000);
8 lcdwrite(1,CMD);
9 lcdprint("Record Deleted");
10 lcdwrite(192,CMD);
11 lcdprint("Successfully");
12 _delay_ms(2000);
13 }
1 /*
2 *
3 AttandeceSystem.
4 c
5 *
6 * Created:
7 1/8/2019 10:10:44
8 PM
9 * Author: Evan
10 */
11
12 #define F_CPU
13 8000000ul
14 #include
15 <avr/io.h>
Coala
CEEE 6111 03 001 NE 24
Mod Coala № Docum. Semnatura Data
16 #include
17 <util/delay.h>
18 #include
19 <avr/interrupt.h>
20
21 /***MACROS*/
22
23 #define
24 USART_BAUDR
25 ATE 9600
26 #define
27 BAUD_PRESCA
28 LE (((F_CPU /
29 (USART_BAUD
30 RATE * 16UL))) -
31 1)
32
33 #define uchar
34 unsigned char
35 #define uint
36 unsigned int
37
38 #define
39 LCDPORTDIR
40 DDRB
41 #define
42 LCDPORT
43 PORTB
44 #define rs 0
45 #define rw 1
46 #define en 2
47
48 #define RSLow
49 (LCDPORT&=~(
50 1<<rs))
51 #define RSHigh
52 (LCDPORT|
53 =(1<<rs))
54 #define RWLow
55 (LCDPORT&=~(
56 1<<rw))
57 #define ENLow
58 (LCDPORT&=~(
59 1<<en))
60 #define ENHigh
61 (LCDPORT|
Coala
CEEE 6111 03 001 NE 25
Mod Coala № Docum. Semnatura Data
62 =(1<<en))
63
64 #define
65 KeyPORTdir
66 DDRA
67 #define key PINA
68 #define KeyPORT
69 PORTA
70
71 #define OK 3
72 #define UP 0
73 #define DOWN 1
74 #define DEL 3
75 #define MATCH
76 1
77 #define ENROL 2
78
79 #define enrol (key
80 & (1<<ENROL))
81 // key 1
82 #define match
83 (key &
84 (1<<MATCH)) /
85 / key 4
86 #define delet (key
87 & (1<<DEL)) //
88 key 2
89 #define up (key &
90 (1<<UP)) // key
91 3
92 #define down (key
93 &
94 (1<<DOWN)) //
95 key 4
96 #define ok (key &
97 (1<<OK)) //
98 key 2
99
100 #define LEDdir
101 DDRC
102 #define LEDPort
103 PORTC
104
105 #define LED 3
106 #define BUZ 2
107
Coala
CEEE 6111 03 001 NE 26
Mod Coala № Docum. Semnatura Data
108 #define LEDHigh
109 (LEDPort +=
110 (1<<LED))
111 #define LEDLow
112 (LEDPort &=
113 ~(1<<LED))
114
115 #define BUZHigh
116 (LEDPort +=
117 (1<<BUZ))
118 #define BUZLow
119 (LEDPort &=
120 ~(1<<BUZ))
121
122 #define HIGH 1
123 #define LOW 0
124
125 #define PASS 0
126 #define ERROR 1
127
128 #define check(id)
129 id=up<down?+
130 +id:down<up?--
131 id:id;
132
133 #define maxId 5
134 #define dataLenth
135 6
136 #define
137 eepStartAdd 10
138
139 /*variable*/
140
141 uchar buf[20];
142 uchar buf1[20];
143 volatile uint ind;
144 volatile uint flag;
145 uint msCount=0;
146 uint
147 g_timerflag=1;
148 volatile uint
149 count=0;
150 uchar data[10];
151 uint id=1;
152 int s,a,b,c;
153
Coala
CEEE 6111 03 001 NE 27
Mod Coala № Docum. Semnatura Data
154 const char
155 passPack[]={0xE
156 F, 0x1, 0xFF,
157 0xFF, 0xFF,
158 0xFF, 0x1, 0x0,
159 0x7, 0x13, 0x0,
160 0x0, 0x0, 0x0,
161 0x0, 0x1B};
162 const char
163 f_detect[]={0xEF,
164 0x1, 0xFF, 0xFF,
165 0xFF, 0xFF, 0x1,
166 0x0, 0x3, 0x1,
167 0x0, 0x5};
168 const char
169 f_imz2ch1[]={0x
170 EF, 0x1, 0xFF,
171 0xFF, 0xFF,
172 0xFF, 0x1, 0x0,
173 0x4, 0x2, 0x1,
174 0x0, 0x8};
175 const char
176 f_imz2ch2[]={0x
177 EF, 0x1, 0xFF,
178 0xFF, 0xFF,
179 0xFF, 0x1, 0x0,
180 0x4, 0x2, 0x2,
181 0x0, 0x9};
182 const char
183 f_createModel[]=
184 {0xEF,0x1,0xFF,0
185 xFF,0xFF,0xFF,0
186 x1,0x0,0x3,0x5,0x
187 0,0x9};
188 char
189 f_storeModel[]={
190 0xEF,0x1,0xFF,0x
191 FF,0xFF,0xFF,0x
192 1,0x0,0x6,0x6,0x1
193 ,0x0,0x1,0x0,0xE
194 };
195 const char
196 f_search[]={0xEF,
197 0x1, 0xFF, 0xFF,
198 0xFF, 0xFF, 0x1,
199 0x0, 0x8, 0x1B,
Coala
CEEE 6111 03 001 NE 28
Mod Coala № Docum. Semnatura Data
200 0x1, 0x0, 0x0,
201 0x0, 0xA3, 0x0,
202 0xC8};
203 char
204 f_delete[]={0xEF,
205 0x1,0xFF,0xFF,0x
206 FF,0xFF,0x1,0x0,
207 0x7,0xC,0x0,0x0,
208 0x0,0x1,0x0,0x15
209 };
210 //const char
211 f_readNotepad[]=
212 {0xEF,0x1,0xFF,0
213 xFF,0xFF,0xFF,0
214 x1,0x0,0x4,0x19,0
215 x0,0x0,0x1E};
216 //char
217 f_writeNotepad[]=
218 {0xEF,0x1,0xFF,0
219 xFF,0xFF,0xFF,0
220 x1,0x0,0x24};
221
222 int
223 timeStamp[7],day;
224
225 enum
226 {
227 CMD=0,
228 DATA,
229 };
230
231 void buzzer(uint);
232
233 void lcdwrite(char
234 ch,char r)
235 {
236 LCDPORT=ch
237 & 0xF0;
238 RWLow;
239 if(r == 1)
240 RSHigh;
241 else
242 RSLow;
243 ENHigh;
244 _delay_ms(5);
245 ENLow;
Coala
CEEE 6111 03 001 NE 29
Mod Coala № Docum. Semnatura Data
246 _delay_ms(10);
247
248
249 LCDPORT=ch<<
250 4 & 0xF0;
251 RWLow;
252 if(r == 1)
253 RSHigh;
254 else
255 RSLow;
256 ENHigh;
257 _delay_ms(5);
258 ENLow;
259 _delay_ms(10);
260 }
261
262 void lcdprint(char
263 *str)
264 {
265 while(*str)
266 {
267 lcdwrite(*str
268 ++,DATA);
269 //__delay_ms
270 (20);
271 }
272 }
273
274 void lcdbegin()
275 {
276 uchar
277 lcdcmd[5]={0x02,
278 0x28,0x0E,0x06,0
279 x01};
280 uint i=0;
281 for(i=0;i<5;i++)
282 lcdwrite(lcdcm
283 d[i], CMD);
284 }
285
286 void serialbegin()
287 {
288 UCSRC = (1 <<
289 URSEL) | (1 <<
290 UCSZ0) | (1 <<
291 UCSZ1);
Coala
CEEE 6111 03 001 NE 30
Mod Coala № Docum. Semnatura Data
292 UBRRH =
293 (BAUD_PRESCA
294 LE >> 8);
295 UBRRL =
296 BAUD_PRESCA
297 LE;
298 UCSRB=(1<<R
299 XEN)|
300 (1<<TXEN)|
301 (1<<RXCIE);
302 sei();
303 }
304
305 ISR(USART_RX
306 C_vect)
307 {
308 char ch=UDR;
309 buf[ind++]=ch;
310 if(ind>0)
311 flag=1;
312 //serial1Write(ch);
313 }
314
315 void
316 serialwrite(char
317 ch)
318 {
319 while ((UCSRA &
320 (1 << UDRE)) ==
321 0);
322 UDR = ch;
323 }
324
325 void
326 serialprint(char
327 *str)
328 {
329 while(*str)
330 {
331 serialwrite(*s
332 tr++);
333 }
334 }
335
336 void
337 serialprintln(char
Coala
CEEE 6111 03 001 NE 31
Mod Coala № Docum. Semnatura Data
338 *str)
339 {
340 serialprint(str);
341 serialwrite(0x0d);
342 serialwrite(0x0a);
343 }
344
345 void serialFlush()
346 {
347 for(int
348 i=0;i<sizeof(buf);i
349 ++)
350 {
351 buf[i]=0;
352 }
353 }
354
355 void
356 SerialSoftWrite(c
357 har ch)
358 {
359 PORTD&=~(1<<
360 7);
361 _delay_us(104);
362 for(int i=0;i<8;i+
363 +)
364 {
365 if(ch & 1)
366 PORTD|=(1<<7);
367 else
368 PORTD&=~(1<<
369 7);
370 _delay_us(104);
371 ch>>=1;
372 }
373 PORTD|=(1<<7);
374 _delay_us(104);
375 }
376
377 void
378 SerialSoftPrint(ch
379 ar *str)
380 {
381 while(*str)
382 {
383 SerialSoftWrite(*s
Coala
CEEE 6111 03 001 NE 32
Mod Coala № Docum. Semnatura Data
384 tr);
385 str++;
386 }
387 }
388
389 void
390 SerialSoftPrintln(c
391 har *str)
392 {
393 SerialSoftPrint(str
394 );
395 SerialSoftWrite(0
396 x0D);
397 SerialSoftWrite(0
398 x0A);
399 }
400
401 int bcdtochar(char
402 num)
403 {
404 return ((num/16 *
405 10) + (num %
406 16));
407 }
408
409 void RTC_start()
410 {
411 TWCR=(1<<TWI
412 NT)|
413 (1<<TWSTA)|
414 (1<<TWEN);
415 while((TWCR&0
416 x80)==0x00);
417 }
418
419 void RTC_stp()
420 {
421 TWCR=(1<<TWI
422 NT)|(1<<TWEN)|
423 (1<<TWSTO);
424 //stop
425 communication
426 }
427
428 void RTC_read()
429 {
Coala
CEEE 6111 03 001 NE 33
Mod Coala № Docum. Semnatura Data
430 TWCR=(1<<TWI
431 NT)|
432 (1<<TWSTA)|
433 (1<<TWEN);
434 while((TWCR&0
435 x80)==0x00);
436 TWDR=0xD0;
437
438 //RTC write
439 (slave address)
440 TWCR=(1<<TWI
441 NT)|(1<<TWEN);
442 while(!
443 (TWCR&(1<<TW
444 INT)));
445 TWDR=0x00;
446
447 //RTC write
448 (word address)
449 TWCR=(1<<TWI
450 NT)|(1<<TWEN);
451 while(!
452 (TWCR&(1<<TW
453 INT)));
454 TWCR=(1<<TWI
455 NT)|
456 (1<<TWSTA)|
457 (1<<TWEN);
458 //start
459 RTC communicat
460 ion again
461 while
462 ((TWCR&0x80)=
463 =0x00);
464 TWDR=0xD1;
465
466 // RTC command
467 to read
468 TWCR=(1<<TWI
469 NT)|(1<<TWEN);
470 while(!
471 (TWCR&(1<<TW
472 INT)));
473 }
474
475 void
Coala
CEEE 6111 03 001 NE 34
Mod Coala № Docum. Semnatura Data
476 sec_init(unsigned
477 char d)
478 {
479 TWDR=d;
480
481 //second init
482 TWCR=(1<<TWI
483 NT)|(1<<TWEN);
484 while(!
485 (TWCR&(1<<TW
486 INT)));
487 }
488
489 void
490 min_init(unsigned
491 char d)
492 {
493 TWDR=d;
494 //
495 minute init
496 TWCR=(1<<TWI
497 NT)|(1<<TWEN);
498 while(!
499 (TWCR&(1<<TW
500 INT)));
501 }
502
503 void
504 hr_init(unsigned
505 char d)
506 {
507 TWDR=d;
508 //
509 hour init
510 TWCR=(1<<TWI
511 NT)|(1<<TWEN);
512 while(!
513 (TWCR&(1<<TW
514 INT)));
515 }
516
517 void
518 day_init(unsigned
519 char d)
520 {
521 TWDR=d;
Coala
CEEE 6111 03 001 NE 35
Mod Coala № Docum. Semnatura Data
522 /
523 /days init
524 TWCR=(1<<TWI
525 NT)|(1<<TWEN);
526 while(!
527 (TWCR&(1<<TW
528 INT)));
529 }
530
531 void
532 date_init(unsigned
533 char d)
534 {
535 TWDR=d;
536 /
537 /date init
538 TWCR=(1<<TWI
539 NT)|(1<<TWEN);
540 while(!
541 (TWCR&(1<<TW
542 INT)));
543 }
544
545 void
546 month_init(unsign
547 ed char d)
548 {
549 TWDR=d;
550 /
551 /month init
552 TWCR=(1<<TWI
553 NT)|(1<<TWEN);
554 while(!
555 (TWCR&(1<<TW
556 INT)));
557 }
558
559 void
560 yr_init(unsigned
561 char d)
562 {
563 TWDR=d;
564 /
565 /year init
566 TWCR=(1<<TWI
567 NT)|(1<<TWEN);
Coala
CEEE 6111 03 001 NE 36
Mod Coala № Docum. Semnatura Data
568 while(!
569 (TWCR&(1<<TW
570 INT)));
571 }
572
573 int sec_rw()
574 {
575 TWCR|
576 =(1<<TWINT)|
577 (1<<TWEA);
578 //RTC
579 second read
580 while((TWCR &
581 0x80)==0x00);
582 return
583 bcdtochar(TWDR
584 );
585 }
586
587 int min_rw()
588 {
589 TWCR|
590 =(1<<TWINT);
591
592 //RTC minute read
593 TWCR|
594 =(1<<TWEA);
595 while((TWCR &
596 0x80)==0x00);
597 return
598 bcdtochar(TWDR
599 );
600 }
601
602 int hr_rw()
603 {
604 TWCR|
605 =(1<<TWINT)|
606 (1<<TWEA);
607 //RTC
608 hour read
609 while((TWCR &
610 0x80)==0x00);
611 return
612 bcdtochar(TWDR
613 );
Coala
CEEE 6111 03 001 NE 37
Mod Coala № Docum. Semnatura Data
614 }
615
616 int day_rd()
617 {
618 TWCR|
619 =(1<<TWINT)|
620 (1<<TWEA);
621 //RTC
622 day read
623 while((TWCR&0
624 x80)==0x00);
625 return
626 bcdtochar(TWDR
627 );
628 }
629
630 int date_rw()
631 {
632 TWCR|
633 =(1<<TWINT)|
634 (1<<TWEA);
635 //RTC
636 date read
637 while((TWCR &
638 0x80)==0x00);
639 return
640 bcdtochar(TWDR
641 );
642 }
643
644 int month_rw()
645 {
646 TWCR|
647 =(1<<TWINT)|
648 (1<<TWEA);
649 //RTC
650 month read
651 while((TWCR &
652 0x80)==0x00);
653 return
654 bcdtochar(TWDR
655 );
656 }
657
658 int yr_rw()
659 {
Coala
CEEE 6111 03 001 NE 38
Mod Coala № Docum. Semnatura Data
660 TWCR|
661 =(1<<TWINT);
662 /
663 /RTC year read
664 TWCR&=(~(1<<
665 TWEA));
666 while((TWCR &
667 0x80)==0x00);
668 return
669 bcdtochar(TWDR
670 );
671 }
672
673 void device()
674 {
675 TWDR=0xD0;
676
677 //RTC write
678 (slave address)
679 TWCR=(1<<TWI
680 NT)|(1<<TWEN);
681 while(!
682 (TWCR&(1<<TW
683 INT)));
684
685 TWDR=0x00;
686
687 // word address
688 write
689 TWCR=(1<<TWI
690 NT)|(1<<TWEN);
691 while(!
692 (TWCR&(1<<TW
693 INT)));
694 }
695
696 void
697 RTCTimeSet()
698 {
699 RTC_start();
700 device();
701 sec_init(0);
702 min_init(0x47);
703 hr_init(0x22);
704 day_init(0x03);
705 date_init(0x23);
Coala
CEEE 6111 03 001 NE 39
Mod Coala № Docum. Semnatura Data
706 month_init(0x08);
707 yr_init(0x19);
708 RTC_stp();
709 }
710
711 void show()
712 {
713 char tem[20];
714 sprintf(tem,"%d",t
715 imeStamp[0]);
716 lcdwrite(0x80,CM
717 D);
718 lcdprint("Time:");
719 lcdprint(tem);
720 lcdwrite(':',DATA
721 );
722 sprintf(tem,"%d",t
723 imeStamp[1]);
724 lcdprint(tem);
725 lcdwrite(':',DATA
726 );
727 sprintf(tem,"%d",t
728 imeStamp[2]);
729 lcdprint(tem);
730 lcdprint(" ");
731 lcdwrite(0xc0,CM
732 D);
733 lcdprint("Date:");
734 sprintf(tem,"%d",t
735 imeStamp[3]);
736 lcdprint(tem);
737 lcdwrite('/',DATA
738 );
739 sprintf(tem,"%d",t
740 imeStamp[4]);
741 lcdprint(tem);
742 lcdwrite('/',DATA
743 );
744 sprintf(tem,"%d",t
745 imeStamp[5]);
746 lcdprint("20");
747 if(timeStamp[5]<1
748 0)
749 lcdwrite('0',DATA
750 );
751 lcdprint(tem);
Coala
CEEE 6111 03 001 NE 40
Mod Coala № Docum. Semnatura Data
752 lcdprint(" ");
753 }
754
755 void RTC()
756 {
757 RTC_read();
758 timeStamp[2]=sec
759 _rw();
760 timeStamp[1]=mi
761 n_rw();
762 timeStamp[0]=hr_
763 rw();
764 day=day_rd();
765 timeStamp[3]=dat
766 e_rw();
767 timeStamp[4]=mo
768 nth_rw();
769 timeStamp[5]=yr_
770 rw();
771 RTC_stp();
772 show();
773 }
774
775 int
776 eeprom_write(uns
777 igned int
778 add,unsigned char
779 data)
780 {
781 while(EECR&(1<
782 <EEWE));
783 EEAR=add;
784 EEDR=data;
785 EECR|
786 =(1<<EEMWE);
787 EECR|
788 =(1<<EEWE);
789 return 0;
790 }
791 char
792 eeprom_read(unsi
793 gned int add)
794 {
795 while(EECR &
796 (1<<EEWE));
797 EEAR=add;
Coala
CEEE 6111 03 001 NE 41
Mod Coala № Docum. Semnatura Data
798 EECR|
799 =(1<<EERE);
800 return EEDR;
801 }
802
803 void saveData(int
804 id)
805 {
806 uint cIndex=
807 eeprom_read(id);
808 if(cIndex == 0)
809 cIndex=1;
810 uint cAddress=
811 (cIndex*6) + (id-
812 1)*48;
813
814 for(int i=0;i<6;i+
815 +)
816 eeprom_write(cA
817 ddress+i,timeStam
818 p[i]);
819 eeprom_write(id,c
820 Index+1);
821 }
822
823 int
824 sendcmd2fp(char
825 *pack, int len)
826 {
827 int res=ERROR;
828 serialFlush();
829 ind=0;
830 _delay_ms(100);
831 for(int
832 i=0;i<len;i++)
833 {
834 serialwrite(*(pa
835 ck+i));
836 }
837 _delay_ms(1000)
838 ;
839 if(flag == 1)
840 {
if(buf[0] ==
0xEF && buf[1]
== 0x01)
Coala
CEEE 6111 03 001 NE 42
Mod Coala № Docum. Semnatura Data
{
if(buf[6] ==
0x07) // ack
{
if(buf[9] ==
0)
{
uint
data_len= buf[7];
data_len<<
=8;
data_len|
=buf[8];
f
o
r
(
i
n
t
i
=
0
;
i
<
d
a
t
a
_
l
e
Coala
CEEE 6111 03 001 NE 43
Mod Coala № Docum. Semnatura Data
n
;
i
+
+
)
d
a
t
a
[
i
]
=
0
;
//data=(cha
r
*)calloc(data_len,
sizeof(data));
for(int
i=0;i<data_len-
2;i++)
{
data[i]=
buf[10+i];
}
res=PASS;
}
Coala
CEEE 6111 03 001 NE 44
Mod Coala № Docum. Semnatura Data
else
{
res=ERROR;
}
}
}
ind=0;
flag=0;
return res;
}
return res;
}
uint getId()
{
uint id=0;
lcdwrite(1,
CMD);
while(1)
{
//check(id);
if(up == LOW)
{
id++;
buzzer(200);
}
else if(down ==
LOW)
{
id--;
if(id==0)
id=0;
buzzer(200);
}
else if(ok ==
LOW)
{
buzzer(200);
return id;
}
lcdwrite(0x80,
CMD);
(void)sprintf((char
*)buf1,"Enter Id:
%d ",id);
Coala
CEEE 6111 03 001 NE 45
Mod Coala № Docum. Semnatura Data
lcdprint((char
*)buf1);
_delay_ms(200);
}
}
void
matchFinger()
{
// lcdwrite(1,C
MD);
// lcdprint("Pla
ce Finger");
// lcdwrite(192,
CMD);
// _delay_ms(2
000);
if(!
sendcmd2fp((char
*)&f_detect[0],siz
eof(f_detect)))
{
if(!
sendcmd2fp((char
*)&f_imz2ch1[0],
sizeof(f_imz2ch1)
))
{
if(!
sendcmd2fp((char
*)&f_search[0],siz
eof(f_search)))
{
LEDHigh;
buzzer(200);
uint id=
data[0];
id<<=8;
id+=data[1];
uint
score=data[2];
sco
re<<=8;
sco
Coala
CEEE 6111 03 001 NE 46
Mod Coala № Docum. Semnatura Data
re+=data[3];
(void)sp
rintf((char
*)buf1,"Id: %d",
(int)id);
lcdwrite
(1,CMD);
lcdprint(
(char *)buf1);
saveData(id);
_delay_ms(1000);
lcdwrite(1,CMD);
lcdprint("Attendan
ce");
lcdwrite(192,CM
D);
lcdprint("Register
ed");
_delay_ms(2000);
LEDLow;
}
else
{
LEDHigh;
lcdwrite
(1,CMD);
lcdprint(
"Not Found");
buzzer(5000);
LEDLow;
}
}
else
{
LEDHigh;
lcdwrite(1,CMD);
lcdprint("Not
Found");
buzzer(2000);
LEDLow;
}
}
Coala
CEEE 6111 03 001 NE 47
Mod Coala № Docum. Semnatura Data
else
{
//lcdprint("No
Finger");
}
//_delay_ms(2
00);
}
void enrolFinger()
{
lcdwrite(1,CMD);
lcdprint("Enroll
Finger");
_delay_ms(2000);
lcdwrite(1,CMD);
lcdprint("Place
Finger");
lcdwrite(192,CM
D);
_delay_ms(1000);
for(int i=0;i<3;i+
+)
{
if(!
sendcmd2fp((char
*)&f_detect[0],siz
eof(f_detect)))
{
//lcdprint("Finger
Detected");
//__delay_ms(100
0);
if(!
sendcmd2fp((char
*)&f_imz2ch1[0],
sizeof(f_imz2ch1)
Coala
CEEE 6111 03 001 NE 48
Mod Coala № Docum. Semnatura Data
))
{
lcdwrite(192,CM
D);
lcdprint("F
inger Detected");
_delay_ms
(1000);
// lcdwrite(
1,CMD);
// lcdprint("
Tamplate 1");
// __delay_
ms(1000);
lcdwrite(1,
CMD);
lcdprint("P
lace Finger");
lcdwrite(1
92,CMD);
lcdprint("
Again ");
_delay_ms
(2000);
if(!
sendcmd2fp((char
*)&f_detect[0],siz
eof(f_detect)))
{
if(!
sendcmd2fp((char
*)&f_imz2ch2[0],
sizeof(f_imz2ch2)
))
{
lcdwr
ite(1,CMD);
lcdpri
nt("Finger
Detected");
_dela
y_ms(1000);
if(!
sendcmd2fp((char
*)&f_createModel
[0],sizeof(f_create
Coala
CEEE 6111 03 001 NE 49
Mod Coala № Docum. Semnatura Data
Model)))
{
id=
getId();
f_st
oreModel[11]=
(id>>8) & 0xff;
f_st
oreModel[12]= id
& 0xff;
f_st
oreModel[14]=
14+id;
if(!
sendcmd2fp((char
*)&f_storeModel[
0],sizeof(f_storeM
odel)))
{
buzzer(200);
l
cdwrite(1,CMD);
l
cdprint("Finger
Stored");
(
void)sprintf((char
*)buf1,"Id:%d",
(int)id);
l
cdwrite(192,CMD
);
l
cdprint((char
*)buf1);
_
delay_ms(1000);
}
else
{
l
cdwrite(1,CMD);
l
cdprint("Finger
Not Stored");
Coala
CEEE 6111 03 001 NE 50
Mod Coala № Docum. Semnatura Data
buzzer(3000);
}
}
else
lcd
print("Error");
}
else
lcdprint("Error");
}
else
i=2;
}
break;
}
if(i==2)
{
lcdwrite(0xc0,CM
D);
lcdprint("No
Finger");
}
}
_delay_ms(2000);
}
void
deleteFinger()
{
id=getId();
f_delete[10]=id>>
8 & 0xff;
f_delete[11]=id
& 0xff;
f_delete[14]=(21+
id)>>8 & 0xff;
f_delete[15]=(21+
id) & 0xff;
if(!
sendcmd2fp(&f_d
elete[0],sizeof(f_d
Coala
CEEE 6111 03 001 NE 51
Mod Coala № Docum. Semnatura Data
elete)))
{
lcdwrite(1,CMD);
sprintf((char
*)buf1,"Finger ID
%d ",id);
lcdprint((char
*)buf1);
lcdwrite(192,
CMD);
lcdprint("Deleted
Success");
}
else
{
lcdwrite(1,CMD);
lcdprint("Error");
}
_delay_ms(2000);
}
void lcdinst()
{
lcdwrite(0x80,
CMD);
lcdprint("1-
Enroll Finger");
lcdwrite(0xc0,
CMD);
lcdprint("2-
delete Finger");
_delay_ms(10);
}
void buzzer(uint t)
{
BUZHigh;
for(int i=0;i<t;i+
+)
_delay_ms(1);
Coala
CEEE 6111 03 001 NE 52
Mod Coala № Docum. Semnatura Data
BUZLow;
}
/*function to show
attendence data on
serial moinitor
using softserial
pin PD7*/
void
ShowAttendance()
{
char buf[128];
lcdwrite(1,CMD);
lcdprint("Downlo
ding....");
SerialSoftPrintln("
Attendance
Record");
SerialSoftPrintln("
");
SerialSoftPrintln("
S.No ID1
ID2 Id3
ID4 I
D5 ");
//serialprintln("Att
endance Record");
//serialprintln(" ");
//serialprintln("S.
No ID1
ID2
Id3
ID4
ID5");
for(int
cIndex=1;cIndex<
=8;cIndex++)
{
sprintf((char
*)buf,"%d "
"%d:%d:%d %d/
%d/20%d "
"%d:%d:%d %d/
%d/20%d "
"%d:%d:%d %d/
Coala
CEEE 6111 03 001 NE 53
Mod Coala № Docum. Semnatura Data
%d/20%d "
"%d:%d:%d %d/
%d/20%d "
"%d:%d:%d %d/
%d/20%d ",
cIndex,
eeprom_read((cIn
dex*6)),eeprom_r
ead((cIndex*6)+1)
,eeprom_read((cIn
dex*6)+2),eeprom
_read((cIndex*6)+
3),
eeprom_read((cIn
dex*6)+4),eeprom
_read((cIndex*6)+
5),
eeprom_read((cIn
dex*6)+48),eepro
m_read((cIndex*6
)+1+48),eeprom_r
ead((cIndex*6)+2
+48),
eeprom_read((cIn
dex*6)+3+48),eep
rom_read((cIndex
*6)+4+48),eepro
m_read((cIndex*6
)+5+48),
eeprom_read((cIn
dex*6)+96),eepro
m_read((cIndex*6
)+1+96),eeprom_r
ead((cIndex*6)+2
+96),
eeprom_read((cIn
dex*6)+3+96),eep
rom_read((cIndex
*6)+4+96),eepro
m_read((cIndex*6
)+5+96),
eeprom_read((cIn
dex*6)+144),eepr
om_read((cIndex*
6)+1+144),eepro
m_read((cIndex*6
Coala
CEEE 6111 03 001 NE 54
Mod Coala № Docum. Semnatura Data
)+2+144),
eeprom_read((cIn
dex*6)+3+144),ee
prom_read((cInde
x*6)+4+144),eepr
om_read((cIndex*
6)+5+144),eepro
m_read((cIndex*6
)+192),eeprom_re
ad((cIndex*6)+1+
192),eeprom_read
((cIndex*6)+2+19
2),
eeprom_read((cIn
dex*6)+3+192),ee
prom_read((cInde
x*6)+4+192),eepr
om_read((cIndex*
6)+5+192));
SerialSoftPrintln(
buf);
//serialprintln(buf)
;
}
lcdwrite(192,CM
D);
lcdprint("Done");
_delay_ms(2000);
}
void
DeleteRecord()
{
lcdwrite(1,CMD);
lcdprint("Please
Wait...");
for(int
i=0;i<255;i++)
eeprom_write(i,10
);
_delay_ms(2000);
lcdwrite(1,CMD);
lcdprint("Record
Deleted");
lcdwrite(192,CM
Coala
CEEE 6111 03 001 NE 55
Mod Coala № Docum. Semnatura Data
D);
lcdprint("Successf
ully");
_delay_ms(2000);
}
int main()
{
LEDdir= 0xFF;
LEDPort=0x03;
KeyPORTdir=0x
F0;
KeyPORT=0x0F
;
LCDPORTDIR=
0xFF;
DDRD+=1<<7;
PORTD+=1<<7;
serialbegin();
SerialSoftPrint("
Circuit Digest");
//serialprint("Sad
dam Khan");
buzzer(2000);
lcdbegin();
lcdprint("Attenda
nce Systm");
lcdwrite(192,CM
D);
lcdprint("Using
AVR and FP");
_delay_ms(2000)
;
if(down ==
LOW)
ShowAttendance
();
else if(delet ==
LOW)
DeleteRecord();
ind=0;
while(sendcmd2f
Coala
CEEE 6111 03 001 NE 56
Mod Coala № Docum. Semnatura Data
p((char
*)&passPack[0],si
zeof(passPack)))
{
lcdwrite(1,CMD);
lcdprint("FP
Not Found");
_delay_ms(2000);
ind=0;
}
lcdwrite(1,CMD)
;
lcdprint("FP
Found");
_delay_ms(1000)
;
lcdinst();
_delay_ms(2000)
;
lcdwrite(1,CMD)
;
//RTCTimeSet();
while(1)
{
RTC();
// if(match ==
LOW)
// {
matchFinger();
// }
if(enrol ==
LOW)
{
buzzer(200);
enrolFinger()
;
_delay_ms(2
000);
// lcdinst();
}
else if(delet ==
Coala
CEEE 6111 03 001 NE 57
Mod Coala № Docum. Semnatura Data
LOW)
{
buzzer(200);
getId();
deleteFinger(
);
_delay_ms(1
000);
}
}
return 0;
}
Coala
CEEE 6111 03 001 NE 58
Mod Coala № Docum. Semnatura Data
Biliografie:
1. https://www.tme.eu/ro/details/atmega32-16au/gama-avr-8-bit/microchip-atmel/
2. https://www.tme.eu/Document/71c294f20b46f518abf4e142f75ea1d5/BC546_50.pdf
3. http://vega.unitbv.ro/~romanca/Carte-MpMc%202015/Microprocesoare%20si
%20microcontrolere-978-606-19-0683-3.pdf
4. https://components101.com/7805-voltage-regulator-ic-pinout-datasheet
5. https://market.yandex.ru/catalog--aksessuary/54530/list?text=Адаптер%20USB
%20AM%20-%20DC%20jack%203.5%20mm%20(Greenconnect%20GCR-
50644)%20(черный)&cvredirect=3&track=srch_ddl&cpa=0&onstock=1&hid=91070&
local-offers-first=0
Coala
CEEE 6111 03 001 NE 59
Mod Coala № Docum. Semnatura Data
Concluzie: Înlucrării de diplomă, am creat un dispozitiv de acces al controlului
prin intermediul cititorului de amprente, pe baza microprocesorului Atmega 32.
Dispozitivul dat are un areal larg de utilizare putând fi implementat oriunde este necesar
de un control al
Coala
CEEE 6111 03 001 NE 60
Mod Coala № Docum. Semnatura Data