Truyền từ master xuống slave:
Ở chế độ này, master sẽ gửi 8 bit dữ liệu, sau khi nhận xong 8 bit này, slave sẽ tự
động gửi lại 1 bit ACK và master phải tạo ra thêm 1 clock để nhận bit ACK này.
//write I2C
void write_I2C(unsigned char data2send)
{
int i;
for (i=0;i<8;i++)
{
SDA = (data2send & 0x80) ? 1:0;
110 trang |
Chia sẻ: NamTDH | Lượt xem: 1263 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Hướng dẫn sử dụng kit 8051, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
yền có tên là txtSend và textbox dùng để hiển thị dữ
liệu nhận tên txtReceive, thuộc tính Multiple lines chỉnh thành true.
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 78
12.5.1 Load các cổng COM của PC lên ComboBox
Chức năng này được hiện thực trong thủ tục Form Load, để tạo ra sự kiện này,
bạn chỉ cần double vào form đang thiết kế hoặc chọn trong cửa sổ thuộc tính sự kiện này
rồi double click vào ô tương ứng như sau :
Cửa sổ viết code sẽ hiện ra như sau :
Chọn Form
Chọn tab sự
kiện
Double Click tại đây
để tạo hàm xử lý sự
kiện Form Load
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 79
Chi tiết hiện thực như sau :
private void frmMain_Load(object sender, EventArgs e)
{
string[] ports = SerialPort.GetPortNames();
// Add all port names to the combo box:
foreach (string port in ports)
{
cboComPorts.Properties.Items.Add(port);
}
}
12.5.2 Kết nối cổng với cổng COM
Chuyển qua lại cửa sổ thiết kế giao diện bằng cách double click vào Form1 trong
cửa sổ project explore :
Màn hình thiết kế giao diện hiện ra, bạn nhấp đôi vào button Connect để tạo hàm
xử lý sự kiện Click cho nó. Hàm được tạo ra và bạn hiện thực code như sau :
private void btnConnect_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen) serialPort.Close();
serialPort.PortName = cboComPorts.Text;
try
{
serialPort.Open();
MessageBox.Show("Đã kết nối cổng COM!");
}
catch
{
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 80
MessageBox.Show("Chưa kết nối được cổng COM!");
}
}
12.5.3 Gửi dữ liệu
Chuyển qua lại cửa sổ thiết kế giao diện bằng cách double click vào Form1 trong
cửa sổ project explore :
Để gửi dữ liệu, ta tạo hàm xử lý cho sự kiện click nút Send bằng cách double
click vào nút đó trên form thiết kế giao diện, hàm này sẽ được tự động tạo ra như sau:
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 81
Hàm này có chức năng truyền 1 string gồm nhiều kí tự qua cổng UART, việc hiện
thực hàm này như sau :
private void btnSend_Click(object sender, EventArgs e)
{
serialPort.Write(txtSend.Text);
}
12.5.4 Nhận dữ liệu
Chuyển sang cửa sổ thiết kế giao diện, chọn vào đối tượng serialPort, chọn tab sự
kiện và tạo hàm cho sự kiện nhận bằng cách double click vào dòng DataReceived :
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 82
Hàm sẽ được tạo ra như sau :
Do khi dữ liệu được gửi đến máy tính sẽ được chia thành nhiều phần. Ví dụ 1
chuỗi 10byte gửi, máy tính có thể lần 1 nhận được 8 byte, lần 2 mới nhận 2 byte còn lại.
Vì lý do này, việc nhận dữ liệu sẽ bị xung đột với thread vẽ màn hình giao diện của
chương trình mà chúng ta đang viết. Để khác phục vấn đề này, C#.NET đưa ra khái niệm
Chọn cổng COM
Chọn tab sự kiện
Double
Click
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 83
hàm gọi bất đồng bộ, khi sự kiện nhận UART bị xung đột với thread màn hình, nó sẽ bị
delay lại và không bị mất.
Ta khai báo hàm gọi bất đồng bộ ở đầu chương trình như sau :
Hiện thực hàm SetText() như sau :
private void SetText(string text)
{
//InvokeRequired required compares the thread ID of the
//calling thread to the thread ID of the creating
thread.
// If these threads are different, it returns true.
if (this.txtReceive.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
//process incoming data + return character
txtReceive.Text += text + Environment.NewLine ;
}
}
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 84
Cuối cùng ta hiện thực hàm nhận dữ liệu:
private void serialPort_DataReceived(object sender,
SerialDataReceivedEventArgs e)
{
InputData = serialPort.ReadExisting();
if (InputData != String.Empty)
{
SetText(InputData);
}
}
Chi tiết code bạn có thể xem thêm trong project RS232Demo đi kèm trong đĩa CD
này. Để chạy chương trình bạn nhấn F5 hoặc tổ hợp phím Ctrl và F5. Ở máy tính khác
không cài Visual 2005, bạn cần phải cài dotnetframework 2.0 rồi chép file
RS232Demo.exe trong thư mục bin\Debug. Bạn có thể tham khảo thêm trên mạng để tạo
ra file setup cho ứng dụng này để sinh ra file cài đặt giống như khi bạn mua đĩa CD và cài
đặt ứng dụng.
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 85
Bài 13 : Giao tiếp PS2 với bàn phím
Mục đích:
Nắm vững giao tiếp PS2 với bàn phím.
Yêu cầu:
Hiện thực chương trình giao tiếp với bàn phím, hiển thị kí tự được nhấn ra ma
trận led .
13.1 Nguyên lý giao tiếp PS2
Dữ liệu trong giao tiếp PS2 cũng được truyền nối tiếp từng bit như uart. Khi 1
phím được nhấn, 11 bit bao gồm Start bit, 8 bit dữ liệu (bit trọng số thấp truyền trước), 1
bit parity và 1 stop bit sẽ được gửi đi :
Ta sẽ lấy dữ liệu tại cạnh xuống của clock, chân của clock được nối vào chân ngắt
ngoài 1 của vi điều khiển (P3.3) như sau:
P3.4kb_Data
kb_Clock
R3
22K
R4
22K
VCC
P3.3VCC
J3
PS/2 CIR 7-R
1
2
3
4
5
6
7
kb_Vcc
VCC
kb_Ground
kb_Shield
Khi 1 phím được nhấn xuống, mã make_code sẽ được gửi lên. Trong khoảng thời
gian phím đó được đè xuống thì mã make_code vẫn được định kì gửi lên. Khi thả phím ra
thì bàn phím gửi lên mã break_code và make_code.
Bảng mã make_code và break_code của các phím như sau:
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 86
Dễ dàng nhận ra mã break_code của 1 phím gồm 0xF0 và mã make_code của
phím đó.
13.2 Kết nối phần cứng
Chân clock của bàn phím nối với P3.3.
Chân data từ bàn phím nới với P3.4.
Ứng dụng xuất kí tự ra ma trận led, nên ta gạt switch 3 lên ON.
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 87
13.3 Viết chương trình
Phần chính của bài thực hành này là lấy cho được dữ liệu truyền lên từ bàn phím.
Quá trình dịch từng bit để lấy data 8 bit trong chuỗi 10 bit được hiện thực trong hàm phục
vụ ngắt ngoài 1. DATA chính là chân P3^4
void ext1_isr() interrupt 2
{
count_bit_input++;
if(count_bit_input == 1) //start to get data
scan_code = 0x00;
// getting data when the key pressed
// ignore start bit, parity bit and stop bit
// just getting 8 data bits
if(count_bit_input > 1 && count_bit_input < 10)
{
scan_code >>= 1;
if(DATA)
scan_code |= 0x80;
}
if(count_bit_input > 10)
{
//Add your code here
count_bit_input = 0; //reset
}
}
Biến count_bit_input dùng để đếm số bit gửi về, khi count_bit_input = 11 ta sẽ
có được dữ liệu scan_code từ bàn phím truyền lên. Bạn sẽ phải xử lý để phân loại đây là
mã make_code hay break_code, có được nhấn kèm với phím shift hay caps lock hay
không để chuyển sang mã ascii cho kí tự được nhấn. Chi tiết code bạn xem thêm trong
Bai 13.
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 88
Bài 14 : PWM điều khiển motor
Mục đích:
Nắm vững kĩ thuật điều xung PWM.
Yêu cầu:
Viết ứng dụng điều khiển motor chạy ở nhiều tốc độ khác nhau.
14.1 Khái niệm PWM
PWM viết tắt của từ Pulse Width Modulation. PWM được sử dụng nhiều trong hệ
thống điều khiển tự động ngày nay. Nó được ứng dụng trong điều khiển tốc độ động cơ,
độ sáng tối của led, màn hình LCD, pha màu cho bang quang báo, sử dụng trong các
thuật toán điều khiển vận tốc cho Robot như PI, PD, PID …
Hiểu đơn giản PWM hoạt động như một công tác đóng mở rất nhiều lần trong 1
giây. Nếu tần số đóng mở càng nhanh thì điện áp cấp trung bình càng lớn.
Một số khái niệm cơ bản của PWM :
v Tần số (Hz, Khz…).
v Chu kỳ T, thời gian xung mức cao TH + thời gian xung mức thấp TL.
v Duty Cycle: tỉ lệ thời gian xung mức và thời gian xung mức thấp.
Như hình trên ta có Duty Cycle lần lượt là 0%, 25%, 50%, 75%, 100%.
Một số công thức :
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 89
Chu kì : TTotal = TOn + TOff
Duty Cycle : D = TOn/TOff
Volt Output : V = Vinput x D
Khi đó nếu TOn = 0 thì VoltOutput = 0 (V) còn TOn = TTotal thì VoltOutput = VoltInput .
Trong thực tế ta có IC chuyên dụng để dùng cho việc điều xung và có các vi điều
khiển có tích hợp sẵn PWM bên trong. Vi điều khiển 89V51 hỗ 5 kênh điều xung (P1.3 –
P1.7) được sử dụng khá linh hoạt cho việc điều xung, người dùng chỉ cần ghi giá trị thích
hợp vào các thanh ghi để có được tín hiện PWM mong muốn.
14.2 Lập trình PWM trên 89V51
Khởi tạo 5 kênh điều xung như sau:
void initPWM()
{
CCAPM0 = 0x42; //set P1.3 pwm mode
CCAPM1 = 0x42; //set P1.4 pwm mode
CCAPM2 = 0x42; //set P1.5 pwm mode
CCAPM3 = 0x42; //set P1.6 pwm mode
CCAPM4 = 0x42; //set P1.7 pwm mode
CMOD = 0x00; // setup to devide frequency by 6
CCAP0H = 0xff;
CCAP1H = 0xff;
CCAP2H = 0xff;
CCAP3H = 0xff;
CCAP4H = 0xff;
CCON |= (1<<6); // set registry PCA
}
Sau khi khởi tạo, mức điện áp ở 5 chân điều xung là 0V. Muốn thay đối giá trị
điện áp ta chỉ cần thay đối nội dung trong thanh ghi CCAPnH, 0x00 tương ứng với 100%
duty cycle, 0xFF tương ứng với 0% duty cycle. Motor được nối với P1.3 tương ứng với
kênh điều xung 0. Motor được tích cực mức 0 nên giá trị trong thanh ghi CCAP0H càng
lớn thì motor quay càng chậm (duty cycle nhỏ thì motor quay nhanh).
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 90
Bài 15 : Giao tiếp LCD character
Mục đích:
Nắm vững kĩ thuật điều khiển LCD character theo 2 chế độ 8 bit và 4 bit.
Yêu cầu:
Xây dựng chương trình xuất dữ liệu ra LCD theo chế độ 4 bit.
15.1 Chức năng các chân của LCD
LCD thường sử dụng 14 chân, chế độ 16 chân khi cần điều khiển đèn nền. Chức
năng của các chân như sau:
Chức năng Thứ tự Tên Mức Logic Mô tả
Ground 1 VSS - 0V
Power Supply 2 Vdd - +5V
Contrast 3 Vee - 0-Vdd
4 RS 0 D0-D7 là command
1 D0-D7 là Data
0 Write 5 R/W
1 Read
0 Disable
1 Normal
Control
Operation
6
E Từ 1 xuống 0 Truyền Data hoặc
Command xuống LCD
7 D0 0|1 Bit 0 LSB
8 D1 0|1 Bit 1
9 D2 0|1 Bit 2
10 D3 0|1 Bit 3
11 D4 0|1 Bit 4
12 D4 0|1 Bit 5
13 D6 0|1 Bit 6
Data/Command
14 D7 0|1 Bit 7 MSB
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 91
15.2 Kết nối màn hình LCD
Hình trên mô tả kết nối LCD với chế độ 16 chân, 2 chân K và A dùng để kết nối
với đèn nền.
15.3 Các vùng nhớ của LCD
15.3.1 Display Data Ram (DDRAM)
Lưu trữ mã ký tự hiển thị ra màn hình. Mã này giống với mã ASCII. Có tất cả 80
ô nhớ DDRAM. Vùng hiển thị tương ứng với cửa sổ gồm 16 ô nhớ hàng đầu tiên và 16 ô
nhớ hàng thứ hai. Chúng ta có thể tạo hiệu ứng dịch chữ bằng cách sử dụng lệnh dịch ,
khi đó cửa sổ hiển thị sẽ dịch đem lại hiệu ứng dịch chữ.
15.3.2 Character Generator Ram (CGRAM)
Lưu trữ tám mẫu ký tự do người dùng định nghĩa. Tám mẫu ký tự này tương ứng
với các mã ký tự D7-D0 = 0000*D2D1D0 (* mang giá trị tùy định 0 hay 1).
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 92
15.3.3 Bộ nhớ CGROM
Bộ nhớ dùng để lưu trữ các kí tự hiển thị trên LCD. Các giá trị lưu trong bộ nhớ
này như sau:
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 93
Chúng ta muốn hiển thị chữ “CE” ở giữa hàng đầu tiên, giả sử cửa sổ hiển thị
đang bắt đầu từ vị trí đầu tiên (hàng thứ nhất hiển thị dữ liệu của ô nhớ từ 0x00 đến 0x0f,
hàng thứ hai hiển thị dữ liệu của ô nhớ từ 0x40 đến 0x4f, đây là vị trí home). Giá trị của ô
nhớ 0x07 là 0x43 (ký tự C), của ô nhớ 0x08 là 0x45 (ký tự E).
Chúng ta muốn hiển thị chữ “®” ở giữ hàng thứ hai, giả sử cử sổ hiển thị đang ở
vị trí home. Trong bảng mẫu ký tự chúng ta thấy không có mẫu “®”. Lúc này chúng ta
phải định nghĩa mẫu “®” 5x8 điểm, gồm có 8 byte, sau đó lưu vào vị trí của mẫu ký tự
CGRAM thứ nhất. Lúc này giá trị của ô nhớ 0x47 là 0x00 hoặc 0x08 (vị trí của mẫu ký
tự CGRAM thứ nhất “®”).
15.4 Các lệnh cơ bản của LCD
Để truyền lệnh cho LCD thì chân RS = 0, khi đó các tín hiện trên D0-D7 được
xem là lệnh. Ý nghĩa của các lệnh điều khiển LCD như sau:
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 94
Lệnh RS RW D7 D6 D5 D4 D3 D2 D1 D0 Thời gian
thực thi
Clear display
0 0 0 0 0 0 0 0 0 1 1.52ms
Return home
0 0 0 0 0 0 0 0 1 * 1.52ms
Entry mode set
0 0 0 0 0 0 0 1 I/D RL 37µs
Display on/off
control
0 0 0 0 0 0 1 D C B 37µs
Cursor/Display
shift
0 0 0 0 0 1
S/
C
R/
L
* * 37µs
Function set
0 0 0 0 1 DL N F * * 37µs
Set CGRAM
address
0 0 0 1 CGRAM address 37µs
Set DDRAM
address
0 0 1 DDRAM address 37µs
Read BUSY flag
(BF)
0 1 BF DDRAM address 0µs
Write to
DDRAM or
CGRAM
1 0 D7 D6 D5 D4 D3 D2 D1 D0 43µs
Read from
DDRAM or
CGRAM
1 1 D7 D6 D5 D4 D3 D2 D1 D0 43µs
I/D 1 = Increment (by 1) RL 1 = Shift right
0 = Decrement (by 1) 0 = Shift left
S 1 = Display shift on DL 1 = 8-bit interface
0 = Display shift off 0 = 4-bit interface
D 1 = Display on N 1 = Display in two lines
0 = Display off 0 = Display in one line
U 1 = Cursor on F 1 = Character format 5x10 dots
0 = Cursor off 0 = Character format 5x7 dots
B 1 = Cursor blink on D/C 1 = Display shift
0 = Cursor blink off 0 = Cursor shift
15.5 Kết nối LCD với vi điều khiển
LCD có 2 chế độ 8 bit và 4 bit. Ở chế độ 8 bit, ta dùng toàn bộ 8 chân D0-D7 để
giao tiếp. Ở chế độ 4 bit, ta chỉ dùng 4 bit cao D4-D7 để giao tiếp với LCD. Dữ liệu gửi
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 95
cho LCD ở chế độ này bao gồm 4bit cao gửi trước, sau đó sẽ đến 4bit thấp. Sơ đồ kết nối
ở 2 chế độ như sau:
Nếu muốn tiết kiệm chân, R/W có thể nối xuống GND. Ở chế độ 4bit thì 4 bit
thấp của LCD có thể nối xuống GND.
15.6 Khởi tạo LCD
Quá trình khởi tạo LCD ở chế độ 8 bit như sau:
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 96
Quá trình khởi tạo ở chế độ 4 bit như sau:
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 97
15.7 Kết nối phần cứng
LCD được kết nối với Port 3 của vi điều khiển như sau:
LED_BACKLIGHT = P3^0
PIN_RS : P3^1
PIN_RW : P3^2
PIN_EN : P3^3
D4 : P3^4
D5 : P3^5
D6 : P3^6
D7 : P3^7
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 98
15.8 Viết chương trình
15.8.1 Các hàm cơ bản
Để quá trình điều khiển LCD hiệu quả, ta định nghĩa 1 số hàm cơ bản như sau
v Hàm delay: trung bình 89V51 thực hiện 1 lệnh mất 1us.
void lcd_delay(int time)
{
while(--time);
}
v Hàm ghi dữ liệu ra LCD:
//Ghi 4 bit
void lcd_write_4bits(unsigned char dat)
{
RW(WRITE); //kéo chân RW xuống 0
EN(SET); //set chân Enable lên 1
LCD_DATA_OUT(dat & 0xF0); //Gửi data ra
lcd_delay(10);
EN(CLR); //kéo chân Enable xuống 0
lcd_delay(10);
}
//Ghi 1 byte : ghi 4 bit 2 lần
void lcd_write_cmd(unsigned char cmd){
lcd_wait_busy();
RS(CMD);
lcd_write_4bits(cmd);
lcd_write_4bits(cmd << 4);
}
v Một số macro trong file lcd.h, ví dụ như:
#define RS(x) ( (x) ? ( LCD_PORT |= 0x02 ) : ( LCD_PORT &= 0xFD ) )
Nếu x = 1 thì thực hiện lệnh LCD_PORT |=0x02, x=0 thì thực hiện LCD_PORT
&=0xFD.
15.8.2 Khởi tạo LCD chế độ 4 bit
void init_lcd() {
lcd_delay(15000); //1
RS(CMD); //2
lcd_write_4bits(0x03 << 4); //3
lcd_delay(4100); //4
lcd_write_4bits(0x03 << 4); //5
lcd_delay(100); //6
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 99
lcd_write_4bits(0x03 << 4); //7
lcd_write_4bits(0x02 << 4); //8
lcd_write_cmd(0x28) ; //9
lcd_write_cmd(0x0C); //10
lcd_write_cmd(0x06); //11
}
Ý nghĩa các lệnh trên như sau:
v Lệnh 1 : gọi hàm lcd_delay(15000) để delay 15ms.
v Lệnh 2 : kéo chân RS (nối với LCD_PORT tại bit 1) xuống 0. Lệnh này được
định nghĩa là 1 macro trong file lcd.h:
#define RS(x) ( (x) ? ( LCD_PORT |= 0x02 ) : ( LCD_PORT &= 0xFD ) )
CMD được define là 0 nên lệnh RS(CMD) sẽ có điều kiện (x) là false và sẽ thực
hiện phần thứ 2 của lệnh trên : LCD_PORT & 0xFD (kéo bit 1 xuống 0 : 1111 1101).
v Lệnh 3 : thực hiện trạng thái đầu tiên sau khi chờ 15ms, ghi D7 D6 D5 D4 =
0011. Các chân này được nối với 4 bit cao của vi điều khiển nên ta phải dịch trái giá trị
0x03 4 bit.
v Lệnh 4 : delay khoảng 41ms.
v Lệnh 5,6,7,8 : Thực hiện các trạng thái 2,3 và 4. Sau lệnh 7 thì LCD đã
chuyển sang chế độ 4 bit, và để gửi 1 byte, ta sẽ gửi 2 lần 4 bit cao trước rồi tới 4 bit thấp.
v Lệnh 9 : gọi hàm lcd_write_cmd để ghi 4 bit 2 lần, giá trị 0x28 tương ứng với
N = 1 (hiển thị trên 2 hàng của LCD) và B = 0 (font định dạng 5x7 điểm).
v Lệnh 10 : thực hiện lệnh display on (xem thêm trong bảng lệnh), D = 1.
v Lệnh 11 : thực hiện lệnh entry set mode, 0x06 tương ứng với chế độ dịch phải
tăng dần.
15.8.3 Xoá màn hình
Hàm này chỉ đơn giản là gửi lệnh clear màn hình lcd (xem thêm trong bảng lệnh
của LCD).
void lcd_clear()
{
lcd_write_cmd(0x01);
lcd_goto_xy(0, 0);
}
15.8.4 Thiết lập vị trí con trỏ
Hàm này thiết lập vị trí bắt đầu xuất dữ liệu trên màn hình LCD 2 hàng 16 cột. Để
hiện thực hàm này ta phải tính được địa chỉ tương ứng với toạ độ (row,col) và dùng lệnh
SET DDRAM ADDRESS (bit 7 của lệnh này bằng 1).
char lcd_goto_xy(unsigned char row, unsigned char col) {
unsigned char addr = 0x00;
if(col >= 20 || row >= 4)
return FALSE;
if(row < 2) {
addr = (row * 0x40) + col;
addr = 0x80 | (addr & 0x7F);
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 100
}
else {
addr = (row * 0x40) + col;
addr = 0x94 | (addr & 0x7F);
}
lcd_write_cmd(addr);
current_row = row;
current_col = col;
return TRUE;
}
15.8.5 In kí tự ra màn hình
Hàm này nhận thông số là 1 kí tự và hiển thị kí tự đó ra màn hình LCD. Việc hiện
thực hàm này khá đơn giản, ta chỉ cần kéo chân RS xuống 0 là LCD sẽ hiểu các bit D7-
D4 là dữ liệu.
void lcd_print_char(unsigned char dat)
{
lcd_wait_busy();
//find next position
if(current_row == 0 && current_col == 16)
lcd_goto_xy(1,0);
if(current_row == 1 && current_col ==16)
lcd_goto_xy(0,0);
RS(DAT); //RS = 0
lcd_write_4bits(dat);
lcd_write_4bits(dat << 4);
current_col ++; //update new position
}
Từ những hàm cơ bản này, bạn có thể hiện thực thêm các hàm để xuất 1 string
hay 1 giá trị số ra màn hình LCD. Code chi tiết có thể xem thêm trong thư mục Bài 15.
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 101
Bài 16 : Giao tiếp I2C – DS1307
Mục đích:
Nắm vững giao tiếp I2C
Yêu cầu:
Xây dựng ứng dụng giao tiếp với DS1307 để lấy dữ liệu ngày tháng năm, giờ phút
giây.
16.1 Các đặc điểm của DS1307
Real time clock đếm giờ, phút, giây, tháng, ngày của
tháng, ngày của tuần, năm kể cả năm nhuận (đến năm 2100).
56 byte Ram để lưu trữ dữ liệu, nhưng dữ liệu không bị
mất khi tắt nguồn.
Sử dụng 2 dây tín hiệu để truyền dữ liệu theo giao thức
I2C.
Có thể lập trình được để xuất tín hiệu xung vuông.
Tự động phát hiện ra nguồn cung cấp bị lỗi (ngắt nguồn) và chuyển qua
mạch bảo vệ sử dùng nguồn pin dự trữ.
16.2 Nguyên lý hoạt động
DS1307 hoạt động như một slaver trên bus dữ liệu nối tiếp. Để truy xuất
nội dung ta phải thiết lập một điều kiện Start và cung cấp mã nhận dạng của IC
(Device Identification Code) theo sau bởi thanh ghi địa chỉ. Các thanh ghi theo sau
được truy xuất tuần tự cho đến khi gặp tín hiệu Stop.
Khi VCC = 1.25Vbat thì DS1307 sẽ kết thúc việc truy xuất và reset lại bộ
đếm địa chỉ. Các Input sẽ không được nhận ra tại thời điểm này để ngăn ngừa một
số lượng lớn dữ liệu được ghi tới DS1307 từ hệ thống bên ngoài. Khi VCC < Vbat
thì ic này sẽ chuyển sang mode sử dụng pin dự trữ. Khi nguồn chính được bật lên
thì IC này sẽ chuyển từ dùng nguồn pin sang dùng nguồn chính. Hình sau mô tả
những phần chính của DS1307.
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 102
16.3 Các tín hiệu Input và Output
VCC, GND : Nguồn DC được cung cấp cho IC qua những chân này. Khi
gắn vào nguồn 5V thì IC này có thể đọc ghi bình thường. Nhưng khi nguồn giảm
xuống còn 3V thì việc đọc ghi sẽ không được phép. Tuy nhiên, các chức năng của
timer vẫn tiếp tục với nguồn cung cấp thấp. Khi Vcc giảm xuống dưới VBAT thì
RAM và timekeeper được chuyển qua sử dụng nguồn cung cấp tại VBAT.
VBAT : Cung cấp nguồn dữ trữ 3V. Để hoạt động ở chế độ sử dụng nguồn
Vbat thì 2.0V < Vbat < 3.5V. Khi VCC gần bằng 1.25VBAT thì chúng ta sẽ
không được phép truy xuất vào RTC (Real time clock) và Ram bên trong của IC.
SCL (Serial Clock Input) : SCL được dùng để đồng bộ dữ liệu trên đường
truyền nối tiếp.
SDA (Serial Data Input/Output) : SDA là chân I/O. SDA là chân Open
drain nên cần có điện trở kéo lên ở bên ngoài.
SQW/OUT (Square Wave/Output Driver) : Khi được bật lên, thì bit SQWE
set lên 1, và chân này sẽ output ra 1 trong 4 tần số sóng vuông là 1hz, 4khz, 8khz,
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 103
32khz. Chân này cũng là chân Open drain nên cũng yêu cầu có điện trở kéo lên
nguồn ở bên ngoài. SQW/OUT sẽ hoạt động khi có nguồn cung cấp vào cho dù đó
là nguồn VCC hay là VBAT.
X1, X2 : Kết nối với thạch anh 32.768Khz. Mạch tạo xung bên trong được
thiết kế để hoạt động với thạch anh và tụ CL = 12.5 pF.
16.4 RTC và sơ đồ địa chỉ Ram
Sơ đồ địa chỉ của RTC và các thanh ghi Ram của DS1307 như ở hình dưới.
Các thanh ghi RTC được định địa chỉ từ 00h đến 07h. Các thanh ghi Ram được
định địa chỉ tiếp theo sau đó và từ 08h đến 3fh. Trong khi truy suất nhiều byte và
khi con trỏ địa chỉ chỉ tới ô 3fh, vị trí cuối của vùng nhớ Ram, thì nó sẽ quay lại
địa chỉ 00h để truy xuất tiếp.
16.5 Thông tin thời gian và lịch
Thông tin thời gian và lịch được chứa trong trong các thanh ghi tương ứng.
Các thanh ghi RTC như ở hình trên. Thời gian và lịch được set hoặc khởi tạo bằng
cách ghi ra các byte thanh khi tương ứng. Nội dung của các thanh ghi thời gian và
lịch được định dạng theo kiểu BCD. Bit 7 của thanh ghi 0 là clock halt bit (CH).
Khi bít này được set lên 1 thì mạch dao động sẽ bị ẩn không được sử dụng nữa,
khi clear xuống 0 thì mạch dao động sẽ được kích hoạt trở lại.
DS1307 có thể chạy ở chế độ 12h hay 24h. Bít thứ 6 của thanh ghi hours
được định nghĩa để set xem sử dụng IC này ở chế độ nào. Khi bit này bằng 1 thì
chế độ 12h được chọn. Trong chế độ 12h thì bit 5 chỉ AM/PM (PM khi bit này là
1). Trong chế độ 24h, thì bít 5 là bít thứ 2 của 10hour (20:23).
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 104
16.6 Thanh ghi điều khiển (Control Register)
Thanh ghi điều khiển của DS1307 được sử dụng để điều khiển hoạt động
của chân SQW/OUT.
Out (Output control) : Bít này điều khiển mức logic xuất ra trên chân
SQW/OUT khi mà sóng vuông không được kích hoạt. Nếu SQWE = 0, thì mức
logic trên chân SQW/OUT là 1 nếu OUT = 1, và là 0 nếu OUT = 0.
SQWE (Square Wave Enabel) : Bít này khi được set lên mức 1 thì sẽ kích
hoạt mạch dao động xuất ra ngoài. Tần số của sóng vuông phụ thuộc vào giá trị ở
bít RS0 và RS1. Với sóng vuông xuất ra 1Hz thì thanh ghi clock sẽ cập nhập dữ
liệu khi có cạnh xuống của xung vuông.
RS (Rate select) : Những bit này điều khiển tần số của sóng vuông được
xuất ra trên chân SQW/OUT. Bảng sau liệt kê ra các tần số có thể được chọn bởi 2
bit RS này.
16.7 Bus dữ liệu nối tiếp.
DS1307 hỗ trợ truyền dữ liệu 2 chiều và giao thức truyền dữ liệu I2C trên 2
dây này. Thiết bị gởi dữ liệu trên bus gọi là transmitter và thiết bị nhận dữ liệu gọi
là receiver. Thiết bị điều khiển các message gọi là master. Thiết bị được điều
khiển bởi master thì gọi là slaver.
Bus dữ liệu được điều khiển bởi master. Bên cạnh đó nó cũng có nhiệm vụ
tạo xung clock trên đường tín hiệu SCL, điều khiển truy xuất bus, và tạo các tín
hiệu Start, Stop. DS1307 hoạt động như một slave trên đường bus này.
HƯỚNG DẪN SỬ DỤNG KIT 8051
BKIT HARDWARE CLUB www.bkit4u.com 105
Các trạng thái của bus:
Bus không bận : khi cả 2 đường giữ tín hiệu ở mức high.
Bắt đầu truyền dữ liệu (start condition) : Thay đổi trạng thái trên đường dữ
liệu từ High xuống Low, trong khi đường clock ổn định ở mức high được định
nghĩa là một tín hiệu Start.
Kết thúc truyền dữ liệu (stop condition) : Thay đổi trạng thái trên đường dữ
liệu từ Low lên High, trong khi đường clock ổn định ở mức high thì được định
nghĩa là một tín hiệu Stop.
Dữ liệu hợp lệ : Trạng thái của đường dữ liệu biểu diễn dữ liệu hợp lệ khi
theo sau bởi tín hiệu START, đường dữ liệu ổn định trong khoảng thời gian mà tín
hiệu clock ở mức High. Dữ liệu trên đường dữ liệu phải được thay đổi trong
khoảng thời gian mà tín hiệu clock ở mức Low.
Mỗi khi truyền dữ liệu điều được bắt đầu bởi một tín hiệu Start và kết thúc
việc truyền bằng một tín hiệu Stop. Số byte dữ liệu truyền giữa 2 tín hiệu Start và
Stop là không hạn chế và được xác định bởi master. Thông tin được truyền và mỗi
lần truyền receiver gởi thêm ack ở bít thứ 9. Để cho biế
Các file đính kèm theo tài liệu này:
- kit_89c51_9299.pdf