Hướng dẫn sử dụng kit 8051

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;

pdf110 trang | Chia sẻ: NamTDH | Lượt xem: 1263 | Lượt tải: 0download
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:

  • pdfkit_89c51_9299.pdf