Hướng dẫn lập trình C nhúng với ngôn ngữ Keil

Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề





Embedded C là ngôn ngữ lập trình phổ biến nhất trong lĩnh vực phần mềm để phát triển các tiện ích điện tử. Mỗi bộ xử lý được liên kết với phần mềm nhúng. Lập trình C nhúng đóng vai trò chính trong việc thực hiện các chức năng cụ thể của bộ vi xử lý. Trong cuộc sống hàng ngày, chúng ta thường xuyên sử dụng nhiều thiết bị điện tử như máy giặt, điện thoại di động, máy ảnh kỹ thuật số ... sẽ hoạt động dựa trên vi điều khiển được lập trình bằng C nhúng.

Lập trình hệ thống nhúng

Lập trình hệ thống nhúng



Mã C được viết ra đáng tin cậy hơn, di động và có thể mở rộng và trên thực tế, dễ hiểu hơn nhiều. Công cụ đầu tiên và quan trọng nhất là phần mềm nhúng quyết định hoạt động của một hệ thống nhúng. Ngôn ngữ lập trình C nhúng thường được sử dụng để lập trình vi điều khiển.


Hướng dẫn lập trình C nhúng (8051)

Để viết chương trình, các nhà thiết kế nhúng phải có đủ kiến ​​thức về phần cứng của bộ xử lý hoặc bộ điều khiển cụ thể vì lập trình C nhúng là một kỹ thuật lập trình liên quan đến phần cứng đầy đủ.



Hướng dẫn lập trình

Hướng dẫn lập trình

Trước đó, nhiều ứng dụng nhúng đã được phát triển bằng cách sử dụng lập trình cấp lắp ráp. Tuy nhiên, họ không cung cấp tính di động để khắc phục vấn đề này với sự ra đời của nhiều ngôn ngữ cấp cao khác nhau như C, COBOL và Pascal. Tuy nhiên, ngôn ngữ C đã được chấp nhận rộng rãi cho phát triển ứng dụng hệ thống nhúng và nó tiếp tục làm như vậy.

Hệ thống nhúng

Hệ thống nhúng được định nghĩa là sự kết hợp của phần mềm lập trình C nhúng và phần cứng chủ yếu bao gồm vi điều khiển và nó nhằm thực hiện một nhiệm vụ cụ thể. Những loại hệ thống nhúng này đang được sử dụng trong cuộc sống hàng ngày của chúng ta như máy giặt và máy ghi hình, tủ lạnh, v.v. Hệ thống nhúng lần đầu tiên được giới thiệu bởi bộ vi điều khiển 8051.

Hệ thống nhúng

Hệ thống nhúng

Giới thiệu về Vi điều khiển 8051

Vi điều khiển 8051 là một vi điều khiển cơ bản, nó được ‘Intel Corporation’ giới thiệu lần đầu tiên từ năm 1970. Nó được phát triển theo kiến ​​trúc bộ xử lý 8086. 8051 là một họ vi điều khiển, được phát triển bởi các nhà sản xuất khác nhau như Philips, Atmel, dalls, v.v. Bộ vi điều khiển 8051 đã được sử dụng trong nhiều sản phẩm nhúng từ đồ chơi của trẻ nhỏ đến các hệ thống ô tô lớn.


Bộ vi điều khiển 8051

Bộ vi điều khiển 8051

Bộ vi điều khiển 8051 là 8-bit Kiến trúc ‘CISC’ . Nó bao gồm các bộ nhớ, giao tiếp nối tiếp, ngắt, các cổng đầu vào / đầu ra và bộ đếm thời gian / bộ đếm, được tích hợp trong một chip tích hợp duy nhất, được lập trình để điều khiển các thiết bị ngoại vi được giao tiếp với nó. Chương trình được lưu trữ trong RAM của vi điều khiển nhưng trước khi viết chương trình, chúng ta phải biết về RAM cơ quan của bộ vi điều khiển.

Lập trình hệ thống nhúng: Khai báo khái niệm cơ bản

Mọi hàm là một tập hợp các câu lệnh thực hiện một nhiệm vụ cụ thể và tập hợp một hoặc nhiều hàm được gọi là ngôn ngữ lập trình. Mọi ngôn ngữ đều bao gồm một số yếu tố cơ bản và các quy tắc ngữ pháp. Lập trình ngôn ngữ C được thiết kế để hoạt động với tập ký tự, biến, kiểu dữ liệu, hằng số, từ khóa, biểu thức, v.v. được sử dụng để viết một chương trình C. Tất cả những điều này được coi là dưới tệp tiêu đề hoặc tệp thư viện và nó được biểu thị là

#include

Phát triển lập trình C nhúng

Phát triển lập trình C nhúng

Phần mở rộng của ngôn ngữ C được gọi là ngôn ngữ lập trình C nhúng. So với ở trên, lập trình nhúng trong ngôn ngữ C có một số tính năng bổ sung như kiểu dữ liệu và từ khóa và tệp tiêu đề hoặc tệp thư viện được biểu diễn dưới dạng

#include

Từ khóa bổ sung được nhúng C

  • sbit
  • bit
  • SFR
  • bay hơi
  • macro xác định

'Sbit' được sử dụng để khai báo mã PIN duy nhất của bộ vi điều khiển. Ví dụ: LED kết nối với chân P0.1 thì không nên gửi trực tiếp giá trị đến chân cổng, đầu tiên ta phải khai báo chân đó với một biến khác sau đó mới sử dụng được ở bất cứ đâu trong chương trình.

Cú pháp: sbit a = P0 ^ 1 // khai báo pin tương ứng với một biến //
a = 0x01 // gửi giá trị đến chân cổng //

'Bit' được sử dụng để kiểm tra trạng thái của biến.

Cú pháp: bit c // khai báo biến bit //
c = a // một giá trị được gán cho biến c //
if (c == 1) // kiểm tra điều kiện đúng hay sai //

{
… ..
……
}

Từ khóa 'SFR' được sử dụng để truy cập các thanh ghi SFR bằng một tên khác. Thanh ghi SFR được định nghĩa là đăng ký chức năng đặc biệt , nó chứa tất cả các thanh ghi liên quan đến ngoại vi bằng cách chỉ ra địa chỉ. Thanh ghi SFR được khai báo bởi từ khóa SFR. Từ khóa SFR phải được viết hoa.

Cú pháp: SFR port = 0x00 // 0x00 là địa chỉ port0 nó được khai báo bởi biến port //
Port = 0x01 // sau đó gửi giá trị đến port0 //
sự chậm trễ()
cổng = 0x00
sự chậm trễ()

Từ khóa 'dễ bay hơi' là từ khóa quan trọng nhất trong phát triển hệ thống nhúng. Không thể thay đổi bất ngờ biến được khai báo với giá trị từ khóa biến động. Nó có thể được sử dụng trong các thanh ghi ngoại vi được ánh xạ bộ nhớ, các biến toàn cục được sửa đổi bởi ISR. Nếu không sử dụng từ khóa biến động để truyền và nhận dữ liệu, lỗi mã hoặc lỗi tối ưu hóa sẽ xảy ra.

Cú pháp: variable int k

Macro là một cái tên được sử dụng để khai báo khối câu lệnh như một chỉ thị tiền xử lý. Bất cứ khi nào tên được sử dụng, nó sẽ được thay thế bằng nội dung của macro. Các macro đại diện cho #define. Toàn bộ chân cổng được xác định bởi macro.

Cú pháp: #define dat Po // toàn bộ cổng được khai báo bởi một biến //
dat = 0x01 // dữ liệu gửi đến cổng0 //

Các chương trình C nhúng cơ bản

Lập trình vi điều khiển sẽ khác nhau đối với mỗi loại hệ điều hành . Mặc dù có rất nhiều hệ điều hành đang tồn tại như Linux, Windows, RTOS, v.v. Tuy nhiên, RTOS có một số lợi thế để phát triển hệ thống nhúng. Bài viết này thảo luận về lập trình C nhúng cơ bản để phát triển lập trình C nhúng sử dụng vi điều khiển 8051.

Các bước lập trình C nhúng

Các bước lập trình C nhúng

  • Đèn LED nhấp nháy sử dụng với vi điều khiển 8051
  • Số Hiển thị trên màn hình 7 đoạn sử dụng vi điều khiển 8051
  • Tính toán bộ định thời / bộ đếm và chương trình sử dụng vi điều khiển 8051
  • Tính toán giao tiếp nối tiếp và chương trình sử dụng vi điều khiển 8051
  • Chương trình ngắt sử dụng vi điều khiển 8051
  • Lập trình bàn phím bằng vi điều khiển 8051
  • Lập trình LCD với vi điều khiển 8051

Đèn LED nhấp nháy sử dụng Vi điều khiển 8051

Đèn LED là một thiết bị bán dẫn được sử dụng trong nhiều ứng dụng, chủ yếu là cho mục đích chỉ dẫn. Nó đang tìm ra một loạt các ứng dụng làm chỉ số trong quá trình thử nghiệm để kiểm tra tính hợp lệ của các kết quả ở các giai đoạn khác nhau. Chúng rất rẻ và dễ dàng có sẵn với nhiều hình dạng, màu sắc và kích cỡ. Các đèn LED được sử dụng để thiết kế bảng hiển thị thông báo và đèn tín hiệu điều khiển giao thông, v.v ... Ở đây các đèn LED được giao tiếp với PORT0 của vi điều khiển 8051.

Đèn LED nhấp nháy sử dụng Vi điều khiển 8051

Đèn LED nhấp nháy sử dụng Vi điều khiển 8051

1. 01010101
10101010

#include // tệp tiêu đề //
void main () // điểm trạng thái thực thi chương trình //
{
unsigned int i // kiểu dữ liệu //
while (1) // cho vòng lặp liên tục //
{
P0 = 0x55 // gửi giá trị hexa tới cổng0 //
cho (i = 0i<30000i++) //normal delay//
P0 = 0x3AA // gửi giá trị hexa tới cổng0 //
cho (i = 0i<30000i++) //normal delay//
}
}

2. 00000001

00000010

00000100

.

.

10.000.000

#include

void main ()

{

không dấu tôi

ký tự không dấu j, b

trong khi (1)

{

P0 = 0x01

b = P0

cho (j-0j<3000j++)

cho (j = 0j<8j++)

{

b = b<<1

P0 = b

cho (j-0j<3000j++)

}

}

}

3. 00001111

11110000

#include

void main ()

{

không dấu tôi

trong khi (1)

{

P0 = 0x0F

cho (j-0j<3000j++)

P0 = 0xF0

cho (j-0j<3000j++)

}

}

4. 00000001

00000011

00000111

.

.

11111111

#include

void main ()

{

không dấu tôi

ký tự không dấu j, b

trong khi (1)

{

P0 = 0x01

b = P0

cho (j-0j<3000j++)

cho (j = 0j<8j++)

0x01

P0 = b

cho (j-0j<3000j++)

}

}

Hiển thị số trên Màn hình 7 đoạn bằng Vi điều khiển 8051

Các Màn hình 7 đoạn là màn hình điện tử cơ bản, được sử dụng trong nhiều hệ thống để hiển thị thông tin dạng số. Nó bao gồm tám đèn LED được kết nối theo cách tuần tự để hiển thị các chữ số từ 0 đến 9, khi sự kết hợp thích hợp của các đèn LED được bật. Chúng chỉ có thể hiển thị một chữ số tại một thời điểm.

Hiển thị số trên Màn hình 7 đoạn bằng Vi điều khiển 8051

Hiển thị số trên Màn hình 7 đoạn bằng Vi điều khiển 8051

1. WAP để hiển thị các số dạng ‘0 đến F’ trên bốn màn hình 7segment?

#include
sbit a = P3 ^ 0
sbit b = P3 ^ 1
sbit c = P3 ^ 2
sbit d = P3 ^ 3
void main ()
{
unsignedchar n [10] = {0 × 40,0xF9,0 × 24,0 × 30,0 × 19,0 × 12,0 × 02,0xF8,0xE00,0 × 10}
không ký tên bạn, j
a = b = c = d = 1
trong khi (1)
{
cho (i = 0i<10i++)
{
P2 = n [i]
cho (j = 0j<60000j++)
}
}
}

2. WAP để hiển thị các số từ '00 đến 10 'trên màn hình 7 đoạn?

#include
sbit a = P3 ^ 0
sbit b = P3 ^ 1
void display1 ()
void display2 ()
void delay ()
void main ()
{
unsignedchar n [10] = {0 × 40,0xF9,0 × 24,0 × 30,0 × 19,0 × 12,0 × 02,0xF8,0xE00,0 × 10}
không ký tên bạn, j
ds1 = ds2 = 0
trong khi (1)
{
cho (i = 0, i<20i++)
display1 ()
display2 ()
}
}
void display1 ()
{
a = 1
b = 0
P2 = s [ds1]
sự chậm trễ()
a = 1
b = 0
P2 = s [ds1]
sự chậm trễ()
}
void display2 ()
{
ds1 ++
nếu (ds1> = 10)
{
ds1 = 0
ds2 ++
nếu (ds2> = 10)
{
ds1 = ds2 = 0
}
}
}
void delay ()
{
không dấu k
cho (k = 0k<30000k++)
}

Tính toán bộ đếm thời gian / bộ đếm và chương trình sử dụng Vi điều khiển 8051

Sự chậm trễ là một trong những yếu tố quan trọng trong việc phát triển phần mềm ứng dụng. Tuy nhiên, độ trễ thông thường sẽ không cho kết quả quý giá để khắc phục vấn đề này để thực hiện độ trễ bộ định thời. Các bộ đếm thời gian và bộ đếm là các thành phần phần cứng của bộ vi điều khiển, được sử dụng trong nhiều ứng dụng để cung cấp thời gian trễ quý giá với các xung đếm. Cả hai tác vụ đều được thực hiện bằng kỹ thuật phần mềm.

Hẹn giờ

WAP để tạo ra thời gian trễ 500us bằng cách sử dụng T1M2 (timer1 và mode2)?

#include

void main ()
{
ký tự không dấu tôi
TMOD = 0x20 // đặt chế độ hẹn giờ //
cho (i = 0i<2i++) //double the time daly//
{
TL1 = 0x19 // đặt thời gian trễ //
TH1 = 0x00
TR1 = 1 // bộ định thời oN //
While (TF1 == 0) // kiểm tra bit cờ //
TF1 = 0
}
TR1 = 0 // hẹn giờ tắt //
}

Độ trễ vòng lặp bình thường

void delay ()

{
không dấu k
cho (k = 0k<30000k++)
}

Chương trình và tính toán giao tiếp nối tiếp sử dụng vi điều khiển 8051

Giao tiếp nối tiếp thường được sử dụng để truyền và nhận tín hiệu. Bộ vi điều khiển 8051 bao gồm Giao tiếp nối tiếp UART tín hiệu được truyền và nhận bởi các chân Rx và Tx. UART lấy từng byte dữ liệu và gửi các bit riêng lẻ theo cách tuần tự. Thanh ghi là một cách để thu thập và lưu trữ dữ liệu trong bộ nhớ. UART là một giao thức bán song công. Bán song công có nghĩa là truyền và nhận dữ liệu, nhưng không phải cùng một lúc.

Chương trình và tính toán giao tiếp nối tiếp sử dụng vi điều khiển 8051

Chương trình và tính toán giao tiếp nối tiếp sử dụng vi điều khiển 8051

1. WAP để truyền ký tự ‘S’ đến cửa sổ nối tiếp sử dụng 9600 làm tốc độ truyền?

28800 là tốc độ truyền tối đa của vi điều khiển 8051

28800/9600 = 3

Tốc độ truyền ‘3’ đó được lưu trữ trong bộ định thời

#include

void main ()

{
SCON = 0x50 // bắt đầu giao tiếp nối tiếp //
TNOD = 0x20 // đã chọn chế độ hẹn giờ //
TH1 = 3 // tải tốc độ truyền //
TR1 = 1 // Hẹn giờ BẬT //
SBUF = ’S’ // lưu ký tự trong thanh ghi //
while (TI == 0) // kiểm tra thanh ghi ngắt //
TI = 0
TR1 = 0 // TẮT bộ định thời //
while (1) // vòng lặp liên tục //
}

2. WAP để nhận dữ liệu từ hyperterminal và gửi dữ liệu đó đến PORT 0 của Vi điều khiển sử dụng 9600 baud?

28800 là tốc độ truyền tối đa của vi điều khiển 8051

28800/9600 = 3

Tốc độ truyền ‘3’ đó được lưu trữ trong bộ định thời

#include

void main ()
{
SCON = 0x50 // bắt đầu giao tiếp nối tiếp //
TMOD = 0x20 // đã chọn chế độ hẹn giờ //
TH1 = 3 // tải tốc độ truyền //
TR1 = 1 // Hẹn giờ BẬT //
PORT0 = SBUF // gửi dữ liệu từ SBUF đến port0 //
while (RI == 0) // kiểm tra thanh ghi ngắt //
RI = 0
TR1 = 0 // TẮT bộ định thời //
while (1) // dừng chương trình khi nhận được ký tự //
}

Chương trình ngắt sử dụng Vi điều khiển 8051

Ngắt là một tín hiệu buộc phải dừng chương trình hiện tại và thực hiện chương trình khác ngay lập tức. Bộ vi điều khiển 8051 cung cấp 6 ngắt, ngắt bên trong và bên ngoài ngắt nguồn . Khi xảy ra ngắt, bộ vi điều khiển tạm dừng tác vụ hiện tại và tham gia vào ngắt bằng cách thực thi ISR ​​sau đó bộ vi điều khiển quay trở lại tác vụ gần đây.

WAP để thực hiện thao tác dịch trái khi bộ định thời 0 xảy ra ngắt thì thực hiện thao tác ngắt cho P0 trong chức năng chính?

#include

char không dấu b

void timer0 () ngắt 2 // ngắt timer0 đã chọn //
{
b = 0x10
P1 = b<<2
}
void main ()
{
ký tự không dấu a, tôi
IE = 0x82 // kích hoạt ngắt timer0 //
TMOD = 0x01
TLo = 0xFC // bộ định thời ngắt //
TH1 = 0xFB
TR0 = 1
a = 0x00
trong khi (1)
{
cho (i = 0i<255i++)
{
a ++
Po = a
}
}
}

Lập trình bàn phím bằng Vi điều khiển 8051

Bàn phím ma trận là một thiết bị chuyển mạch tương tự, được sử dụng trong nhiều ứng dụng nhúng để cho phép người dùng thực hiện các tác vụ cần thiết. A bàn phím ma trận bao gồm sự sắp xếp các công tắc ở dạng ma trận theo hàng và cột. Các hàng và cột được kết nối với bộ vi điều khiển sao cho hàng công tắc được kết nối với một chân và các công tắc trong mỗi cột được kết nối với một chân khác, sau đó thực hiện các thao tác.

Lập trình bàn phím bằng Vi điều khiển 8051

Lập trình bàn phím bằng Vi điều khiển 8051

1. WAP để bật tắt đèn LED bằng cách nhấn công tắc

#include
sbit a = P3 ^ 0
sbit b = P3 ^ 1
sbit c = P3 ^ 2
sbit d = P3 ^ 3
void delay ()
void main ()
{
trong khi (1)
{
a = 0
b = 1
c = 1
d = 1
sự chậm trễ()
a = 1
b = 0
c = 1
d = 1
void delay ()
{
ký tự không dấu tôi
TMOD = 0x20 // đặt chế độ hẹn giờ //
cho (i = 0i<2i++) //double the time daly//
{
TL1 = 0x19 // đặt thời gian trễ //
TH1 = 0x00
TR1 = 1 // bộ định thời oN //
While (TF1 == 0) // kiểm tra bit cờ //
TF1 = 0
}
TR1 = 0 // hẹn giờ tắt //
}

2. WAP để BẬT đèn LED bằng cách nhấn phím ‘1’ trên bàn phím?

#include

sbit r1 = P2 ^ 0
sbit c1 = P3 ^ 0
sbit LED = P0 ^ 1

void main ()
{

r1 = 0
nếu (c1 == 0)
{

LED = 0xff
}
}

3. WAP để hiển thị số 0,1,2,3,4,5 trên bảy đoạn bằng cách nhấn phím tương ứng trên bàn phím?

#include

sbit r1 = P2 ^ 0

sbit c1 = P3 ^ 0

sbit r2 = P2 ^ 0

sbit c2 = P3 ^ 0

sbit a = P0 ^ 1

void main ()

{

r1 = 0 a = 1

nếu (c1 == 0)

{

a = 0xFC

}

Nếu (c2 == 0)

{

a = 0x60

}

nếu (c3 == 0)

{

a = 0xDA

}

Nếu (c4 == 0)

{

a = 0xF2

}

}

Lập trình LCD với Vi điều khiển 8051

Các Màn hình LCD là một thiết bị điện tử, thường được sử dụng trong nhiều ứng dụng để hiển thị thông tin dưới dạng văn bản hoặc hình ảnh. Màn hình LCD là màn hình có thể dễ dàng hiển thị các ký tự trên màn hình. Màn hình LCD có 8 dòng dữ liệu và 3 dòng điều khiển được sử dụng để giao tiếp với bộ vi điều khiển.

Lập trình LCD với Vi điều khiển 8051

Lập trình LCD với Vi điều khiển 8051

WAP để hiển thị “EDGEFX KITS” trên màn hình LED?

#include
#define kam P0

voidlcd_initi ()
voidlcd_dat (ký tự không dấu)
voidlcd_cmd (ký tự không dấu)
void delay ()
void display (unsigned char * s, unsigned char r)

sbitrs = P2 ^ 0
sbitrw = P2 ^ 1
sbit at = P2 ^ 2
void main ()
{

lcd_initi ()
lcd_cmd (0x80)
trì hoãn (100)
lcd_cmd (0xc0)
hiển thị (“bộ dụng cụ edgefx”, 11)
trong khi (1)
}

void display (unsigned char * s, unsigned char r)
{
unsignedint w
cho (w = 0w{
lcd_data (s [w])
}
}
voidlcd_initi ()
{
lcd_cmd (0 × 01)
trì hoãn (100)
lcd_cmd (0 × 38)
trì hoãn (100)
lcd_cmd (0 × 06)
trì hoãn (100)
lcd_cmd (0x0c)
trì hoãn (100)
}
voidlcd_dat (unsigned char dat)
{
lược = cái đó
rs = 1
rw = 0
trong = 1
trì hoãn (100)
trong = 0
}
}
voidlcd_cmd (không dấu char cmd)
{
đến = cmd
rs = 0
rw = 0

trong = 1
trì hoãn (100)
trong = 0
}
void delay (unsigned int n)
{

unsignedint a
cho (a = 0a}

Hy vọng bài viết này cung cấp một thông tin cơ bản về lập trình hệ thống nhúng sử dụng vi điều khiển 8051 với một vài chương trình ví dụ. Để có hướng dẫn lập trình C nhúng chi tiết, vui lòng gửi ý kiến ​​và thắc mắc của bạn trong phần bình luận bên dưới.