Professional Documents
Culture Documents
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial
Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data
EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write
protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code
protection off)
#include <xc.h>
#define _XTAL_FREQ 8000000
//napisati program u kojem se LED dioda pali i gasi
void main() {
TRISB=0X00;
while(1) {
RB0=1;
__delay_ms(100);
RB0=0;
__delay_ms(100);
}
}
1
Slika 1
Slika 2
2
2. Upravljanje sa tri LED diode
#pragma config FOSC = HS
#pragma config WDTE = ON
#pragma config PWRTE = OFF
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
#include <stdio.h>
#include <stdlib.h>
int main(){
TRISB = 0x00;
TRISC = 0x00;
while(1){
RB1 = 1;
RB2 = 0;
RC1 = 0;
__delay_ms(2000);
RB1 = 0;
RB2 = 1;
RC1 = 0;
__delay_ms(2000);
RB1 = 0;
RB2 = 0;
RC1 = 1;
__delay_ms(2000);
RB1 = 1;
RB2 = 1;
RC1 = 0;
__delay_ms(2000);
RB1 = 0;
RB2 = 1;
RC1 = 1;
__delay_ms(2000);
RB1 = 1;
RB2 = 1;
RC1 = 1;
3
__delay_ms(2000);
}
return 0;
}
Slika 3
4
3. Napisati program i izvršiti simulaciju tako da mikrokontroler PIC16F877A
upravlja LED diodom putem push buttona. Ako push button nije pritisut, LED
dioda je ugašena, ako se drži aktivnim duže od 2 sekunde, LED dioda se upali.
5
Slika 4
6
4. Napisati kôd i izvršiti simulaciju u kojoj pushbutton mijenja stanje dvije LED
diode. Ako je pritisnut, upaljena je jedna, ako se ugasi, ugasi se ta i upali se druga.
if(RC1==0){
RB1 = 0;
RB5 = 1;
}
}
else
{
RB1 = 1;
RB5 = 0;
}
}
return 0;
}
7
Slika 5
8
5. Napisati program i izvršiti simulaciju u Proteusu za program koji će koristiti dva
push buttona za međusobno uključivanje i isključivanje LED diode.
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial
Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data
EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write
protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code
protection off)
#include <xc.h>
#define _XTAL_FREQ 8000000
void main() {
TRISB=0;
TRISC=1;
while(1) {
if(RC0=1) {
if(RC1=1) RB0=0; else RB0=1;
RC1=0;
}
else if(RC1=1) {
if(RC0=1)RB0=0; else RB0=1;
}
else {
RC0=RC1=0;
RB0=0;
}
}
}
9
Slika 6
10
6. Napisati program i izvršiti simulaciju tako da sedmosegmentni display kada je
sklopka aktivna broji od 0 do 9. Kada se sklopka deaktivira, brojač stane.
unsigned char const SEGMENT_MAP[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D,
0x07, 0x7F, 0x6F};
void main(void){
TRISD = 0x00;
TRISC = 0x01;
char broj = 0;
while(1){
if(!PORTC){
__delay_ms(250);
broj++;
if (broj>9)
broj = 0;
}
else{
PORTD = (SEGMENT_MAP[broj]);
}
}
}
11
Slika 7
12
7. Napisati program i izvršti simulaciju u kojoj se servomotor rotira od -90°do 90°.
void servoRotiraj0(){
unsigned int i;
for(i=0; i<50; i++){
RB0 = 1;
__delay_us(800);
RB0 = 0;
__delay_us(19200);
}
}
void servoRotiraj90(){
unsigned int i;
for(i=0; i<50; i++){
RB0 = 1;
__delay_us(1500);
RB0 = 0;
__delay_us(18500);
}
}
void servoRotiraj180(){
unsigned int i;
for(i=0; i<50; i++){
RB0 = 1;
__delay_us(2200);
RB0 = 0;
__delay_us(17800);
}
}
void main() {
TRISB = 0;
13
do{
servoRotiraj0();
__delay_ms(180);
servoRotiraj180();
__delay_ms(180);
}
while(1);
Slika 8
14
8. Napisati program kojim se pali jedna dioda kad se motor obrće u jednu, a druga
kad se obrće u drugu stranu
void ServoRotiraj0() {
unsigned int i;
for(i=0;i<50;i++) {
RB0=1;
__delay_us(800);
RB0=0;
__delay_us(19200);
}
}
void ServoRotiraj90() {
unsigned int i;
for(i=0;i<50;i++) {
RB0=1;
__delay_us(1500);
RB0=0;
__delay_us(18500);
}
}
void ServoRotiraj180() {
unsigned int i;
for(i=0;i<50;i++) {
RB0=1;
__delay_us(2200);
RB0=0;
__delay_us(17800);
}
}
void main () {
15
TRISB=0;
do {
ServoRotiraj0();
RB2=1;
RB1=0;
__delay_ms(150);
ServoRotiraj180();
RB1=1;
RB2=0;
__delay_ms(150);
}
while(1);
}
Slika 9
Slika 10
16
9. Koristiti virtualni terminal za komunikaciju s korisnikom kako bi njegovom
naredbom upalili ili ugasili LED diodu.
void Initializing_UART(void){
TRISC6 = 0;
TRISC7 = 1;
SPBRG =((_XTAL_FREQ/16)/Baud_rate)-1;
BRGH = 1;
SYNC = 0;
SPEN = 1;
TXEN = 1;
CREN = 1;
TX9 = 0;
RX9 = 0;
}
char UART_get_char() {
if(CERR){
CREN = 0;
CREN = 1;
}
while(!RCIF);
return RCREG;
}
17
Slika 11
18
10. Upotrebom LCD 16*2 displeja ispisati željenu poruku kao string, kao pomjerački
tekst lijevo-desno i kao karakter.
Header file:
void Lcd_Port(char a){
if(a&1)
D4=1;
else D4=0;
if(a&2)
D5=1;
else D5=0;
if(a&4)
D6=1;
else D6=0;
if(a&8)
D7=1;
else D7=0;
}
void Lcd_Clear(){
Lcd_Cmd(0);
Lcd_Cmd(1);
}
void Lcd_Init(){
19
Lcd_Port(0x00);
__delay_ms(20);
Lcd_Cmd(0x03);
__delay_ms(5);
Lcd_Cmd(0x03);
__delay_ms(11);
Lcd_Cmd(0x03);
Lcd_Cmd(0x02);
Lcd_Cmd(0x02);
Lcd_Cmd(0x08);
Lcd_Cmd(0x00);
Lcd_Cmd(0x0C);
Lcd_Cmd(0x00);
Lcd_Cmd(0x06);
void Lcd_Shift_Right(){
Lcd_Cmd(0x01);
Lcd_Cmd(0x0C);
}
void Lcd_Shift_Left(){
Lcd_Cmd(0x01);
Lcd_Cmd(0x08);
}
20
Glavni file:
#define _XTAL_FREQ 8000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include <xc.h>
#include "header_fajl.h"
int main(){
unsigned int a;
TRISD = 0x00;
Lcd_Init();
while(1){
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Na vjezbama ");
Lcd_Set_Cursor(2,3);
Lcd_Write_String("iz digitalnih ");
__delay_ms(2000);
Lcd_Clear();
Lcd_Set_Cursor(1,3);
Lcd_Write_String("Snijeg pada ");
Lcd_Set_Cursor(2,1);
Lcd_Write_String("Lalalalalal ");
__delay_ms(2000);
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Vidimo se");
21
for (a = 0; a<15; a++){
__delay_ms(300);
Lcd_Shift_Right();
}
Lcd_Clear();
Lcd_Set_Cursor(2,7);
Lcd_Write_Char('E');
Lcd_Write_Char('0');
__delay_ms(2000);
}
return 0;
}
Slika 12
22
UART (Universal Asynchronous Receiver / Trainsmitter) je univerzalni serijski prijemnik i
odašiljač. Predstavlja serijsko komunikacijsko sučelje koje predstavlja duplex komunikaciju
između dva uređaja. Koristi dvije podatkovne linije za slanje podataka TX i dvije podatkovne
linije za primanje podataka RX. Uzemljenje, odnosno referenca uređaja mora biti zajednička.
Asihnrono komunikacijsko sučelje znači da nije potrebno slati clock zajedno sa podacima kao
što se mora u sinhronoj komunikaciji.
23
(ne mogu se praviti u istom projektu)
char UART_TX_Empty(){
return TRMT;
}
24
//PROVJERA JESU LI PODACI PRIMLJENI
char UART_Data_Ready(){
return RCIF;
}
25
MAIN FILE OD MASTERA
void main(){
TRISB = 0xFF; // PORT B INPUT
nRBPU = 0;
UART_Init(9600);
do{
UART_Write(PORTB);
__delay_ms(100);
}
while(1);
}
26
MAIN FILE OD SLAVEA
void main(){
TRISB = 0x00; // PORT B INPUT
UART_Init(9600);
do{
if(UART_Data_Ready())
PORTB = UART_Read();
__delay_ms(100);
}
while(1);
}
27
Slika 13
28
12. Koriste se 4 sedmosegmentna displeja za prikaz minute: sekunde (00:00). Kada se
odbroji do vremena 00:59 treba da se upali zelena led dioda, te da se na displeju
ispiše to vrijeme i poruka: Vrijeme je pod kontrolom! Kada se odbroji do vremena
01:59 treba da se upali žuta led lioda, te da se na LCD dispelu ispiše to vrijeme i
poruka Vrijeme je na granici! Kada se odbroji do vremena 02:15 treba se upaliti
crvena led dioda, te da se ispiše Vrijeme je van dozvoljenih granica!
if(a & 2)
D5 = 1;
else
D5 = 0;
if(a & 4)
D6 = 1;
else
D6 = 0;
if(a & 8)
D7 = 1;
else
D7 = 0;
Lcd_Clear(){
Lcd_Cmd(0);
Lcd_Cmd(1);
}
if (a == 1){
temp = 0x80 + b - 1;
z = temp >> 4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}else if(a == 2){
temp = 0xC0 + b - 1;
z = temp >> 4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}
}
void Lcd_Init(){
Lcd_Port(0x00);
__delay_ms(20);
Lcd_Cmd(0x03);
__delay_ms(5);
30
Lcd_Cmd(0x03);
__delay_ms(11);
Lcd_Cmd(0x03);
Lcd_Cmd(0x02);
Lcd_Cmd(0x02);
Lcd_Cmd(0x08);
Lcd_Cmd(0x00);
Lcd_Cmd(0x0C);
Lcd_Cmd(0x00);
Lcd_Cmd(0x06);
}
31
void Lcd_Shift_Right(){
Lcd_Cmd(0x01);
Lcd_Cmd(0x0C);
}
void Lcd_Shift_Left(){
Lcd_Cmd(0x01);
Lcd_Cmd(0x08);
}
MAIN FILE:
#define _XTAL_FREQ 200000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include <xc.h>
#include "led.h"
void main(){
int jedinice, desetice, stotice, hiljade;
int br1 = 0, br2 = 0, k =0;
CMCON = 0x07;
ADCON1 = 0x06;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
Lcd_Init();
RC6 = 0;
RC5 = 0;
RC4 = 0;
while(1){
if(br1 == 58){
RC6 = 1;
RC5 = 0;
RC4 = 0;
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("00:59 Vrijeme je");
Lcd_Set_Cursor(2,1);
Lcd_Write_String("pod kontrolom!");
33
}
if(br1 == 158){
RC6 = 0;
RC5 = 1;
RC4 = 0;
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("01:59 Vrijeme");
Lcd_Set_Cursor(2,1);
Lcd_Write_String("je na granici!");
}
if(br1 == 215){
RC6 = 0;
RC5 = 0;
RC4 = 1;
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Vrijeme je izvan");
Lcd_Set_Cursor(2,1);
Lcd_Write_String("dozvoljene granice!");
34
RC4 = 0;
Lcd_Clear();
}
if(br1 == 9999){
br1 = 0;
}
else{
br1++;
br2++;
}
//desetice
desetice = Vrijednost((br1 / 10) %10);
PORTB = desetice;
RC2 = 0;
__delay_ms(10);
RC2 = 1;
//stotice
stotice = Vrijednost((br1 / 100) %10);
PORTB = stotice;
RC1 = 0;
__delay_ms(10);
RC1 = 1;
35
//shiljade
hiljade = Vrijednost((br1 / 1000) %10);
PORTB = hiljade;
RC0 = 0;
__delay_ms(10);
RC0 = 1;
}
}
}
Slika 14
36
13. Napisati program koji će izvršavati sljedeće naredbe upotrebnom virtualne mašine
koja omogućava:
a) prva radnja je rotacija servo motora za +-180
b) druga radnja je pale se 3 led diode redoslijedom sve tri upaljene, prve dvije upaljene, prva
upaljena, druge dvije upaljene treća upaljena
c) treća radnja je brojač od 0 do 4, zatim od 2 do 8 i od 9 do 3 prikazati na 7-segmentnom
displeju
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
unsigned int Segment_Display[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F};
//Servo motor
void ServoRotate0(){
unsigned int i;
for(i = 0; i<50; i++){
RB0 = 1;
__delay_us(800);
RB0 = 0;
__delay_us(19200);
}
}
void ServoRotate90(){
unsigned int i;
for(i = 0; i<50; i++){
RB0 = 1;
__delay_us(1500);
RB0 = 0;
37
__delay_us(18500);
}
}
void ServoRotate180(){
unsigned int i;
for(i = 0; i<50; i++){
RB0 = 1;
__delay_us(2200);
RB0 = 0;
__delay_us(17800);
}
}
void opcija1() {
ServoRotate0();
__delay_ms(130);
ServoRotate180();
__delay_ms(130);
}
void opcija2(){
RB1 = 1;
RB2 = 1;
RB3 = 1;
__delay_ms(1000);
RB1 = 1;
RB2 = 1;
RB3 = 0;
__delay_ms(1000);
RB1 = 1;
RB2 = 0;
RB3 = 0;
__delay_ms(1000);
RB1 = 0;
RB2 = 1;
RB3 = 1;
__delay_ms(1000);
RB1 = 0;
RB2 = 0;
RB3 = 1;
__delay_ms(1000);
RB1 = 0;
RB2 = 0;
RB3 = 0;
}
void opcija3(){
char broj = 0;
for(int i = 0; i < 5; i++){
38
broj = i;
PORTD = (Segment_Display[broj]);
__delay_ms(500);
}
void Initialize_UART(void){
TRISC6 = 0; //TX pin -izlazni
TRISC7 = 1; //RX pin - ulazni
//Asihrnoski serijskiport
SYNC = 0;
SPEN = 1;
TX9 = 0;
RX9 = 0;
char UART_get_char(){
if(OERR){ //provjerava error
CREN = 0; //ako ima error - restart
CREN = 1; //isto
}
while(!RCIF); //zaustavlja pr dok se RX ne oslobodi
return RCREG;
39
}
//MENU
void menuShow(){
UART_send_string("\r");
UART_send_string("Odaberite opciju 1, 2 ili 3... \r");
}
void main(void){
int vrijednost;
TRISB = 0;
TRISD = 0;
Initialize_UART();
menuShow();
do{
vrijednost = UART_get_char();
switch(vrijednost) {
menuShow();
case '1':
UART_send_string("Odabrali ste opciju 1 \r");
UART_send_string("Okretanje servo motora \r ");
opcija1();
break;
case '2':
UART_send_string("Odabrali ste opciju 2 \r");
UART_send_string("Led diode \r ");
opcija2();
break;
case '3':
UART_send_string("Odabrali ste opciju 3 \r");
UART_send_string("7 segmentni displej \r ");
opcija3();
break;
}
}
while(vrijednost != 4);
}
40
Slika 15
Slika 16
41
14. Napisati program koji ce omoguciti A/D konverziju uzimajuci analogne podatke iz
potenciometra i prikazujuci stanje na izlazu koristeci 10 led dioda. Takodjer
koristiti voltmetar koji ce citati vrijednost sa potenciometra.
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial
Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data
EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write
protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code
protection off)
#include <xc.h>
#define _XTAL_FREQ 8000000
void main() {
//Postavimo portove
TRISA=0XFF;
TRISB=0X00;
TRISC=0X00;
//POSTAVLJAMO CHANNEL
ADCON0bits.CHS0=0;
ADCON0bits.CHS1=0;
42
ADCON0bits.CHS2=0;
//PORT KONFIGURACIJA
ADCON1bits.PCFG0=0;
ADCON1bits.PCFG1=0;
ADCON1bits.PCFG2=0;
ADCON1bits.PCFG3=0;
//SWITCH NA ADC
ADCON0bits.ADON=1;
while(1) {
if(ADCON0bits.GO_DONE==0) { //nakon konverzije acon0bits.go_Done ce biti jednak
nuli
ADCON0bits.GO_DONE=1; //postavimo na 1 za pocetak sljedece konverzije
PORTB=ADRESL; //Donjih 8 bitova od ADC result
PORTD=ADRESH;//High i 2 bita od ADC result
}
};
}
Slika 17
43