• Ngoài chức năng trên chúng em còn tích hợp và mở rộng các chức năng khác như đồng hồ bấm giây, hẹn giờ báo thức, đo và hiển thị nhiệt độ của môi trường lên LCD, cảnh báo nhiệt độ khi n
Trang 1ĐẠI HỌC CẦN THƠ
KHOA CÔNG NGHỆ
BỘ MÔN ĐIỆN TỬ VIỄN THÔNG
Báo Cáo Vi Xử Lí
ĐỀ TÀI
THIẾT KẾ MẠCH HIỂN THỊ THỜI GIAN
THỰC TRÊN LCD DÙNG VI ĐIỀU KHIỂN MSP430
GVHD: Thầy TRẦN HỮU DANH
Nhóm: sáng thứ 6
SVTH:
ĐẶNG VŨ MINH DŨNG 1090915
NGUYỄN PHAN NGỌC THANH KHIẾT 1080857
LÝ SƠN BẢO 1091004
GIỚI THIỆU ĐỀ TÀI:
• Hiển thị thời gian thực trên LCD có nghĩa là hiện thị thời gian tuyệt đối mà hằng ngày con người đang sử dụng, tình bằng giây, phút, giờ, thứ, ngày, tháng, năm như 1 đồng hồ Đây là đề tài được thực hiện với loại vi xử lí mới MSP430G2452 là dòng vi xử lí tiết kiệm năng lượng của hãng
Texas Instruments
• Ngoài chức năng trên chúng em còn tích hợp và mở rộng các chức năng khác như đồng hồ bấm giây, hẹn giờ báo thức, đo và hiển thị nhiệt độ của môi trường lên LCD, cảnh báo nhiệt độ khi nhiệt độ khi vượt quá giá trị dặt trước, với sự tùy chỉnh của người dùng
Trang 2
NỘI DUNG BÁO CÁO
1 Sơ đồ khối
2 Giới thiệu cấu tạo chức năng các loại linh kiện
3 Giới thiệu cách thức giao tiếp của các linh kiện
4 Ghép nối phần cứng
5 Lưu đồ giải thuật lập trình cho mạch
6 Code chương trình
7 Một số vướng mắc trong đồ án
8 Kết quả đạt được và hướng cải tiến tích hợp
1 SƠ ĐỒ KHỐI
Hình 1 Sơ đồ khối
- Khối chính: bao gồm khối điều khiển, khối hiển thị, khối real time, khối chuyển đổi I2C và khối nút nhấn
Trang 3- Khối mở rộng: bao gồm hệ thống báo hiệu, khối cho cảm biến nhiệt độ.
- Ngoài ra còn khối nguồn
2 GIỚI THIỆU LINH KIỆN
1 Vi xử lý: MSP430G2452PDIP
Hình 2 Vi xử lí msp430g2452
• IC thuộc họ msp430 của Texas Instuments
• Điện áp nguồn 1.8V – 3.3V
• Cấu trúc RICS-16bit, bộ nhớ 8KB flash, 256B RAM
• IC có 16 ngõ I/O, 2chân nguồn, 1TEST, 1RESET
• Tần số nội 16MHz
• Thạch anh 32MHz
• 1 Timer_A 16bit
• Giao tiếp chuẩn I2C
• Giao tiếp đồng bộ SPI
• Bộ chuyển đổi ADC 10 bit, 200ksps
• Ngôn ngữ hỗ trợ lập trình C, Assembly
2 Chip xử lý thời gian thực: DS1307
Hình 3 Chip DS1307
Trang 4DS1307 là chip đồng hồ thời gian thực (RTC : Real-time clock), khái niệm thời gian thực ở đây được dùng với ý nghĩa thời gian tuyệt đối mà con người đang sử dụng, tình bằng giây, phút, giờ…DS1307 là một sản phẩm của Dallas
Semiconductor (một công ty thuộc Maxim Integrated Products) Chip này có 7 thanh ghi 8-bit chứa thời gian là: giây, phút, giờ, thứ (trong tuần), ngày, tháng, năm Ngoài ra DS1307 còn có 1 thanh ghi điều khiển ngõ ra phụ(Control) và 56 thanh ghi trống có thể dùng như RAM
Hình 4 Cách mắc DS1307
• X1 và X2: là 2 ngõ kết nối với 1 thạch anh 32.768KHz làm nguồn tạo dao
động cho chip
• VBAT: cực dương của một nguồn pin 3V nuôi chip.
GND: chân mass chung cho cả pin 3V và Vcc.
Vcc: nguồn cho giao diện I2C, thường là 5V và dùng chung với vi điều
khiển
• Chú ý là nếu Vcc không được cấp nguồn nhưng VBAT được cấp thì DS1307 vẫn đang hoạt động (nhưng không ghi và đọc được)
SQW/OUT: một ngõ phụ tạo xung vuông (Square Wave / Output Driver),
tần số của xung được tạo có thể được lập trình Như vậy chân này hầu như không liên quan đến chức năng của DS1307 là đồng hồ thời gian thực, chúng ta sẽ bỏ trống chân này khi nối mạch
SCL và SDA là 2 đường giao xung nhịp và dữ liệu của giao diện I2C.
3 Màn hình hiển thị: Text LCD(16x2)
Hình 5 Text LCD 16x2
Trang 5Text LCD là các loại màn hình tinh thể lỏng nhỏ dùng để hiển thị các dòng chữ hoặc số trong bảng mã ASCII Không giống các loại LCD lớn, Text LCD được chia sẵn thành từng ô và ứng với mỗi ô chỉ có thể hiển thị một ký tự ASCII Cũng vì lý
do chỉ hiện thị được ký tự ASCII nên loại LCD này được gọi là Text LCD LCD 16x2 là loại có 2 dòng và mỗi dòng có thể hiển thị tối đa 16 ký tự Text LCD có 2 cách giao tiếp cơ bản là nối tiếp (như I2C) và song song
Hình 6 Các chân của text LCD 16x2
• Chân 1 và chân 2 là các chân nguồn, được nối với GND và nguồn 5V
• Chân 3 là chân chỉnh độ tương phản
• RS (chân số 4): Chân lựa chọn thanh ghi
• R/W chân số 5: Chân lựa chọn giữa việc đọc và ghi
• EN (chân số 6): Chân cho phép LCD hoạt động (Enable)
• D0 => D7 (chân số 7 đến chân 14) là 8bit giao tiếp dữ liệu
• Chân A(Anode), chân K(Kathode) nối nguồn LED nền cho LCD
4 PCA9517
• Là IC chuyển đổi mức logic để giao tiếp I2C với hai thiết bị có mức logic khác nhau (3.3v<->5v)
• VCCA: 0.9V -> 5.5V
• VCCB: 2.7V -> 5.5V
• Có thể đáp ứng cho giao tiếp I2C có tần số lên đến 400kHz
• Nhiệt độ giới hạn từ -40oC đến 85oC
Trang 6Hình 7 Hình dạng PCA9517
Các sử dụng: mắc vi xử lý phía bên B của Pca9517, phía bên A mắc DS1307 được minh họa như hình dưới
Hình 8 Cách mắc PCA9517
5 IC nguồn 3.3volt LM1117
Trang 7Hình 9 Hình ảnh về LM1117
6 Cảm biến nhiệt độ DS18B20
• Có thể đo nhiệt độ trong khoảng -55 -> +125 °C
• Với khoảng nhiệt độ là -10°C to +85°C thì độ chính xác ±0.5°C
• Có chức năng cảnh báo nhiệt độ vượt quá giá trị cho trước
Hình 10 Hình ảnh về DS18B20
Các đặc điểm kỹ thuật của cảm biến DS18B20:
• Sử dụng giao diện một dây nên chỉ cần có một chân ra để truyền dữ liệu
• Điện áp sử dụng : 3 – 5.5 V,
• Có thể cấu hình mã hóa nhiệu độ từ 9 – 12 bit số bit càng lớn thì độ chính xác cao hơn
• Thời gian chuyển đổi nhiệt độ tối đa là 750ms cho mã hóa 12 bit
Trang 8• Dòng tiêu thụ tại chế độ nghỉ cực nhỏ
• Mỗi cảm biến có một mã định danh duy nhất 64 bit chứa trong bộ nhớ ROM trên chip (on chip), giá trị nhị phân được khắc bằng tia laze
• Nếu cấu hình cho DS18B20 theo 9,10,11,12 bit thì ta có độ chính xác tương ứng là : 0.5°C , 0.25°C ,0.125°C, 0.0625°C.Theo mặc định của nhà sản xuất nếu chúng ta không cấu hình chế độ chuyển đổi thì nó sẽ tự cấu hình là 12 bit
• Khi bắt đầu chuyển đổi nhiệt độ thì chân DQ sẽ được kéo xuống mức thấp và khi chuyển đổi xong thì ở mức cao.Như vậy ta sẽ căn cứ vào hiện tượng này
để xác định khi nào chuyển đổi xong nhiệt độ
7 Ngoài ra còn có các linh kiện khác
• IC nhạc Um66
• Loa, transistor
• Tụ điện, điện trở, ….
3 CÁCH THỨC GIAO TIẾP GIỮA CÁC THIẾT BỊ
1 Giao tiếp giữa LCD và vi điều khiển:
+ Giao tiếp 8bit: Để sử dụng mode 8 bit, tất cả các lines dữ liệu của LCD từ D0
đến D7 (từ chân 7 đến chân 14) phải được nối với 1 PORT của chip điều khiển bên ngoài Ưu điểm của phương pháp giao tiếp này là dữ liệu được ghi và đọc rất nhanh
và đơn giản vì chip điều khiển chỉ cần xuất hoặc nhận dữ liệu trên 1 PORT Tuy nhiên, phương pháp này có nhược điểm là tổng số chân dành cho giao tiếp LCD quá nhiều, nếu tính luôn cả 3 chân điều khiển thì cần đến 11 đường cho giao tiếp LCD
+ Giao tiếp 4bit: LCD cho phép giao tiếp với bộ điều khiển ngoài theo chế độ 4
bit Trong chế độ này, các chân D0, D1, D2 và D3 của LCD không được sử dụng (để trống), chỉ có 4 chân từ D4 đến D7 được kết nối với chip bộ điều khiển ngoài Ưu điểm lớn nhất của phương pháp này tối thiểu số lines dùng cho giao tiếp LCD Tuy nhiên, việc đọc và ghi 4bit tương đối khó khăn hơn đọc và ghi dữ liệu 8 bit
2 Giao tiếp giữa vi điều khiển với chip xử lý thời gian thực
Giao tiếp chuẩn I2C: Đây là giao tiếp được phát triển bởi Philips
Semiconductor và được gọi là bus I2C (Inter-Intergrated Circuit) Tất cả các chip có tích hợp và tương thích với I2C đều có thêm một giao diện tích hợp trên Chip để truyền thông trực tiếp với các thiết bị tương thích I2C khác Việc truyền dữ liệu nối tiếp theo hai hướng 8 bit được thực thi theo 3 chế độ sau: Chuẩn (Standard)—100 Kbits/sec Nhanh (Fast)—400 Kbits/sec Tốc độ cao (High speed)—3.4 Mbits/sec
Trang 9Đường bus thực hiện truyền thông nối tiếp I2C gồm hai đường là đường truyền dữ liệu nối tiếp SDA và đường truyền nhịp xung đồng hồ nối tiếp SCL
SDA- Serial Data: là đường dữ liệu nối tiếp, tất cả các thông tin về địa chỉ hay
dữ liệu đều được truyền trên đường này theo thứ tự từng bit một Chú ý là trong chuẩn I2C, bit có trọng số lớn nhất (MSB) được truyền trước nhất, đặc điểm này ngược lại với chuẩn UART
SCL –Serial Clock: là đường giữ nhịp nối tiếp TWI (I2C) là chuần truyền
thông nối tiếp đồng bộ, cần có 1 đường tạo xung giữ nhịp cho quá trình truyền/nhận,
cứ mỗi xung trên đường giữ nhịp SCL, một bit dữ liệu trên đường SDA sẽ được lấy mẫu (sample) Dữ liệu nối tiếp trên đường SDA được lấy mẫu khi đường SCL ở mức cao trong một chu kỳ giữ nhịp, vì thế đường SDA không được đổi trạng thái khi SCL
ở mức cao Chân SDA có thể được đổi trạng thái khi SCL ở mức thấp
3 Giao tiếp giữa thiết bị có mức điện áp 3.3Volt với 5Volt.
Dùng IC PCA9517 để chuyển đổi giao tiếp I2C giữa DS1307 với Msp430 Minh họa hình bên dưới:
Hình 11 Giao tiếp I2C
4 Giao tiếp 1 dây (1-wire protocol) : là phương thức truyền nhận dữ liệu nối tiếp chỉ trên 1 dây dữ liệu, các bit dữ liệu được truyền lần lượt cho đến hết chuỗi bit, trên 1 sợi dây có thể gắn nhiều thiết bị giao tiếp và tất cả cùng truyền nhận dữ liệu cũng trên một dây rất nhỏ gọn và tiết kiệm
Trang 10• Mỗi cảm biến nhiệt độ DS1820 có một dãy mã 64 bit duy nhất được lưu trữ trong bộ nhớ ROM từ khi sản xuất bằng kỹ thuật laze
Ý nghĩa của 64 bit:
• Tám bit đầu tiên là mã định danh họ một dây, mã của DS1820 là 10h
• 48 bit tiếp theo là mã số xuất xưởng duy nhất, nghĩa là mỗi cảm biến DS1820 chỉ có một mã số
• Tám bit cuối có ý nghĩa là byte mã kiểm tra CRC (cyclic redundancy check), byte này được tính toán từ 56 bit đầu tiên của dãy mã trên ROM
• Để truy cập lên cảm biến một dây DS1820 ta phải sử dụng hai nhóm lệnh: các lệnh ROM và các lệnh chức năng (function commands) bộ nhớ, các lệnh được
mô tả như sau:
• Sau khi thiết bị chủ (thường là một vi điều khiển) phát hiện ra một xung presence pulse,nó có thể xuất ra một lệnh ROM Có 5 loại lệnh ROM, mỗi lệnh dài 8 bit Thiết bị chủ phải đưa ra lệnh ROM thích hợp trước khi đưa ra một lệnh chức năng để giao tiếp với cảm biến DS18S20
4 GHÉP NỐI PHẦN CỨNG
1. Cách ghép nối
• Vi xử lý MSP430G2452PDIP có 16 ngõ I/O để giao tiếp
• Dùng 6 ngõ I/O để giao tiếp với text LCD theo phương pháp giao tiếp 4bit
• Dùng 2 ngõ I/O qua IC PCA 9517 để giao tiếp I2C với chip thời gian thực DS1307
• Dùng 3 ngõ I/O điều khiển 3 nút nhấn để điều chỉnh chế độ cài đặt
• Dùng 1 ngõ I/O để giao tiếp 1 dây (1 wire) với cảm biến nhiệt độ DS18B20
• Dùng 1 ngõ I/O để điều khiển loa báo hiệu
• Như vậy là còn dư lại 3 ngõ I/O dùng cho những cãi tiến và tích hợp trong tương lai
2. Mạch nguồn 3.3volt
Trang 11Hình 12 Mạch nguồn 3.3volt
3. Mạch nguyên lý đầy đủ có dạng sau:
Trang 12Hình 13 Mạch nguyên lý đầy đủ
5 LƯU ĐỒ GIẢI THUẬT
Chương trình chính:
Chia làm 3 chương trình:
+ Đọc DATA từ DS1307
+ Hiển thị LCD
+ Cài đặt thời gian
Chương trình mở rộng:
+ Đọc và hiển thị nhiệt độ
+ Hẹn giờ báo thức
+ Đồng hồ bấm giây
Lưu đồ hoàn chỉnh:
Trang 13Hình 14 Lưu đồ giải thuật
Giải thích lưu đồ:
• Bắt đầu, chương trình sẽ gọi chương trình con đọc dữ liệu từ con DS1307 với chuẩn giao tiếp I2C và đọc dữ liệu từ DS18B20 qua giao tiếp 1 wire, sau đó sẽ gọi chương trình con để hiển thị các giá trị: hiển thị giá trị của Giờ, hiển thị giá trị của Phút, hiển thị giá trị của Giây, hiển thị nhiệt độ ở dòng 1 LCD, kế tiếp hiển thị giá trị của thứ, hiển thị giá trị của ngày, hiển thị giá trị của tháng,
và hiển thị giá trị của năm cùng với hiển thị biểu tượng hẹn giờ ở dòng 2 LCD Nếu phím MODE (chọn chế độ cài đặt) không được nhấn thì vòng lặp của chương trình này sẽ chạy vô tận Nếu phím MODE được nhấn, nó sẽ nhảy tới chương trình con cài đặt thời gian, hẹn giờ báo thức, bấm giây tùy thuộc vào số lần nhấn phím MODE của người dùng
Trang 146 CODE CHƯƠNG TRÌNH
Code đọc DS1307:
//DS1307
//****************************************************************
void I2C_start(void)
{
_P1_DIRECT->_BIT.b6 =1;
_P1_DIRECT->_BIT.b7 =1;
SDAOUT = 1; SCLOUT = 1;
delay_1();
SDAOUT = 0; delay_1();
SCLOUT = 0; delay_1();
}
void I2C_stop(void)
{
_P1_DIRECT->_BIT.b6 =1;
_P1_DIRECT->_BIT.b7 =1;
SCLOUT = 1; SCLOUT = 0;
SDAOUT = 0; delay_1();
SCLOUT = 1; delay_1();
SDAOUT = 1;
}
unsigned char I2C_write(unsigned char dat)
{
_P1_DIRECT->_BIT.b6 =1;
_P1_DIRECT->_BIT.b7 =1;
unsigned char i;
for (i=0;i<8;i++)
{
SDAOUT = (dat & 0x80) ? 1:0;
SCLOUT=1;SCLOUT=0;
dat<<=1;
}
SCLOUT = 1; delay_1();
SCLOUT = 0;
return dat;
}
unsigned char I2C_read(void)
{
_P1_DIRECT->_BIT.b6 =1;
_P1_DIRECT->_BIT.b7 =0;
char rd_bit;
unsigned char i, dat;
dat = 0x00;
for(i=0;i<8;i++) /* For loop read data 1 byte */
{
delay_1();
SCLOUT = 1; delay_1(); /* Set SCL */
rd_bit = SDAIN; /* Keep for check acknowledge */
dat = dat<<1;
dat = dat | rd_bit; /* Keep bit data in dat */
SCLOUT = 0; /* Clear SCL */
}
return dat;
}
//****************************************************************************** //******************************************************************************
Trang 15// CAC CHUONG TRINH CON CHO DS1307
//****************************************************************************** unsigned char DS1307_read(unsigned char addr)
{
unsigned int temp,ret;
I2C_start(); /* Start i2c bus */
I2C_write(0xD0); /* Connect to DS1307 */
I2C_write(addr); /* Request RAM address on DS1307 */
I2C_start(); /* Start i2c bus */
I2C_write(0XD1); /* Connect to DS1307 for Read */
ret = I2C_read(); /* Receive data */
I2C_stop();
//**********************************************************
temp = ret; /*BCD to HEX*/ ret = (((ret/16)*10)+ (temp & 0x0f)); /*for Led 7seg*/
//**********************************************************
return ret;
}
void DS1307_Write(unsigned char addr,unsigned char dat)
{
unsigned int temp;
//**********************************************
temp = dat ; /*HEX to BCD*/
dat = (((dat/10)*16)|(temp %10)); /*for Led 7seg*/
//**********************************************
I2C_start(); /* Start i2c bus */
I2C_write(0XD0); /* Connect to DS1307 */
I2C_write(addr); /* Request RAM address on DS1307 */
I2C_write(dat); /* Connect to DS1307 for Read */
I2C_stop();
}
void Read_DS1307()
{
sec = DS1307_read(SEC);
min = DS1307_read(MIN);
hour = DS1307_read(HOUR);
day = DS1307_read(DAY);
date = DS1307_read(DATE);
month = DS1307_read(MONTH);
year = DS1307_read(YEAR);
}
void Write_DS1307()
{
DS1307_Write(SEC,sec);
DS1307_Write(MIN,min);
DS1307_Write(HOUR,hour);
DS1307_Write(DAY,day);
DS1307_Write(DATE,date);
DS1307_Write(MONTH,month);
DS1307_Write(YEAR,year);
}
Code giao tiếp LCD:
//***********************************************************************
//**********************************************************************
//*****************************************************************
void LCD_out(unsigned char data) //ham gui byte data cao
{
unsigned char convert=0;
convert=data&0x10;
Trang 16if(convert==0x10)DATA_4=1;
else DATA_4=0;
convert=data&0x20;
if(convert==0x20)DATA_5=1;
else DATA_5=0;
convert=data&0x40;
if(convert==0x40)DATA_6=1;
else DATA_6=0;
convert=data&0x80;
if(convert==0x80)DATA_7=1;
else DATA_7=0;
}
//**************************************************** void lcd_delay(int time)
{
while( time);
}
void lcd_wait_busy(void)
{
lcd_delay(1000);
}
//********************LCD Funtion*********************** //Ghi 4 bit
void lcd_write_4bits(unsigned char dat)
{
EN=1;
LCD_out(dat);
lcd_delay(10);
EN=0;
lcd_delay(10);
}
void lcd_write_cmd(unsigned char cmd)//gui lenh
{
EN=1;
lcd_wait_busy();
RS=0;
lcd_write_4bits(cmd);
lcd_write_4bits(cmd << 4);
}
void lcd_write_data(unsigned char data)//gui du lieu
{
lcd_wait_busy();
RS=1;
lcd_write_4bits(data);
lcd_write_4bits(data << 4);
}
void init_lcd()
{
lcd_delay(15000);
RS=0;
lcd_write_4bits(0x03 << 4);
lcd_delay(4100);
lcd_write_4bits(0x03 << 4);
lcd_delay(100);
lcd_write_4bits(0x03 << 4);
lcd_write_4bits(0x02 << 4);
lcd_write_cmd(0x28) ;
lcd_write_cmd(0x0C);
lcd_write_cmd(0x06);
lcd_write_cmd(0x01);