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

vi điều khiển 02 CCS c compiler (ThangTV)

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 (705.36 KB, 47 trang )

Bài 02
CCS C COMPILER

1


1. Hướng dẫn sử dụng chương trình CCS:
 Cài đặt trình biên dịch C dùng phần mềm CCS:

 Cửa sổ CCS:

2


 Tạo mới một source file: File->Source file (hoặc dùng project Wizard
như hướng dẫn trong giáo trình)
1. Chọn thư mục lưu trữ source file

2. Đặt tên file
3. Lưu file

3


Biên dịch chương trình tạo file *.HEX dùng Compile hoặc Rebuild
4. Chọn Device PIC16F877A và PCM 14 bit

Cửa sổ soạn thảo nội
dung chương trình

Cửa sổ thông báo lỗi và


cảnh báo khi biên dịch
chương trình

4


 Sử dụng HELP của CCS: chứa tất cả các trợ giúp sử dụng cho các
khai báo và các hàm trong CCS dùng cho PIC

1. Click chuột trái vào biểu tượng HELP ở
góc trên bên phải cửa sổ CCS

2. Chọn Contents hoặc Index

5


 Sử dụng HELP của CCS
3. Nhập vào nội dung cần tìm
Hướng dẫn sử dụng

Ví dụ

Các nội dung liên quan

6


2. Các thành phần chính của source file:
Các khai báo chính của chương trình:

#include <16F877A.h>
// No WatchDog, High Speed, No Power Up Timer, No Low Voltage Programming
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống

Các định nghĩa và biến toàn cục
#Define
LED
PIN_D0
#BYTE
TMP
25
CONST unsigned char a[10] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
unsigned char Time;

Chương trình con và ngắt (Interrupt)
Void Quet_LED ( )
{
// Nội dung
}

Chương trình chính
Void main( )
{
// Nội dung
}
7


Chương trình chính chi tiết

Void main( )
{
/* 1. Khai báo biến cục bộ: là các biến chỉ dùng trong chương trình chính, không dùng
được trong chương trình con*/
unsigned char i,j;
Int temperature;
// 2. Cấu hình thiết bị và ngắt (interrupt)
//============================================
//setup_adc(ADC_CLOCK_INTERNAL);
//setup_adc_ports( ALL_ANALOG );
//============================================
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_timer_0(RTCC_8_BIT);
// 3. Vòng lặp vô hạn để thực hiện nội dung chương trình
While (TRUE) // hoặc while (1)
{
// Nội dung chính của chương trình
}
}

8


3. Biến chương trình:
Kiểu biến

Giá trị

Ý nghĩa


int1

True hay False ( 0 hay 1)

int8

0 đến 255

int16

0 đến 65,535

Số nguyên 2 byte

int32

0 đến 4,294,967,295

Số nguyên 4 byte

Char

-128 đến 127

Float

3,4

đế 3,4


số 1 bit
Số nguyên 1 byte ( 8 bit)

Ký tự 8 bit
Số thực 32 bit

short

Mặc định như kiểu int1

Byte

Mặc định như kiểu int8

Int

Mặc định như kiểu int8

Long

Mặc định như kiểu int16

Lưu ý: có thể sử dụng signed hoặc unsigned trước các kiểu để chỉ cho
trường hợp có dấu và không có dấu.
9


Ví dụ:


unsigned char a, i, j;
float set, temp;
CONST int8 a[3] = {2, 7, 0x7a};
unsigned int16 tmp1, tmp2;
char kitu;

- Dịch trái n bit biến a: a = a << n
- Dịch phải n bit biến a: a = a >> n
(Xem thêm trong HELP: operators)

* Các điều kiện logic:
- AND (&&)

* Các phép toán trong CCS:

- OR ( || )

- Cộng (+)

- EQUAL (==)

- Trừ (-)

- Phủ định (!)

- Nhân (*)
- Chia (/)

* Các định nghĩa trong CCS:


- Chia lấy phần dư (%)

- #define

LED

- Đảo (~)

- #byte

SET = 100

- Phép toán logic: AND (&); OR( | )

- #bit

SW1 = 0x86.0 // RB0

PIN_D0

10


4. Các hàm thông dụng trong CCS:
a) Hàm delay: liên quan đến #use delay(clock = tần số thạch anh)
- delay_ms(giá trị 2 byte)
Ví dụ:
1.

delay_ms(1000): trì hoãn 1000 ms


2.

delay_ms(200): trì hoãn 200 ms

- delay_us(giá trị 2 byte)
Ví dụ:
1.

delay_us(10): trì hoãn 10 μs

2.

delay_us(5): trì hoãn 5 μ s

- delay_cycles(giá trị 2 byte)
Ví dụ:
delay_cycles(1): trì hoãn 1 xung clock = 1/(fXTAL/4 )
11


b) Hàm I/O: xuất/ nhập một giá trị ra/ từ PIN (bit) hoặc PORT (byte)
-

set_tris_x(byte)

Trong đó:
x: a, b, c, d, e
Byte: xác định ngõ vào hoặc ngõ ra cho các tín hiệu của một PORT
bit = 1: tín hiệu tương ứng là ngõ vào

bit = 0: tín hiệu tương ứng là ngõ ra
Ví dụ: cấu hình PORT D với RD0 và RD1 là ngõ vào, RD7 đến RD2 là ngõ
ra
Set_tris_d(0x03);// 0x03 = 00000011b
Hoặc: cấu hình RC7-RC4 là ngõ vào, RC3-RC0 là ngõ ra
Set_tris_c(11110000b);
12


- output_high(PIN)
Ví dụ:
Output_high(PIN_C0); // RC0 = 1
- output_low(PIN)
Ví dụ:
Output_low(PIN_D0); // RD0 = 0
- output_toggle(PIN)
Ví dụ:
Output_toggle(PIN_C4); // RC4 = ~RC4
- output_x(byte): x là a, b, c,d, hoặc e (port a, b, c,d, hoặc e)
Ví dụ:
Output_d(0xc0); // PORTD = C0H
13


- input(PIN)
Ví dụ 1:
State = input(PIN_E0); // State là biến nhị phân (int1 State)
Ví dụ 2:
#define SW1


PIN_D4

#define LED

PIN_C1

………….
If (!input(SW1))
{ output_toggle(LED); delay_ms(300);}

- input_x(): x là a, b, c,d, hoặc e (port a, b, c,d, hoặc e)
Ví dụ:
Unsigned char a;
a = input_d(); // đọc 1 byte từ port d và gán vào a

14


c) Hàm truy xuất bộ nhớ EEPROM: ghi/ đọc nhớ
-

Write_eeprom(address, value)

Trong đó:
address: địa chỉ vùng nhớ EEPROM (0 – 255)
Value: giá trị 8 bit cần ghi vào bộ nhớ
Ví dụ:
Write_eeprom(15,147);// ghi giá trị 247 vào eeprom tại địa chỉ 15
-


Read_eeprom(address)

Trong đó:
address: địa chỉ vùng nhớ EEPROM (0 – 255)
Ví dụ:
Int8 a;
a = read_eeprom(15);
15


5. Các cấu trúc điều kiện thông dụng:
a) IF:
If (biểu thức điều kiện)
{ khối lệnh 1;}
Else
{khối lệnh 2;}

Ví dụ 1:
If ((a==1)&&(b==2))
{ c = a+b; a++;}
Else {c = 0; b++;}

Ví dụ 2:
If (!input(PIN_C0)||!input(PIN_C1)) output_low(PIN_D2);
Else output_high(PIN_D2);

16


b) SWITCH:

switch (biểu thức )

Ví dụ:

{

Int8 a;

case giá trị 1: lệnh 1;

a = input_d();

break;
case giá trị 2: lệnh 2;
break;


{

case 0: {output_high(PIN_C0);
break;}
case 5: {output_high(PIN_C1);

case giá trị n: lệnh n;
break;
Default:

Switch(a)

lệnh;

break;}

break;}
case 9: {output_high(PIN_C2);
break;}
default: {output_c(0x00);
break;}
17


c) WHILE:
while (điều kiện )

Ví dụ 1:

{

Int8 i;

Khối lệnh;

CONST a[4] = {0x00, 0xff, 0x00, 0xff};

}

i=4;
while(i>0)
{output_d(a[i-1]);
Delay_ms(100);
i--;}


Ví dụ 2:
While(1)
{output_toggle(PIN_D4); delay_ms(300);}
18


d) FOR:
for (biểu thức 1; điều kiện; biểu thức 2)
{
Khối lệnh;
}

Ví dụ 1:
CONST a[4] = {0x00, 0xff, 0x00, 0xff};
For (int8 i = 0; i<4; i++)
{ouput_d(a[i]);
Delay_ms(100);
}

19


6. Các ứng dụng cơ bản: LED đơn, LED 7 đoạn, Text LCD, phím
nhấn đơn
VDD
4.7uF - 10uF
VDD

R1

10K

a) LED đơn

C2

1uF
2
3
4
5
6
7

PIC16F877A

31

32

MCLR/Vpp

GND

1

VCC

U2


C3

RA0/AN0
RA1/AN1
RA2/AN2/Vref RA3/AN3/Vref +
RA4/TOCKI
RA5/AN4/SS

RB7/PGD
RB6/PGC
RB5
RB4
RB3/PGM
RB2
RB1
RB0/INT

40
39
38
37
36
35
34
33

ICSPDAT
ICSPCLK

C6 33P

13

OSC1/CLKIN

RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7

Y1
14

GND

RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCL
RC4/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT

RD7/PSP7
RD6/PSP6
RD5/PSP5
RD4/PSP4
RD3/PSP3
RD2/PSP2
RD1/PSP1
RD0/PSP0


12

15
16
17
18
23
24
25
26

VCC

C11 33P

8
9
10

OSC2/CLKO

8M

11

RESET

RST


30
29
28
27
22
21
20
19
R10

R11

270

270

D1

D2

LED

LED

VDD
J1
6
5
4
3

2
1

JTAG

VDD
ICSPCLK
ICSPDAT
VDD
RST

20


YÊU CẦU:
1. Viết chương trình điều khiển LED D1 chớp tắt vô hạn lần, thời
gian delay là 300 ms.
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
#define

D1

PIN_D3

//-------CHƯƠNG TRÌNH CHÍNH--------Void main()
{
While(1)

{output_toggle(D1); delay_ms(300);}
}

21


YÊU CẦU:
2. Viết chương trình điều khiển LED D2 sáng 500 ms và tắt 100 ms
lặp lại vô hạn lần.
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
#define

D2

PIN_D7

//-------CHƯƠNG TRÌNH CHÍNH--------Void main()
{
While(1)
{output_low(D2); delay_ms(500);
Output_high(D2); delay_ms(100);}
}
22


YÊU CẦU:
3. Viết chương trình điều khiển LED D2 sáng/tắt (nhấp nháy) với

thời gian delay 500 ms, lặp lại 10 lần.
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
#define

D2

PIN_D7

//-------CHƯƠNG TRÌNH CHÍNH--------Void main()
{
For (int8 i = 0; i <20; i++)
{output_toggle(D2); delay_ms(500);}
While(1) ;
}
23


b) LED 7s

VDD
4.7uF - 10uF
VDD

R1
10K

C2


C6 33P
OSC1/CLKIN

RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7

Y1

15
16
17
18
23
24
25
26

R9 4K7

Q1

R10 4K7

R11 4K7

Q2
A1013


LED4

A1013

LED7S

a
b
c
d
e
f
g
p

R12 4K7

Q4
A1013

RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCL
RC4/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT

RD7/PSP7

RD6/PSP6
RD5/PSP5
RD4/PSP4
RD3/PSP3
RD2/PSP2
RD1/PSP1
RD0/PSP0

30
29
28
27
22
21
20
19

VDD

24

C2

7
6
4
2
1
9
10

5

C1

a
b
c
d
e
f
g
p

3

C1

Q3

C2

LED7S

a
b
c
d
e
f
g

p

3

C2

7
6
4
2
1
9
10
5

8

LED3
a
b
c
d
e
f
g
p

LED7S

C1


a
b
c
d
e
f
g
p

8

7
6
4
2
1
9
10
5

3

a
b
c
d
e
f
g

p

8

LED2

LED7S

VCC

GND

C11 33P

a
b
c
d
e
f
g
p

A1013

OSC2/CLKO

VCC

14

8M

8
9
10

LED1
a 7
b 6
c
4
d 2
e 1
f
9
g 10
p 5

12

13

R1
R2
R3
R4
R5
R
R6
R

R7
R
R8
R
R
R
R
100X8

C2

40
39
38
37
36
35
34
33

C1

RA0/AN0
RA1/AN1
RA2/AN2/Vref RA3/AN3/Vref +
RA4/TOCKI
RA5/AN4/SS

RB7/PGD
RB6/PGC

RB5
RB4
RB3/PGM
RB2
RB1
RB0/INT

8

2
3
4
5
6
7

PIC16F877A

3

1uF

31

32

MCLR/Vpp

GND


1

VCC

U2

C3

11

RESET

RST


YÊU CẦU:
1. Viết chương trình hiển thị số 1 trên LED 4.
Hướng dẫn:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M) // Tần số thạch anh dùng trong hệ thống
//-------CHƯƠNG TRÌNH CHÍNH--------Void main()
{
Output_d(0xFF);// tắt các led
Output_b(0x9F);
Output_low(PIN_D0);
While(1);// STOP
}
25



×