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

Tiểu luận lập trình điều khiển tự động

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 (1.23 MB, 34 trang )

TRƯỜNG ĐẠI HỌC NƠNG LÂM TP.HCM
KHOA CƠ KHÍ - CƠNG NGHỆ

TIỂU LUẬN KẾT THÚC MÔN HỌC

GIẢNG VIÊN HƯỚNG DẪN: NGUYỄN TRỊNH NGUYÊN
SINH VIÊN THỰC HIỆN: NGUYỄN HUY TOÀN
LỚP: DH19OT
MSSV: 19154900

Tháng 2/2022


MỤC LỤC
MỤC LỤC .................................................................................................................................................. 2
Lập trình điều khiển mạch đèn I/O ............................................................................................. 3

I.
1.

Mô tả ban đầu về nội dung ...................................................................................................... 3

2.

Mô tả thiết kế và mô tả phần mềm ......................................................................................... 3
a.

Điều khiển 1 led chớp tắt theo quy luật .............................................................................. 3

b.


Điều khiển 2 led chớp tắt...................................................................................................... 6

c.

Điều khiển 8 led chớp theo quy luật led chạy từ trái qua phải ...................................... 10

II. Lập trình điều khiển mạch đèn I/O bằng nút điều khiển........................................................ 14
1.

Mô tả ban đầu về nội dung .................................................................................................... 14

2.

Mô tả thiết kế và mô tả phần mềm ....................................................................................... 14

III. Lập trình điều khiển hiển thị LCD .......................................................................................... 17
1.

Mô tả ban đầu về nội dung .................................................................................................... 17

2.

Mô tả thiết kế và mô tả phần mềm ....................................................................................... 18

IV.

a.

Điều khiển LCD hiển thị chữ và số ................................................................................... 18


b.

Điều khiển LCD hiển thị ký tự chạy từ trái sang phải .................................................... 22

Lập trình điều khiển mạch sử dụng ADC ............................................................................... 25

1.

Mơ tả ban đầu về nội dung .................................................................................................... 25

2.

Mô tả thiết kế và mô tả phần mềm ....................................................................................... 25
a.

Đọc giá trị điện áp và hiển thị giá trị ADC trên LCD ..................................................... 25

b.

Đọc giá trị điện áp và hiển thị giá trị ADC trên LCD ..................................................... 30

2


I.

Lập trình điều khiển mạch đèn I/O
1. Mơ tả ban đầu về nội dung
I/O (viết đầy đủ là Input/Output) là một thuật ngữ thuộc lĩnh vực công nghệ thông tin
và truyền thông mang ý nghĩa “đầu vào/đầu ra” hay “nhập/xuất” của các loại thơng tin, dữ

liệu, tín hệu điện tử và tần số.
• Đầu vào (Input) là nơi đưa vào các nguyên liệu của một quá trình xử lý của hệ
thống. Đầu vào có thể là hệ thống máy móc, con người hay một cơ chế tiếp nhận
và xử lý thơng tin nào đó. Trong điện tử, đầu vào là nơi nhập tín hiệu, mơ tả các
nơi các dữ liệu, điều kiện,…của hệ thống và là một thành phần của tập hợp ngõ
giao tiếp vào/ra.
• Đầu ra (Output) là nơi đưa ra các kết quả của một quá trình xử lý của hệ thống.
Tại đây sẽ suất ra các tín hiệu, thông tin và dữ liệu sau khi đã được xử lý và thực
thi xong. Trong điện tử, đầu ra là nơi xuất tín hiệu ra, là một thành phần của tập
hợp ngõ giao tiếp vào/ra và là nơi nhận được kết quả xử lý của hệ thống đó.
Trong các mạch điện điện tử, thơng thường thì đầu vào và ra là hai cổng phân biệt nhau,
có hướng và khơng bị lẫn lộn với nhau. Đây là cơ sở cho việc đường truyền tín hiệu có
hướng di chuyển xác định, từ đó ta gọi "dẫn tín hiệu đến" đầu vào và "đưa tín hiệu đi" từ
đầu ra.
Nội dung 2 bên dưới sẽ mơ tả một vài mạch lập trình điện tử tiêu biểu có ứng dụng I/O
để có thể hiểu rõ hơn về công việc của đầu vào và đầu ra trong mạch và chip điện tử.

2. Mô tả thiết kế và mô tả phần mềm
a. Điều khiển 1 led chớp tắt theo quy luật
- Mạch điện được mô phỏng bởi chương trình Proteus 8 Professional như sau:

Mơ tả mạch:

3


• Mạch được xây dựng bởi 1 chip ATmega16 và 1 LED đỏ. Chip điều khiển LED
qua dây nối từ chân A5 của chip, và từ LED có dây dẫn xuống đất (hay ra mass) để tạo
thành mạch đóng kín. Khi kích hoạt mạch thì qua các dịng code được tạo sẵn như bên
dưới và đưa vào chip, LED qua sự điều khiển của chip sẽ chớp tắt theo quy luật được

quy định sẵn trong code (cụ thể ở mạch này là sáng 1s và tắt 2s).
- Code được tạo bởi chương trình CodeVisionAVR dành cho mạch trên:
Chip type
: ATmega16
Program type
: Application
AVR Core Clock frequency: 8.000000 MHz
Memory model
: Small
External RAM size
:0
Data Stack size
: 256
*******************************************************/
#include <mega16.h>
#include <delay.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<(0<// State: Bit7=T Bit6=T Bit5=0 Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<(0<// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In

DDRB=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<(0<// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<(0<// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<(0<// Timer/Counter 0 initialization
// Clock source: System Clock

4


// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<TCNT0=0x00;

OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<TCCR2=(0<

TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<(0<// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<MCUCSR=(0<// USART initialization
// USART disabled
UCSRB=(0<(0<// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin

5


ACSR=(1<(0<SFIOR=(0<// ADC initialization
// ADC disabled

ADCSRA=(0<(0<// SPI initialization
// SPI disabled
SPCR=(0<(0<// TWI initialization
// TWI disabled
TWCR=(0<while (1)
{
// Place your code here
PORTA.5=1;
delay_ms(1000);
PORTA.5=0;
delay_ms(2000);
}
}

Mơ tả code:
• Code chứa 2 hàm thư viện (như tơ sáng ở trên) để có thể hoạt động khi được đổ
vào mạch, gồm hàm mega16.h (của chip) và hàm delay.h (dùng để tạo độ trì hoãn
trong việc đọc lệnh theo 1 thời gian quy định). Code trên quy định cho mạch hoạt động
như mong muốn ở tần số 8MHz.
• Vì chip được chỉnh sẽ điều khiển LED ở chân A5, tại dòng Port A Initialization
(như tơ sáng ở trên) trên code có Function: Bit5=Out, tương ứng với State: Bit5=0
(khác với các chân khác là In và T).
• Từ dịng Place your code here (như tơ sáng ở trên) là code chính dùng cho mạch
trên. PORTA.5=1 có nghĩa chân A5 của chip sẽ kích hoạt cho LED sáng.
delay_ms(1000) có nghĩa lệnh PORTA.5=0 (điều khiển LED tắt) sẽ được thực hiện sau

lệnh PORTA.5=1 khoảng thời gian 1s. Tương tự với lệnh delay_ms(2000) là cho việc
thực hiện lệnh tạm ngưng 2s trước khi đến lệnh tiếp theo (ở trường hợp này là lặp lại
quá trình trên vì đây là dòng lệnh cuối).

b. Điều khiển 2 led chớp tắt
- Mạch điện được mơ phỏng bởi chương trình Proteus 8 Professional như sau:

6


Mơ tả mạch:
• Mạch được xây dựng bởi 1 chip ATmega16 và 2 LED gồm 2 màu trắng và vàng.
Chip điều khiển LED qua dây nối từ chân các B0 và B1 của chip, và 2 LED được
chập với nhau ở 1 đầu và từ đầu đó có dây đi xuống đất (hay ra mass) để tạo thành
mạch đóng kín. Khi kích hoạt mạch thì qua các dịng code được tạo sẵn như bên dưới
và đưa vào chip, 2 LED qua sự điều khiển của chip sẽ chớp tắt theo quy luật được quy
định sẵn trong code (cụ thể ở mạch này LED trắng chớp tắt 1 lần và LED vàng 2 lần
trong 1 chu kỳ code).
- Code được tạo bởi chương trình CodeVisionAVR dành cho mạch trên:
Chip type
: ATmega16
Program type
: Application
AVR Core Clock frequency: 8.000000 MHz
Memory model
: Small
External RAM size
:0
Data Stack size
: 256

*******************************************************/
#include <mega16.h>
#include <delay.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<(0<// Port B initialization

7


// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
DDRB=(0<(1<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=0 Bit0=0
PORTB=(0<(0<// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<(0<

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<(0<// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<(0<// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off

TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<TCCR2=(0<
8


TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<(0<// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off

MCUCR=(0<MCUCSR=(0<// USART initialization
// USART disabled
UCSRB=(0<(0<// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<(0<SFIOR=(0<// ADC initialization
// ADC disabled
ADCSRA=(0<(0<// SPI initialization
// SPI disabled
SPCR=(0<(0<// TWI initialization
// TWI disabled
TWCR=(0<while (1)
{
// Place your code here
PORTB.0=1;

PORTB.1=1;
delay_ms(1000);
PORTB.1=0;
delay_ms(500);
PORTB.1=1;
delay_ms(1000);
PORTB.1=0;
PORTB.0=0;
delay_ms(1000);
}
}

Mơ tả code:
• Code chứa 2 hàm thư viện và hoạt động ở tần số như đã nói ở mạch trước.
9


• Vì chip được chỉnh sẽ điều khiển LED ở chân B0 và B1, tại dịng Port B
Initialization (như tơ sáng ở trên) trên code có Function: Bit0=Out và Bit1=Out, tương
ứng với State: Bit0=0 và Bit1=0 (khác với các chân khác là In và T).
• Từ dịng Place your code here (như tơ sáng ở trên) là code chính dùng cho mạch
trên. PORTB.0=1 có nghĩa chân B0 của chip sẽ kích hoạt cho LED trắng sáng. Ngay
sau đó LED vàng nối với chân B1 sẽ được điều khiển cho sáng với lệnh PORTB.1=1.
Sau khi LED vàng sáng được 1s (quy định qua delay_ms(1000)) thì tắt khi code thực
hiện lệnh PORTB.1=0. Tương tự như vậy, sau 0.5s LED vàng lại chớp tắt, và sau đó
LED trắng tắt qua lệnh PORTB.0=0. Tại thời điểm này 2 đèn đều tắt và sau 1s chu kỳ
mạch lặp lại.

c. Điều khiển 8 led chớp theo quy luật led chạy từ trái qua phải
- Mạch điện được mơ phỏng bởi chương trình Proteus 8 Professional như sau:


Mơ tả mạch:
• Mạch được xây dựng bởi 1 chip ATmega16 và 8 LED xanh dương. Chip điều
khiển LED qua dây nối từ các chân B0 đến B7 của chip, và các LED được chập với
nhau ở 1 đầu và từ đầu đó có dây đi xuống đất (hay ra mass) để tạo thành mạch đóng
kín. Khi kích hoạt mạch thì qua các dịng code được tạo sẵn như bên dưới và đưa vào
chip, cả 8 LED qua sự điều khiển của chip sẽ chớp tắt theo quy luật được quy định
sẵn trong code (cụ thể ở mạch này LED chớp tắt tuần tự theo tứ tự từ trái sang phải).
- Code được tạo bởi chương trình CodeVisionAVR dành cho mạch trên:
Chip type
Program type

: ATmega16
: Application

10


AVR Core Clock frequency: 8.000000 MHz
Memory model
: Small
External RAM size
:0
Data Stack size
: 256
*******************************************************/
#include <mega16.h>
#include <delay.h>
// Declare your global variables here
void main(void)

{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<(0<// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(1<(1<// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<(0<// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<(0<// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<

(0<// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected

11


// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;

ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<TCCR2=(0<TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<(0<// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<MCUCSR=(0<// USART initialization
// USART disabled
UCSRB=(0<(0<// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is

// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<(0<SFIOR=(0<// ADC initialization
// ADC disabled
ADCSRA=(0<(0<// SPI initialization
// SPI disabled

12


SPCR=(0<(0<// TWI initialization
// TWI disabled
TWCR=(0<while (1)
{
// Place your code here
PORTB.0=1;
delay_ms(1000);
PORTB.0=0;
delay_ms(200);
PORTB.1=1;
delay_ms(1000);

PORTB.1=0;
delay_ms(200);
PORTB.2=1;
delay_ms(1000);
PORTB.2=0;
delay_ms(200);
PORTB.3=1;
delay_ms(1000);
PORTB.3=0;
delay_ms(200);
PORTB.4=1;
delay_ms(1000);
PORTB.4=0;
delay_ms(200);
PORTB.5=1;
delay_ms(1000);
PORTB.5=0;
delay_ms(200);
PORTB.6=1;
delay_ms(1000);
PORTB.6=0;
delay_ms(200);
PORTB.7=1;
delay_ms(1000);
PORTB.7=0;
delay_ms(200);
}
}

Mơ tả code:

• Code chứa 2 hàm thư viện và hoạt động ở tần số như đã nói ở mạch trước.
• Vì chip được chỉnh sẽ điều khiển LED ở các chân B0 đến B7, tại dòng Port B
Initialization (như tơ sáng ở trên) trên code có Function: các Bit đều có giá trị Out,
tương ứng với State: các Bit đều có giá trị 0 (khác với các chân khác là In và T).
• Từ dịng Place your code here (như tơ sáng ở trên) là code chính dùng cho mạch
trên. PORTB.0=1 có nghĩa chân B0 của chip sẽ kích hoạt cho LED đầu tiên sáng. Sau
khi LED đầu tiên sáng được 1s (quy định qua delay_ms(1000)) thì tắt khi code thực
hiện lệnh PORTB.0=0. Sau 0.2s từ khi LED đầu tiên tắt (quy định qua delay_ms(200))
thì LED thứ 2 sáng khi code thực hiện lệnh PORTB.1=1, và sau 1s lại tắt. Tương tự
như vậy sau đó LED thứ 3 chớp tắt và chu trình tiếp tục đến với LED cuối cùng. Sau
khi các LED đã chớp tắt xong theo thứ tự, chu kỳ mạch được lặp lại.
13


II.

Lập trình điều khiển mạch đèn I/O bằng nút điều khiển
1. Mô tả ban đầu về nội dung
Phát triển từ khái niệm về I/O như đã nói ở trên, khi mạch điện tử được gắn thêm nút
điều khiển thì nút điều khiển đó sẽ được xem như chìa khóa kích hoạt I/O của mạch. Tùy
thuộc vào quy ước cho trước của lập trình viên đối với chiều đóng/mở của cơng tắc mà
chức năng của mạch sẽ làm việc theo trạng thái tương ứng và I/O của từng trại thái sẽ
khác nhau.
Nội dung 2 bên dưới sẽ mô tả một mạch lập trình điện tử tiêu biểu có ứng dụng điều
khiển I/O bằng nút điều khiển để có thể hiểu rõ hơn về công việc của đầu vào và đầu ra
trong mạch và chip điện tử trong từng trạng thái đóng/mở của nút điều khiển.

2. Mô tả thiết kế và mô tả phần mềm
- Mạch điện được mô phỏng bởi chương trình Proteus 8 Professional như sau:


Mơ tả mạch:
• Mạch được xây dựng bởi 1 chip ATmega16 và 2 LED gồm 2 màu xanh lá và cam
và một công tắc (hay có thể là nút nhấn) điều khiển. Chip điều khiển LED qua dây nối
từ các chân B0 và B1 của chip, và các LED được chập với nhau ở 1 đầu và từ đầu đó
có dây đi xuống đất (hay ra mass) để tạo thành mạch đóng kín. Cả 2 LED được điều
khiển bởi công tắc nối với chân A0 của chip. Khi kích hoạt mạch thì qua các dịng
code được tạo sẵn như bên dưới và đưa vào chip, tùy vào trạng thái đóng hay mở của
cơng tắc mà các LED có quy luật hoạt động khác nhau (cụ thể ở mạch này khi đóng
14


cơng tắc thì 2 LED chớp tắt ln phiên, và khi nhả cơng tắc thì ngẫu nhiên 1 trong 2
LED sẽ sáng).
- Code được tạo bởi chương trình CodeVisionAVR dành cho mạch trên:
Chip type
: ATmega16
Program type
: Application
AVR Core Clock frequency: 8.000000 MHz
Memory model
: Small
External RAM size
:0
Data Stack size
: 256
*******************************************************/
#include <mega16.h>
#include <delay.h>
// Declare your global variables here
int i=0;

void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=P
PORTA=(0<(0<// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
DDRB=(0<(1<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=0 Bit0=0
PORTB=(0<(0<// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<(0<// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T

PORTD=(0<(0<// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<TCNT0=0x00;
OCR0=0x00;

15


// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;

ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<TCCR2=(0<TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<(0<// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<MCUCSR=(0<// USART initialization
// USART disabled
UCSRB=(0<(0<// Analog Comparator initialization
// Analog Comparator: Off

// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<(0<SFIOR=(0<// ADC initialization
// ADC disabled

16


ADCSRA=(0<(0<// SPI initialization
// SPI disabled
SPCR=(0<(0<// TWI initialization
// TWI disabled
TWCR=(0<while (1)
{
// Place your code here
if (PINA.0==1) {
i++;
};
delay_ms(500);
if (i==1) {

PORTB.0=1;
PORTB.1=0;
};
if (i==2) {
PORTB.0=0;
PORTB.1=1;
};
if (i==3) {
i=0;
};
}
}

Mơ tả code:
• Code chứa 2 hàm thư viện và hoạt động ở tần số như đã nói ở mạch trước. Ngồi
ra, tại dịng Declare your global variables here, ta đặt biến i theo dạng số ngun (int)
có giá trị 0.
• Vì chip được chỉnh sẽ điều khiển LED ở các chân B0 và B1, tại dịng Port B
Initialization (như tơ sáng ở trên) trên code có Function: 2 Bit0 và 1 đều có giá trị Out,
tương ứng với State: Bit0 và 1 đều có giá trị 0 (khác với các chân khác là In và T).
Thông qua công tắc được chỉnh chế độ pull up (thể hiện ở Port A Initialization, State:
Bit0=P) 2 LED hoạt động theo từng trạng thái của cơng tắc.
• Từ dịng Place your code here (như tơ sáng ở trên) là code chính dùng cho mạch
trên. Vì cơng tắc điều khiển có 2 trạng thái độc lập nên lệnh if được sử dụng. Khi cơng
tắc đóng thì 2 LED chớp tắt luân phiên, điều này được thể hiện qua lệnh
if(PINA.0==1) {i++;}, trong đó PINA.0==1 là khi cơng tắc đóng và i++ có ý nghĩa 2
LED sáng luân phiên. Những lệnh sau đó thể hiện trạng thái mở của cơng tắc, khi đó 1
trong 2 LED sẽ sáng ngẫu nhiên trong trình tự chớp tắt ln phiên của 2 LED đó.

III.


Lập trình điều khiển hiển thị LCD
1. Mơ tả ban đầu về nội dung
17


Cơng nghệ màn hình tinh thể lỏng hay LCD (Liquid Crystal Display) là loại công nghệ
hiển thị (một loại thiết bị đầu ra tiêu biểu) được cấu tạo bởi các tế bào (các điểm ảnh)
chứa tinh thể lỏng có khả năng thay đổi tính phân cực của ánh sáng và do đó thay đổi
cường độ ánh sáng truyền qua khi kết hợp với các kính lọc phân cực. LCD có ưu điểm là
có màn hình phẳng gồm nhiều kích cỡ, cho hình ảnh sáng, chân thật và tiết kiệm năng
lượng tiêu thụ. LCD được dùng để thông hiển thị ký tự (và có thể là hình ảnh) được ghi
nạp và chỉ định trước trong chương trình lập trình.
Nội dung 2 bên dưới sẽ mơ tả một vài mạch lập trình điện tử tiêu biểu có ứng dụng điều
khiển hiển thị LCD để có thể hiểu rõ hơn về cách quy định văn bản hiển thị trong LCD
qua code lập trình và cách LCD xuất ra những văn bản đó qua sự điều khiển của chip sau
khi đã nhận code.

2. Mô tả thiết kế và mô tả phần mềm
a. Điều khiển LCD hiển thị chữ và số
- Mạch điện được mô phỏng bởi chương trình Proteus 8 Professional như sau:

Mơ tả mạch:
• Mạch được xây dựng bởi 1 chip ATmega16 và 1 LCD thuộc nhóm LMxxxL (cụ
thể ở mạch này sử dụng LCD LM016L). Chip điều khiển văn bản hiển thị trên LCD
qua dây nối từ các chân thuộc cổng A (trừ chân A3) của chip. Khi kích hoạt mạch thì
qua các dòng code được tạo sẵn như bên dưới và đưa vào chip, LCD sẽ hiển thị văn
bản được quy định trước (cụ thể ở mạch này LCD hiển thị văn bản gồm chữ và số).
- Code được tạo bởi chương trình CodeVisionAVR dành cho mạch trên:
Chip type

: ATmega16
Program type
: Application
AVR Core Clock frequency: 8.000000 MHz
Memory model
: Small

18


External RAM size
:0
Data Stack size
: 256
*******************************************************/
#include <mega16.h>
#include <delay.h>
// Alphanumeric LCD functions
#include <alcd.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRA=(1<(1<// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTA=(0<

(0<// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<(0<// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<(0<// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<(0<// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF

19


// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF

// OC2 output: Disconnected
ASSR=0<TCCR2=(0<TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<(0<// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<MCUCSR=(0<// USART initialization
// USART disabled
UCSRB=(0<(0<// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<(0<SFIOR=(0<// ADC initialization
// ADC disabled
ADCSRA=(0<

(0<// SPI initialization
// SPI disabled

20


SPCR=(0<(0<// TWI initialization
// TWI disabled
TWCR=(0<// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS: PORTA Bit 0
// RD: PORTA Bit 1
// EN: PORTA Bit 2
// D4: PORTA Bit 4
// D5: PORTA Bit 5
// D6: PORTA Bit 6
// D7: PORTA Bit 7
// Characters/line: 8
lcd_init(16);
while (1)
{
// Place your code here
lcd_clear();
lcd_puts("Nguyen Huy Toan");
delay_ms(500);

lcd_gotoxy(0,1);
lcd_puts("MSSV: 19154900");
delay_ms(500);
lcd_clear();
delay_ms(200);
}
}

Mơ tả code:
• Ngồi 2 hàm thư viện đã biết, code còn chứa thêm 1 hàm thư viện khác là alcd.h
(như tô sáng ở trên) dùng để chứa tài nguyên và nguồn tham chiếu cho hiển thị nội
dung trên LCD.
• Vì chip được chỉnh sẽ điều khiển LCD ở các chân A, tại dòng Port A Initialization
(như tơ sáng ở trên) trên code có Function: các Bit đều có giá trị Out, tương ứng với
State: các Bit đều có giá trị 0 (khác với các chân khác là In và T). Tại dòng
Alphanumeric LCD initialization, ta có trình tự các chân của LCD được nối với chân
của chip (như thể hiện trong mạch). Giới hạn ký tự trên 1 dịng được thể hiện ở dịng
Characters/line.
• Từ dịng Place your code here (như tơ sáng ở trên) là code chính dùng cho mạch
trên. Lệnh lcd_clear() sẽ xóa sạch tất cả những gì có trên LCD trước đó và đồng thời
đưa con trỏ ký tự về góc trái trên màn hình (là tọa độ (0;0)). Lệnh lcd_puts là nơi để
quy định nội dung sẽ hiển thị trong LCD. Sau khi nội dung được hiển thị từ tọa độ
(0;0) của LCD, con trỏ xuống dòng (là ở tọa độ (0;1) để hiển thị nội dung của dịng
đó). Khi đã hiển thị hết nội dung trong khoảng thời gian quy định, màn hình LCD được
xóa sạch và sau đó chu kỳ mạch lặp lại.

21


b. Điều khiển LCD hiển thị ký tự chạy từ trái sang phải

- Mạch điện được mô phỏng bởi chương trình Proteus 8 Professional như sau:

Mơ tả mạch:
• Mạch được xây dựng bởi 1 chip ATmega16 và 1 LCD thuộc nhóm LMxxxL (cụ
thể ở mạch này sử dụng LCD LM016L). Chip điều khiển văn bản hiển thị trên LCD
qua dây nối từ các chân thuộc cổng A (trừ chân A3) của chip. Khi kích hoạt mạch thì
qua các dịng code được tạo sẵn như bên dưới và đưa vào chip, LCD sẽ hiển thị văn
bản di chuyển trên màn hình theo quy luật trước (cụ thể ở mạch này LCD hiển thị văn
bản gồm ký tự di chuyển từ trái sang phải màn hình).
- Code được tạo bởi chương trình CodeVisionAVR dành cho mạch trên:
Chip type
: ATmega16
Program type
: Application
AVR Core Clock frequency: 8.000000 MHz
Memory model
: Small
External RAM size
:0
Data Stack size
: 256
*******************************************************/
#include <mega16.h>
#include <delay.h>
// Alphanumeric LCD functions
#include <alcd.h>
// Declare your global variables here
int i;
void main(void)
{

// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out

22


DDRA=(1<(1<// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTA=(0<(0<// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<(0<// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<(0<// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<

(0<// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<(0<// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;

OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

23


// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<TCCR2=(0<TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<(0<// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<MCUCSR=(0<// USART initialization
// USART disabled
UCSRB=(0<(0<

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<(0<SFIOR=(0<// ADC initialization
// ADC disabled
ADCSRA=(0<(0<// SPI initialization
// SPI disabled
SPCR=(0<(0<// TWI initialization
// TWI disabled
TWCR=(0<// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS: PORTA Bit 0
// RD: PORTA Bit 1
// EN: PORTA Bit 2
// D4: PORTA Bit 4
// D5: PORTA Bit 5
// D6: PORTA Bit 6
// D7: PORTA Bit 7

// Characters/line: 16
lcd_init(16);

24


while (1)
{
// Place your code here
for (i=0;i<13;i++)
{
lcd_clear();
lcd_gotoxy(i, 0);
lcd_puts(">>>>");
delay_ms(250);
lcd_clear();
}
}
}

Mơ tả code:
• Phát triển từ mạch LCD trên, ta dùng biến i loại số nguyên để có thể quy định ký
tự di chuyển.
• Từ dịng Place your code here, các lệnh chính để mạch hoạt động được thể hiện.
Lệnh for được dùng để ràng buộc các lệnh trong ngoặc nhọn ngay sau nó phải thực
hiện xong thì điều kiện trong ngoặc đơn sau for mới có thể được thực hiện để hiển thị
ký tự di chuyển trong LCD.

IV.


Lập trình điều khiển mạch sử dụng ADC
1. Mô tả ban đầu về nội dung
ADC (Analog-Digital Converter) là bộ chuyển đổi tín hiệu giữa tín hiệu Analog (tín
hiệu tương tự) và tín hiệu Digital (tín hiệu kỹ thuật số). Tín hiệu Analog mang điện áp
V_in được so sánh với điện áp mẫu V_max (giá trị lớn nhất) trong bộ chuyển đổi, sau đó
được chuyển đổi thành tín hiệu Digital và được lưu vào thanh ghi dữ liệu (thanh data) của
bộ chuyển đổi.
Nội dung 2 bên dưới sẽ mơ tả một vài mạch lập trình điện tử tiêu biểu có sử dụng ADC
để có thể hiểu rõ hơn về cách giá trị điện áp được quy đổi khi chuyển đổi giữa hai tín hiệu
Analog và Digital qua sự điều khiển của chip đã nhận sẵn code lập trình.
2. Mơ tả thiết kế và mơ tả phần mềm
a. Đọc giá trị điện áp và hiển thị giá trị ADC trên LCD
- Mạch điện được mô phỏng bởi chương trình Proteus 8 Professional như sau:

25


×