C VỚI LẬP TRÌNH PIC VÀ TRÌNH BIÊN DỊCH PICC LITE

C VỚI LẬP TRÌNH PIC VÀ TRÌNH BIÊN DỊCH PICC LITE


Ngôn ngữ lập trình C: Một trong những ngôn ngữ lập trình được sử dụng rộng rãi nhất hiện nay. Mặc dù các trình biên dịch C được viết cho PC và vi điều khiển tương tự nhau, nhưng có một số khác biệt quan trọng giữa chúng. Trình biên dịch C được viết cho PC thường lớn hơn và cung cấp nhiều chức năng cho lập trình viên (ví dụ: mở / đóng tệp, đọc tệp, v.v.). Ngoài ra, một trình biên dịch C được viết cho vi điều khiển nhỏ hơn và số lượng các hàm được trình bày cho lập trình viên là khá hạn chế. Tuy nhiên, một lập trình viên đã học ngôn ngữ C chuẩn có thể dễ dàng phát triển chương trình bằng ngôn ngữ C nếu anh ta biết kiến ​​trúc của vi điều khiển mà anh ta đang sử dụng.
Có một số trình biên dịch C được viết cho vi điều khiển PIC. Ví dụ, các công ty lâm nghiệp điện tử được cung cấp bởi Dự trữ Liên bang C, các công ty công nghệ cao của các sản phẩm với PICC, và một lần nữa cùng một công ty với sản phẩm và PICC Lite miễn phí, công ty CCS của PCM và PCW trình biên dịch và nhiều hơn nữa như nó.
Trong dự án này, trình biên dịch PICC Lite C, là một sản phẩm của công ty công nghệ cao và rất phổ biến, được sử dụng.
PICC Lite Compiler: nó được phát triển bởi công ty Hi-Tech và ANSI có tiêu chuẩn C, sau C biên dịch này rất nhiều tính năng trong nhiều ứng dụng công nghiệp, phục vụ giảng dạy và học tập, đồng thời được sử dụng như sở thích điện tử.
Trình biên dịch PICC Lite rất giống với trình biên dịch PICC được sản xuất và tiếp thị bởi cùng một công ty và có một số hạn chế vì nó là miễn phí. Ví dụ, PICC Lite chỉ có thể được sử dụng cho các bộ vi điều khiển PIC 16C84, 16F84, 16F84A, 16F627, 12F629, 16F877 và 16F877A PIC. Hơn nữa, hai hỗ trợ chỉ có một ngân hàng RAM (ngân hàng 2, mặc dù nó là đủ để PIC16F84 có thể không đủ cho PIC16F877) và khi 16F877 và 16F877 vi điều khiển sử dụng để 2K suất ROM bị hạn chế. Ngoài ra, các chức năng printf không thể được sử dụng cho các loại dữ liệu dài và nổi trong trình biên dịch PICC Lite. Ngoài những ràng buộc này, các trình biên dịch PICC Lite và PICC là giống nhau và có thể phát triển các ứng dụng PIC rất phức tạp bằng cả hai trình biên dịch.
Trong phần này, chúng tôi sẽ xem xét các tính năng của trình biên dịch PICC Lite và cách phát triển một chương trình C với trình biên dịch này.
Các biến thể dữ liệu PICC Lite: Trình biên dịch PICC Lite C hỗ trợ các kiểu dữ liệu sau. Cần lưu ý ở đây rằng chữ thường được sử dụng. .
bit 
unsigned char 
ký char 
unsigned int 
đã ký 
dài 
unsigned long 
float 
đôi
Bây giờ chúng ta hãy xem xét các kiểu dữ liệu này chặt chẽ hơn với các ví dụ.
Bit: Các số trong kiểu dữ liệu này có thể là Boolean (0 hoặc 1). Ví dụ, trong định nghĩa sau, cờ biến chỉ có thể lấy giá trị 0 hoặc 1.
cờ bit;
unsigned char: Với kiểu dữ liệu này, các số 8 bit được xác định và các số này có thể nằm trong khoảng từ 0 đến 255. Ví dụ, trong biến định nghĩa dữ liệu sau q có thể lấy bất kỳ giá trị nào trong khoảng từ 0 đến 255, trong đó q được đánh giá là 180. Đồng thời, biến a bằng với ký tự R. Với định nghĩa của unsigned char, cả một số nguyên 8 bit và một ký tự có thể được định nghĩa:
unsigned char q, a; 
q = 180; 
a = 'R';
Lưu ý rằng mỗi dòng trong ngôn ngữ C kết thúc bằng một dấu chấm phẩy (";"). Trình biên dịch sẽ thất bại nếu dấu này không được đặt ở cuối dòng.
char đã ký: Định nghĩa dữ liệu này chứa ký hiệu được sử dụng để xác định các số từ -128 đến +127. Trong ví dụ sau, giá trị của biến p'50 được đưa ra và giá trị của biến z'28 được cho:
ký char p, z; 
p = -50; 
z = 28;
int không dấu: Với định nghĩa này, 16 bit và số từ 0 đến 65535 có thể được xác định. Trong ví dụ sau, các giá trị cho biến Q là 915 và biến x là 3000:
unsigned int q; 
q = 915; 
x = 3000;
int đã ký: Trong định nghĩa này, có chứa ký hiệu và được sử dụng cho các số 16 bit, số phải nằm trong khoảng -32768 và +32767. Trong ví dụ sau, biến t'ye được gán một giá trị -500:
ký int t; 
t = -500;
long: Đối với định nghĩa này được sử dụng cho các số có 32 bit và ký hiệu, số phải nằm trong khoảng -2147483648 và +2147483647. Ví dụ, trong định nghĩa sau, biến m được định nghĩa là dài và giá trị là 200000:
dài m; 
m = 200000;
unsigned long: được sử dụng cho các số không dấu 32 bit trong định nghĩa này, các số phải nằm trong khoảng từ 0 đến 4294967295. Trong ví dụ sau, biến k được định nghĩa là unsigned long và có giá trị là 2000000:
unsigned long k; 
k = 2000000;
float: Định nghĩa này được sử dụng cho các biến số dấu phẩy động 24 hoặc 32 bit. Các biến số dấu chấm động rất quan trọng trong các phép toán. Trong ví dụ sau, temp biến được cho một giá trị là 1,23:
float temp; 
temp = 1,23;
double: Trong số định nghĩa này có thể là 24 hoặc 32 bit. Trong ví dụ sau, tổng biến có giá trị 12.45:
tổng kép; 
tổng = 12,45;
Định nghĩa các biến trong khi định nghĩa: Các biến trong ngôn ngữ lập trình C có thể được định giá trong khi định nghĩa. Ví dụ, biến temp được cho giá trị 10 trong định nghĩa và biến x là ký tự 'A':
unsigned int temp = 10; 
unsigned char x = 'A';
Nội dung giải thích trong chương trình: Sau hai dấu gạch chéo về phía trước ("//"), chúng không được trình biên dịch khuyên dùng,
i = 0; // làm cho biến i bằng không 
j = j + 2; // thêm 2 vào biến j 
// bây giờ nhân hai số 
// và lưu kết quả
Nếu giải thích là một dạng khác của văn bản, hãy bắt đầu mô tả bằng các ký tự "/ *" và kết thúc bằng ký tự "* /". Ví dụ sau đây cho thấy mô tả này:
/ * Chương trình này thu thập hai số. 
Một trong các số là x và số còn lại là y. 
Kết quả được lưu trữ. 

* /
z = x + y;
Có thể sử dụng cả hai định nghĩa trong bất kỳ chương trình nào.
Lưu trữ các biến trong bộ nhớ: Các biến trong trình biên dịch PICC Lite C thường được lưu trữ trong bộ nhớ RAM (các thanh ghi mục đích chung). Nếu giá trị của biến được cố định và không thay đổi trong chương trình, có thể lưu biến đó trong bộ nhớ chương trình (EPROM hoặc Flash). Bằng cách này, dung lượng RAM với dung lượng giới hạn không được sử dụng nhiều.
Để lưu trữ một biến cố định trong bộ nhớ chương trình, lệnh const phải được thêm vào trước và giá trị của biến phải được xác định tại thời điểm định nghĩa. Trong ví dụ sau, biến temp1 được lưu trong bộ nhớ RAM, biến temp2 được đặt thành 12 và chương trình được lưu trữ dưới dạng hằng số trong bộ nhớ. Ở đây, giá trị của biến temp được cố định trong suốt chương trình và không thể thay đổi trong chương trình. Biến thể tạm thời 1 có thể được thay đổi như mong muốn và bất cứ lúc nào:
int temp1; 
const int temp = 12;
Mảng: được sử dụng để tổng hợp một tập hợp các biến như một nhóm. Ví dụ,
int end [6];
Như trong Hình 1.1, lệnh này có 6 định nghĩa số nguyên và kết quả của các số nguyên này là [0], kết quả thứ hai là kết quả [1], và kết quả cuối cùng là kết quả [5].
Hình 1.1- Một loạt 6 phần tử
Ví dụ, kết quả [3] = 18 bằng số 18 của phần tử thứ tư của chuỗi kết quả. Trong cùng một cách, kết quả [2] = kết quả [1] bằng phần tử thứ hai của mảng kết quả với phần tử thứ ba.
Các phần tử của một mảng có thể được lưu trữ trong bộ nhớ RAM hoặc bộ nhớ chương trình. Nếu các giá trị của các phần tử được cố định và không thay đổi trong suốt chương trình, các phần tử này có thể được lưu trữ trong bộ nhớ chương trình bằng cách sử dụng lệnh const. Bằng cách này, bộ nhớ RAM có dung lượng giới hạn không được sử dụng. Trong ví dụ sau, các phần tử của mảng temp 5 phần tử được lưu trong bộ nhớ chương trình. Mảng này chứa 10 byte (mỗi số nguyên mất 2 byte):
const int temp [] = {1, 5, 9, 12, 45};
Trong ví dụ sau, mảng temp chứa 10 byte RAM trong bộ nhớ:
int temp [] = {1, 5, 9, 12, 45};
Trong ngôn ngữ lập trình C, các biến chuỗi là các chuỗi kết thúc bằng ASCII 0 và chứa một số ký tự. Trong trường hợp này,
char name [] = "Suzan";
Trong lệnh, trình biên dịch tự động phân bổ 6 ký tự với ký tự cuối ASCII 0 cho chuỗi tên. Trong ví dụ này, mảng được lưu trữ trong RAM. Chúng ta có thể lưu trữ chuỗi trong bộ nhớ chương trình bằng cách đặt lệnh const trên cùng một thư mục.
Các mảng có thể là đa chiều. Trong ví dụ sau và trong Hình 1.2 một mảng 2D được định nghĩa:
int temp [3] [5];
Hình 1.2 cho thấy một mảng hai chiều
Ở đây temp có thể được coi là một chuỗi với 3 hàng và 5 cột. Phần tử đầu tiên của mảng là temp [0] [0] , phần tử thứ hai temp [0] [1] , phần tử thứ ba temp [0] [2],v.v.
Ví dụ, temp [0] [1] = 10 bằng 10 của phần tử thứ hai của thư mục.
Có thể xác định các phần tử mảng trong khi định nghĩa. Trong ví dụ sau, chuỗi kiểm tra được lưu trữ trong bộ nhớ RAM và các thành phần của nó được thiết lập để kiểm tra [0] = 2, kiểm tra [1] = 5 và thử nghiệm [2] = 8 :
int temp [3] = {2,5,8};
Như đã đề cập trước đó, sử dụng lệnh const, chúng ta có thể lưu trữ các phần tử mảng liên tục trong bộ nhớ chương trình.
Biến chương trình: bắt đầu bằng ký tự hoặc dấu gạch dưới ("_"), theo sau là số ký tự mong muốn hoặc số từ 0-9. Sau đây là một số tên biến chương trình hợp lệ:
bạn 
total_miktar 
max5 
_order 

ge2ci23ci 
a_b_c_d
Biến tĩnh: Biến thường được tìm thấy trong một hàm và giá trị của nó không thay đổi ở mỗi lần sử dụng. Khi xác định các biến này, tên của chúng được ghi vào đầu tĩnh. Ví dụ, khi nhập một hàm, giá trị của một biến được sử dụng trước đó trong hàm là mơ hồ. Nhưng chúng ta sẽ giữ lại giá trị của tĩnh bằng cách tạo biến tĩnh.
Biến biến động: Nó được sử dụng bất cứ khi nào một biến không thể giữ giá trị cũ của nó mỗi khi nó được sử dụng. Các biến rằng tất cả các cổng đầu vào-đầu ra và các thay đổi thường trình gián đoạn phải dễ bay hơi.
Biến cố định: Nói chung, khi vi điều khiển PIC được đặt lại, tất cả các biến được sử dụng trong chương trình ban đầu là không. Tuy nhiên, trong một số trường hợp, chúng tôi có thể không muốn một số biến mất giá trị của chúng trong khi đặt lại. Chúng tôi viết từ liên tục trước tên của bất kỳ biến nào để biểu thị rằng chúng tôi không muốn biến đó được đặt lại trong quá trình đặt lại.
Biến địa chỉ tuyệt đối: Biến có thể được cung cấp giá trị địa chỉ tuyệt đối bằng cách đặt ký tự "@" ở cuối tên của biến đó. Ví dụ,
unsigned char Portbit @ 0x06;
Trong dòng trên, một biến được gọi là Portbit được định nghĩa tại địa chỉ 6 nci của bộ nhớ. Ở đây trình biên dịch không dự trữ một vị trí cho biến portbit, nhưng chỉ tên portbit bằng địa chỉ tuyệt đối 6. Định nghĩa này của assembler bằng rùng mình:
Portbit EQU 06 giờ
Kiểu dữ liệu bit và địa chỉ tuyệt đối có thể được kết hợp và bất kỳ bit nào trong một địa chỉ mong muốn có thể được đọc và thay đổi. Ví dụ, STATUS writer được gửi tới bộ nhớ 3 trong bộ nhớ. Nếu chúng ta muốn bit thứ ba của thanh ghi này, chúng ta có thể định nghĩa thanh ghi STATUS tại địa chỉ 3 và định nghĩa 3 × 8 + 3 = 27 bit nci như sau:
static unsigned char STATUS @ 0x03; 
bit tĩnh PD @ (không dấu) & STATUS * 8 + 3;
Biến PD ở đây định nghĩa 27 bit nci (bit thứ ba của thanh ghi STATUS) trong bộ nhớ.
Các nhà khai thác: Trong bất kỳ ngôn ngữ lập trình nào, các toán tử đều cực kỳ quan trọng. Tất cả các phép toán số học và logic được thực hiện bởi các toán tử này. Trình biên dịch PICC Lite hỗ trợ các toán tử sau đây:
() [] parentez 
Logic LƯU Ý 
bit ngược lại 
+ - * / số học khai thác 
mô đun 
++ tăng 
làm giảm 
địa chỉ 
<< >> ca (shift) điều hành 
> = lớn hơn hoặc khai thác bằng 
đó là các nhà điều hành lớn nhất 
<= nhỏ hơn hoặc khai thác bằng 
là một nhà điều hành nhỏ 
sizeof của một biến bao nhiêu byte 
= = toán tử logic bằng nhau 
toán tử logic không bằng nhau 
|| lôgic OR 
&& lôgic AND 
+ = - = / = toán tử bình đẳng 
| = ^ =% = toán tử bình đẳng 
& = << = >> = toán tử bằng nhau
Điều khiển luồng chương trình: Các lệnh thay đổi luồng chương trình là cực kỳ quan trọng trong mọi ngôn ngữ lập trình, bao gồm ngôn ngữ của trình biên dịch. Với các lệnh này, chúng ta có thể lặp hoặc chúng ta có thể thực hiện các phép toán khác nhau tùy thuộc vào giá trị của một biến. PICC Lite hỗ trợ các lệnh điều khiển luồng chương trình sau đây:
if-else 
cho 
một thời gian để 
làm 
goto 
ngắt 
công tắc - trường hợp
Chúng ta hãy xem xét kỹ hơn cách sử dụng các lệnh này.
if - else: Lệnh này, thay đổi luồng chương trình tùy thuộc vào việc thực hiện, có thể được sử dụng nói chung như sau:
if (điều kiện) lệnh;
hoặc,
if (condition) 

command; 
lệnh; 
.......... 
.......... 
lệnh;
}
hoặc,
if (condition) 

command; 
lệnh; 
.......... 

else 

command; 
lệnh; 
.......... 
}
nó cũng có thể được sử dụng trong các tình huống mà chỉ có một lệnh:
if (điều kiện) 
lệnh; lệnh 
khác 
;
Chú ý dấu chấm phẩy ở cuối các lệnh.
Trong ví dụ sau, nếu p là 0, b được tăng lên 1, nếu không 2 được thêm vào b:
nếu (p = 0) 
b = b + 1; 
khác 
b = b + 2;
Lưu ý rằng trong ví dụ trên, toán tử equals "= =" được sử dụng.
Cho: Đối với lệnh được sử dụng để lặp qua chương trình. Vòng lặp được sử dụng để lặp lại một hoặc nhiều lệnh nhiều lần. Lệnh này có thể là:
cho (bắt đầu, điều kiện, gia tăng) lệnh;
hoặc,
cho (bắt đầu; điều kiện; gia tăng) 

lệnh; 
lệnh; 
.......... 
}
trong đó giá trị ban đầu của biến vòng lặp là giá trị ban đầu và giá trị gia tăng là giá trị cuối cùng.
Trong ví dụ sau, biến vòng lặp i tăng lên đến 10 d và biến đếm được tăng lên 10 lần.
cho (i = 1; k = 10; i + +) sayac ++;
Có thể lặp lại bên trong bằng lệnh for. Trong ví dụ sau, vòng lặp bên trong được lặp lại 5 lần và lặp lại vòng lặp ngoài 10 lần:
(i = 0; i <10 cho="" i="" j="0; </font">.........}}
while: Lệnh khác được sử dụng để lặp là lệnh while, là mẫu sử dụng chung:
while (cond) lệnh;
hoặc,
while (condition) 

command; 
lệnh; 
......... 
}
Chu trình tiếp tục miễn là điều kiện được chỉ định là đúng. Nếu tùy chọn không chính xác ở đầu vòng lặp, các lệnh trong vòng lặp không được xử lý. Trong ví dụ sau, vòng lặp được lặp lại 10 lần:
i = 0; 
trong khi (i <10 font="" l="" nbsp="" nh="">lệnh; i ++; }
Khi sử dụng lệnh while, chúng ta phải cẩn thận không tạo điều kiện trong vòng lặp, nếu không chúng ta sẽ nhận được một vòng lặp vô hạn.
do: Một lệnh khác được sử dụng để lặp là lệnh do. Ở đây tùy chọn được kiểm tra ở cuối của sự trở lại và do đó vòng lặp sẽ chạy ít nhất một lần ngay cả khi điều kiện không chính xác. Việc sử dụng chung của lệnh này như sau:
do 

command; 
lệnh; 
…… .. 
} trong khi (điều kiện);
Trong ví dụ sau, biến vòng lặp j đi từ 0 đến 5 và vòng lặp được lặp lại 5 lần:
j = 0; 
do 

command; 
lệnh; 
j ++; 
} trong khi <5 font="">
Khi sử dụng lệnh while, chúng ta phải cẩn thận không tạo điều kiện trong vòng lặp, nếu không chúng ta sẽ nhận được một vòng lặp vô hạn. Đồng thời, ngay cả khi điều kiện được thỏa mãn, vòng lặp được thực hiện ít nhất một lần.
break: Lệnh break được sử dụng để thoát khỏi vòng lặp trong vòng lặp và trước khi kết thúc vòng lặp. Trong ví dụ sau, khi biến j là 10, vòng lặp dừng lại và các lệnh sau khi vòng lặp được xử lý. Lệnh này thường được sử dụng trong lệnh switch-case mà chúng ta sẽ thấy sau:
trong khi (i <100 font="" l="" nbsp="" nh="">lệnh; nếu (j = 10) nghỉ; }
switch - case: Lệnh này hoạt động giống như một lệnh if-else. Một biến được tìm nạp và các lệnh khác nhau được xử lý tùy thuộc vào giá trị của biến này.
Trong ví dụ sau, trong biến giây và 'A' và 'F', trong đó một chữ số thập lục phân số được hiển thị để được chuyển đổi sang số thập phân. Số được chuyển đổi được lưu trữ trong một biến như hex:
Chuyển đổi (giây) 

Trường hợp A ': hex = 65; 
break; 
Case'B ': hex = 66; 
break; 
Case'C ': hex = 67; 
break; 
Case'D ': hex = 68; 
break; 
Case'E ': hex = 69; 
break; 
Case'F ': hex = 70; 
break; 
mặc định: hex = 0; 
break; 
}
Nếu giá trị của biến sec là 'A', biến số thập phân trở thành 65, 'B' trở thành biến số thập lục 66, 'C' trở thành biến số thập phân 67, v.v. Nếu biến sec không nằm giữa 'A' và 'F' Trong ví dụ, biến số thập phân bằng 0. Lưu ý rằng lệnh break thường được sử dụng trong lệnh switch-case (nếu ngắt không được sử dụng, chương trình sẽ tiếp tục với lần chạy tiếp theo).
Chức năng người dùng: Chức năng thường được sử dụng trong một chương trình và độc lập với chương trình chính. Mỗi chức năng là một tên và một chức năng có thể chuyển thông tin chương trình chính nếu muốn. Các hàm bắt đầu bằng lệnh void lúc đầu không thể chuyển thông tin đến chương trình chính. Ví dụ, tên hàm sau là hàm mũ và hàm này không truyền thông tin chương trình chính.
void ledon () 

led = 1; 
}
Hàm ledon sau đây chuyển thông tin số nguyên đến chương trình chính:
int ledon () 

command; 
lệnh; 
return (biến); 
}
Các hàm có thể lấy thông tin từ chương trình chính, xử lý thông tin đó và chuyển thông tin chương trình chính về chương trình chính. Trong ví dụ sau, hàm vuông lấy một giá trị số nguyên từ chương trình chính và lấy khung và chuyển nó vào chương trình chính:
int square (int y) 

int w; 
w = y * y; 
return (w); 
}
Chức năng này có thể được sử dụng bởi chương trình chính như sau:
s = hình vuông (p);
Hàm vuông lấy giá trị của biến p từ chương trình chính và lấy khung của số này và chuyển nó trở lại chương trình chính. Định nghĩa int ở đầu hàm cho biết chương trình chính sẽ chuyển số nguyên (số nguyên). Trong trường hợp này, biến s trong chương trình chính bằng p.
Một điểm quan trọng ở đây là các biến w và y được sử dụng trong hàm chỉ có chức năng và không liên quan gì đến biến w hoặc y trong chương trình chính. Đồng thời, không có sự tương quan giữa một biến được sử dụng trong chương trình chính và bất kỳ biến nào được sử dụng trong hàm và mang cùng một tên.
Ví dụ 3.2
Viết một hàm tính toán diện tích của một hình tam giác với một cơ sở và độ cao đã biết, và chuyển vùng mà bạn tìm đến chương trình chính.
Giải pháp 3.2 Các
cơ sở và chiều cao có thể được tìm thấy như là khu vực của một tam giác đã biết. Trong trường hợp này, hàm mong muốn được đưa ra dưới đây. Kiểu dữ liệu float được sử dụng, cho rằng các biến có thể là bất kỳ số nào:
lĩnh vực float (phao nổi, chiều cao phao) 

float i; 
i = (base * height) / 2; 
trả lại (i); 
}
Giả sử rằng đáy là 23.2 và chiều cao là 3.4, hàm này có thể được gọi bởi chương trình chính như sau:
calc = alan (23.2, 3.4);
Ở đây, trường được tính toán bởi hàm và được lưu trữ trong một biến được gọi là máy tính. biến tài khoản phải được định nghĩa là phao trong chương trình chính.
Pre-processor Directives: Trình biên dịch PICC Lite hỗ trợ một loạt các chỉ thị tiền xử lý được tìm thấy trong các trình biên dịch C chuẩn khác. Các chỉ thị tiền xử lý chung được mô tả dưới đây.
#define: Chỉ thị này được sử dụng ở đầu chương trình và hoạt động như macro, thay thế các ký hiệu bằng bằng.
ví dụ 
#define size 10 
#define max 100 
#define min 0
chúng tự động đặt các giá trị của chúng vào vị trí khi các ký hiệu này được sử dụng trong chương trình:
a = 1; // tạo biến số 1 
a = a + size; // biến thể có giá trị 11
Chỉ thị xác định có thể rất phức tạp. Trong định nghĩa macro sau, thao tác 2 * (a + b) được định nghĩa là mult (a, b):
#define mult (a, b) 2 * (a + b)
Bây giờ chúng ta hãy xem xét việc sử dụng makron này trong một chương trình.
a = 2; // tạo một biến 2 làm 
b = 5; // tạo biến b 5 
c = mult (a, b); // c biến 2 * (2 + 5) = 14
Ví dụ 3.3
Một số nguyên bao gồm 2 byte. Để nhận được các byte trên và dưới của một số nguyên như vậy, chúng tôi viết macro bằng lệnh "define".
Giải pháp 3.3
Để có được byte trên, chúng ta có thể di chuyển số 8 lần sang bên phải. Bằng cách nói ustbayt trong tên của macro,
#define usfbayt (x) (unsigned char) (x >> 8)
Nó xảy ra. Để tìm byte dưới cùng, chúng ta có thể che dấu nó bằng 0xFF (tối đa 255). Nếu chúng ta nói altbayt trong tên của macro,
#define altbayt (x) (unsigned char) (x & 0xFF)
Nó xảy ra.
Ví dụ 3.4 Chúng ta
viết một macro bằng cách sử dụng chỉ thị "define" để tạo một bit bất kỳ của biến 1 hoặc 0.
Giải pháp 3.4
Nếu chúng ta sử dụng macro để thực hiện bất kỳ bit 1 nào, chúng ta có thể viết:
#define bit_set (var, bitno) ((var) - = (1 << (bitno)))
Để thực hiện bất kỳ bit nào 0, nếu chúng ta sử dụng macro bit_reset, chúng ta có thể viết:
#define bit_reset (var, bitno) ((yar) & = ~ (1 << (bitno)))
Ví dụ, để tạo bit 3 của x biến 1 chúng ta có thể sử dụng lệnh sau:
bit_set (x, 3);
Tương tự như vậy, chúng ta có thể sử dụng lệnh sau để biến bit thứ 6 của biến p 0:
bit_reset (p, 6);
#asm và #endasm: Với các chỉ thị này, một chương trình lắp ráp hoặc một hoặc nhiều lệnh lắp ráp có thể được thêm vào chương trình C của bạn:
.......... 
.......... 

a = 2; 
#asm 
movlw 10h 
#endasm

............. 
.............
Các lệnh Assembler nên được đặt giữa các lệnh #asm và #endasm như đã thấy trong chương trình trên.
#include: Sử dụng chỉ thị này, chúng tôi có thể nhập một tệp văn bản khác vào chương trình của chúng tôi. Ví dụ: tệp "myproject.h" có thể được thêm vào chương trình của bạn như sau:
#include " myproject.h "
hoặc,
#include
Trong khi phần mềm PIC phát triển, tệp phải được thêm vào chương trình. Tệp này mô tả các biến khác nhau của vi điều khiển PIC là nội dung.
Sử dụng cơ sở số khác nhau trong chương trình: Số cơ sở của trình biên dịch PICC Lite là 10 (thập phân) và số cơ sở được sử dụng trong nhiều bộ vi xử lý và ứng dụng vi điều khiển cần được thay đổi theo thời gian. Ví dụ, trong các ứng dụng điều khiển dựa trên vi điều khiển, 16 base (hệ thập lục phân) hoặc 8 base (bát phân) được sử dụng.
Để viết một số dưới dạng thập lục phân, bạn phải đặt% x (hoặc% 0X) trước mặt nó,% o ở phía trước nó để viết bát phân và 0b ở trước nó để viết nhị phân. Dưới đây là một số ví dụ từ các cơ sở khác nhau:
tổng =% 0x1f; // total = 0001 1111 
sum =% o37; // sum = 011 111 
a = 0b00001111 // a = 00001111
Cấu trúc: Xây dựng được sử dụng để xây dựng các biến khác nhau liên quan đến nhau dưới một biến mới. Ví dụ: một số thông tin về một cá nhân thường có thể được mô tả là:
tên char chưa được ký [80]; 
unsigned char char [80]; 
int int chưa được ký; 
địa chỉ char chưa được ký [80];
Sử dụng một cấu trúc chúng ta có thể viết các định nghĩa ở trên:
struct sahsi 

unsigned char name [80]; 
unsigned char char [80]; 
int int chưa được ký; 
địa chỉ char được chỉ định [80]; 
}
Trong trường hợp này, tất cả các định nghĩa về người có cấu trúc sahi được thu thập dưới một mái nhà. Khi một cấu trúc được định nghĩa như trên, nó không có chỗ trong bộ nhớ. Tuy nhiên, cấu trúc này chiếm bộ nhớ khi được sử dụng trong ví dụ tiếp theo.
Bây giờ, chúng ta có thể tạo ra định nghĩa mới sau đây:
struct sahsi mine_brafik;
Với định nghĩa trên, my_info là một biến mới, là kiểu biến và biến này chứa trong bộ nhớ. Bây giờ, bằng cách sử dụng biến thể mới này, chúng ta có thể viết:
My_batter.set = 25;
Sử dụng một cấu trúc, chúng ta có thể chia một biến thành số bit mong muốn. Trong ví dụ sau, x và y là biến 1 bit và z là biến 6 bit. Các cờ temp biến có cấu trúc và chứa tổng số 1 byte trong bộ nhớ:
struct flags 

unsigned char x: 1; 
unsigned char y: 1; 
unsigned char z: 6; 
}
struct flags temp;
Con trỏ: Trong ngôn ngữ lập trình C, khái niệm con trỏ được sử dụng rộng rãi. Nói chung, một con trỏ biểu thị địa chỉ thực của một biến. Ví dụ, nếu x là một biến, một con trỏ đến x giữ địa chỉ của x trong bộ nhớ của nó. Dấu được xác định bằng cách đặt ký tự "*" trước tên biến. Theo biến cesidium, giống marker cũng thay đổi. Ví dụ: không thể sử dụng dấu ký tự cho số nguyên. Trong ví dụ sau, p được định nghĩa là dấu ký tự:
char * p;
Trong đó p được định nghĩa là dấu ký tự, nó hiện không được sử dụng ở bất kỳ đâu. Chúng tôi có thể lấy địa chỉ của biến đó bằng cách đặt "&" trước bất kỳ biến nào. Sau đó chúng ta có thể sử dụng biến con trỏ. Ví dụ, trong con trỏ p, chúng ta có thể tải địa chỉ của biến z như sau:
p = & lt; / RTI & gt;
Con trỏ p bây giờ giữ địa chỉ của biến z. Sử dụng toán tử "*", chúng ta có thể đọc giá trị thực của một biến có địa chỉ được biết. Trong ví dụ sau, giá trị của biến z được xác định trước đó được đặt thành 3:
* p = 3;
Việc truy cập địa chỉ của bất kỳ biến nào là rất hữu ích trong nhiều ứng dụng. Có thể phát triển các chương trình ngắn hơn và hiệu quả hơn theo cách này.
Đánh dấu rất hữu ích trong mảng. Tên của một thư mục chứa địa chỉ của thư mục đó. Trong trường hợp này, chúng ta có thể dễ dàng xử lý các mảng bằng cách sử dụng một con trỏ. Một ví dụ được đưa ra dưới đây:
char buffer [10]; // định nghĩa một bộ đệm với 10 phần tử 
char * p; // p là một con trỏ ký tự 
p = buffer; // p địa chỉ đệm con trỏ được tải 
* p = 0; // tạo thành phần tử đầu tiên của mảng đệm 0 
p ++; // Gia tăng p (phần tử tiếp theo theo địa chỉ) 
* p = 1; // tạo thành phần tử thứ hai của bộ đệm 1
Như bạn sẽ thấy ở trên, có thể thực hiện các phép tính số học khác nhau với các điểm đánh dấu và đi đến các địa chỉ khác nhau.
Bộ đọc và ghi EEPROM: Một số bộ vi điều khiển PIC (ví dụ PIC16F84) có bộ nhớ EEPROM. Để đọc và ghi vào bộ nhớ này, trình biên dịch PICC Lite có hai hàm, EEPROM_WRITE và EEPROM_READ.
Hàm EEPROM_WRITE (địa chỉ, dữ liệu) ghi địa chỉ vào địa chỉ bộ nhớ. Ví dụ, lệnh EEPROM_WRITE (5, 12 ) ghi 12 đến địa chỉ bộ nhớ 5.
Hàm EEPROM_READ (địa chỉ) đọc dữ liệu từ địa chỉ bộ nhớ. Ví dụ, lệnh z = EEPROM_READ (14) đọc dữ liệu tại địa chỉ thứ 14 của bộ nhớ và bằng biến z.
Cấu hình Bits: PIC bit cấu hình vi điều khiển "_config (x)" có thể được lựa chọn như mong muốn bằng cách sử dụng lệnh. Ở đây x là cấu hình mong muốn. Trong ví dụ sau Guardian Dog bị ngừng hoạt động, chế độ tinh thể XT được chọn và không bảo vệ mã nào được thực hiện:
_CONFIG (WDTDIS & XT & UNPROTECT);
Bạn có thể chọn các bit cấu hình PIC như bạn muốn với phần mềm lập trình trong quá trình lập trình của chip.
Viết tập tin nguồn (rft) với C với lập trình PIC và trình biên dịch PICC Lite
Tải xuống tệp LINK danh sách (ở định dạng TXT) link-3688.zip mật khẩu-pass: 320volt.com Cảm ơn bạn

Post a Comment

[disqus] [facebook] [blogger]

MKRdezign

Biểu mẫu liên hệ

Name

Email *

Message *

Powered by Blogger.
Javascript DisablePlease Enable Javascript To See All Widget
Hỗ trợ trực tuyến