Tải bản đầy đủ (.pdf) (30 trang)

Giải đề kĩ thuật vi xử lý lập trình trên MPlabx pic16f887

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.57 MB, 30 trang )

BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP.HCM
KHOA CÔNG NGHỆ ĐIỆN TỬ

TIỂU LUẬN KẾT THÚC HỌC PHẦN
HỌC KỲ I, 2021-2022.
TÊN HỌC PHẦN:

Họ và tên sinh viên:
Mã số sinh viên:
Tên lớp học phần:
Mã lớp học phần:
Email liên hệ:
Số điện thoại:
Giảng viên giảng dạy:

Tống Duy Thắng
17074901

Kĩ thuật vi xử lý
420300086907

0797166319
Ong Mẫu Dũng

Tp HCM, tháng 12 năm 2021.


Câu 1: Thiết kế đèn giao thông ngã tư với quy tắc đèn xanh 20s, đèn vàng 5s, đèn đỏ
10s.
1. Tính tốn dữ liệu


Ngun tắc đèn giao thơng tại ngã tư Việt Nam: khi chiều A sáng xanh thì chiều B đỏ,
mỗi cột đèn không sáng 2 màu đèn cùng thời điểm. Trước khi đèn xanh chuyển sang đỏ
sẽ có đèn vàng sáng trong khoảng thời gian ngắn.
❖ Xét 2 cột đèn khác phương hướng với thời gian đèn đỏ sáng được xác định:
𝑡đỏ = 𝑡𝑥𝑎𝑛ℎ + 𝑡𝑣à𝑛𝑔
Xem dữ liệu bài toán dành cho cột đèn 1, thời gian sáng của các đèn cột 2 được xác định
như trong bảng trạng thái sau
Trạng thái

Xanh 1

Vàng 1

Đỏ 1

Xanh 2

Vàng 2

Đỏ 2

𝑇𝑑𝑒𝑙𝑎𝑦 (𝑠)

TT1

1

0

0


0

0

1

20

TT2

0

1

0

0

0

1

5

TT3

0

0


1

1

0

0

x

TT4

0

0

1

0

1

0

y

Vậy để đèn đỏ cột 1 vẫn sáng trong 10s
 𝑡đỏ1 = 𝑥 + 𝑦 = 10𝑠 với 𝑥˃𝑦
 Có thể chọn 𝑥 = 7𝑠, 𝑦 = 3𝑠

Linh kiện sử dụng là PIC16F887 có điện áp hoạt động từ 2-5.5V, LED được dùng để mơ
phỏng cho đèn giao thơng có điện áp hoạt động 2.2V với dòng 𝐼 = 10𝑚𝐴.
❖ Xác định điện áp rơi trên điện trở hạn dòng:
𝑉𝑅 = 𝑉𝑝𝑖𝑐 − 𝑉𝑙𝑒𝑑
 𝑉𝑅 = 5.5 − 2.2 = 3.3𝑉
 𝑅=

𝑉𝑅
𝐼

=

3.3
10∗10−3

= 330𝛺


2. Sơ đồ nguyên lý

❖ Nguyên lý hoạt động:
Khi cấp nguồn cho PIC các pin RC1:RC3 và RD1:RD3 lần lượt điều khiển các LED
D1:D3 và D4:D6 với thời gian delay định sẵn.


3. Lưu đồ giải thuật


4. Code chương trình
// PIC16F887 Configuration Bit Settings

// 'C' source line config statements
// CONFIG1
#pragma config FOSC = HS
// Oscillator Selection bits (HS oscillator: High-speed
crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF
// Watchdog Timer Enable bit (WDT disabled and
can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF
// Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON
// RE3/MCLR pin function select bit (RE3/MCLR
pin function is MCLR)
#pragma config CP = OFF
// Code Protection bit (Program memory code protection
is disabled)
#pragma config CPD = OFF
// Data Code Protection bit (Data memory code
protection is disabled)
#pragma config BOREN = OFF
// Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF
// Internal External Switchover bit (Internal/External
Switchover mode is disabled)
#pragma config FCMEN = OFF
// Fail-Safe Clock Monitor Enabled bit (Fail-Safe
Clock Monitor is disabled)
#pragma config LVP = OFF
// Low Voltage Programming Enable bit (RB3 pin has
digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset
set to 4.0V)
#pragma config WRT = OFF
// Flash Program Memory Self Write Enable bits
(Write protection off)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#define _XTAL_FREQ 4000000
void delay(int n)
{
while(n--)
{
__delay_ms(1);
}


}
void init_port()
{
ANSEL= ANSELH= 0X00;
TRISC= 0X00; TRISD= 0X00;
PORTC= 0X00; PORTD= 0X00;
}
void main()
{
init_port();
int i;
while(1)

{
RC1=1; // DEN XANH 1 SANG
RD3=1; // DEN DO 2 SANG
for(i=0;i<40;i++) // DELAY 20s
{
delay(500); // Delay 500ms
}
RC1=0; // DEN XANH 1 TAT
RC2=1; // DEN VANG 1 SANG
for(i=0;i<10;i++) // DELAY 5s
{
delay(500); // Delay 500ms
}
RC2=0; // DEN VANG 1 TAT
RD3=0; // DEN DO 2 TAT
RD1=1; // DEN XANH 2 SANG
RC3=1; // DEN DO 1 SANG
for(i=0;i<14;i++) // DELAY 7s
{
delay(500); // Delay 500ms
}
RD1=0; // DEN XANH 2 TAT
RD2=1; // DEN VANG 2 SANG
for(i=0;i<6;i++) // DELAY 3s
{
delay(500); // Delay 500ms
}
PORTC= PORTD=0X00; // RESET CAC PIN
}
}



5. Kết quả mơ phỏng

Hình 1: Cột đèn 1 sáng xanh và cột đèn 2 sáng đỏ trong 20s. Lúc này người tham gia
giao thơng phía đèn xanh 1 có thể chạy thẳng hoặc rẽ vào phía cột đèn 1.

Hình 2: Cột đèn 1 chuyển sang đèn vàng và giữ trạng thái cột đèn 2 trong vòng 5s.
Người tham gia phía cột 1 phải chạy chậm chuẩn bị dừng cho phía cột đèn 2 chuẩn bị
chạy


Hình 3: Cột đèn 1 chuyển sang đèn đỏ cấm chạy và cho phép phía cột đèn 2 được
phép chạy trong 7s.

Hình 4: Cột đèn 2 chuyển sang vàng trong 3s chuẩn bị trở về trạng thái như
hình 1.


Câu 2: Thiết kế mạch điều khiển động cơ 48V với 8 cấp độ điều tốc. Cho biết mạch có 2
nút nhấn dùng cho việc tăng và giảm D% trong điều chế PWM ngõ ra; và 8 cấp độ điều
tốc tương ứng từ 12% đến 96%. Sử dụng thêm 3 led đơn để hiển thị 08 cấp độ theo mã
nhị phân.
1. Tính tốn dữ liệu
Các linh kiện sử dụng gồm: PIC16F887 có nguồn cung cấp 5V, LED đơn có V=2.2V,
mơ phỏng motor có điện áp 48V(R=12Ω), IC L293D với điện áp hoạt động 5V để điều
khiển tốc độ động cơ.
Dòng điện cần để cung cấp cho motor:
𝐼𝑚𝑜𝑡𝑜𝑟 =


𝑉𝑚𝑜𝑡𝑜𝑟 48
=
= 4𝐴
𝑅
12

Bỏ qua tổn hao trên tải ta chọn điện áp cấp cho motor là 48V

❖ Xác định D% cho 6 cấp độ còn lại:
Cấp độ

D1

D2

D3

D4

D5

D6

D7

D8

Giá trị(%)

12


x

x

x

x

x

x

96

𝛥𝐷% =

𝐷8 % − 𝐷1 % 0.96 − 0.12
=
= 0.12
8−1
7

 Vậy mỗi cấp độ sẽ tăng thêm 12% chu kì PWM.
D

D1

D2


D3

D4

D5

D6

D7

D8

Giá trị(%)

12

24

36

48

60

72

84

96


Hai nút nhấn được sử dụng để tăng, giảm D% lần lượt là RB0(UP) và RB1(DOWN).
Các pin được dùng làm tín hiệu ngõ ra cho 3 led đơn là RD0, RD1, RD2
RD0
0
1
0
1
0
1
0
1

RD1
0
0
1
1
0
0
1
1

RD2
0
0
0
0
1
1
1

1

CẤP ĐỘ
1
2
3
4
5
6
7
8


❖ Xác định điện áp rơi trên điện trở hạn dòng cho các led:
𝑉𝑅 = 𝑉𝑝𝑖𝑐 − 𝑉𝑙𝑒𝑑
 𝑉𝑅 = 5.5 − 2.2 = 3.3𝑉
 𝑅=

𝑉𝑅
𝐼

=

3.3
10∗10−3

= 330𝛺

❖ Xác định giá trị điều chế PWM
Cho tần số PWM là 5kHz

1

 𝑇𝑝𝑤𝑚 =

𝑓𝑝𝑤𝑚

=

1
5𝑘𝐻𝑧

= 0.2𝑚𝑠

Tần số XTAL là 4MHz
 𝑇𝑜𝑠𝑐 =

1
𝑓𝑜𝑠𝑐

=

1
4𝑀𝐻𝑧

= 0.25𝑢𝑠

Dùng Timer 2 điều chế PWM tại chân RC1(CCP2) ta có:
𝑇𝑝𝑤𝑚 = (𝑃𝑅2 + 1) ∗ 4 ∗ 𝑇𝑜𝑠𝑐 ∗ 𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒
0.2𝑚𝑠 = (𝑃𝑅2 + 1) ∗ 4 ∗ 0.25𝑢𝑠 ∗ 𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒
200 = (𝑃𝑅2 + 1) ∗ 𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒

Với điều kiện 0 ≤ 𝑃𝑅2 ≤ 255 , nếu PR2=255
 𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒 =

200
256

= 0.78

Vậy ta chọn Prescale = 1
T2CKPS1

T2CKPS0

Prescaler

𝑃𝑟𝑒𝑠𝑇2

0

0

1:1

1

0

1

1:4


4

1

1

1:16

16

 𝑃𝑅2 =

200
1

− 1 = 199


Chu kì D% được xác định:
𝐷% =

𝑇𝑜𝑛
𝑇𝑜𝑛
=
𝑇𝑜𝑛 + 𝑇𝑜𝑓𝑓 𝑇𝑝𝑤𝑚

Ta có 𝐷1 % = 12%
 𝑇𝑜𝑛1 = 𝐷1 % ∗ 𝑇𝑝𝑤𝑚 = 0.12 ∗ 0.2𝑚𝑠 = 24𝑢𝑠
𝐷8 % = 96%

 𝑇𝑜𝑛8 = 𝐷8 % ∗ 𝑇𝑝𝑤𝑚 = 0.96 ∗ 0.2𝑚𝑠 = 192𝑢𝑠
Tương tự ta có 𝑇𝑜𝑛 (𝑃𝑢𝑙𝑠𝑒 𝑤𝑖𝑑𝑡ℎ) cho các cấp độ còn lại
D1

D2

D3

D4

D5

D6

D7

D8

D%

12

24

36

48

60


72

84

96

𝑇𝑜𝑛 (𝑢𝑠)

24

48

72

96

120

144

168

192

Biểu thức độ rộng xung PWM(Pulse Width):
𝑇𝑜𝑛 = 𝑃𝑊 = (𝐶𝐶𝑃𝑅2𝐿: 𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >) ∗ 𝑇𝑂𝑆𝐶 ∗ 𝑃𝑟𝑒𝑠𝑇2
𝐶𝐶𝑃𝑅2𝐿 = (𝐶𝐶𝑃𝑅2𝐿: 𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >)/4
𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >= (𝐶𝐶𝑃𝑅2𝐿: 𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >)%4
(𝐶𝐶𝑃𝑅2𝐿: 𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >) : Con số có giá trị 10 bit (gồm 8 bit MSB trong thanh
ghi CCPR2L và 2 bit LSB trong thanh ghi CCP2CON).

0 ≤ (𝐶𝐶𝑃𝑅2𝐿: 𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >) ≤ 1023
Biểu thức tỉ số chu kì nhiệm vụ(Duty Cycle Ratio):
𝐷𝐶𝑅 =

(𝐶𝐶𝑃𝑅2𝐿: 𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >)
∗ 100%
4 ∗ (𝑃𝑅2 + 1)

Đặt 𝐴 = (𝐶𝐶𝑃𝑅2𝐿: 𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >)
 𝐷𝐶𝑅 =

𝐴
4∗200

∗ 100% =

𝐴
800

 𝐴 = 𝐷𝐶𝑅 ∗ 800
Từ đó ta có được:
𝐶𝐶𝑃𝑅2𝐿 =

𝐴
= 𝐷𝐶𝑅 ∗ 200; 𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >= 𝐴%4 = (𝐷𝐶𝑅 ∗ 800)%4
4


❖ Xác định giá trị bit cho thanh ghi:
Thanh ghi CCP2CON

|_||_||𝐶𝐶𝑃2𝑋 ||𝐶𝐶𝑃2𝑌||𝐶𝐶𝑃2𝑀3||𝐶𝐶𝑃2𝑀2||𝐶𝐶𝑃2𝑀1||𝐶𝐶𝑃2𝑀0|
Để hoạt động chế độ PWM
 CCP2M3=CCP2M2=1;
❖ Xác định CCP2M1 và CCP2M0 dựa vào Duty cylce ratio
Duty cycle

CCP2M1

CCP2M0

Chú thích

x.0

0

0

Khi chu kì nhiệm vụ là

x.25

0

1

phân số thập phân

x.5


1

0

x.75

1

1

Nhận thấy các D% là số nguyên nên CCP2M1=CCP2M0=0.
❖ Xác định giá trị bit cho |𝐶𝐶𝑃2𝑋 ||𝐶𝐶𝑃2𝑌|
Giá trị dư

0

1

2

3

𝐶𝐶𝑃2𝑋

0

0

1


1

𝐶𝐶𝑃2𝑋

0

1

0

1

𝐶𝐶𝑃2𝐶𝑂𝑁 < 5: 4 >= 𝐴%4 = (𝐷𝐶𝑅 ∗ 800)%4
Thay các D% vào biểu thức trên và tìm giá trị dư:
D1

D2

D3

D4

D5

D6

D7

D8


D%

12

24

36

48

60

72

84

96

Số dư

0

0

0

0

0


0

0

0

 CCP2X = CCP2Y = 0
Vậy thanh ghi 𝐶𝐶𝑃2𝐶𝑂𝑁 = 0𝑥0𝐶


2. Sơ đồ nguyên lý

❖ Nguyên lý hoạt động:
Khi cấp nguồn cho PIC16F887 động cơ bắt đầu chạy với cấp độ 1 và 3 led tắt. Khi nhấn
nút RB0(UP) làm tăng D% lên 12% và đèn sáng nhị phân theo mô tả trên. Nhấn nút
RB1(DOWN) giảm D% xuống 12% mỗi lần nhấn.
IC L293D nhận tín hiệu từ pin RC1(CCP2) để điều chỉnh tốc độ động cơ.


3. Lưu đồ giải thuật

4. Code chương trình

// PIC16F887 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = HS


// Oscillator Selection bits (HS oscillator: High-speed

crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF

// Watchdog Timer Enable bit (WDT disabled and

can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF

// Power-up Timer Enable bit (PWRT disabled)


#pragma config MCLRE = ON

// RE3/MCLR pin function select bit (RE3/MCLR

pin function is MCLR)
#pragma config CP = OFF

// Code Protection bit (Program memory code protection

is disabled)
#pragma config CPD = OFF

// Data Code Protection bit (Data memory code

protection is disabled)
#pragma config BOREN = OFF
#pragma config IESO = OFF


// Brown Out Reset Selection bits (BOR disabled)
// Internal External Switchover bit (Internal/External

Switchover mode is disabled)
#pragma config FCMEN = OFF

// Fail-Safe Clock Monitor Enabled bit (Fail-Safe

Clock Monitor is disabled)
#pragma config LVP = OFF

// Low Voltage Programming Enable bit (RB3 pin has

digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset
set to 4.0V)
#pragma config WRT = OFF

// Flash Program Memory Self Write Enable bits

(Write protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#define _XTAL_FREQ 4000000

#define UP RB0
#define DOWN RB1

unsigned char led[]={ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; // KHAI BAO
MA LED


void init_port()
{
ANSEL=ANSELH=0X00;
TRISD=0X00; // PORTD HOAT DONG VOI CHE DO OUTPUT
TRISC1=0; // RC1 LA OUTPUT
TRISB=0X03;
nRBPU=0; WPUB=0X03; // KICH HOAT DIEN TRO KEO LEN CHO RB0, RB1
INTEDG=0; // CHO PHEP NGAT CANH XUONG
RBIE=1; // CHO PHEP NGAT
}

void init_PWM()
{
CCP2CON=0X0C; // CHO PHEP PIC HOAT DONG PWM MODE
T2CKPS1=0; T2CKPS0=0; // PRESCALER 1:1
TOUTPS3=0; TOUTPS2=0; TOUTPS1=0; TOUTPS0=0; // POSTSCALER 1:1
TMR2=0; // NAP GIA TRI DAU
PR2=199; // CHU KI PWM
TMR2IF=0; // XOA CO BAO NGAT
TMR2ON=1; // CHO PHEP TIMER 2 CHAY
TMR2IE=1; // CHO PHEP NGAT TIMER 2
if(!TMR2IF)
{

TMR2IF=0; // XOA CO BAO NGAT KHI TANG LEN 1
}

}

void main()
{
init_port(); // GOI CHUONG TRINH CON


init_PWM();
float DCR=0.12; // KHAI BAO SO THUC CHO DCR
int count=0; // KHAI BAO BIEN COUNT
while(1) // VONG LAP VO HAN
{
CCPR2L=DCR*200; // XAC DINH GIA TRI CCP2L
PORTD=led[count]; // HIEN THI LED QUA MOI CAP DO
if(!UP)
{
__delay_ms(20);
while(!UP);
if(DCR<0.96)
{
count++; // TANG GIA TRI LEN 1
DCR=DCR+0.12; //TANG 12% CHO DUTY CYLCE RATIO
}
}
if(!DOWN)
{
__delay_ms(20);

while(!DOWN);
if(DCR>0.12)
{
count--; // GIAM 1 GIA TRI CHO BIEN COUNT
DCR=DCR-0.12; // GIAM 12% DUTY CYCLE RATIO
}
}
}
}


5. Kết quả mơ phỏng

Hình 1: Motor chạy chậm với cấp độ đầu(D%=0.12) và các LED tắt, dạng sóng đúng
với 𝑇𝑜𝑛 =24us(10us/div).

Hình 2: Sau khi nhấn tăng D% động cơ quay nhanh hơn so với lúc đầu và led D1 sáng
dạng sóng có 𝑇𝑜𝑛 =48us(10us/div).


Hình 3: Khi tăng đến 96% tất cả các led sáng và tốc độ động cơ đã quay nhanh nhất có
thể với 𝑇𝑜𝑛 =192us(20us/div).

Hình 4: Nhấn nút RB1(DOWN) động cơ quay chậm hơn so với khi D=96% và led D1 tắt
như trong bảng mô tả trạng thái led.


Câu 3: Thiết kế mạch phát hiện 10 nút nhấn, sử dụng 1 ngõ vào chân AN0. Vị trí nút
nhấn thể hiện qua 10 LED.
1. Tính tốn dữ liệu

❖ Xác định điện áp rơi trên điện trở hạn dòng cho các led:
𝑉𝑅 = 𝑉𝑝𝑖𝑐 − 𝑉𝑙𝑒𝑑
 𝑉𝑅 = 5.5 − 2.2 = 3.3𝑉
 𝑅=

𝑉𝑅
𝐼

=

3.3
10∗10−3

= 330𝛺

❖ Xác định độ chênh điện áp các cấp
Chọn cấp điện áp tại nút 1 và nút 10: 𝑉1 = 0.5𝑉, 𝑉10 = 5𝑉
Điện áp chênh lệch cho mỗi nút nhấn:
𝑉10 − 𝑉1
= 0.5
10 − 1

𝛥𝑉 =
❖ Xác định giá trị ADC
Điện áp tham chiếu: Vref-; Vref+

Điện áp phân giải (mức điện áp nhỏ nhất giữa 2 mức liền kề):
Q =

Vref + − Vref −

2 −1
10

=

5000mV − 0mV
= 4.8876(mV )
1023

Giá trị 10bit ADC_out khi có tín hiệu Analog vào (Vin)
 Vin 
ADC _ out = 
 =(
 Q 10

)2

Giá trị 𝐴𝐷𝐶𝑜𝑢𝑡 tại nút 1: 𝐴1 =

0.5𝑉
4.8876𝑚𝐴

= 102.299

Xác định giá trị điện trở cho mỗi nút nhấn:
Nút nhấn

1

2


3

4

5

6

7

8

9

10

V

𝑉1

𝑉2

𝑉3

𝑉4

𝑉5

𝑉6


𝑉7

𝑉8

𝑉9

𝑉10

𝑅𝑥

𝑅2

𝑅3

𝑅4

𝑅5

𝑅6

𝑅7

𝑅8

𝑅9

𝑅10

𝑅11


LED

D1

D2

D3

D4

D5

D6

D7

D8

D9

D10

Với điện trở kéo lên cố định có 𝑅1 = 10𝑘𝛺, theo phương pháp cầu phân áp, điện trở cho
mỗi cấp điện áp được xác định như sau:


𝑉1 = 𝑉𝑐𝑐 ∗

𝑅2

𝑅1+ 𝑅2

 0.5 = 5 ∗

𝑅2
10𝑘𝛺+𝑅2

 𝑅2 = 1111.11𝛺
Tương tự với các bước tính tốn trên ta có giá trị cho tất cả các nút nhấn như sau:
Nút nhấn

1

2

3

4

5

6

7

8

9

10


V

0.5

1

1.5

2

2.5

3

3.5

4

4.5

5V

ADC

102

204

307


409

511

613

716

818

920

1023

R(Ω)

1,111k

2,5k

4,285k

6,666k

10k

15k

23,33k


40k

90k

❖ Cấu hình PORT
Các port được sử dụng để hiển thi trạng thái LED là PORTD và RE0, RE1.
Cấu hình ANALOG theo đề bài:
ASEL=|𝐴𝑁6||𝐴𝑁5||𝐴𝑁4||𝐴𝑁3||𝐴𝑁2||𝐴𝑁1||𝐴𝑁0|
ASELH=|𝐴𝑁13||𝐴𝑁12||𝐴𝑁11||𝐴𝑁10||𝐴𝑁9||𝐴𝑁8||𝐴𝑁7|
 ASELH=0x00; ASEL=0x01

1M
(max)


2. Sơ đồ nguyên lý

❖ Nguyên lý hoạt động:
Ngay khi cấp nguồn cho PIC và khơng có sự tác động tất cả led tắt. Sau khi nhấn nhả
một vị trí nút nhấn bất kì sẽ làm thay đổi giá trị điện áp và LED tại vị trí tương ứng sẽ
sáng.
Tại 1 thời điểm chỉ có 1 đèn sáng và giữ nguyên trạng thái đó cho đến khi một nút nhấn
khác được nhấn.


3. Lưu đồ giải thuật


4. Code chương trình


// PIC16F887 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = HS

// Oscillator Selection bits (HS oscillator: High-speed

crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF

// Watchdog Timer Enable bit (WDT disabled and

can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF

// Power-up Timer Enable bit (PWRT disabled)

#pragma config MCLRE = ON

// RE3/MCLR pin function select bit (RE3/MCLR

pin function is MCLR)
#pragma config CP = OFF

// Code Protection bit (Program memory code protection

is disabled)

#pragma config CPD = OFF

// Data Code Protection bit (Data memory code

protection is disabled)
#pragma config BOREN = OFF
#pragma config IESO = OFF

// Brown Out Reset Selection bits (BOR disabled)
// Internal External Switchover bit (Internal/External

Switchover mode is disabled)
#pragma config FCMEN = OFF

// Fail-Safe Clock Monitor Enabled bit (Fail-Safe

Clock Monitor is disabled)
#pragma config LVP = OFF

// Low Voltage Programming Enable bit (RB3 pin has

digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset
set to 4.0V)
#pragma config WRT = OFF
(Write protection off)

// Flash Program Memory Self Write Enable bits



// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define _XTAL_FREQ 4000000

void init_port()
{
ANSEL=0X01; // CHAN AN0 LA ANALOG
ANSELH=0X00;
TRISD=0X00; PORTD=0X00; // PORTD LA OUTPUT
TRISE=0X00; PORTE=0X00; // PORTE LA OUTPUT
}
void ADC_init()
{
TRISA0=1;
ADCS1=1; ADCS0=1; // CHON GIA TRI XUNG CLOCK NOI BO
CHS0=0; CHS1=0;

CHS2=0;

CHS3=0; // CHAN AN0 LA NGO VAO

ADON=1; // CHO PHEP AD POWER UP
VCFG0=0; VCFG1=0; // CHON DIEN AP THAM CHIEU THEO NGUON VCC
ADFM=0; // DICH SANG TRAI
}

unsigned long Read_ADC(void)
{
__delay_us(20);
GO_nDONE=1;
while(GO_nDONE);
return((((unsigned int)ADRESH)<<8)|ADRESL);
}


×