Upload
rockwellsiemens
View
48
Download
8
Embed Size (px)
DESCRIPTION
tài liệu học lập trình PIC18 hay cho những ai muốn tìm hiểu về vi điều khiển PIC
Citation preview
CÔNG TY CỔ PHẦN TỰ ĐỘNG HOÁ
T©n Ph¸t AUTOMATION Địa chỉ: Km11 + 500 – Quốc lộ 1A – Thanh Trì – Hà Nội
Điện thoại: 084 - 4 - 62883181/ Fax: 084 - 4 - 62883180Website: www.tpa.com.vn - Email: [email protected]
TÀI LIỆU HƯỚNG DẪN SỬ DỤNG
BỘ THÍ NGHIỆM PIC18F4550mP.A003
Hà Nội, tháng 01-2011
BỘ THÍ NGHIỆM PIC18F4550mP.A003
ISO 9001:2008
CÁC NỘI DUNG ĐƯỢC TRÌNH BÀY
☺ Giới thiệu bộ thí nghiệm☺ Vi điều khiển PIC18F4550☺ Giới thiệu MPLAB☺ Các bài thí nghiệm trên bộ thí nghiệm
PIC18F4550☺ Sơ đô nguyên ly PIC18F4550 TRAINNING
KIT
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
1 Giới thiệu bộ thí nghiệm
Bộ thí nghiệm PIC được sản xuất đạt tiêu chuẩn quản lý chất lượng ISO 9001: 2008 và ISO 14001-2004 trong lĩnh vực thiết bị dạy nghề và sản xuất mô hình học cụ phục vụ dạy nghề. Hộp gá lắp thiết bị và hộp gá lắp module bằng nhựa, đảm bảo tính thẩm mỹ và độ bềnn theo thời gian.
Bộ thí nghiệm vi xử lý PIC sử dụng chip PIC 18F4550, có thể lập trình sử dụng hệ thống công tắc nhấn và chuyển mạch, giao tiếp với máy tính qua cổng COM, USB, RS 232, RS 485, có khả năng điều khiển được nhiều đối tượng công nghiệp. Môi trường phát triển phần mềm chính hãng MBLAB IDE v8.00 hoặc cao hơn.
1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 3
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
2 Vi điều khiển PIC18F4550
2.1 Sơ đồ chân của PIC18F550
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 4
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
2.2 Chức năng các chân của PIC18F550Bảng: Bảng mô tả các chức năng từng chân của PIC18F4550
Chân Hướng Mô tả chức năng và các đặc tính
AN0- AN12
I 13 kênh Input, Analog, AN6 và AN7 còn dùng cho lập trình dữ liệu và xung clock vào.
Avdd Nguồn dương cho môđun tương tự.
Avss Nguồn Ground cho modul tương tự
CLKI I Lối vào của xung Clock ngoài, luôn kết hợp với chân OSC1.
CLKO O Lối ra của bộ dao động tinh thể, nối với tinh thể hoặc bộ cộng hưởng trong chế độ dao động thạch anh. Giống như CKLO trong chế độ RC hoặc EC. Luôn kết hợp với chân chức năng OSC2.
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 5
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
CN0-CN7, CN17-CN18
I Khai báo thay đổi ở lối vào.
COFS I/O Cổng giao tiếp chuyển đổi dữ liệu đồng bộ khung.
CSCK I/O Cổng giao tiếp chuyển đổi dữ liệu Clock vào ra nối tiếp.
CSDI I Lối vào dữ liệu nối tiếp
CSDO O Lối ra dữ liệu nối tiếp.
C1RX I Cổng nhận bus CAN1
C1TX O Cổng phát bus CAN1
EMUD I/O Cổng vào ra dữ liệu kênh truyền thông sơ cấp của ICD.
EMUC I/O Vào ra xung nhịp kênh sơ cấp.
EMUD1 I/O Vào ra dữ liệu kênh thứ cấp.
EMUC1EMUD2 EMUC2EMUD3 EMUC3
I/O …
IC1, IC2, IC7, IC8
I Các cổng vào của môđun Capture.
INT0, INT1, INT2
I. Các ngắt ngoài.
LVDIN I Cổng vào phát hiện sụt thế.
/MCLR I Power, chân Reset, mức tích cực thấp
OSC1 I Lối vào bộ giao động tinh thể.
OSC2 O Bộ đệm Trigger Schmitt được sử dụng khi cấu hình trong chế độ RC. Lối ra bộ dao động tinh thể.
PGD I/O Vào ra dữ liệu của ICSP.
PGC I Lối vào Clock của ICSP.
RA11 I/O Port A.
RB0- I/O PortB.
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 6
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
RB12
RC13- RC15
I/O PortC.
RD0-RD3, RD8, RD9
I/O PortD.
RF0-RF5 I/O PortF.
SCK1 I/O Vào ra Clock đồng bộ của khối SPI1.
SDI1 I Lối vào dữ liêu của khối SPI1.
SDO1 O Lối ra dữ liệu của SPI1.
SS1 I Slaver đồng bộ.
SCL I/O Vào ra Clock nối tiếp của I2C.
SDA I/O Vào ra Data nối tiếp đồng bộ của I2C.
SOSCO O Lối ra bộ dao động tinh thể công suất thấp 32Khz
SOSCI I Lối vào bộ dao động 32Khz
T1CK I Lối vào xung Clock ngoài của Timer1.
T2CK I Lối vào xung Clock ngoài của Timer2.
U1RX I Cổng nhận khối UART1
U1TX O Cổng phát khối UART1
U1ARX I Cổng nhận mở rộng khối UART1.
U1ATX O Cổng phát mở rộng khối UART1.
VDD Chân nguồn Vdd
VSS Chân nguồn Vss
Vref+ I Lối vào Vref+ (cao) thế analog chuẩn
Vref- I Lối vào Vref- (thấp) thế chuẩn.
3 Giới thiệu MPLAB
3.1 Môi trường phát triển MPLAB
- Các phần mềm cần có để lập trình cho PIC18F4550:
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 7
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
MPLAB IDE 8.5
HT PIC 8.05
MPLAB C18.
Hướng dẫn tạo 1 project trên MPLAB C18.
Kích đúp chuột vào biểu tượng MPLAB trên Desktop hoặc theo cách sau: Start -> All Programs -> Microchip -> MPLAB IDE v8.5 -> MPLAB IDE.
Từ thanh Menu, click chọn tab Project -> Project Wirazd…
Cửa sổ Welcome hiện lên và chọn Next.
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 8
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Chọn PIC cần sử dụng tại khung Device >>PIC18F4550 Click Next:
Chọn tool Microchip C18 Toolsuite tại Active Toolsuite. Chọn MPLAB C18 C Compiler tại Tollsuite contents. Nếu lập trình bằng assembly thì chon Active Toolsuite theo hình sau:
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 9
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Ở đây chúng ta lập trình bằng C18.
Click Next
Chọn Browse…. Để chọn thư mục lưu project.
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 10
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Đánh vào tên Project muốn tạo. Save, sau đó chọn Next thì hiện ra của sổ như sau:
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 11
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Đây là nơi để add thư viện cho project. Nên add hết các file cần thiết cho việc lập trình trước khi bắt đầu viết
chương trình gồm file .lib và file .lkr. Nếu viết chương trình cho con chip nào thì ta lấy file .lib và file .lkr của chíp tương ứng, như hình trên đang sử dụng chip 18f4550. Click Next.
Click Finish. Sẽ được một project như hình sau:
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 12
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Một project đơn giản nhất phải gồm có 2 thành phần Source files và Hearder Files. Thư mục Source files chứa file text *.asm hoặc file *.c chứa code lâp trình. Thư mục Hearder Files chứa file *.h hoặc *.INC: file có sẵn của microchip. User khai báo dùng loại chip gì => add vào thư mục này.
ADD source file: Click chọn New trên toolbar:
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 13
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Save as file với tên KeyLed.c
Từ Source Files click chuột phải chọn Add files :
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 14
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Chọn File từ đường dẫn trực tiếp của project, sau đó chọn Files “KeyLed.c” và Open :
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 15
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Chúng sẽ soạn thảo chương trình khi ấn 4 phím ấn lần lượt thì 4 Led lần lượt sáng tương ứng.
Chương trình code :#include <p18f4550.h>
//SW101 = 0;SW201 = 1;SW301 = 1;SW601 = 0;
#pragma config FOSC = HSPLL_HS // Using 20 MHz crystal with PLL
#pragma config PLLDIV = 5 // Divide by 5 to provide the 96 MHz //PLL with 4 MHz input
#pragma config CPUDIV = OSC2_PLL3 // Divide 96 MHz PLL output by //2 to get 48 MHz //system clock
#pragma config USBDIV = 2 // USB clock comes from 96 MHz PLL output / 2
#pragma config FCMEN = OFF // Disable Fail-Safe Clock Monitor
#pragma config IESO = OFF // Disable Oscillator Switchover mode
#pragma config PWRT = OFF // Disable Power-up timer
#pragma config BOR = OFF // Disable Brown-out reset
#pragma config VREGEN = ON // Use internal USB 3.3V voltage regulator
#pragma config WDT = OFF // Disable Watchdog timer
#pragma config MCLRE = ON // Enable MCLR Enable
#pragma config LVP = OFF // Disable low voltage ICSP
#pragma config ICPRT = OFF // Disable dedicated programming port (44-//pin devices)
#pragma config CP0 = OFF // Disable code protection
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 16
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
#define KEY0 PORTDbits.RD0 //Define LEDPin as PORT D Pin 0
#define KEY1 PORTDbits.RD1 //Define LEDPin as PORT D Pin 1
#define KEY2 PORTDbits.RD2 //Define LEDPin as PORT D Pin 2
#define KEY3 PORTDbits.RD3 //Define LEDPin as PORT D Pin 3
#define LED0 LATDbits.LATD4
#define LED1 LATDbits.LATD5
#define LED2 LATDbits.LATD6
#define LED3 LATDbits.LATD7
void delay(unsigned int d);
void initPort();
void display(unsigned int dat);
//======================================================//
const unsigned char Led[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//=======================================================//
void main()
{
unsigned char flag = 0, i = 0;
unsigned char n,m,time;
initPort();
time = 5;
flag = 1;
while(1)
{
if(flag)
{
LED0 = 1; LED1 = LED2 = LED3 = 0;
for(m=0;m<time;m++) delay(0xfff);
LED1 = 1; LED0 = LED2 = LED3 = 0;
for(m=0;m<time;m++) delay(0xfff);
LED2 = 1; LED1 = LED0 = LED3 = 0;
for(m=0;m<time;m++) delay(0xfff);
LED3 = 1; LED1 = LED2 = LED0 = 0;
for(m=0;m<time;m++) delay(0xfff);
}
else {LED3 = LED1 = LED2 = LED0 = 0;}
if(KEY0==0) if(time<255) time+=2; else time = 255;
if(KEY1==0) if(time>2) time-=2; else time = 1;
if(KEY2==0) flag = 0;
if(KEY3==0) flag = 1;
/*
if(KEY0==0) LED0 = 0; else LED0 = 1;
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 17
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
if(KEY1==0) LED1 = 0; else LED1 = 1;
if(KEY2==0) LED2 = 0; else LED2 = 1;
if(KEY3==0) LED3 = 0; else LED3 = 1;
delay(0xfff);*/
}
}
void initPort()
{
ADCON1 = 0xFFFF; //Config digital I/O all
TRISD = 0x0F;
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISE = 0;
}
void delay(unsigned int d)
{
while(d--);
}
Ở trên ta thấy có 2 phần trong hàm main :Phần 1 :
if(flag){
LED0 = 1; LED1 = LED2 = LED3 = 0;for(m=0;m<time;m++) delay(0xfff);LED1 = 1; LED0 = LED2 = LED3 = 0;for(m=0;m<time;m++) delay(0xfff);LED2 = 1; LED1 = LED0 = LED3 = 0;for(m=0;m<time;m++) delay(0xfff);LED3 = 1; LED1 = LED2 = LED0 = 0;for(m=0;m<time;m++) delay(0xfff);
}else {LED3 = LED1 = LED2 = LED0 = 0;}
if(KEY0==0) if(time<255) time+=2; else time = 255;if(KEY1==0) if(time>2) time-=2; else time = 1;if(KEY2==0) flag = 0;
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 18
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
if(KEY3==0) flag = 1;Phần này có tác dụng : ban đầu các Led sẽ sáng lần lượt nếu :
- Nhấn KEY0 thì Led nhấp nháy chậm dần.- Nhấn KEY1 thì Led nhấp nháy nhanh dần.- Nhấn KEY2 thì Led tắt.- Nhấn KEY3 thì hoạt động trở lại.
Phần 2 :if(KEY0==0) LED0 = 0; else LED0 = 1;
if(KEY1==0) LED1 = 0; else LED1 = 1;if(KEY2==0) LED2 = 0; else LED2 = 1;if(KEY3==0) LED3 = 0; else LED3 = 1;delay(0xfff);*/
- Khi nhấn KEY1 thì Led1 sáng.- Khi nhấn KEY2 thì Led2 sáng.- Khi nhấn KEY3 thì Led3 sáng.- Khi nhấn KEY4 thì Led4 sáng.
Sauk hi viết chương trình xong ta biên dịch Project bằng cách click vào biểu tương Build All :
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 19
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Nếu kết quả của chương trình như trên ta phải sửa lỗi như sau :Ta vào Project>>Buid Option>>Project :
Chọn New sau đó điền vào : “Output-Hex Files” và ấn Apply.
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 20
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Chuyển sang thông số tiếp theo, chon new và điền “Object-Linking Files”, sau đó ấn Apply:
Chuyển sang thông số tiếp theo, chon new và chỉ đường dẫn tới :
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 21
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
C:\MCC18\h
Ấn Ok, sau đó Apply chuyển sang thông số tiếp theo. Chọn New và chỉ tới đường dẫn : C:\MCC18\lib
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 22
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Ấn OK, sau đó ấn Apply, và chuyển tới thông số cuối cùng. Chọn đường dẫn tới C:\MCC18\lkr
Ấn Ok, sau đó Apply. Cuối cùng ta ấn Ok để thoát ra và biên dịch lại :
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 23
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Chương trình không lỗi sẽ báo như trên.Chọn mạch nạp PICKIT2 :
Vào phần Setting chọn các thông số sau :
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 24
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Các thông số trên có nghĩa sẽ nạp chương trình nếu build thành công, sau đó cho phép chip hoạt động luôn.
4 Các bài thí nghiệm trên bộ thí nghiệm PIC18F4550
4.1 CPU
Sơ đồ bố trí linh kiện trên bộ thí nghiệm
1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 25
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Sơ đồ nguyên lý
Chương trình quét ma trận phím 4x4 và hiển thị Led7Thanh :#include <p18f4550.h>#include "8255.h"
#pragma config FOSC = HSPLL_HS // Using 20 MHz crystal with PLL#pragma config PLLDIV = 5 // Divide by 5 to provide the 96 MHz PLL with 4 MHz input#pragma config CPUDIV = OSC2_PLL3 //Divide 96MHz PLL output by 2 to get 48 MHz system clock#pragma config USBDIV = 2 // USB clock comes from 96 MHz PLL output / 2#pragma config FCMEN = OFF // Disable Fail-Safe Clock Monitor#pragma config IESO = OFF // Disable Oscillator Switchover mode#pragma config PWRT = OFF // Disable Power-up timer#pragma config BOR = OFF // Disable Brown-out reset#pragma config VREGEN = ON // Use internal USB 3.3V voltage regulator#pragma config WDT = OFF // Disable Watchdog timer#pragma config MCLRE = ON // Enable MCLR Enable#pragma config LVP = OFF // Disable low voltage ICSP#pragma config ICPRT = OFF // Disable dedicated programming port (44-pin devices)#pragma config CP0 = OFF // Disable code protection
#define ALED0 LATDbits.LATD0 //Define LEDPin as PORT D Pin 0#define ALED1 LATDbits.LATD1 //Define LEDPin as PORT D Pin 1#define ALED2 LATDbits.LATD2 //Define LEDPin as PORT D Pin 2#define ALED3 LATDbits.LATD3 //Define LEDPin as PORT D Pin 3
#define LCD_EN LATCbits.LATC1 // Enable
void initPort();void initTimer0();void display(unsigned int dat);
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 26
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
void InterruptHandlerHigh ();unsigned int i = 0, j = 0, time = 0;//===========================================================//const unsigned char Font[]={ 0x00, 0x10, 0x20, 0x30, 0x40,
0x50,0x60,0x70,0x80, 0x90};unsigned char led[4];unsigned char index;//===========================================================//void main(){
unsigned char key;initPort();initTimer0();write8255(0x88,'W'); //PC4-PC7 : input; PC0-PC3 : output//write8255C(0xFE,'C');while(1){
write8255C(0xFE,'C'); //write 0 to C1key = read8255('C');if((key&0xF0)==0xE0) i = 1;else if((key&0xF0)==0xD0) i = 5;else if((key&0xF0)==0xB0) i = 9;else if((key&0xF0)==0x70) i = 13;write8255C(0xFD,'C'); //write 0 to C2key = read8255('C');if((key&0xF0)==0xE0) i = 2;else if((key&0xF0)==0xD0) i = 6;else if((key&0xF0)==0xB0) i = 10;else if((key&0xF0)==0x70) i = 14;write8255C(0xFB,'C'); //write 0 to C3key = read8255('C');if((key&0xF0)==0xE0) i = 3;else if((key&0xF0)==0xD0) i = 7;else if((key&0xF0)==0xB0) i = 11;else if((key&0xF0)==0x70) i = 15;write8255C(0xF7,'C'); //write 0 to C4key = read8255('C');if((key&0xF0)==0xE0) i = 4;else if((key&0xF0)==0xD0) i = 8;else if((key&0xF0)==0xB0) i = 12;else if((key&0xF0)==0x70) i = 16;
display(i);delay(0xffff);
}}
void initPort(){
ADCON1 = 0xFFFF; //Config digital I/O allTRISD = 0; TRISA = 0;TRISB = 0;TRISC = 0;TRISE = 0;
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 27
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
LCD_EN = 0;}
void initTimer0(){
// Timer0 configuration T0CON = 0x87;TMR0H = 0xFF; //20M/256*4 = TMR0L = 0xEB;
//enable priority levels RCONbits.IPEN = 1;
INTCON = 0xE0; T0CONbits.TMR0ON = 1; // Start the timer}
void display(unsigned int dat ){
if(dat>9999) {dat = 0;led[0] = led[1] = led[2] = led[3];}else {
led[0] = dat/1000;led[1] = (dat%1000)/100;led[2] = ((dat%1000)%100)/10;led[3] = ((dat%1000)%100)%10;
}}
// High priority interrupt vector#pragma code InterruptVectorHigh = 0x0Avoid InterruptVectorHigh (void){ _asm goto InterruptHandlerHigh //jump to interrupt routine _endasm}#pragma code#pragma interrupt InterruptHandlerHighvoid InterruptHandlerHigh (){
if (INTCONbits.TMR0IF == 1) {
write8255(0xFF,'A');switch(index){
case 0: {write8255(Font[led[0]]|0x07,'A');index++;}break;case 1: {write8255(Font[led[1]]|0x0B,'A');index++;}break;case 2: {write8255(Font[led[2]]|0x0D,'A');index++;}break;case 3: {write8255(Font[led[3]]|0x0E,'A');index=0;}
}TMR0H = 0xFF;TMR0L = 0xEB;INTCONbits.TMR0IF = 0;
}
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 28
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
}
4.2 Động cơ 1 chiều
Sơ đồ bố trí trên bộ thí nghiệm1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Sơ đồ nguyên lý
Chương trình ví dụ
#include <p18f4550.h>#include <pwm.h>#include <timers.h>#include <adc.h>#include "LCD.h"
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 29
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
#pragma config FOSC = HSPLL_HS // Using 20 MHz crystal with PLL#pragma config PLLDIV = 5 // Divide by 5 to provide the 96 MHz PLL with 4 MHz input#pragma config CPUDIV = OSC2_PLL3 // Divide 96 MHz PLL output by 2 to get 48 MHz system clock#pragma config USBDIV = 2 // USB clock comes from 96 MHz PLL output / 2#pragma config FCMEN = OFF // Disable Fail-Safe Clock Monitor#pragma config IESO = OFF // Disable Oscillator Switchover mode#pragma config PWRT = OFF // Disable Power-up timer#pragma config BOR = OFF // Disable Brown-out reset#pragma config VREGEN = ON // Use internal USB 3.3V voltage regulator#pragma config WDT = OFF // Disable Watchdog timer#pragma config MCLRE = ON // Enable MCLR Enable#pragma config LVP = OFF // Disable low voltage ICSP#pragma config ICPRT = OFF // Disable dedicated programming port (44-pin devices)#pragma config CP0 = OFF // Disable code protection
#define PWM LATCbits.LATC2 //Define STEP3Pin as PORT B Pin 6
void delay(unsigned int d);void initPort();void initTimer0();void initInt0();void InterruptHandlerHigh ();
unsigned int T, t, DCycle, Duty, ReadAdc, Speed;unsigned char index;
char c[] = "DC Motor Module";char h[] = "ADC= ";char m[] = "Speed= V/P";char n[] = "PWM= %";
void main(){
unsigned char i;initPort();initInt0();initTimer0();OpenTimer2(TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_1); //Using Timer2OpenPWM1(0xFF); //Chanel 1; PWM period =[(PR2) + 1] x 4 x TOSC x TMR2 prescalerSetOutputPWM1(SINGLE_OUT,PWM_MODE_1);SetDCPWM1(Duty);//DutyCycleOpenADC( ADC_FOSC_32 & // A/D clock source set to 32Tosc ADC_RIGHT_JUST& // write the Digital result(10bits) from right, into ADRESH:ADRESL (16bits).
ADC_20_TAD, // A/D acquisition time: 20TAD (for 10bit conversion at least 12TAD) ADC_CH1 & //choose input channel (0), AN0 ADC_INT_OFF& //ADC interrupt off ADC_VREFPLUS_VDD& // choose the supply voltage VDD as reference voltage, V+ ADC_VREFMINUS_VSS, // choose the supply voltage VSS as reference voltage, V- 7 // this value is used for setting the Analog and Digital I/O. Make
//sure that AN0 is chosen as analog input. );
while(1){
lcdGoPos (0,0);LCD_PUTS(c);
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 30
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
lcdGoPos (1,0);LCD_PUTS(h); lcdGoPos (1,5);lcdWrNum(Duty);lcdGoPos (2,0);LCD_PUTS(m);lcdGoPos (2,7);lcdWrNum(Speed);lcdGoPos (3,0);LCD_PUTS(n);lcdGoPos (3,6);lcdWrNum(DCycle);
delay(0xffff);ConvertADC (); // Start an A/D conversion.
while( BusyADC()); // Wait for completion. when BusyADC is cleared, the conversion is finished. Duty = ReadADC();
SetDCPWM1(Duty);DCycle = Duty/10.24;
}}
void initPort(void){//InitPort
ADCON1 = 0xFFFF; //Config digital I/O allTRISD = 0; TRISA = 0x03;TRISB = 0x01;TRISC = 0;TRISE = 0;
//InitVarT = 0xFF32; //10ms
// T = 0xFF9D; //5msindex = 0;
//InitLCDLCD_INIT();LCD_CLEAR();lcdGoPos (0,0);LCD_PUTS(c); lcdGoPos (1,0);LCD_PUTS(h); lcdGoPos (2,0);LCD_PUTS(m);lcdGoPos (3,0);LCD_PUTS(n);
STEP0 = 0;STEP1 = 0;STEP2 = 0;STEP3 = 1;}
void initTimer0(){
// Timer0 configuration T0CON = 0x87; //Scale 1/256TMR0H = T>>8; //20M/256*4 <=> 5.12*10^(-5)TMR0L = T&0xff; //T = (0xFFFF-T)*5.12*10^(-5)
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 31
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
//enable priority levels RCONbits.IPEN = 1;
INTCONbits.TMR0IE = 1;INTCONbits.PEIE = 1;INTCONbits.GIE = 1;
T0CONbits.TMR0ON = 1; //Start the timer}
void initInt0(){
INTCONbits.INT0IE = 1;INTCONbits.INT0IF = 0;INTCON2bits.INTEDG0 = 1; //rising
}
void delay(unsigned int d){
while(d--){};}
// High priority interrupt vector#pragma code InterruptVectorHigh = 0x08void InterruptVectorHigh (void){ _asm goto InterruptHandlerHigh //jump to interrupt routine _endasm}#pragma code#pragma interrupt InterruptHandlerHighvoid InterruptHandlerHigh (){
if (INTCONbits.TMR0IF == 1){
Speed = 16.7*t; //Speed = t = 0;TMR0H = T>>8;TMR0L = T&0xff;
INTCONbits.TMR0IF = 0;}if(INTCONbits.INT0IF){
t++;INTCONbits.INT0IF = 0;
}}
4.3 LCD
Sơ đồ bố trí trên bộ thí nghiệm
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 32
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION 1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Chương trình ví dụ
#include <p18f4550.h>
#include "LCD.h"
//SW101 = 0;SW201 = 1;SW301 = 0;SW601 = 0;
#pragma config FOSC = HSPLL_HS // Using 20 MHz crystal with PLL
#pragma config PLLDIV = 5 // Divide by 5 to provide the 96 MHz PLL with 4 MHz input
#pragma config CPUDIV = OSC2_PLL3 //Divide 96MHzPLL output by 2 to get 48 MHz system clock
#pragma config USBDIV = 2 // USB clock comes from 96 MHz PLL output / 2
#pragma config FCMEN = OFF // Disable Fail-Safe Clock Monitor
#pragma config IESO = OFF // Disable Oscillator Switchover mode
#pragma config PWRT = OFF // Disable Power-up timer
#pragma config BOR = OFF // Disable Brown-out reset
#pragma config VREGEN = ON // Use internal USB 3.3V voltage regulator
#pragma config WDT = OFF // Disable Watchdog timer
#pragma config MCLRE = ON // Enable MCLR Enable
#pragma config LVP = OFF // Disable low voltage ICSP
#pragma config ICPRT = OFF // Disable dedicated programming port (44-pin devices)
#pragma config CP0 = OFF // Disable code protection
#define CS8255 LATEbits.LATE2 // Register select
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 33
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
void initPort();
//===========================================================//
void main()
{
char c[] = " PIC18F4550 ";
char h[] = " TRAINING KIT ";
char m[] = " TANPHAT ";
char n[] = " AUTOMATION";
initPort();
LCD_INIT();
LCD_CLEAR();
lcdGoPos (0,0);
LCD_PUTS(c);
lcdGoPos (1,0);
LCD_PUTS(h);
lcdGoPos (2,0);
LCD_PUTS(m);
lcdGoPos (3,0);
LCD_PUTS(n);
while(1)
{
}
}
void initPort()
{
ADCON1 = 0xFF; //Config digital I/O all
TRISD = 0x00;
TRISA = 0;
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 34
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
TRISB = 0;
TRISC = 0;
TRISE = 0;
}
4.4 Loa
Sơ đồ bố trí trên bộ thí nghiệm1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Sơ đồ nguyên lý
1 2
U503A
74HC04
SP501Loa Buzzer
D5014148
3 4
U503B
74HC04
5 6
U503C
74HC04
13 12
U503D
74HC04
BUZZ
3.3uF/16V
C503
Chương trình ví dụ
Giống chương trình DC Motor, nhưng phải gạt SW101 sang vị trí ‘1’.
4.5 Động cơ bước
Sơ đồ bố trí trên bộ thí nghiệm
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 35
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Sơ đồ nguyên lý
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 36
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Chương trình ví dụ
#include <p18f4550.h>
#include "LCD.h"
#pragma config FOSC = HSPLL_HS // Using 20 MHz crystal with PLL
#pragma config PLLDIV = 5 // Divide by 5 to provide the 96 MHz PLL with 4 MHz input
#pragma config CPUDIV = OSC2_PLL3 //Divide 96MHz PLL output by 2 to get 48 MHz system clock
#pragma config USBDIV = 2 // USB clock comes from 96 MHz PLL output / 2
#pragma config FCMEN = OFF // Disable Fail-Safe Clock Monitor
#pragma config IESO = OFF // Disable Oscillator Switchover mode
#pragma config PWRT = OFF // Disable Power-up timer
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 37
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
#pragma config BOR = OFF // Disable Brown-out reset
#pragma config VREGEN = ON // Use internal USB 3.3V voltage regulator
#pragma config WDT = OFF // Disable Watchdog timer
#pragma config MCLRE = ON // Enable MCLR Enable
#pragma config LVP = OFF // Disable low voltage ICSP
#pragma config ICPRT = OFF // Disable dedicated programming port (44-pin devices)
#pragma config CP0 = OFF // Disable code protection
#define STEP0 LATBbits.LATB3 //Define STEP0Pin as PORT B Pin 3
#define STEP1 LATBbits.LATB4 //Define STEP1Pin as PORT B Pin 4
#define STEP2 LATBbits.LATB5 //Define STEP2Pin as PORT B Pin 5
#define STEP3 LATBbits.LATB6 //Define STEP3Pin as PORT B Pin 6
void delay(unsigned int d);
void initPort();
void initTimer0();
void InterruptHandlerHigh ();
unsigned int T, t;
unsigned char index;
void main()
{
char c[] = "PIC18F4550";
char h[] = "TRAINING KIT";
char m[] = "Step Motor Module";
char n[] = "T = ms";
initPort();
initTimer0();
LCD_INIT();
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 38
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
LCD_CLEAR();
lcdGoPos (0,5);
LCD_PUTS(c);
lcdGoPos (1,2);
LCD_PUTS(h);
lcdGoPos (3,0);
LCD_PUTS(m);
lcdGoPos (4,0);
LCD_PUTS(n);
while(1)
{
t = (65535-T)*0.0512;
lcdGoPos (3,3);
lcdWrNum(t);
delay(0xffff);
}
}
void initPort(void)
{
ADCON1 = 0xFFFF; //Config digital I/O all
TRISD = 0;
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISE = 0;
//T = 0xFF2D; //10ms
T = 0xFF9D; //5ms
index = 0;
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 39
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
}
void initTimer0()
{
// Timer0 configuration
T0CON = 0x87; //Scale 1/256
TMR0H = T>>8; //20M/256*4 <=> 5.12*10^(-5)
TMR0L = T&0xff; //T = (0xFFFF-T)*5.12*10^(-5)
//enable priority levels
RCONbits.IPEN = 1;
INTCON = 0xE0; //enable interrupt : GIE, PEIE, TMR0IE
T0CONbits.TMR0ON = 1; //Start the timer
}
void delay(unsigned int d)
{
while(d--);
}
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
#pragma code
#pragma interrupt InterruptHandlerHigh
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 40
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
void InterruptHandlerHigh ()
{
if (INTCONbits.TMR0IF == 1)
{
switch(index)
{
case 0: {STEP0 = 0; STEP1 = 0; STEP2 = 0; STEP3 = 1;index++;}break;
case 1: {STEP0 = 0; STEP1 = 0; STEP2 = 1; STEP3 = 0;index++;}break;
case 2: {STEP0 = 0; STEP1 = 1; STEP2 = 0; STEP3 = 0;index++;}break;
case 3: {STEP0 = 1; STEP1 = 0; STEP2 = 0; STEP3 = 0;index=0;}
}
TMR0H = T>>8;
TMR0L = T&0xff;
INTCONbits.TMR0IF = 0;
}
}
4.6 Truyền thông
Sơ đồ bố trí trên bộ thí nghiệm
1 2
1 2
1
2
1
2
1
2
2 1
2 1
21
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
2
1
HOLF
HOLE
4
32
1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 41
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Sơ đồ nguyên lý
Chương trình ví dụ
- RS-232
#include <p18f4550.h>
#include <stdio.h>
#include <delays.h>
#include <usart.h>
#define constant 100 //Baud = 19200
#pragma config FOSC = HSPLL_HS // Using 20 MHz crystal with PLL
#pragma config PLLDIV = 5 // Divide by 5 to provide the 96 MHz PLL with 4 MHz input
#pragma config CPUDIV = OSC1_PLL2 //Divide 96MHzPLL output by 2 to get 48 MHz system clock
#pragma config USBDIV = 2 // USB clock comes from 96 MHz PLL output / 2
#pragma config FCMEN = OFF // Disable Fail-Safe Clock Monitor
#pragma config IESO = OFF // Disable Oscillator Switchover mode
#pragma config PWRT = OFF // Disable Power-up timer
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 42
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
#pragma config BOR = OFF // Disable Brown-out reset
#pragma config VREGEN = ON // Use internal USB 3.3V voltage regulator
#pragma config WDT = OFF // Disable Watchdog timer
#pragma config MCLRE = ON // Enable MCLR Enable
#pragma config LVP = OFF // Disable low voltage ICSP
#pragma config ICPRT = OFF // Disable dedicated programming port (44-pin devices)
#pragma config CP0 = OFF // Disable code protection
void delay(unsigned int d);
void initPort(void);
void RxIntFcn(void);
void InterruptHandlerHigh ();
void InitializeUSART(void);
void main (void)
{
char c[] = "Viet Nam SingGapore ";
initPort();
InitializeUSART();
while(1)
{
Delay10KTCYx (500);
Delay10KTCYx (500);
Delay10KTCYx (500); // each data packet sent every 0.5s
while(BusyUSART()) ;
putsUSART(c);
}//end while
}
void initPort(void)
{
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 43
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
ADCON1 = 0xFF; //Config digital I/O all
TRISD = 0x0F;
TRISA = 0;
TRISB = 0;
TRISC = 0x80;
TRISE = 0;
}
void InitializeUSART(void)
{
TRISCbits.TRISC7=1; // RX
TRISCbits.TRISC6=0; // TX
SPBRG = 0xE1;
SPBRGH = 0x02;//0x04; // 0x04E1 for 48MHz -> 9600 baud
// SPBRG = 0x02;
// SPBRGH = 0x70;//Baud = 19200
TXSTA = 0x07;//0x24; // TX enable BRGH=1
RCSTA = 0x90; // continuous RX
BAUDCON = 0x08; // BRG16 = 1
PIR1bits.RCIF = 0;
PIE1bits.RCIE = 1; // Reception Interrupt Enable
INTCONbits.GIE = 1; // Global Interrupt Enable
INTCONbits.PEIE = 1; // Perapheral Interrupt Enable
}
// Implementation of some functions
void RxTxIntFcn(void)
{
char temp;
temp = ReadUSART();
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 44
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
WriteUSART(temp+1);
}
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
if (PIE1bits.RCIE && PIR1bits.RCIF)
{
PIR1bits.RCIF = 0;
RxIntFcn();
};
}
- RS-485 :
Khai báo thêm chân DTE và sửa hàm truyền như sau :
#define DTE LATCbits.LATC0 void RxTxIntFcn(void)
{char temp;temp = UART_Read();DTE = 1;WriteUSART(temp);DTE = 0;
}
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 45
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
- USB :
Chương trình USB được cung cấp theo đĩa đi kèm.
4.7 Chuyển đổi số tương tự
Sơ đồ bố trí trên bộ thí nghiệm
1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Sơ đồ nguyên lý
Chương trình ví dụ #include <p18f4550.h>#include "LCD.h"
#pragma config FOSC = HSPLL_HS // Using 20 MHz crystal with PLL#pragma config PLLDIV = 5 // Divide by 5 to provide the 96 MHz PLL with 4 MHz input#pragma config CPUDIV = OSC2_PLL3 // Divide 96 MHz PLL output by 2 to get 48 MHz system clock#pragma config USBDIV = 2 // USB clock comes from 96 MHz PLL output / 2#pragma config FCMEN = OFF // Disable Fail-Safe Clock Monitor#pragma config IESO = OFF // Disable Oscillator Switchover mode#pragma config PWRT = OFF // Disable Power-up timer#pragma config BOR = OFF // Disable Brown-out reset#pragma config VREGEN = ON // Use internal USB 3.3V voltage regulator#pragma config WDT = OFF // Disable Watchdog timer#pragma config MCLRE = ON // Enable MCLR Enable#pragma config LVP = OFF // Disable low voltage ICSP#pragma config ICPRT = OFF // Disable dedicated programming port (44-pin devices)#pragma config CP0 = OFF // Disable code protection
#define CSDAC LATAbits.LATA4 // Register select
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 46
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
void initPort();void delay(unsigned int d);void writeDac(unsigned char value);//===========================================================//void main(){
unsigned char value;char c[] = "PIC18F4550";char h[] = "TRAINING KIT";char m[] = "DAC module";char n[] = "Value : ";initPort();LCD_INIT();LCD_CLEAR();lcdGoPos (0,5);LCD_PUTS(c); lcdGoPos (1,2);LCD_PUTS(h); lcdGoPos (2,0);LCD_PUTS(m); lcdGoPos (3,0);LCD_PUTS(n);value = 0;while(1){
lcdGoPos (1,24);lcdWrNum(value);if(value<255) value++;else {
value = 0;LCD_CLEAR();lcdGoPos (0,5);LCD_PUTS(c); lcdGoPos (1,2);LCD_PUTS(h); lcdGoPos (2,0);LCD_PUTS(m); lcdGoPos (3,9);LCD_PUTS(n);
}writeDac(value);delay(0xffff);delay(0xffff);
}}
void initPort(){
ADCON1 = 0xFFFF; //Config digital I/O allTRISD = 0x00; //TRISA = 0;TRISB = 0;TRISC = 0;TRISE = 0;
}
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 47
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
void delay(unsigned int d){
while(d--){};}
void writeDac(unsigned char value){
CSDAC = 0;delay(0xff);PORTD = value;CSDAC = 1;
}
4.8 Chuyển đổi tương tự số
Sơ đồ bố trí trên bộ thí nghiệm
1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Sơ đồ nguyên lý
AN1
AN0
VCC
13
2
U502A
TL082
75
6
U502B
TL082
+12V
VO2
+VS1
3
GND
U501 LM35
Z501
5V
T1
J501
T1
J502
T1
J503
22K
R502
18K
R503
10KR504Z502
5V
104C501
104C502
AN0
AN1
VCC
10K
VR
501
10KR501
123
J504
Chương trình ví dụ
Chương trình đọc cảm biến nhiệt LM35 :
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 48
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
#include <p18f4550.h>#include <adc.h>#include <math.h>#include "LCD.h"
#pragma config FOSC = HSPLL_HS // Using 20 MHz crystal with PLL#pragma config PLLDIV = 5 // Divide by 5 to provide the 96 MHz PLL with 4 MHz input#pragma config CPUDIV = OSC2_PLL3 / Divide 96MHzPLL output by 2 to get 48 MHz system clock#pragma config USBDIV = 2 // USB clock comes from 96 MHz PLL output / 2#pragma config FCMEN = OFF // Disable Fail-Safe Clock Monitor#pragma config IESO = OFF // Disable Oscillator Switchover mode#pragma config PWRT = OFF // Disable Power-up timer#pragma config BOR = OFF // Disable Brown-out reset#pragma config VREGEN = ON // Use internal USB 3.3V voltage regulator#pragma config WDT = OFF // Disable Watchdog timer#pragma config MCLRE = ON // Enable MCLR Enable#pragma config LVP = OFF // Disable low voltage ICSP#pragma config ICPRT = OFF // Disable dedicated programming port (44-pin devices)#pragma config CP0 = OFF // Disable code protection
void initPort();void delay(unsigned int d);void writeDac(unsigned char value);//===========================================================//void main(){
unsigned int val; //ADC Value unsigned int t; //Temperature
unsigned char value;char c[] = "PIC18F4550";char h[] = "TRAINING KIT";char m[] = "ADC module LM35";char n[] = "Temp : ";initPort();LCD_INIT();LCD_CLEAR();lcdGoPos (0,5);LCD_PUTS(c); lcdGoPos (1,2);LCD_PUTS(h); lcdGoPos (0,16);LCD_PUTS(m); lcdGoPos (1,16);LCD_PUTS(n);value = 0;
OpenADC( ADC_FOSC_32 & // A/D clock source set to 32Tosc ADC_RIGHT_JUST& // write the Digital result(10bits) from right, into ADRESH:ADRESL (16bits).ADC_20_TAD, // A/D acquisition time: 20TAD (for 10bit conversion at least 12TAD)ADC_CH0 & //choose input channel (0), AN0ADC_INT_OFF& //ADC interrupt off ADC_VREFPLUS_VDD& // choose the supply voltage VDD as reference voltage, V+ADC_VREFMINUS_VSS, // choose the supply voltage VSS as reference voltage, V-7 // this value is used for setting the Analog and Digital I/O. Make sure //that AN0 is chosen as analog input.
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 49
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
);while(1){
lcdGoPos (1,23);lcdWrNum(t);Delay10TCYx(5); //Delay for 50TCY. Because within this delay, the holding //capacitor should be disconnected from the ananlog input.
ConvertADC (); // Start an A/D conversion. while( BusyADC()); // Wait for completion. when BusyADC is cleared, the //conversion is finished.
val = ReadADC(); t = val/10.23; //Convert to Degree Celcius
//V = val*5/1023 //5/(1023*5*0.01) = 1/10.23delay(0xffff);delay(0xffff);
}}
void initPort(){
ADCON1 = 0xFFFD; //Config digital I/O allTRISD = 0x00; TRISA = 0x03;TRISB = 0x00;TRISC = 0x00;TRISE = 0x00;
}
void delay(unsigned int d){
while(d--){};}
4.9 LED Segment
Sơ đồ bố trí trên bộ thí nghiệm
1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Sơ đồ nguyên lý
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 50
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Chương trình ví dụ
#include <p18f4550.h>#include "8255.h"
#pragma config FOSC = HSPLL_HS // Using 20 MHz crystal with PLL#pragma config PLLDIV = 5 // Divide by 5 to provide the 96 MHz PLL with 4 MHz input#pragma config CPUDIV = OSC2_PLL3 //Divide 96MHz PLL output by 2 to get 48 MHz system clock#pragma config USBDIV = 2 // USB clock comes from 96 MHz PLL output / 2#pragma config FCMEN = OFF // Disable Fail-Safe Clock Monitor#pragma config IESO = OFF // Disable Oscillator Switchover mode#pragma config PWRT = OFF // Disable Power-up timer#pragma config BOR = OFF // Disable Brown-out reset#pragma config VREGEN = ON // Use internal USB 3.3V voltage regulator#pragma config WDT = OFF // Disable Watchdog timer#pragma config MCLRE = ON // Enable MCLR Enable#pragma config LVP = OFF // Disable low voltage ICSP#pragma config ICPRT = OFF // Disable dedicated programming port (44-pin devices)#pragma config CP0 = OFF // Disable code protection
#define ALED0 LATDbits.LATD0 //Define LEDPin as PORT D Pin 0#define ALED1 LATDbits.LATD1 //Define LEDPin as PORT D Pin 1#define ALED2 LATDbits.LATD2 //Define LEDPin as PORT D Pin 2#define ALED3 LATDbits.LATD3 //Define LEDPin as PORT D Pin 3
void initPort();void initTimer0();void initTimer1(void);void display(unsigned int dat);void InterruptHandlerHigh ();unsigned int i = 0, j = 0, time = 0; //===========================================================//const unsigned char Font[]={ 0x00, 0x10, 0x20, 0x30, 0x40,
0x50,0x60,0x70,0x80, 0x90};unsigned char led[4];unsigned char index;//===========================================================//void main()
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 51
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
{unsigned char key;initPort();initTimer0();write8255(0x88,'W'); //write8255(0x0F,'B'); while(1){
write8255(0xFC,'C'); //write 0 to C1key = read8255('C'); display(key);delay(0xffff);
}}
void initPort(){
ADCON1 = 0xFFFF; //Config digital I/O allTRISD = 0xF0; //TRISA = 0;TRISB = 0;TRISC = 0;TRISE = 0;
}
void initTimer0(){
// Timer0 configuration T0CON = 0x87;TMR0H = 0xFF; //20M/256*4 = TMR0L = 0xEB;
//enable priority levels RCONbits.IPEN = 1;
INTCON = 0xE0; T0CONbits.TMR0ON = 1; // Start the timer}
void display(unsigned int dat ){
if(dat>9999) {dat = 0;led[0] = led[1] = led[2] = led[3];}else {
led[0] = dat/1000;led[1] = (dat%1000)/100;led[2] = ((dat%1000)%100)/10;led[3] = ((dat%1000)%100)%10;
}}// High priority interrupt vector#pragma code InterruptVectorHigh = 0x0Avoid InterruptVectorHigh (void){ _asm
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 52
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
goto InterruptHandlerHigh //jump to interrupt routine _endasm}#pragma code#pragma interrupt InterruptHandlerHighvoid InterruptHandlerHigh (){
if (INTCONbits.TMR0IF == 1) {
write8255(0x88,'W');write8255(0xFF,'A');switch(index){
case 0: {write8255(Font[led[0]]|0x07,'A');index++;}break;case 1: {write8255(Font[led[1]]|0x0B,'A');index++;}break;case 2: {write8255(Font[led[2]]|0x0D,'A');index++;}break;case 3: {write8255(Font[led[3]]|0x0E,'A');index=0;}
}/* if(j<1000) j++;
else{
if(i<9999) i++; else i = 0;display(i);j = 0;
}*/TMR0H = 0xFF;TMR0L = 0xEB;INTCONbits.TMR0IF = 0;
}}
4.10 LED – button
Sơ đồ bố trí trên bộ thí nghiệm
1
3 2
00
3
3 2
10
123
1 2
3
12
12
12
12
3
4
2
1
1
2
1
2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
21
12
1
2
1
2
1
2
21
12
1 2
12
1 2 3 4 5 6
12 11 10 9 8 7
1 2 3 4 5
23 1 23 1 23 1 23 1
21
21
2 1
2 1
21
2 1 2 1 2 1 2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
2 1
21
2 1
2 1
2 1
21
2 1
21
21
21
2 1
2 1
2 1
12
1
3
4
5
6
7
8
9
2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
5
6
7
8
4
3
2
1
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
11
12
13
14
15
16
17
18
19
20
10
9
8
7
6
5
4
3
2
11
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
1
2
3
4
8
7
6
5
1
2
4
3
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
3 21
1
2
21 21 21 21 21 21 21 21
0
0 0
0
16151413121110987654321
12
34
56
78
910
16 15
14 13
12 11
6
5
4
3
2
1
1
2 1
2
1
2
21
21
2 1
2 1
21
21
2 1
2 1
2 1
2 1
1
2
4
3
1
2
4
3
1
2
4
3
1
2
4
3
12
2 1
21 21 21 21
2 1
2 1
2 1
21
21
21
1 21 21 21 2
1
2
12
12
1
2
1
1
1
21 21 21 21
2 1
1
2
4
3
2
1
23 123 123 123 1
1 2 31 2 31 2 31 2 3
1 2 3
2 1
2 1
2 1
2 1
2 1
21 21
2 1 2 1 2 1 2 1
2 1
21
21
2 1
12
2 1
21
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
2 1
21
21
2 1
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
5
6
7
14
13
12
11
10
9
8
1
2
3
4
8
7
6
5
1
2
3
4
5
6
7
14
13
12
11
10
9
8
12 3
1 23
1 2
12
1 2
1 2
B A13 2
B A13 2
B A13 2
B A13 2
23 1
87654321
B
DC
A1
1
2
1
2 1
HOLF
HOLE
4
32
1
32 1
11
10
1
6
2
7
3
8
4
9
5
11
10
1
6
2
7
3
8
4
9
5
Sơ đồ nguyên lý
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 53
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Chương trình ví dụ
Giống chương trình mẫu ở trên.
Các thư viện cần có :- Thư viện LCD :
#include <p18f4550.h>#include <string.h>
//LCD output Cotrol#define LCD_RS LATEbits.LATE1 // Register select#define LCD_RW LATEbits.LATE0#define LCD_EN LATCbits.LATC1 // Enable
void lcdWrNum(unsigned int val);void delayms(unsigned int ms);void lcdWrCmd(unsigned char ch);void lcdGoPos (unsigned char line, unsigned char pos_of_line);void LCD_STROBE(void);void LCD_WCMD(unsigned char CMD);void LCD_WDATA(unsigned char DATA);void LCD_INIT(void);
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 54
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
void LCD_CLEAR(void);void LCD_PUTS(const char* s);
void delayms(unsigned int ms){
while(--ms){};}
void lcdWrCmd(unsigned char ch){
LCD_RS = 0; LCD_RW = 0; LATD = ch; LCD_EN = 1;
delayms(10);LCD_EN=0;delayms(10);
}
void lcdGoPos (unsigned char line, unsigned char pos_of_line)// Move cursor to posistion of a line{
unsigned char DDRAMAddr;if (line==0) DDRAMAddr = pos_of_line;else if (line==1) DDRAMAddr = 0x40+pos_of_line;else if (line==2) DDRAMAddr = 0x10+pos_of_line;else if (line==3) DDRAMAddr = 0x50+pos_of_line;lcdWrCmd (0x80+DDRAMAddr);
}
void lcdWrNum(unsigned int val){
unsigned char i, j, num[5];i = 0;while(val > 9){
num[i] = val%10 + 0x30;val = val/10;i++;
}num[i] = val + 0x30;for(j = 0; j <= i; j++){
LCD_WDATA(num[i - j]);}
}//====================== ===========================//void LCD_STROBE(void){
LCD_EN = 1;delayms(0xfff);LCD_EN = 0;
}//===================== ===========================//void LCD_WCMD(unsigned char CMD){
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 55
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
LATD = CMD;LCD_RW = 0;LCD_RS = 0;LCD_STROBE();delayms(1);
}//===============================================//void LCD_WDATA(unsigned char DATA){
LATD = DATA;LCD_RW = 0;LCD_RS = 1;LCD_STROBE();delayms(2);
}//================================================//void LCD_INIT(void){
LCD_WCMD(0x0C); //8bit mode; font 5x7delayms(50);LCD_WCMD(0x38);delayms(50);LCD_WCMD(0x0F);delayms(50);LCD_WCMD(0x01);delayms(50);LCD_WCMD(0x06);delayms(10);
}//================================================//void LCD_CLEAR(void){
LCD_WCMD(0x01);}void LCD_HOME(void){
LCD_WCMD(0x02);}//===================== ===========================//void LCD_PUTS(const char* s) //Write String{
char i, len = strlen(s);for(i=0;i<len;i++) LCD_WDATA(s[i]);
}
- Thư viện 8255.h : #include <p18f4550.h>//config 8255 ==================
#define PPI_EN LATEbits.LATE2 #define PPI_RD LATEbits.LATE1 #define PPI_WR LATEbits.LATE0 #define PPI_A0 LATAbits.LATA2 #define PPI_A1 LATAbits.LATA3
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 56
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
void delay(unsigned int d);void write8255(unsigned char data,unsigned char ch);unsigned char read8255(unsigned char ch);void write8255C(unsigned char data,unsigned char ch);//small functions detail===============================void write8255(unsigned char data,unsigned char ch){
TRISD = 0; PPI_EN = 0;PPI_RD = 1;
switch(ch){case 'A': //PortA
PPI_A0 = 0;PPI_A1 = 0;break;
case 'B': //PortBPPI_A0 = 1;PPI_A1 = 0;break;
case 'C': //PortCPPI_A0 = 0;PPI_A1 = 1;break;
case 'W': //CW PPI_A0 = 1;
PPI_A1 = 1;}LATD = data;PPI_WR = 0;PPI_WR = 0;PPI_WR = 0;PPI_WR = 1; PPI_WR = 1; PPI_WR = 1;
}void write8255C(unsigned char data,unsigned char ch){
TRISD = 0xF0; PPI_EN = 0;PPI_RD = 1;
switch(ch){case 'A': //PortA
PPI_A0 = 0;PPI_A1 = 0;break;
case 'B': //PortBPPI_A0 = 1;PPI_A1 = 0;break;
case 'C': //PortCPPI_A0 = 0;PPI_A1 = 1;break;
case 'W': //CW PPI_A0 = 1;
PPI_A1 = 1;}
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 57
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
LATD = data;PPI_WR = 0;PPI_WR = 0;PPI_WR = 0;PPI_WR = 1; PPI_WR = 1; PPI_WR = 1;
}
unsigned char read8255(unsigned char ch){
unsigned char data;TRISD = 0xF0; PPI_EN = 0;PPI_WR = 1;
switch(ch){case 'A': //PortA
PPI_A0 = 0;PPI_A1 = 0;break;
case 'B': //PortBPPI_A0 = 1;PPI_A1 = 0;break;
case 'C': //PortCPPI_A0 = 0;PPI_A1 = 1;break;
case 'W': //CW PPI_A0 = 1;
PPI_A1 = 1;}PPI_RD = 1;PPI_RD = 1;PPI_RD = 1;PPI_RD = 0;PPI_RD = 0;PPI_RD = 0; data = PORTD;
return data;}
void delay(unsigned int d){
while(d--);}
5 Sơ đô nguyên ly PIC18F4550 TRAINNING KIT1. Sơ đồ tổng quát
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 58
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
2. CPU
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 59
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
3. NGUỒN CUNG CẤP
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 60
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
4. DC MOTOR
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 61
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
5. DAC
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 62
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
6. STEP MOTOR
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 63
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
7. SENSORTài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 64
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
8. COMM
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 65
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
9. SEGLED
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 66
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 67
Công ty Cổ Phần Tự Động Hoá Tân Phát AUTOMATION
Tài liệu hướng dẫn sử dụng bộ thí nghiệm PIC18F4550 68