Ngôn ngữ lập trình cho PIC rất đa dạng.. Ngôn ngữ lập trình cấp thấp có Asemmbler , các ngôn ngữ lập trình cấp cao có C, Basic, Pascal, Kell C, …Ngoài ra còn có 1 số ngôn ngữ lập trình đ
Trang 1Ngôn ngữ lập trình cho PIC rất đa dạng Ngôn ngữ lập trình cấp thấp có Asemmbler , các ngôn ngữ lập trình cấp cao có C, Basic, Pascal, Kell C, …Ngoài ra còn có 1 số ngôn ngữ lập trình được phát triển dành riêng cho Pic như PicBasic, MikroBasic, … Nhưng do giới hạn của
đề tài này mà nhóm chi giới thiệu về ngôn ngữ lập trình C
4.1 Các kiểu khai báo biến, mảng
4.1.1 Các khai báo biến
int1 số 1 bit có giá trị là 0 hoặc 1
int8 số nguyên 1 byte ( 8 bit) có giá trị từ từ -127 đến 128.
int16 số nguyên 16 bit
int32 số nguyên 32 bit
char ký tự 8 bit
float số thực 32 bit
short như kiểu int1
byte như kiểu int8
int như kiểu int8
long như kiểu int16.
Khai báo Unsigned ở phía trước để đó là số không dấu.
Ví dụ: Unsigned int8 sẽ có giá trị từ 0 đến 255
4.1.2 Khai báo mãng
4.1.2.1Khai báo mãng 1 chiều
Đối với việc khai báo mãng 1chiều có 2 cách để khai báo đó là khai báo mãng tĩnh và mãng động.
Khai báo mãng tĩnh: Int8 const a[i]={a0,……., ai}
Nếu khai báo mảng như trên thì ta sẻ có 1 mảng gồm i phần tử
Lưu ý: nếu đánh không đủ số phần tử vào trong ngoặc kép như đã khai báo, các phần tử còn lại sẽ là 0 Truy xuất giá trị vượt quá chỉ số mãng khai báo sẻ làm chương trình chạy vô tận
VD: int8 const a[7]={1,2,3,4,5,6} thì phần tử thứ 7 sẽ mang giá trị là 0
Khai báo mãng động: Int8 const a[]={a0,…….,ai}
Nếu khai báo mảng như trên thì ta sẻ có 1 mảng có kích thước bằng với số phần
tử được nhập vào
VD: int8 const a[]={1,2,3,4,5,6,7} thì mãng a[] sẽ có kích thước là 7
4.1.2.2Khai báo mãng 2 chiều
Int8 const a[i][j]={a00,………….,a0j
………
ai0………… ,aij} VD: int8 const a[2][3]={1,2,3
4,5,6}
Trang 24.2 Các phép toán trong C
cấu trúc hàm cơ bản của C
4.3.1
If….else
Dạng 1:
If (điều kiện)
{lệnh 1;
lệnh 2;
………
lệnh n;}
VD: if(x==5) {x=1;}
+= Phép cộng bằng VD: x+=8 x=x+8
= Phép gán giá trị / Phép chia lấy phần nguyên
== So sánh bằng
> Lớn hơn
>= Lớn hơn hoăc bằng ++ Tăng 1 đơn vị
<<= Dịch trái
<< Dịch trái
<= Bé hơn hoặc bằng
&& Phép ‘AND’
Phép giảm 1 đơn vị
% Phép chia lấy phần dư
>>= Dịch phải
>> Dịch phải
Trang 3Dạng 2:
If (điều kiện)
{lệnh 1;
lệnh 2;
………
lệnh n;}
else
{lệnh 1;
lệnh 2;
………
lệnh n;}
Dạng 3:
If (điều kiện)
{lệnh 1;
lệnh 2;
………
lệnh n;}
else if (điều kiện)
{lệnh 1;
lệnh 2;
………
lệnh n;}
4.3.2 Cấu trúc For
Cấu trúc:
For(gt 1,…gti;dk1,……dkm,bt1,….btk)
{lệnh 1;
lệnh 2;
…………;
lệnh n;}
VD: for(i=0;i<9;i++)
{x+=5;}
4.3.3 Cấu trúc do… while
Cấu trúc:
Do
{lệnh 1;
Trang 4lệnh 2 …………;
lệnh n;}
while(điều kiện) 4.3.4 Cấu trúc While
Cấu trúc:
While(điều kiện)
{lệnh 1;
lệnh 2;
………
lệnh n;}
4.3.5 Cấu trúc Switch….case
Cấu trúc:
Switch(variable) {case (value 1):{lệnh 1;break;}
case (value 2):{lệnh 2;break;}
case (value n):{lệnh n;break;}
4.4 Các lênh cơ bản
4.4.1 Các lệnh tiền xử lý
#INCLUDE
Cú pháp : #include <tên PIC.h>
Luôn phải có và đăt ở dòng đầu tiên
#BYTE
Cú pháp: #byte id=X
Tạo 1 byte đặt ở địa chỉ X VD: #byte PortB=0x06
#BIT
Cú pháp: #bit id = x.y
Mô tả: Tạo 1 bit đặt ở byte X vị trí Y dùng kiểm tra hay gán giá trị bit cho thanh ghi
#USE DELAY
Cú pháp: #USE DELAY (CLOCK=SPEDD)
Khai báo tần số thạch anh sử dụng
VD: #use delay (clock=4000000)
#USE FAST_IO
Cú pháp: #use fast_io(tên Port)
4.4.2 Các lệnh delay
Delay_cycles(value)
Value : giá trị từ 0 đến 255 Là số chu kì lệnh 1 chu kì lệnh bằng 4 chu kì máy
Trang 5Time là thời gian delay đơn vị tính là µs
Nếu Time là hằng số thì Time nằm trong khoảng 0 ≤ Time ≥ 65535
Nếu Time là biến số thì Time nằm trong khoảng 0 ≤ Time ≥ 255
Delay_ms(time)
Time là thời gian delay đơn vị tính là ms
Nếu Time là hằng số thì Time nằm trong khoảng 0 ≤ Time ≥ 65535
Nếu Time là biến số thì Time nằm trong khoảng 0 ≤ Time ≥ 255
4.4.3 Các lệnh I/O
Output_low(pin) và Output_high(pin)
Dùng thiết lập mức ‘0’ hay mức ‘1’ cho các chân của IC
Output_X(value)
X: tên Port
Value: từ 0 đến 255.
Input(pin) Input_X(tên port) Set_tris_X(value)
Value: từ 0 đến 255
Hàm này định nghĩa chân I/O của 1 port
4.4.4 Các lệnh sử dụng khối chức năng
4.4.4.1 ADC
Setup_ADC ( mode ) :
Dùng cài đặt thời gian chuyển đổi của bộ ADC
ADC_CLOCK_INTERNAL : thời gian lấy mẫu bằng tốc độ xung Clock ADC_CLOCK_DIV_2 : thời gian lấy mẫu bằng tốc độ xung Clock/2 ADC_CLOCK_DIV_8 : thời gian lấy mẫu bằng tốc độ xung Clock/8 ADC_CLOCK_DIV_32 : thời gian lấy mẫu bằng tốc độ xung Clock/32
Setup_ADC_ports ( value )
Xác định chân lấy tín hiệu Analog và điện thế chuẩn ALL_ANALOGS : tất cả các chân đều để đọc Analog : A0 A1 A2 A3 A5 E0 E1 E2 (Vref=Vdd)
NO_ANALOG : Không dùng Analog các chân sẻ là I/O AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF : A0 A1 A2 A5 E0 E1 E2 VRefh=A3
AN0_AN1_AN2_AN3_AN4 : A0 A1 A2 A3 A5 AN0_AN1_AN3 : A0 A1 A3 , Vref = Vdd AN0_AN1_VSS_VREF : A0 A1 VRefh = A3 AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF : A0 A1 A5 E0 E1 E2 VRefh=A3 , VRefl=A2
Trang 6AN0_AN1_AN2_AN3_AN4_AN5 : A0 A1 A2 A3 A5 E0
AN0_AN1_AN2_AN4_AN5_VSS_VREF : A0 A1 A2 A5 E0 VRefh=A3
AN0_AN1_AN4_AN5_VREF_VREF : A0 A1 A5 E0 VRefh=A3 VRefl=A2 AN0_AN1_AN4_VREF_VREF : A0 A1 A5 VRefh=A3 VRefl=A2
AN0_AN1_VREF_VREF : A0 A1 VRefh=A3 VRefl=A2
AN0 : A0
AN0_VREF_VREF : A0 VRefh=A3 VRefl=A2
Set_ADC_channel(channel)
Chọn chân để đọc giá trị ADC Giá trị channel tùy thuộc vào từng loại Pic.Đối với Pic16F877A channel có những giá trị sau:
0-chân A0
1-chân A1
2-chân A2
3-chân A3
4-chân A5
5-chân E0
6-chân E1
7-chân E2
Read_ADC()
Dùng đọc giá trị từ thanh ghi chứa kết quả biến đổi ADC
4.4.4.2 Timer0
Setup_Timer_0 (mode|bộ chia tần)
Hàm này có chức năng là cài đặt bộ timer0
Trong đó mode là:
RTCC_Internal : xung tác động là xung nội
RTCC_EXT_L_TO_H : xung (cạnh lên) tác động từ chân RA4
RTCC_EXT_H_TO_L : xung (cạnh xuống) tác động từ chân RA4
RTCC_DIV_1 : chia tần 1:1
RTCC_DIV_2 : chia tần 1:2
RTCC_DIV_4 : chia tần 1:4
RTCC_DIV_8 : chia tần 1:8
RTCC_DIV_16 : chia tần 1:16
RTCC_DIV_32 : chia tần 1:32
RTCC_DIV_64 : chia tần 1:64
RTCC_DIV_128 : chia tần 1:128
RTCC_DIV_256 : chia tần 1:256
Set_timer0(value)
Hàm này có chức năng gán giá trị vào Timer0
Get_timer0()
Hàm này có chức năng trả về giá trị của Timer0
4.4.4.3 Timer1
Trang 7Setup_timer_1(mode|bộ chia tần)
Hàm này có chức năng là cài đặt bộ timer0
Trong đó mode là:
T1_INTERNAL : xung tác động là xung nội
T1_EXTERNAL : xung (không đồng bộ) tác động từ chân RC0 T1_EXTERNAL_SYNC : xung (đồng bộ) tác động từ chân RC0
T1_DIV_BY_1 : chia tần 1:1
T1_DIV_BY_2 : chia tần 1:2
T1_DIV_BY_4 : chia tần 1:4
T1_DIV_BY_8 : chia tần 1:8
Set_timer1(value)
Hàm này có chức năng gán giá trị Timer1
Get_timer1()
Hàm này có chức năng trả về giá trị của Timer1
4.4.4.4 Timer2
Setup_timer_2(bộ chia tần,period,postscale)
Hàm này có chức năng là cài đặt bộ timer2
T2_DIV_BY_1 : chia tần 1:1
T2_DIV_BY_4 : chia tần 1:4
T2_DIV_BY_16 : chia tần 1:16
Set_timer1(value)
Hàm này có chức năng gán giá trị vào Timer2
Get_timer1()
Hàm này có chức năng trả về giá trị của Timer2
4.4.4.5 PWM
Setup_ccpX(ccp_pwm)
set_pwmX_duty(x);
Setup_timer_2(bộ chia tần,period,postscale)
4.4.4.6 SPI
setup_spi(SPI_MASTER | SPI_h_TO_l| SPI_CLK_DIV_16);
spi_write(value);
Trên đây chỉ giới thiệu 1 số lệnh cơ bản của C Ngoài ra nó còn nhiều lệnh khác chi tiết
xem tại file Help của CCS.
4.4.5 Cấu trúc của 1 chương trình C.
#include <16f877a.h>
#use delay(clock=speed)
………
Void chuongtrinhcon 1;//có thể có hoặc không tùy theo cách viết
………
Void chuongtrinhcon n;
Void main()
Trang 8{lệnh 1 ;
……….;
Chuongtrinhcon 1 (); //nếu có
lệnh n;
}
Void chuongtrinhcon 1()
{ lệnh 1 ;
……….;
lệnh n;
}