Đó chính là sự ra đời của hàng loạt thiết bị hiện đại trong ngành viễn thông, truyền hình, giáo dục, đặc biệt là sự ra đời và phát triển của Internet đã góp phần phát triển các phương ph
Trang 1TRƯỜNG ĐẠI HỌC CẦN THƠ
KHOA SƯ PHẠM
BỘ MÔN SƯ PHẠM VẬT LÝ
ỨNG DỤNG NGÔN NGỮ LẬP TRÌNH C VÀO VI ĐIỀU KHIỂN THIẾT
KẾ MẠCH ĐỒNG HỒ ĐIỆN TỬ LED HIỂN THỊ THỜI GIAN THỰC
RTC Luận văn tốt nghiệp Ngành: SƯ PHẠM VẬT LÝ
MSSV: 1110193 Lớp: Sư Phạm Vật Lý - TL11012A1 Khóa: 37
Cần Thơ, năm 2015
Trang 2Em xin bày tỏ lòng biết ơn chân thành và sâu sắc đến Ban chủ nhiệm Khoa Sư Phạm và toàn thể các thầy (cô) trong Khoa đã giúp em có những kiến thức cơ bản và đặc biệt là thầy (cô) của bộ môn Vật Lý khoa Sư Phạm của trường ĐH Cần Thơ đã truyền đạt kiến thức chuyên nghành và tạo điều kiện để cho em hoàn thành luận văn tốt nghiệp này Và đây cũng là hành trang chuẩn bị cho
em bước vào đời
Em xin cám ơn thầy Vương Tấn Sĩ (giáo viên hướng dẫn) đã giúp đỡ và chỉ bảo tận tình cho em trong suốt quá trình làm luận văn
Tp Cần Thơ, ngày 24 tháng 4 năm 2015
Sinh viên Nguyễn Long Phước Đường
LỜI CẢM ƠN
Trang 3LỜI CAM ĐOAN
Tôi xin cam đoan đây là công trình nghiên cứu do chính tôi thực hiện Các số liệu, kết quả phân tích trong luận văn là hoàn toàn trung thực và chưa từng được công bố trong bất kỳ công trình nghiên cứu nào trước đây
Mọi tham khảo, trích dẫn đều được chỉ rõ nguồn trong danh mục tài liệu tham khảo của luận văn
Cần Thơ, ngày 24 tháng 4 năm 2015
Tác giả
Nguyễn Long Phước Đường
Trang 4MỤC LỤC
Mục lục……… i
Danh mục ký hiệu, chữ viết tắt……….iii
PHẦN 1: MỞ ĐẦU……….1
1 Lý do chọn đề tài………1
2 Mục tiêu của đề tài……….2
3 Giới hạn đề tài………2
4 Phương pháp và phương tiện thực hiện đề tài………2
4.1 Phương pháp………2
4.2 Phương tiện……… 3
PHẦN 2: NỘI DUNG……….4
1 Chương 1 Giới thiệu chung về họ vi điều khiển 8051……… 4
1.1 Sơ lược về vi điều khiển……… 4
1.2 Sơ lược về các khối trong vi điều khiển……… 5
1.3 Giới thiệu về họ vi điều khiển 8051……….7
2 Chương 2 Vi điều khiển IC 89S52……….9
2.1 Sơ lược về vi điều khiển 89S52………9
2.2 Sơ đồ chân và chức năng của IC 89S52……… 9
2.3 Bộ nhớ dữ liệu……… 14
2.4 Các bước lập trình cho 89S52……… 15
2.5 Hoạt động ngắt……… 19
3 Chương 3 Lập trình nhúng và ngôn ngữ C trong lập trình vi điều khiển………21
3.1 Ngôn ngữ lập trình……….21
3.2 Lập trình……….21
3.3 Lập trình nhúng………21
Trang 53.4 Ngôn ngữ C ……… 22
4 Chương 4 Giới thiệu trình biên dịch Dev C++ và trình biên dịch Keil C µVision 4 (Compiler)………34
4.1 Trình biên dịch Dev C++ ………34
4.2 Trình biên dịch Keil C µVision 4 (Compiler)……….41
PHẦN 3: THI CÔNG MẠCH THỰC TẾ……….47
1 Chương 1 Giới thiệu các khối và các linh kiện trong mạch………… 47
1.1 Giới thiệu các linh kiện trong mạch………47
1.2 Các khối trong mạch……….62
2 Chương 2 Sơ đồ nguyên lý và mạch mô phỏng……….67
2.1 Sơ đồ nguyên lý……… 67
2.2 Mạch in……… 68
2.3 Mạch mô phỏng……….68
3 Chương 3 Lưu đồ giải thuật và chương trình……… 70
3.1 Lưu đồ giải thuật……… 70
3.2 Mã nguồn chương trình……… 77
PHẦN 4: KẾT LUẬN………92
1 Kết quả đạt được của đề tài……… 92
2 Đề nghị………93
3 Hướng phát triển………93
Danh mục tài liệu tham khảo……….94
Phụ lục……….95
Phụ lục 1……… 95
Phụ lục 2……… 96
Phụ lục 3……… 97
Trang 6DANH MỤC KÍ HIỆU, CHỮ VIẾT TẮT
AC Auxiliary Carry Flag Cờ nhớ phụ
ALE Address Latch Enable Tín hiệu điều khiển chốt địa chỉ
CP/RL2 Capture/ Reload Select Chế độ thu nhận
CPU Central Processing Unit Đơn vị xử lý trung tâm
C/T Timer/Counter Bộ định thời/ đếm
DCD Data Carrier Detect Tách tín hiệu mang dữ liệu DCE Data Comnication Equipment Thiết bị tiếp nhận
DPTR Data Pointer Con trỏ ngăn xếp
DTR Data Terminal Realy Đầu cuối dữ liệu
DSR Data Set Realy Dữ liệu sẵn sàng
DTE Data Terminal Equipment Thiết bị đầu cuối
EA External Access Tín hiệu cho phép chọn bộ nhớ
EIA Electronics Industry
Asscociation Hiệp hội công nghiệp điện tử
Trang 7GND Ground Đất
I2C Intergrated Circuit Chuẩn giao tiếp I2C
IE Interupt Enable Thanh ghi cho phép ngắt
IP Interrupt priority Thanh ghi ưu tiên ngắt ISR Interrupt Service Routine Chương trình con phục vụ ngắt LCHCLK Latch Clock Xung cock chốt dữ liệu
Trang 8
PHẦN 1: MỞ ĐẦU
1 LÝ DO CHỌN ĐỀ TÀI
Ngày nay công nghệ kỹ thuật vi điều khiển và lập trình nhúng đã trở nên quen thuộc trong các ngành kỹ thuật và trong dân dụng từ các dây truyền sản xuất lớn đến các thiết bị gia dụng nhỏ chúng ta đều thấy sự hiện diện của vi điều khiển Các bộ vi điều khiển có khả năng
xử lý nhiều hoạt động phức tạp mà chỉ cần sử dụng một chip vi mạch nhỏ, nó đã thay thế các
hệ thống điều khiển lớn và phức tạp bằng những mạch điện nhỏ và gọn nhẹ, dễ dàng thao tác
và sử dụng
Lâp trình nhúng ứng dụng vào vi điều khiển không những góp phần vào kỹ thuật điều khiển
mà còn góp phần to lớn vào việc phát triển thông tin, giáo dục v.v Đó chính là sự ra đời của hàng loạt thiết bị hiện đại trong ngành viễn thông, truyền hình, giáo dục, đặc biệt là sự ra đời
và phát triển của Internet đã góp phần phát triển các phương pháp – phương tiện giáo dục trở nên tiện lợi hơn, chính vì lý do trên việc tìm hiểu về lập trình nhúng và khảo sát vi điều khiển, chế tạo các mạch điện tử ứng dụng trong giảng dạy là điều mà các sinh viên ngành Sư Phạm đặc biệt là ngành Sư Phạm Vật Lý rất quan tâm Đó chính là một nhu cầu cần thiết và cấp bách đối với mỗi sinh viên Luận văn này được thực hiện chính là đáp ứng nhu cầu đó Các bộ điều khiển sử dụng vi điều khiển tuy đơn giản nhưng để vận hành và sử dụng chúng là một điều rất phức tạp Các bộ vi điều khiển chủ yếu vẫn phụ thuộc vào con người đó là chương trình hay phần mềm Hiện nay đã có những loại máy tính rất thông minh có thể giải quyết được những bài toán phức tạp trong vài phần triệu giây nhưng thành quả đạt được cũng là dựa trên sự hiểu biết của con người Nếu không có sự tham gia của con người thì hệ thống cũng chỉ như những vật vô tri Khi nói đến vi điều khiển cũng giống như máy tính bao gồm hai phần: phần cứng và phần mềm
Các bộ vi điều khiển phát triển theo thời gian cùng với sự phát triển của công nghệ bán dẫn đã phát triển rất nhanh Từ bộ vi điều khiển 4 bit đơn giản đã phát triển lên bộ vi điều khiển 32 bit Với công nghệ tiên tiến hiện nay các máy tính có thể suy nghĩ và hành động gần giống con người nhưng để tiếp cận và hiểu được công nghệ này cần phải nghiên cứu trong thời gian rất dài
Để tìm hiểu bộ vi điều khiển một cách khoa học và mang lại hiệu quả làm nền tảng cho sự phát triển sau này thì việc trang bị những kiến thức về vi điều khiển và ngôn ngữ lập trình cho sinh viên là rất cần thiết
Trang 9Một trong những ứng dụng thiết thực của lâp trình nhúng vào vi điều khiển đó là thiết kế đồng
hồ hiển thị thời gian Đây là một ứng dụng thường thấy nhất trong cuộc sống
Qua các môn đã được học: kỹ thuật điện tử 1, thực tập kỹ thuật điện tử 1, CAD, cảm biến….Với mục đích kiểm tra lại kiến thức về điện tử nên ở luận văn này, em chọn thi công mạch đồng hồ số hiện thời gian thực dùng DS1307 để vận dụng tất cả các kiến thức cơ bản đã được học
Ở đây, do được học cơ bản về AT89S52 nên sẽ sử dụng vi xử l ý AT89S52 để thi công mạch
Về phần hiển thị thời gian có thể dùng led 7 đoạn, led đơn,led ma trận, hay LCD để hiển thị Đối với led ma trận thì khá phức tạp cho việc hiển thị, do đó em sử dụng led 7 đoạn cho việc
hiển thị Xuất phát từ thực tiễn này em đã chọn đề tài “Ứng dụng ngôn ngữ lập trình C vào vi điều khiển thiết kế mạch đồng hồ Led 7 đoạn hiển thị thời gian thực RTC”
2 MỤC TIÊU CỦA ĐỀ TÀI
Kiến thức vật lý luôn là 1 phần rất quan trọng trong các môn khoa học tự nhiên và trong mọi ngành kỹ thuật – đời sống, là nền tảng cho mọi ngành công nghiệp hiện đại như tin học, điện tử,… Việc ứng dụng các kiến thức đó vào việc chế tạo các thiết bị phục vụ đời sống thường ngày cũng như nghiên cứu và dạy học nói chung nhằm đáp ứng các yêu cầu của việc dạy và học về điện tử cho sinh viên ngành Sư Phạm Vật Lý Thực hiện nghiên cứu và chế tạo mạch đồng hồ Led là sự ứng dụng các kiến thức vật lý vào cuộc sống thường ngày, qua đó cho thấy rằng Vật Lý không đơn thuần là những định luật khô khan hàn lâm mà luôn hiện diện xung quanh ta ở mọi khía cạnh
3 GIỚI HẠN ĐỀ TÀI
Trước sự phát triển mạnh mẽ của công nghệ phần cứng và công nghệ phần mềm có rất nhiều vi điều khiển và phần mềm hỗ trợ lập trình và biên dịch nhưng đề tài của em chỉ nghiên cứu về vi điều khiển AT89S52 và ngôn ngữ lập trình C mà thôi
4 PHƯƠNG PHÁP VÀ PHƯƠNG TIỆN THỰC HIỆN ĐỀ TÀI
4.1 Phương pháp
- Nghiên cứu lý thuyết:
Vi điều khiển AT89S52 là vi điều khiển có cấu tạo tương đối phức tạp nhưng có nguyên tắc làm việc cũng như xuất nhập dữ liệu tương đối đơn giản
Tìm hiểu về lập trình nhúng và ngôn ngữ lập trình C
Trang 10Sử dụng các trình biên dịch và các phần mềm mô phỏng trước khi ráp mạch thực tế giúp giảm thiểu tối đa các sai sót và tổn hao thiết bị khi ráp mạch thực tế
- Thực hành: Thực hiện thi công ráp mạch thực tế
4.2 Phương tiện
- Vi điều khiển AT89S52
- Các linh kiện điện tử khác cần thiết cho luận văn như: thạch anh 12MHz, DS 1307, tụ hóa, pin CMOS 3V, v.v…
- Ngôn ngữ lập trình C và các phần mềm viết code như Dev C ++
- Các bo mạch, mạch nạp và 1 số phần mềm mô phỏng, nạp mạch, biên dịch, v.v…
Trang 11PHẦN 2: NỘI DUNG
CHƯƠNG 1: GIỚI THIỆU CHUNG VỀ HỌ VI ĐIỀU KHIỂN 8051
1.1 Sơ lược về vi điều khiển:
Năm 1976, hãng Intel giới thiệu bộ vi điều khiển 8748 – mở đầu cho họ vi điều khiển MCS-48
8748 là một vi mạch chứa hơn 17.000 transistor bao gồm một CPU, 1 kbyte bộ nhớ EPROM, 64B RAM, một bộ đếm/định thời 8 bit và 27 chân vào/ra 8748 và các vi điều khiển tiếp theo của nó trong họ MCS-48 đã được sử dụng phổ biến trong các ứng dụng hướng điều khiển như máy giặt, ôtô, các thiết bị ngoại vi của máy tính… Sau 8748, các bộ vi điều khiển mới liên tục được các hãng sản xuất như Intel, Atmel, Siemens… giới thiệu cho các ứng dụng nhúng
Vi mạch tích hợp, hay vi mạch, hay mạch tích hợp (integrated circuit) hay vi điều khiển, gọi tắt
IC, hay chip là các mạch điện chứa các linh kiện bán dẫn (như transistor) và linh kiện điện tử thụ động (như điện trở) được kết nối với nhau, kích thước nhỏ và chế tạo bởi công nghệ silicon cho lĩnh vực điện tử
Vi điều khiển là những vi mạch điện tử tích hợp (chip) mà chúng ta có thể lập trình để thực hiện những nhiệm vụ mà bạn muốn Khác với vi xử lý, các vi điều khiển ngoài chức năng xử
lý dữ liệu thuật toán nó còn được tích hợp các bộ chức năng đặc biệt khác, các vi điều khiển ngõ vào để nhận và xuất dữ liệu, các bộ timer xử lý thời gian, các bộ trao đổi dữ liệu theo một
số chuẩn giao tiếp, thậm chí có một số loại vi điều khiển còn có cả bộ chuyển đổi AD, bộ điều khiển động cơ…
Vi điều khiển (MCU – viết tắt của cụm từ “Micro Control Unit”) có thể được coi như một máy tính thu nhỏ trên một chip, nó có thể hoạt động với vài linh kiện phụ trợ ở bên ngoài.Vi điều khiển khác với vi xử lý ở những điểm sau:
+ Về phần cứng: Vi xử lý cần ghép thêm các thiết bị ngoại vi bên ngoài như bộ nhớ và các thiết bị ngoại vi khác để có thể tạo thành một bản mạch hoàn chỉnh Với vi điều khiển bản thân
nó là một hệ máy tính hoàn chỉnh với CPU, bộ nhớ, mạch giao tiếp, các bộ định thời và mạch điều khiển ngắt được tích hợp bên trong
+ Về ứng dụng: Các bộ vi xử lý chủ yếu được dùng làm CPU trong các máy tính còn các bộ vi điều khiển dùng làm trong các ứng dụng hướng điều khiển
+ Về các đặc trưng tập lệnh: Do ứng dụng khác nhau nên các bộ vi xử lý và vi điều khiển cũng
có những yêu cầu khác nhau đối với tập lệnh của chúng Tập lệnh của các vi xử lý thường
Trang 12mạnh về các kiểu địa chỉ với các lệnh cung cấp các hoạt động trên các lượng dữ liệu lớn như 1 byte, ½ byte, word, double word…Ở các vi điều khiển, các tập lệnh rất mạnh trong việc xử lý các kiểu dữ liệu nhỏ như bit hoặc một vài bit.[1]
Hình 1.1 Các loại vi điều khiển (chip)
1.2 Sơ lƣợc về các khối trong vi điều khiển:
1.2.1 Bộ nhớ
Bộ nhớ là một bộ phận của vi điều khiển, chức năng của nó là lưu trữ dữ liệu Hoạt động của
bộ nhớ được so sánh với tủ lớn có nhiều ngăn kéo, cần đánh dấu ngăn kéo để không xảy ra
sự nhầm lẫn và nội dung được truy cập một cách thuận lợi chính xác
Bộ nhớ bao gồm các địa chỉ và việc định địa chỉ để có thể lựa chọn chính xác một trong các
ô nhớ ngoài ra còn cần đến khả năng ghi dữ liệu lên ô nhớ Với mức logic bằng 1 có nghĩa là việc ghi đọc đã hoàn tất và ngược lại Bộ nhớ là phần tử đầu tiên ta cần nắm rõ để làm việc với vi điều khiển
Bộ nhớ được tạo ra từ các vi mạch nhớ ROM và RAM
ROM (Read Only Memory) bộ nhớ chỉ đọc, nội dung bên trong không bị mất khi mất nguồn nuôi ROM dùng để chứa các chương trình điều khiển hệ thống như chương trình kiểm tra các thiết bị khi bật nguồn, chương trình trao đổi thông tin với các thiết bị ngoại vi như bàn phím, màn hình…
RAM (Random Access Memory) bộ nhớ truy cập ngẫu nhiên, bộ nhớ có thể ghi/đọc được, ta
có thể đọc, xóa thông tin từ bộ nhớ, ghi thông tin mới vào bộ nhớ Thông tin trong RAM sẽ
Trang 13bị mất khi mất nguồn nuôi, RAM để lưu trữ toán hạng mã lệnh, kết quả của chương trình khi
nó đang thực hiện RAM có dung lượng là 1, 2, 4, 8, 16, 32, 64, 128, 256, 512MB
1.2.2 Đơn vị xử lý trung tâm
Giả sử đã có ít nhất là 3 ô nhớ ta thêm vào một khối có cấu tạo đặc biệt, khối này có khả năng thực hiện các phép toán cộng, trừ, nhân, chia và di chuyển nội dung từ ô nhớ này đến ô nhớ khác Khối ta vừa thêm vào gọi là “đơn vị xử lí trung tâm” và ô nhớ của nó gọi là các thanh ghi Do đó những thanh ghi là những ô nhớ và vai trò của nó là hỗ trợ ta thực hiện nhiều phép toán bất kì trên dữ liệu được tìm thấy trên vi điều khiển Như vậy hiện tại có hai khối thực hiện độc lập (bộ nhớ và bộ xử lí trung tâm) được kết nối với nhau
1.2.3 BUS hệ thống
Các đường dẫn để di chuyển dữ liệu từ khối này sang khối khác gọi là bus Về mặt vật
lí bus là một nhóm các đường dẫn có thể có 8,16 hoặc nhiều hơn Bus chia làm 3 loại: bus điều khiển, bus địa chỉ và bus dữ liệu Bus điều khiển là các đường dây mang tín hiệu điều khiển hoạt động hoặc phản ánh trạng thái của các khối như /RD (read - đọc bộ nhớ hoặc thiết
bị vào), /WR (write - ghi dữ liệu vào bộ nhớ hoặc xuất ra thiết bị ra), INT (interrup – ngắt vi
xử lí để trao đổi dữ liệu)… Bus dữ liệu là các đường dây mang số liệu mà vi xử lí đang trao đổi với bộ nhớ hoặc thiết bị vào ra
Bus địa chỉ bao gồm số đường dẫn tương xứng với dung lượng bộ nhớ ta muốn định địa chỉ Bus địa chỉ mang thông tin về địa chỉ ô nhớ Bus địa chỉ để truyền địa chỉ từ CPU tới bộ nhớ còn bus dữ liệu để kết nối tất cả các khối trong vi điều khiển
1.2.4 Khối vào và ra
Có ba loại cổng là vào, ra, cổng hai chiều Khi làm việc với cổng trước tiên ta phải chọn cổng cần giao tiếp sau đó truyền dữ liệu tới hoặc nhận dữ liệu từ cổng Khi làm việc cổng đóng vai trò như một ô nhớ ghi vào hoặc đọc ra từ các cổng nó được chỉ ra trên các chân của vi điều khiển
1.2.5 Truyền thông cổng nối tiếp
Bên cạnh các khối ở trên ta bổ sung thêm khả năng truyền thông với thế giới bên ngoài Tuy nhiên cách truyền thông có phần hạn chế Điểm hạn chế cơ bản là số lượng đường dẫn cần được dùng để truyền dữ liệu Khi có hai đường dẫn truyền và nhận dữ liệu tách biệt nhau
ta sẽ có khả năng truyền và nhận dữ liệu cùng một lúc Vì thế gọi là chế độ song công, khối cho phép thực hiện việc truyền thông này gọi là khối truyền thông nối tiếp Không giống với
Trang 14truyền song song dữ liệu được truyền từng bit một, hoặc là một chuỗi các bit vì vậy mà có thuật ngữ truyền thông nối tiếp Sau khi nhận dữ liệu ta chuyển sang bước đọc dữ liệu từ bên nhận và lưu vào bộ nhớ Dữ liệu tới bộ nhớ thông qua bus để tới ô nhớ truyền rồi tới khối nhận phù hợp
1.2.6 Bộ định thời
Đây là khối cung cấp cho ta thông tin về thời gian, khoảng thời gian mà một sự kiện tồn tại, v.v… Khối cơ bản của bộ định thời là bộ đếm tự do, thực tế bộ đếm này là một thanh ghi mà giá trị của nó tăng thêm một sau những khoảng thời gian bằng nhau ta có thể xác định được khoảng thời gian đã trôi qua là bao nhiêu Đây là phần quan trọng của vi điều khiển ứng dụng quan trọng trong việc đóng ngắt
1.2.7 Watchdog
Đây là bộ đếm tự do khác, trong trường hợp chương trình gặp bất thường nó sẽ khởi động lại vi điều khiển khi đạt giá trị đếm cực đại Điều này sẽ dẫn tới kết quả thực hiện lại chương trình một lần nữa và lần này sẽ chạy chính xác Nó là phần tử quan trọng làm cho chương trình trở nên tin cậy hơn mà không cần sự giám sát của người dùng
1.3 Giới thiệu về họ vi điều khiển 8051
Năm 1981, hãng Intel giới thiệu bộ vi điều khiển 8051, bộ vi điều khiển này có 128 byte RAM, 4 kbyte ROM, hai bộ định thời, một cổng nối tiếp và bốn cổng vào/ra song song, tất cả được đặt trên một chip 8051 là bộ xử lý 8 bit có nghĩa là CPU chỉ có thể làm việc với
8 bit tại một thời điểm Dữ liệu lớn hơn 8 bit được chia ra thành các dữ liệu 8 bit để xử lý,
8051 cung cấp những đặc tính chuẩn như: 8 KByte bộ nhớ chỉ đọc có thể xóa và lập trình nhanh (EPROM), 128 Byte RAM, 32 đường I/O, 3 TIMER/COUNTER 16 Bit, 5 vectơ ngắt
có cấu trúc 2 mức ngắt, một Port nối tiếp bán song công, 1 mạch dao động tạo xung Clock
Trang 15Chân vào/ra 32
Trang 16CHƯƠNG 2: VI ĐIỀU KHIỂN IC 89S52
2.1 Sơ lược về vi điều khiển 89S52 [3]
Năm 1980 khi Intel tung ra chip 8051, bộ Vi điều khiển đầu tiên của họ MCS-51 và là chuẩn công nghệ cho nhiều họ Vi điều khiển được sản xuất sau này
Năm 1980 Intel công bố chíp 8051(80C51), bộ vi điều khiển đầu tiên của họ vi điều khiển MCS-51bao gồm :
- 4KB ROM,
- 128 byte RAM,
- 32 đường xuất nhập,
- 1 port nối tiếp và 2 bộ định thời 16 bit
Tiếp theo sau đó là sự ra đời của chip 8052,8053,8055 với nhiều tính năng được cải tiến Hiện nay Intel không còn cung cấp các loại Vi điều khiển họ MCS-51 nữa, thay vào đó các nhà sản xuất khác như Atmel, Philips/Signetics, AMD, Siemens, Matra&Dallas, Semiconductors được cấp phép làm nhà cung cấp thứ hai cho các chip của họ MSC-51 Chip Vi điều khiển được sử dụng rộng rãi trên thế giới cũng như ở Việt Nam hiện nay là Vi điều khiển của hãng Atmel Các mã số chip được thay đổi chút ít khi được Atmel sản xuất
Mã số 80 chuyển thành 89, chẳng hạn 80C52 của Intel khi sản xuất ở Atmel mã số thành 89C52 (Mã số đầy đủ: AT89C52) với tính năng chương trình tương tự như nhau Tương tự 8051,8053,8055 có mã số tương đương ở Atmel là 89C51, 89C53, 89C55
Sau khoảng thời gian cải tiến và phát triển, hãng Atmel tung ra thị trường dòng Vi điều khiển mang số hiệu 89Sxx với nhiều cải tiến và đặc biệt là có thêm khả năng nạp chương trình theo chế độ nối tiếp rất đơn giản và tiện lợi cho người sử dụng
Dung lượng RAM Dung lượng ROM Chế độ nạp:
2.2 Sơ đồ chân và chức năng của IC 89S52
Trang 18Hình 0.1 Cấu trúc của các chân trên port 1 và port 3
Trang 19 Port 3 (P3.0 – P3.7)
Port 3:Từ chân 10 đến chân 17 (P3.0 _ P3.7) Port 3 là port có tác dụng kép Các chân của port
này có nhiều chức năng, có công dụng chuyển đổi có liên hệ đến các đặc tính đặc biệt của 89S52 như ở bảng 2.1
Bảng 2.1 Chức năng của Port 3
P3.0 RXD Dữ liệu nhận cho port nối tiếp
P3.1 TXD Dữ liệu truyền cho port nối tiếp
P3.4 T0 Ngõ vào của timer/counter0
P3.5 T1 Ngõ vào của timer/counter1
P3.6 /WR Xung ghi bộ nhớ dữ liệu ngoài
P3.7 /RD Xung đọc bộ nhớ dữ liệu ngoài
PSEN (Program store enable)
PSEN là tín hiệu ngõ ra có tác dụng cho phép đọc chương trình ở bộ nhớ ngoài và thường được nối đến chân OE để cho phép đọc các byte mã lệnh trên ROM ngoài Nối với chân PSEN ở mức thấp trong thời gian 89S52 lấy lệnh Các mã lệnh của chương trình được đọc từ EPROM qua bus dữ liệu, được chốt vào thanh ghi lệnh bên trong 89S52 để giải mã lệnh Khi 89S52 thi
hành chương trình trong ROM nội, PSEN ở mức cao
ALE (Address Latch Enable)
ALE là tín hiệu điều khiển chốt địa chỉ có tần số bằn 1/6 lần tần số dao động của vi điều khiển Tín hiệu ALE được dùng để cho phép vi mạch chốt bên ngoài như 74373, 74573 chốt
byte địa chỉ thấp ra khỏi bus đa hợp địa chỉ/dữ liệu (Port 0)
Chân /EA (External Access)
Trang 20Tín hiệu /EA cho phép chọn bộ nhớ chương trình là bộ nhớ trong hay ngoài vi điều khiển Nếu /EA ở mức cao (nối với Vcc), thì vi điều khiển thi hành chương trình trong ROM nội Nếu /EA
ở mức thấp (nối với GND) thì vi điều khiển thi hành chương trình từ bộ nhớ ngoài
RST (Reset)
Ngõ vào RST trên chân 9 là ngõ reset của 8051 Khi tín hiệu này được đưa lên mức cao (trong
ít nhất hai chu kỳ máy ), các thanh ghi trong vi điều khiển được tải những giá trị thích hợp để khởi động hệ thống
Trang 21- 8 KB EPROM bên trong
- 256 Byte RAM nội
- 4 Port xuất /nhập I/O 8 bít
- 3 bộ đi ̣nh thời 16 bit
- Watch dog timer
- Các đặc điểm khác giống AT89C51
AT89S52 có 8kbyte Flash ROM trên chip, khi chân /EA (chân số 31) được đặt ở mức logic cao (+5V), bộ vi điều khiển sẽ thực hiện chương trình trong bộ nhớ này bắt đầu từ địa chỉ 0000H Số lần lập trình cho bộ nhớ này khoảng 1000 lần Khi chân /EA ở mức logic thấp, bộ nhớ chương trình sẽ thực hiện ở bộ nhớ ngoài (EPROM ngoài), tuy nhiên cần có mạch phối ghép AT89S52
2.3 Bộ nhớ dữ liệu
Bộ nhớ dữ liệu ngoài là RAM được đọc hoặc được ghi bởi tín hiệu /RD và /WR.RAM bên
trong AT89S52 được phân chia như sau:
Các bank thanh ghi có địa chỉ từ 00H đến 1FH: 32 byte thấp của bộ nhớ nội được dành cho các bank thanh ghi Bộ lệnh 8951 hỗ trợ 8 thanh ghi có tên là R0 – R7 và mặc định sau khi reset hệ thống thanh ghi có địa chỉ từ 00H – 07H Do có 4 bank thanh ghi nên tại một thời điểm chỉ có một bank được truy xuất bởi thanh ghi R0 – R7 RAM địa chỉ hóa từng bit có địa chỉ từ 20H đến 2FH: AT89S52 có 128 bit chứa các byte định địa chỉ Các bit có thể được đặt xóa bằng phần mềm với 1 lệnh đơn RAM đa dụng từ 30H đến 7FH
Các thanh ghi chức năng đặc biệt từ 80H đến FFH
AT89S52 có 21 thanh ghi chức năng ở vùng trên của RAM nội từ địa chỉ 80H đến FFH
Thanh ghi trạng thái chương trình:
Bảng 2.2 Thanh ghi trạng thái chương trình
PSW.4 RS1 D4H Bit 1 chọn bank thanh ghi
PSW.3 RS0 D3H Bit 0 chọ bank thanh ghi
00= Bank 0 địa chỉ: 0H÷07H
Trang 2201= Bank 1 địa chỉ: 08H÷0FH 10= Bank 2 địa chỉ: 10H÷1FH 11= Bank 3 địa chỉ: 18H÷1FH
đề liên quan đến việc định thời và đếm sự kiện
2.4.2 Hoạt động định thời
Các bộ định thời (Timer) được sử dụng rất rộng rãi trong các ứng dụng đo lường và điều khiển Có thể coi bộ định thời n bit được tạo bởi n Flip-Flop mắc nối tiếp với nhau Đầu vào của bộ định thời là đầu vào của Flip-Flop đầu tiên, đầu ra báo tràn (Over Flow) của bộ định thời phản ánh trạng thái tràn của nó Đầu ra của các Flip-Flop phản ánh giá trị hiện thời của bộ đếm Tuỳ thuộc vào ứng dụng đầu vào của bộ định thời có thể lấy nguồn xung lấy từ xung nhịp của vi điều khiển hoặc là lấy từ nguồn xung từ bên ngoài đưa đến Vi điều khiển AT89S52 có
ba bộ định thời 16 bit trong đó có hai bộ Timer 0 và Timer 1 có bốn chế độ hoạt động, Timer 2
có ba chế độ hoạt động Các bộ định thời được dùng để khẳng định thời gian (hẹn giờ), đếm sự kiện xảy ra bên ngoài vi điều khiển hoặc tạo tốc độ Baud cho cổng nối tiếp của vi điều khiển
2.4.3 Thanh ghi timer 1 và timer 0
Thanh ghi chế độ định thời (TMOD):
+ Thanh ghi TMOD chứa hai nhóm 4 bit dùng để đặt chế độ làm việc cho Timer 0 và Timer 1.Thanh ghi chứa giá trị của các bộ định thời của Timer 0 và Timer 1 là THx và TLx, là thanh ghi 8 bit để chứa giá trị khởi tạo hoặc giá trị hiện thời của Timer Thanh ghi này không được định địa chỉ bit
Bảng 2.3 Thanh ghi TMOD
Trang 237 GATE1 1
Bit mở cổng cho timer 1, khi được đặt bằng 1 thì timer 1 chỉ chạy khi chân INT1 ở mức cao Nếu bit này được đặt là 0 thì hoạt động của timer 1 không bị ảnh hưởng bởi mức logic trên chân INT1
Bit chọn chế độ timer/couter của timer 1
1= bộ đếm sự kiện
0= bộ định khoảng thời gian
5 M1 1 Bit 1 chọn chế độ (mode) của timer 1
Bit 0 chọn chế độ của timer 1:
00: chế độ 0 - timer 13 bit 01: chế độ 1 - timer 16 bit 10: chế độ 2 - timer 8 bit tự nạp lại 11: chế độ 3 - tách timer
Bit mở cổng cho timer 0 Khi được đặt bằng 1 thì timer 0 chỉ chạy khi chân INT0 ở
mức cao
2 C/#T0 0 Bit chọn chế độ couter/timer của timer 0
1 M1 0 Bit 1 chon chế độ của timer 0
0 M0 0 Bit 0 chọn chế độ của timer 0
TF2: Cờ báo tràn của timer 2 TF2 không được thiết lập khi TCLK hoặc RCLK được đặt bằng
1
EXF2: Cờ ngắt ngoài của timer 2 EXF2 = 1 khi xảy ra sự nạp lại hoặc thu nhận EXF2 = 1
cũng gây ra ngắt do Timer 2 nếu như ngắt này được lập trình cho phép
RCLK: Bit chọn timer cung cấp xung nhịp cho đường nhận của cổng nối tiếp
TCLK: Bit chọn timer cung cấp xung nhịp cho đường truyền của cổng nối tiếp
EXEN2: Bit điều khiển hoạt động của Timer 2 Khi EXEN2=1 việc nạp lại hoặc thu nhận
(Capture) diễn ra khi có sự chuyển trạng thái từ 1 sang 0 ở chân T2EX nếu Timer 2 không sử dụng để cung cấp tốc độ Baud cho cổng nối tiếp
TR2: Bit điều khiển hoạt động của timer 2 (tương tự như TR0, 1)
C/#T2: Bit chọn chế độ đếm hoặc định thời của Timer 2 (tương tự như C/#T0,1)
CP/#RL2: Bit chọn chế độ thu nhận hay nạp lại của Timer 2
Trang 24Khi CP/#RL2C được thiết lập bằng 1 việc thu nhận được thực hiện khi có sườn xuống ở chân T2EX và bit EXEN1 được đặt là 1
Khi CP/#RL2C được đặt bằng 0, việc nạp lại được thực hiện khi có sườn xuống ở chân T2EX
và bit EXEN2 được đặt là 1 Nếu RCLK hoặc TCLK = 1, bit này được bỏ qua, Timer 2 tự nạp lại khi tràn
Thanh ghi T2MOD:
Thanh ghi TMOD có địa chỉ 0C9H, thanh ghi này không định địa chỉ bit
T2MOD.1 T2OE Cho phép đầu ra khi sử dụng Timer 2 để chế tạo
xung (chế tạo xung – clock out)
T2MOD.0 DCEN Bit cho phép Timer 2 hoạt động như bộ đếm
+ Chế độ 2:Trong chế độ 2 bộ Timer dùng TL để chứa các giá trị đếm và TH để chứa các giá trị nạp lại vì vậy chế độ này được gọi là chế độ tự nạp lại 8 bit Sau khi đếm quá 255 sẽ xảy ra tràn, khi đó TF được đặt bằng 1 đồng thời giá trị của timer tự động được nạp lại bằng nội dung của TH
Trang 25+ Chế độ 3:Trong chế độ 3, Timer 0 được tách thành 2 bộ Timer hoạt động độc lập Timer thứ nhất với nguồn xung clock được lấy từ bộ chia tần hoặc trên chip hoặc từ bộ tạo xung bên ngoài qua chân T0 Giá trị đếm của Timer chứa trong TL0, khi xảy ra tràn, cờ TF0 được đặt bằng 1 và gây ra ngắt do timer 0 (nếu được đặt).Bộ Timer thứ hai với nguồn xung clock được lấy từ bộ chia tần trên chip Việc điều khiển hoạt động của Timer thứ hai chỉ là việc đặt giá trị của bit TR0 Giá trị đếm của Timer chứa trong TH0, khi xảy ra tràn cờ TF được đặt bằng 1 và gây ra ngắt do Timer 1 (nếu được đặt).Khi Timer 0 được tách thành 2 Timer 8 bit thì timer 1 vẫn có thể hoạt động bình thường ở các chế độ 0, 1, 2 Tuy nhiên khi xảy ra tràn cờ TF1 không được thiết lập bằng 1 Như vậy trong trường hợp này Timer 1 chỉ có thể sử dụng cho các ứng dụng không cần thiết ngắt (TF1= 1)
Timer 2: Timer 2 có ba chế độ hoạt động đó là chế độ thu nhận (Capture), chế độ tự nạp lại (Auto-reload) và chế độ cung cấp tốc độ baud cho cổng nối tiếp (Baud Rate Generator)
ổng nối tiếp (Baud Rate Generator)
Bảng 2.6 Chế độ hoạt động của timer 2
0 0 1 16 bit Auto-reload:16 bit tự nạp lại
0 1 1 16 bit Capture:16 bit thu nhận
1 X 1 Baud Rate Generator:cung cấp tốc
đi và về hoàn toàn độc lập với nhau, do đó có thể truyền nhận đồng thời, và cổng nối tiếp có đặc tính như vậy còn gọi là cổng song cổng (Full Duplex)
Cổng RS232 Máy tính
Bộ chuyển
Trang 262.5 Hoạt động ngắt
Ngắt là những yêu cầu do ngoại vi (là các phần cứng tích hợp trên IC hoặc các tác động
từ bên ngoài) gửi tới CPU nhằm đòi hỏi những đáp ứng nhất định Mục đích của việc thiết kế
cơ chế ngắt trong vi xử lý nhằm tiết kiệm thời gian cho CPU
Trong ngắt có hai loại ưu tiên ngắt cơ bản là ưu tiên giữa các ngắt xảy ra đồng thời và ưu tiên giữa các ngắt xảy ra khác thời điểm, chen vào nhau Trong cả hai trường hợp, ngắt có ưu tiên cao hơn sẽ luôn được phục vụ ngay lập tức
AT89S52 có 6 nguồn ngắt:
Ngắt ngoài đến từ chân #INT0
Ngắt ngoài đến từ chân #INT1
Ngắt do Timer 0
Ngắt do Timer 1
Ngắt do Timer 2
Ngắt do Port nối tiếp
Sáu nguồn ngắt này được xoá khi hết và được đặt riêng bằng phần mềm bởi các bit trong các thanh ghi cho phép ngắt (IE), thanh ghi ưu tiên ngắt (IP)
Bảng 2.8 Thanh ghi cho phép ngắt IE Bit Ký hiệu Địa chỉ bit Mô tả (1 cho phép; 0:cấm
IE.7 EA AFH Cho phép hoặc cấm toàn bộ
IE.6 - AEH Không được định nghĩa
IE.5 ET5 ADH Cho phép ngắt từ timer 1 (8052)
IE.4 ES ACD Cho phép ngắt từ portt nối tiếp
IE.3 ET1 ABH Cho phép ngắt từ timer 1
IE.2 EX1 AAH Cho phép ngắt ngoài 1
IE.1 ET0 A9H Cho phép ngắt từ timer 0
IE.0 EX0 A8H Cho phép ngắt ngoài 0
Bảng 2.9 Thanh ghi ưu tiên ngắt IP Bit Ký hiệu Địa chỉ bit Mô tả
IP.5 PT2 BDH Ưu tiên ngắt từ Timer 2
Trang 27IP.4 PS BCH Ưu tiên ngắt ngoài Port nối tiếp IP.3 PT1 BBH Ưu tiên ngắt ngoài từ Timer 1 IP.2 PX1 BAH Ưu tiên ngắt ngoài 1
IP.1 PT0 B9H Ưu tiên cho ngắt ngoài Timer 0 IP.0 PX0 B8H Ưu tiên ngắt ngoài 0
Trang 28CHƯƠNG 3: LẬP TRÌNH NHÚNG VÀ NGÔN NGỮ C TRONG LẬP
TRÌNH VI ĐIỀU KHIỂN
3.1 Ngôn ngữ lập trình
Là ngôn ngữ dùng để diễn tả thuật toán sao cho máy tính hiểu và thực hiện được, có 3 loại ngôn ngữ lập trình (NNLT): ngôn ngữ máy, hợp ngữ, ngôn ngữ bậc cao
+ Ngôn ngữ máy (còn được gọi máy ngữ hay mã máy) là một loại ngôn ngữ lập trình trong
đó mọi chỉ thị đều được biểu diễn bằng các con số nhị phân 0 và 1 Đây là ngôn ngữ lập trình thế hệ đầu tiên Tuy khó đọc và khó sử dụng, nhưng ngôn ngữ máy là ngôn ngữ duy nhất mà bộ vi xử lí có thể nhận biết và thực hiện một cách trực tiếp (tức không cần dịch sang bất kì ngôn ngữ nào khác) Lợi điểm chính của các chương trình viết bằng ngôn ngữ máy là
có thể được thực thi một cách nhanh chóng (nhờ vi xử lí có thể xử lí các chỉ thị viết bằng ngôn ngữ máy một cách trực tiếp)
+ Hợp ngữ (assembly language) là một ngôn ngữ cấp thấp dùng để viết các chương trình máy tính Cách dùng các thuật nhớ thân thiện để viết chương trình đã thay thế cách lập trình trực tiếp lên máy tính bằng mã máy dạng số (numberic machine code) - từng áp dụng cho những máy tính đầu tiên - vốn rất mệt nhọc, dễ gây lỗi và tốn nhiều thời giờ Một chương trình viết bằng hợp ngữ sẽ được dịch sang ngôn ngữ máy bằng một tiện ích gọi là trình hợp dịch Lưu ý rằng, trình hợp dịch khác hoàn toàn với trình biên dịch, vốn dùng để biên dịch các ngôn ngữ bậc cao sang các chỉ thị lệnh cấp thấp mà sau đó sẽ được trình hợp dịch chuyển đổi sang ngôn ngữ máy
+ Ngôn ngữ bậc cao là các lệnh được mã hóa bằng một ngôn ngữ gần với ngôn ngữ Tiếng Anh Chương trình viết trên ngôn ngữ bậc cao phải được chuyển đổi thành chương trình trên ngôn ngữ máy mới có thể thực hiện được Lập trình bằng ngôn ngữ bậc cao dễ viết hơn vì các lệnh được mã hóa gần với ngôn ngữ tự nhiên Lập trình trên ngôn ngữ máy rất khó, thường các chuyên gia lập trình mới lập trình được
3.2 Lập trình
Lập trình là việc sử dụng cấu trúc dữ liệu và các lệnh của ngôn ngữ lập trình cụ thể để
mô tả dữ liệu và diễn đạt các thao tác của thuật toán
3.3 Lập trình nhúng [4]
3.3.1 Hệ thống nhúng
Trang 29Xuất hiện từ những năm đầu thập niên 1960, hệ thống nhúng đang dần trở thành một ngành phát triển mạnh mẽ trong lĩnh vực công nghệ thông tin (CNTT), với những ứng dụng rộng rãi trong công nghiệp và đời sống
Hệ thống nhúng (embedded system) được định nghĩa là một hệ thống chuyên dụng, thường
có khả năng tự hành và được thiết kế tích hợp vào một hệ thống lớn hơn để thực hiện một chức năng chuyên biệt nào đó
Hệ thống nhúng bao gồm cả thiết bị phần cứng và phần mềm, hầu hết đều phải thỏa mãn yêu cầu hoạt động theo thời gian thực (real-time)
3.3.2 Lập trình nhúng
Lập trình nhúng hiểu đơn giản là lập trình nhưng là lập trình cụ thể trên một chức năng chuyên biệt, xử lý 1 công việc cụ thể chuyên biệt Các xử lý này có thể dựa trên thời gian thực (real-time) hoặc tự vận hành bởi 1 hệ điều hành thời gian thực (real-time OS) Lập trình nhúng có thể chỉ lập trình về core (firmware) hoặc cũng có thể kết hợp cả (software + firmware) Trong 1 hệ thống, lập trình nhúng có 1 đặc điểm là có thể “nhúng” (hay còn gọi
là giao tiếp) với bo mạch chủ (hay gọi là mạch quản lý cả hệ thống) thông qua việc nạp mã nguồn vào vi điều khiển
Chính vì tính chất chuyên biệt của lập trình nhúng và hệ thống nhúng nên có nhiều nhà sản xuất vi điều khiển và phần cứng để tạo ra sự đa dạng như: Texas Instrument, Freescale, ARM, Intel, Motorola, Atmel, AVR v.v… Và kèm theo đó là những hệ điều hành khác nhau
để làm việc tối ưu như QNX, uITRON, VxWorks, Windows CE/XP Embedded, Embedded Linux, Osek, Symbian…
3.4 Ngôn ngữ C [5]
3.4.1 Giới thiệu
Có nhiều ngôn ngữ bậc cao như C/C++, Basic, Pascal… Trong đó C là ngôn ngữ thông dụng hơn cả trong kỹ thuật vi điều khiển Khi sử dụng ngôn ngữ C người lập trình không cần hiểu sâu sắc về cấu trúc của bộ vi điều khiển Có nghĩa là với 1 người chưa quen với 1 vi điều khiển cho trước vẫn có thể xây dựng được chương trình và thuật toán hợp lý mà không mất quá nhiều thời gian để tìm hiểu kiến trúc của vi điều khiển đó Đồng thời việc sử dụng lại các chương trình đã xây dựng trước đó cũng dễ dàng hơn
3.4.2 Tập ký tự dùng trong C
Trang 30Ngôn ngữ C được xây dựng trên bộ ký tự:
3.4.4 Tên
Tên là một khái niệm rất quan trọng, nó dùng để xác định các đại lượng khác nhau trong một chương trình chúng ta có tên hằng, tên biến, tên mảng, tên hàm, tên con trỏ, tên tệp, tên cấu trúc, tên nhãn,
Các tên đúng :
a_1 delta x1 _step gama Các tên sai :
3MN ký tự đầu tiên là số m#2 sử dụng ký tự # f(x) sử dụng các dấu ( )
do trùng với từ khoá
Trang 31te ta sử dụng dấu trắng Y-3 sử dụng dấu -
3.4.5 Kiểu dữ liệu: Trong C sử dụng các các kiểu dữ liệu sau :
3.4.5.1 Kiểu ký tự (char)
Có hai kiểu dữ liệu char: Kiểu signed char và unsigned char
kiểu phạm vi biểu diễn số ký tự kích thước signed char -128 đến 127 256 1 byte
unsigned char 0 đến 255 256 1 byte
Phân loại ký tự: Có thể chia 256 ký tự làm ba nhóm:
+ Nhóm 1: Nhóm các ký tự điều khiển có mã từ 0 đến 31 chẳng hạn ký tự m• 13 dùng để chuyển con trỏ về đầu dòng, ký tự 10 chuyển con trỏ xuống dòng dưới ( trên cùng một cột ) các ký tự nhóm này nói chung không hiển thị ra màn hình
+ Nhóm 2: Nhóm các ký tự văn bản có mã từ 32 đến 126, các ký tự này có thể được đưa ra màn hình hoặc máy in
+ Nhóm 3: Nhóm các ký tự đồ hoạ có mã số từ 127 đến 255, các ký tự này có thể đưa ra màn hình nhưng không in ra được (bằng các lệnh dos)
Trang 32#define tên hằng giá trị
Các loại hằng:
+ Hằng int: là số nguyên có giá trị trong khoảng từ -32768 đến 32767
+ Hằng long: là số nguyên có giá trị trong khoảng từ -2147483648 đến 2147483647
Hằng ký tự còn có thể được viết theo cách sau:
Kiểu dữ liệu_vùng nhớ_tên biến_địa chỉ;
Vị trí của khai báo biến: Các khai báo cần phải được đặt ngay sau dấu { đầu tiên của thân hàm và cần đứng trước mọi câu lệnh khác, ta có thể lấy một ví dụ điển hình về khai báo biến sai:
Trang 33Mỗi biến chỉ có thể biểu diễn một giá trị Để biểu diễn một dãy số hay một bảng số ta có thể dùng nhiều biến nhưng cách này không thuận lợi Trong trường hợp này ta có khái niệm về mảng Khái niệm về mảng trong ngôn ngữ C cũng giống như khái niệm về ma trận trong đại
số tuyến tính tức là mảng có thể được hiểu là một tập hợp nhiều phần tử có cùng một kiểu giá trị và chung một tên, mỗi phần tử mảng biểu diễn được một giá trị, có bao nhiêu kiểu biến thì có bấy nhiêu kiểu mảng, mảng cần được khai báo để định rõ:
+ Loại mảng: int, float, double
+ Tên mảng
+ Số chiều và kích thước mỗi chiều
3.4.9 Các lệnh vào ra [6]
Các hàm vào ra chuẩn - getchar() và putchar() - getch() và putch()
+ Hàm getchar () dùng câu lệnh sau:
Trang 34/ phép chia a/b (chia số nguyên bỏ phần thập phân)
% phép lấy phần dư a%b (lấy phần dư của a/b)
3.4.11 Các phép toán quan hệ và logic
Trang 353.4.12 Cấu trúc cơ bản của chương trình
Cấu trúc chương trình và hàm là một trong các vấn đề quan trọng của C Về hàm ta sẽ có một chương nói tỉ mỷ về nó Ở đây ta chỉ đưa ra một số qui tắc chung:
- Hàm là một đơn vị độc lập của chương trình, tính độc lập của hàm thể hiện ở hai điểm:
+ Không cho phép xây dựng một hàm bên trong các hàm khác
+ Mỗi hàm có các biến, mảng riêng của nó và chúng chỉ được sử dụng nội bộ bên trong hàm, nói cách khác hàm là đơn vị có tính chất khép kín
+ Các chương trình C được tổ chức theo mẫu:
+ Khai báo các đối tượng dữ liệu ngoài (biến, mảng, cấu trúc vv…)
+ Khai báo nguyên mẫu các hàm
+ Hàm main()
+ Định nghĩa các hàm (hàm main có thể đặt sau hoặc xen vào giữa các hàm khác)
3.4.13 Lệnh và khối lệnh
Trang 36+ Lệnh: Một biểu thức kiểu như x=0 hoặc ++i hoặc scanf( ) trở thành câu lệnh khi có đi kèm theo dấu ;
Trong C dấu; là dấu hiệu kết thúc câu lệnh
+ Khối lệnh: Một dãy các câu lệnh được bao bởi các dấu { } gọi là một khối lệnh
Khai báo ở đầu khối lệnh: Các khai báo biến và mảng chẳng những có thể đặt ở đầu của một hàm mà còn có thể viết ở đầu khối lệnh:
3.4.14 Cấu trúc điều khiển
Các cấu trúc điều khiển cho phép thay đổi trật tự nói trên, do đó máy có thể nhảy thực hiện một câu lệnh khác ở một ví trí trước hoặc sau câu lệnh hiện thời
Xét về mặt công dụng, có thể chia các cấu trúc điều khiển thành các nhóm chính:
+ Nhảy không có điều kiện
Trang 37Cấu trúc tổng quát của nó là:
switch (biểu thức nguyên
{
case n1
khối lệnh 1 case n2
khối lệnh 2
case nk khối lệnh k [ default
khối lệnh k+1 ]
3.4.16 Cấu trúc lặp
Cấu trúc lặp với toán tử while và for
Cấu trúc lặp với toán tử while
Toán tử while dùng để xây dựng chu trình lặp dạng :
while (biểu thức)
lệnh hoặc khối lệnh;
Như vậy toán tử while gồm một biểu thức và thân chu trình, thân chu trình có thể là một lệnh hoặc một khối lệnh
Cấu trúc lặp với toán tử for
Toán tử for dùng để xây dựng cấu trúc lặp có dạng sau :
for ( biểu thức 1; biểu thức 2; biểu thức 3)
Trang 38lệnh hoặc khối lệnh ;
3.4.17 Hàm
Một chương trình viết trong ngôn ngữ C là một dãy các hàm, trong đó có một hàm chính ( hàm main() ), hàm chia các bài toán lớn thành các công việc nhỏ hơn, giúp thực hiện những công việc lặp lại nào đó một cách nhanh chóng mà không phải viết lại đoạn chương trình, Thứ tự các hàm trong chương trình là bất kỳ, song chương trình bao giờ cũng đi thực hiện từ hàm main()
Hàm có thể xem là một đơn vị độc lập của chương trình, các hàm có vai trò ngang nhau, vì vậy không có phép xây dựng một hàm bên trong các hàm khác
Xây dựng một hàm bao gồm: khai báo kiểu hàm, đặt tên hàm, khai báo các đối và đưa ra câu lệnh cần thiết để thực hiện yêu cầu đề ra cho hàm một hàm được viết theo mẫu sau :
type tên hàm ( khai báo các đối )
Trang 39Khi xây dựng cấu trúc, ta cần mô tả kiểu của nó, điều này cũng tương tự như việc phải thiết
kế ra một kiểu nhà trước khi ta đi xây dựng những căn nhà thực sự ở các địa điểm khác nhau, công việc định nghĩa một kiểu cấu trúc bao gồm việc nêu ra tên của kiểu cấu trúc và các thành phần của nó theo mẫu sau:
struct tên_kiểu _cấu_trúc
{
khai báo các thành phần của cấu trúc (1) };
3.4.21 Khai báo theo một kiểu cấu trúc đã định nghĩa
Xây dựng những cấu trúc thực sự theo các kiểu đã khai báo trước đó, vấn đề này hoàn toàn giống như việc khai báo các biến và các mảng, giả sử ta đã có các kiểu cấu trúc ngay và nhancong như trong mục trên khi đó ta khai báo:
3.4.22 Interrupt
Chức năng có thể được quy định như 1 thủ tục ngắt bằng cách sử dụng từ khóa interrupt (gián đoạn) và interrupt number (ngắt số) Các hàm ngắt như ngắt timer0, timer1, ngắt nối tiếp, ngắt ngoài Lệnh như sau:
Void ten_hàm( ) interrupt a unsing b Với: a = 0 External Interrupt 0 ngắt ngoài 0
a = 1 Timer 1 ngắt timer 1
a = 2 External Interrupt 1 ngắt ngoài 1
a = 3 Timer 2 ngắt timer 2
Trang 40a = 4 Serial port ngắt cổng truyền phát nối tiếp
b là bank nào ta sử dụng ngắt trong 4 bank thành ghi 0-1-2-3 Mặc định chọn 0