You are on page 1of 6

Câu 1 và câu 2 là các câu yêu cầu sử dụng ngắt ngoài.

Các vấn đề cần chú ý bao gồm:

- Copy khung chương trình có sử dụng ngắt;

- Ở chương trình chính, ngoài các lệnh khởi tạo với TRIS, ADCON1, cần viết:

+ Lệnh làm cho GIE=1;

+ Lệnh làm cho INTxIE=1 (x=0,1,2 tùy theo đề bài yêu cầu nối KEY với chân INT0,1 hoặc 2)

+ Lệnh làm cho INTEDGx=0 nếu thiết kế mạch điện gây ngắt bằng sườn âm hoặc INTEDGx=1 nếu
thiết kế mạch điện gây ngắt bằng sườn dương;

+ Các lệnh theo đề bài (LED nhấp nháy liên tục)

- Ở CTCPVN cần viết:

+ Lệnh xóa cờ ngắt (INTxIF=0)

+ Các lệnh theo đề bài.

Câu 1:

Thuật toán:

CTC

Begin
CTCPVN

Khởi tạo:
RC2,RC4: Ra số; RB1: vào số Xóa cờ ngắt (INT1IF)
Cho phép ngắt INT1 LED1 tắt

LED1 sáng LED2 sáng/tắt 10 lần


Trễ 1s
LED1 tắt
Trễ 1s
Về CTC

ĐK kết S
thúc?

End
Mạch điện:

U1
2 15 D1
3
RA0/AN0/C1IN- RC0/T1OSO/T13CKI
16
R2
RA1/AN1/C2IN- RC1/T1OSI/CCP2B
4 17
5
RA2/AN2/C2IN+/VREF-/CVREF RC2/CCP1/P1A
18
560 D2
R1 6
RA3/AN3/C1IN+/VREF+ RC3/SCK/SCL
23
R3 LED-BLUE
RA4/T0CKI/C1OUT RC4/SDI/SDA
7 24
10k RA5/AN4/SS/HLVDIN/C2OUT RC5/SDO 560
14 25 LED-BLUE
RA6/OSC2/CLKO RC6/TX/CK
13 26
RA7/OSC1/CLKI RC7/RX/DT
33 19
RB0/AN12/FLT0/INT0 RD0/PSP0
34 20
RB1/AN10/INT1 RD1/PSP1
35 21
RB2/AN8/INT2 RD2/PSP2
36 22
RB3/AN9/CCP2A RD3/PSP3
37 27
RB4/KBI0/AN11 RD4/PSP4
38 28
RB5/KBI1/PGM RD5/PSP5/P1B
39 29
RB6/KBI2/PGC RD6/PSP6/P1C
40 30
RB7/KBI3/PGD RD7/PSP7/P1D
8
RE0/RD/AN5
9
RE1/WR/AN6
10
RE2/CS/AN7
1
RE3/MCLR/VPP
PIC18F4520

Chương trình:

//khai báo thu vi?n

#include<p18f4520.h>

#include<stdio.h>

#include<delays.h>

//c?u hình

#pragma config OSC=HS

#pragma config WDT=OFF

#pragma config MCLRE=ON

#pragma config PBADEN=OFF

#define LED1 PORTCbits.RC1

#define LED2 PORTCbits.RC4

//khai báo tên chuong trình con ph?c v? ng?t (CTCPVN)

void ngat_ngoai(void);

//Ði?m d?t chuong trình ph?c v? ng?t có m?c uu tiên cao (vector 0008H)

#pragma code uu_tien_cao = 0x08

// N?u là chuong trình ph?c v? ng?t có m?c uu tiên th?p (vector 0018H):

// #pragma code uu_tien_thap = 0x18


//Tên CTCPVN uu tiên cao (tùy ch?n)

void ngat_cao(void)

ngat_ngoai(); //g?i d?n CTCPVN

//Ði?m vi?t CTCPVN

#pragma code

#pragma interrupt ngat_ngoai

void ngat_ngoai(void)

//Noi dung cua CTCPVN

unsigned int i;

INTCON3bits.INT1IF=0; // xoa co ngat INT1

LED1=0;

for (i=0; i<10; ++i)

LED2=1; Delay10KTCYx(100);

LED2=0; Delay10KTCYx(100);

//Chuong trình chính

void main()

ADCON1=0x0f; // vao ra so

TRISB=0b00000111; // RB0,1,2/INT0,1,2 co chieu vao

TRISC=0b00000000;

INTCONbits.GIE=1;

INTCON3bits.INT1IE=1; //Cho phep ngat INT1

INTCON2bits.INTEDG1=0; //ngat bang suon am

LED2=0;
while(1)

LED1 = 1; //LED1 sang

Delay10KTCYx(100);

LED1 = 0; //LED1 tat

Delay10KTCYx(100);

Câu 2:

CTC

Begin
CTCPVN

x=0 (x là số lần nhấn KEY)


RC4-RC7: Ra số; RB0: vào số Xóa cờ ngắt (INT1IF)
Cho phép ngắt INT0 x=x+1

LED4 sáng LED4-6 sáng/tắt theo giá trị


Trễ 1s của x
LED4 tắt
Trễ 1s S
x>=7?
Đ
S Dừng đếm bằng cách xóa
ĐK kết
bit cho phép ngắt (INT0IE)
thúc?

Đ
Về CTC
End
Chương trình:

//khai báo thu vi?n

#include<p18f4520.h>

#include<stdio.h>

#include<delays.h>

//c?u hình

#pragma config OSC=HS

#pragma config WDT=OFF

#pragma config MCLRE=ON

#pragma config PBADEN=OFF

#define LED4 PORTCbits.RC7

unsigned int x=0; //bien chua so lan nhan PB

//khai báo tên chuong trình con ph?c v? ng?t (CTCPVN)

void ngat_ngoai(void);

//Ði?m d?t chuong trình ph?c v? ng?t có m?c uu tiên cao (vector 0008H)

#pragma code uu_tien_cao = 0x08

void ngat_cao(void)

ngat_ngoai(); //g?i d?n CTCPVN

//Ði?m vi?t CTCPVN

#pragma code

#pragma interrupt ngat_ngoai

void ngat_ngoai(void)

INTCONbits.INT0IF=0;

x=x+1;

PORTC=x<<4; //dich trai 4 lan de ve v? tri cua RC4-RC6

if (x>=7) //nhan qua 7 lan


INTCONbits.INT0IE=0; //cam ngat INT0 (khong dem nua)

void main()

//Kh?i t?o các thanh ghi liên quan

ADCON1=0x0F;

TRISB=0b00000111;

TRISC=0b00000000;

PORTC=0b00000000; //ban dau chua nhan PB, LED1-LED3 tat

INTCONbits.GIE=1;

INTCONbits.INT0IE=1;

INTCON2bits.INTEDG0=0;

while(1)

LED4=1; Delay10KTCYx(100);

LED4=0; Delay10KTCYx(100);

You might also like