Uploaded by hoangbui0801

Nhom1 15

advertisement
BỘ THÔNG TIN VÀ TRUYỀN THÔNG
Nhóm sinh viên 15
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
-------------------------------------
BÁO CÁO MÔN HỌC KỸ THUẬT VI XỬ LÝ
LỚP Kỹ Thuật Vi xử Lý Nhóm 1
Đề tài: “Đồng hồ thời gian thực sử dụng Vi điều khiển 8051 ,
hiển thị lên màn hình LCD”
Nhóm Sinh viên thực hiện:
Bùi Minh Hoàng
Nguyễn Minh Hoàng
Bùi Đình Lâm
Môn học: Kỹ thuật vi xử lỹ
Hệ: Đại học chính quy
HÀ NỘI – 2020
MỤC LỤC
CHƯƠNG 1 MỤC TIÊU BÀI TOÁN
1 Mục tiêu
3
CHƯƠNG 2 GIỚI THIỆU
2.1 P89V51RD2
2.2 DS1307
4
2.3 LCD
8
2.4 Tín hiệu I2C
9
6
CHƯƠNG 3 THIẾT KẾ CHẾ TẠO
3.1 NGUYÊN LÝ CHẾ TẠO
3.2 YÊU CẦU PHÂN CỨNG
3.3 THỰC HIÊN
3.4 KÊT NỐI
CHƯƠNG 4 CHƯƠNG TRÌNH ĐIỀU KHIỂN
4.1 LƯU ĐÔ THUẬT TOÁN CHƯƠNG TRÌNH CHÍNH
4.2 LƯU ĐỒ ĐẶT THỜI GIAN
4.3 CODE CHƯƠNG TRÌNH
9
10
11
12
14
14
15
CHƯƠNG 1: MỤC TIÊU BÀI TOÁN
I MỤC TIÊU
Mục tiêu chung:
+Nắm được các phương pháp xây dựng mạch giải mã đã được học trên lớp
+Biết tận dụng để xây dựng các mạch giải mã đơn giản
-Mục tiêu cụ thể:
Dự án này là sử dụng vi điều khiển P89V51RD2 để hiển thị thời gian thực lên
LCD , và sử dụng IC DS1307 để cung cấp thông tin về ngày tháng năm.
CHƯƠNG 2: GIỚI THIỆU
II GIỚI THIỆU
Dự án này sử dụng các vi xử lý vi điều khiển sau:
ic Dallas DS 1307 , vi điều kiển Philips P89V51RD2, màn hình LCD và giao thức
truyền thông I2C
2.1 P89V51RD2
Nó là một vi điều khiển 80C51 với 64 kB Flash và 1024 byte RAM dữ liệu . Một tính
năng chính của P89V51RD2 là tùy chọn chế độ X2. Kỹ sư thiết kế có thể chọn chạy
ứng dụng với xung nhịp 80C51 thông thường (12 xung nhịp cho mỗi chu kỳ máy)
hoặc chọn chế độ X2 (6 xung nhịp cho mỗi chu kỳ máy) để đạt được thông lượng
gấp đôi ở cùng một tần số xung nhịp. Một cách khác để hưởng lợi từ tính năng này
là giữ nguyên hiệu suất bằng cách giảm một nửa tần số xung nhịp, do đó giảm
đáng kể EMI. Bộ nhớ chương trình Flash hỗ trợ lập trình song song, lập trình nối
tiếp trong hệ thống (ISP).
Chế độ lập trình song song cung cấp khả năng lập trình băng nhóm với tốc độ cao,
giảm chi phí lập trình và thời gian đưa ra thị trường. ISP cho phép một thiết bị được
lập trình lại trong sản phẩm cuối cùng dưới sự kiểm soát của phần mềm. Khả năng
trường / cập nhật chương trình cơ sở ứng dụng làm cho một loạt các ứng dụng có
thể. P89V51RD2 cũng có thể lập trình trong ứng dụng (IAP), cho phép cấu hình lại
bộ nhớ chương trình Flash ngay cả khi ứng dụng đang chạy.
CÁC TÍNH NĂNG CỦA P89V51RD2 :

Bộ xử lý trung tâm 80C51

5 V Điện áp hoạt động từ 0 đến 40 MHz

64 kB bộ nhớ chương trình Flash trên chip với ISP (Lập trình trong hệ
thống) và

IAP (Lập trình trong ứng dụng)
Hỗ trợ lựa chọn chế độ 12 đồng hồ (mặc định) hoặc 6 đồng hồ thông

qua phần mềm hoặc ISP

SPI (Giao diện ngoại vi nối tiếp) và UART nâng cao

PCA (Mảng bộ đếm có thể lập trình) với PWM và các chức năng Chụp
/ So sánh
Bốn cổng I / O 8 bit với ba chân Cổng 1 dòng điện cao (mỗi chân 16

mA)

Ba bộ định thời / bộ đếm 16 bit

Bộ đếm thời gian Cơ quan giám sát có thể lập trình (WDT)

Tám nguồn ngắt với bốn mức ưu tiên

Mức logic tương thích TTL và CMOS
Sơ đồ chân
2.2 DS1307
CHI TIẾT CỦA DS1307
Đồng hồ thời gian thực nối tiếp DS1307 là đồng hồ / lịch BCD công suất thấp, cộng
với 56 byte SRAM không bay hơi. Địa chỉ và dữ liệu được truyền nối tiếp thông qua
một bus hai chiều 2 dây. Đồng hồ / lịch cung cấp thông tin giây, phút, giờ, thứ,
ngày, tháng và năm. Ngày cuối tháng được tự động điều chỉnh cho các tháng có ít
hơn 31 ngày, bao gồm cả các điều chỉnh cho năm nhuận. Đồng hồ hoạt động ở
định dạng 24 giờ hoặc 12 giờ với chỉ báo AM / PM. DS1307 có mạch cảm biến
nguồn tích hợp giúp phát hiện lỗi nguồn và tự động chuyển sang nguồn cung cấp
pin. Mạch cho DS1307 đã được hiển thị trong Sơ đồ mạch Tab2.
TÍNH NĂNG CỦA DS1307

Đồng hồ thời gian thực đếm giây, phút, giờ, ngày trong tháng, thứ,
ngày trong tuần và năm với phần bù năm nhuận có giá trị lên đến
2100.


RAM 56 byte không linh hoạt để lưu trữ dữ liệu

Giao diện nối tiếp 2 dây

Tín hiệu đầu ra sóng vuông có thể lập trình

Mạch chuyển mạch và phát hiện lỗi nguồn tự động

Tiêu thụ ít hơn 500 nA ở chế độ dự phòng pin với bộ dao động đang
chạy

Phạm vi nhiệt độ công nghiệp tùy chọn 40 ° C đến + 85 ° C

Có sẵn trong DIP 8 chân hoặc SOIC

Được công nhận bởi Phòng thí nghiệm Nhà bảo hiểm
MÔ TẢ PIN

VCC - Nguồn cấp chính

Kết nối tinh thể X1, X2 - 32,768 kHz

VBAT - Đầu vào pin + 3V

GND - Mặt đất

SDA - Dữ liệu nối tiếp

SCL - Đồng hồ nối tiếp

SQW / OUT - Trình điều khiển đầu ra / sóng vuông
Sơ đồ chân:
Hình 3: Sơ đồ chân của DS 1307
2.3 LCD
Chân
1
2
3
4
5
6
714
Ký
hiệu
Vss
Mô tả
Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này
với GND của mạch điều khiển
VDD Chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân
này với VCC=5V của mạch điều khiển
VEE Điều chỉnh độ tương phản của LCD.
RS
Chân chọn thanh ghi (Register select). Nối chân RS với
logic “0” (GND) hoặc logic “1” (VCC) để chọn thanh ghi.
+ Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của
LCD (ở chế độ “ghi” - write) hoặc nối với bộ đếm địa chỉ của
LCD (ở chế độ “đọc” - read)
+ Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR
bên trong LCD.
R/W Chân chọn chế độ đọc/ghi (Read/Write). Nối chân R/W với
logic “0” để LCD hoạt động ở chế độ ghi, hoặc nối với logic
“1” để LCD ở chế độ đọc.
E
Chân cho phép (Enable). Sau khi các tín hiệu được đặt lên
bus DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung
cho phép của chân E.
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển
vào(chấp nhận) thanh ghi bên trong nó khi phát hiện một
xung (high-to-low transition) của tín hiệu chân E.
+ Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi
phát hiện cạnh lên (low-to-high transition) ở chân E và
được LCD giữ ở bus đến khi nào chân E xuống mức thấp.
DB0 - Tám đường của bus dữ liệu dùng để trao đổi thông tin với
DB7 MPU. Có 2 chế độ sử dụng 8 đường bus này :
+ Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với
bit MSB là bit DB7.
+ Chế độ 4 bit : Dữ liệu được truyền trên 4 đường từ DB4
tới DB7, bit MSB là DB7
Sơ đồ chân
2.4 Tín hiệu I2C
I2C sử dụng hai đường truyền tín hiệu:

Một đường xung nhịp đồng hồ(SCL) chỉ do Master phát đi ( thông thường ở
100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz).

Một đường dữ liệu(SDA) theo 2 hướng.

bus not busy : Cả hai đường dữ liệu và đồng hồ vẫn ở mức CAO.

Bắt đầu truyền dữ liệu: Sự thay đổi trạng thái của dòng dữ liệu, từ
CAO đến THẤP, trong khi đồng hồ ở mức CAO, xác định điều kiện BẮT
ĐẦU.

Dừng truyền dữ liệu: Sự thay đổi trạng thái của dòng dữ liệu, từ
THẤP đến CAO, trong khi dòng đồng hồ là CAO, xác định điều kiện
DỪNG.

Dữ liệu hợp lệ: Trạng thái của đường dữ liệu biểu thị dữ liệu hợp lệ
khi sau điều kiện START, đường dữ liệu ổn định trong khoảng thời gian
CAO của tín hiệu đồng hồ. Dữ liệu trên đường dây phải được thay đổi
trong khoảng thời gian THẤP của tín hiệu đồng hồ. Có một xung đồng
hồ trên mỗi bit dữ liệu
III THIẾT KẾ CHẾ TẠO
3.1 NGUYÊN LÝ CHẾ TẠO
Trong dự án của chúng tôi, vi điều khiển giao tiếp với chip RTC trên giao thức I 2 C,
trong đó vi điều khiển sẽ hoạt động như một chủ và chip RTC như một nô lệ. Chip
RTC có thể duy trì thời gian của riêng nó. Bộ vi điều khiển sẽ đọc dữ liệu từ chip
RTC được ghi ban đầu bởi uC, thực hiện các hoạt động cần thiết trên nó và gửi dữ
liệu đó đến bộ phận LCD sẽ hiển thị nó ở định dạng con người có thể đọc
được. Quá trình này sẽ tiếp tục trong thời gian vô hạn.
3.2 Yêu cầu phần cứng
Các thành phần sau được yêu cầu để thiết kế mạch RTC
Sr. No.
Part Description
Qty.
1
P89V51RD2
1
Board
2
Real time clock IC
1
DS1307
3
Crystal 32.768 kHz
1
4
Capacitors 12.5 pF
2
5
Coin Cell 3V
1
6
Coin Cell Holder
1
7
LCD 16 X 2
1
8
Potentiometer 10k
1
General Purpose
1
9
Circuit Board
10
230:12
1
Transformer
3.3 Thực hiện
Các bước triển khai dự án:
1. Mã hóa và mô phỏng - Chúng tôi viết chương trình theo nhu
cầu giao tiếp với chip RTC. Sau đó, nó được chỉnh sửa,
biên dịch và gỡ lỗi thành Keil uVision4 IDE. Chúng tôi thiết
kế mạch yêu cầu trong trình mô phỏng Proteus. Và tệp .hex
do Keil IDE tạo ra đã được chuyển vào uC
trong proteus . Sau nhiều lần biên dịch và mô phỏng, chúng
tôi đã có kết quả tốt.
2. Yêu cầu phần cứng - Chúng tôi đã chọn các thành phần
thích hợp với các thông số kỹ thuật cần thiết cho việc thiết
kế mạch.
3. Xây dựng và Kiểm tra Mạch - Sau đó, chúng tôi gắn các
thành phần trên PCB mục đích chung theo thiết kế mạch và
sau đó hàn được thực hiện. Sau khi hàn, chúng tôi thực
hiện Kiểm tra Bread Board (được gọi là BBT) để tìm ngắn
mạch. Sau đó, chúng tôi sửa chữa các lỗi trong quá trình
hàn. Sau đó, chúng tôi tải xuống chương trình vào chip uC
bằng cách sử dụng trình tải xuống FlashMagic của NXP.
4. Thiết kế vỏ bọc - Chúng tôi thiết kế hộp chứa hoặc vỏ bọc
cho toàn bộ mạch với các ổ cắm phù hợp như LCD, công
tắc ON-OFF, nồi điều khiển độ tương phản và dây cấp
nguồn.
3.4 Kết nối
Bảng sau đây cho thấy việc sử dụng các chân vi điều khiển trong thiết
kế mạch
Pin điều khiển vi mô
Kết nối
P1.0 - P1.7
D0- D7 của LCD
P2.0
Nút SET
P2.1
Chân RS của LCD
P2.2
Nút INC.
P2.3
En pin của LCD
P2.4
SCL của DS1307
P2.5
SCL của DS1307
IV Chươn Trình Điều Khiển
4.1 lưu đồ thuật toán chương trình chính:
4.2 Lưu Đồ Đặt Thời Gian
4.3. Code của chương trình
//PROG. Version 11.10.23.17
// interfacing ds1307 with 80C51
#include<reg51.h>
/* pins used for external h/w */
sbit RS=P2^1; //Kết nối p2.1 tới pin rs của lcd
sbit EN=P2^3; //Kết nối p2.3 tới pin en của lcd
sbit SCL=P2^4; //ping i2c của đồng hồ
sbit SDA=P2^5; // ping dữ liệu i2c
sbit SET=P2^0; //nút đặt pin
sbit INR=P2^2; //nút tăng pin
/* Một số định nghĩa cần thiết */
#define delay_us _nop_(); //Tạo 1 micro giây trễ
#define LCD P1 //Cổng 1 kết nối tới chân dữ liệu LCD
#define SCLHIGH SCL=1;
#define SCLLOW SCL=0;
#define SDAHIGH SDA=1;
#define SDALOW SDA=0;
/*các chức năng khác nhau được sử dụng trong toàn bộ chương trình */
void _nop_(void);
void init_lcd(void);
void cmd_lcd(unsigned char);
void write_lcd(unsigned char);
void display_lcd(unsigned char *);
void delay_ms(unsigned int);
void init_rtc(void);
void set_rtc(void);
void strt_msg(void);
void start(void);
void stop(void);
void send_byte(unsigned char);
unsigned char receive_byte(unsigned char);
void write_i2c(unsigned char,unsigned char,unsigned char);
void set_value(void);
void stpwtch(void);
unsigned char read_i2c(unsigned char,unsigned char);
//Give time here to set initial values to ds 1307 as specified in timekeeper register
unsigned char clock[]={0x00,0x59,0x23,0x04,0x20,0x10,0x11};
//clock[]={seconds,minutes,hours,day_of_week,date,month,year};
unsigned char stp[]={0x00,0x00,0x00};
//stopwatch initial value
unsigned char *s[]={"SUN","MON","TUE","WED","THU","FRI","SAT"};
unsigned char slave_ack,add=0,c,k,sas;
unsigned int num;
void main(void)
{
init_lcd();
strt_msg();
//COMMENT THIS SECTION WHILE TRANSFRING PROGRAM SECOND
TIME IN H/W
init_rtc();
//always do this
while(1)
{
if(SET==0)
set_value();
c=read_i2c(0xd0,0x02);//đọc giờ đăng ký và hiển thị trên màn hình LCD
/* IMP rtc ds 1307 hiểu số BCD. 8051 uC của chúng tôi hiểu HEX no.sys.
và LCD yêu cầu dữ liệu ASCII
ví dụ. hãy xem xét nếu dữ liệu đọc từ 1307 là 12 (BCD), tức là 0001 0010 (BIN) vì
vậy 8051 coi nó là 18 (DECIMAL)
x1=(18/16)+48=49(ASCII) i.e. lcd sẽ hiện 1 và
x2=(18%16)+48=50(ASCII) i.e. lcd sẽ hiện 2
i.e. 12 on lcd
*/
write_lcd((c/16)+48);
write_lcd((c%16)+48);
write_lcd(':');
sas = c & 0x20;
c=read_i2c(0xd0,0x01);//đọc thanh ghi phút và hiển thị trên màn hình LCD
write_lcd((c/16)+48);
write_lcd((c%16)+48);
write_lcd(':');
c=read_i2c(0xd0,0x00);//đọc thanh ghi giây và hiển thị trên màn hình LCD
write_lcd((c/16)+48);
write_lcd((c%16)+48);
write_lcd(' ');
display_lcd(s[read_i2c(0xd0,0x03)]);//đọc thanh ghi ngày và hiển thị trên màn hình
LCD
//write_lcd(*s[read_i2c(0xd0,0x03)]);
cmd_lcd(0xc0);// Chuyển đến vị trí bắt đầu của dòng thứ 2 của màn hình LCD
c=read_i2c(0xd0,0x04);//đọc thanh ghi ngày và hiển thị trên màn hình LCD
write_lcd((c/16)+48);
write_lcd((c%16)+48);
write_lcd('/');
c=read_i2c(0xd0,0x05);//đọc thanh ghi tháng và hiển thị trên màn hình LCD
write_lcd((c/16)+48);
write_lcd((c%16)+48);
write_lcd('/');
write_lcd('2'); //viết 2 chữ số đầu tiên của năm bời vì chỉ 2 bit cuối cùng được lưu trữ
trong rtc
write_lcd('0');
c=read_i2c(0xd0,0x06);//đọc thanh ghi năm và hiển thị trên màn hình LCD
write_lcd((c/16)+48);
write_lcd((c%16)+48);
write_lcd(32); //Phần này hiện Sáng/Tối
if(sas == 0x20)
{
display_lcd("AM");
//write_lcd(49);
}
else
{
//write_lcd(48);
display_lcd("PM");
}
delay_ms(110);
cmd_lcd(0x01); // Chuyển đến vị trí bắt đầu của dòng đầu tiên của màn hình LCD
}
}
void start(void) //khởi động i2c, nếu cả SCK và SDA đều không hoạt động
{
if(SCL==0) //kiểm tra SCK. nếu SCK bận, trả về khác SCK ở chế độ không hoạt
động
return;
if(SDA==0) //kiểm tra SDA. nếu SDA bận, trả lại SDA khác ở chế độ không hoạt
động
return;
SDALOW
delay_us
SCLLOW //clock low
delay_us
}
void stop(void) //Dừng i2c , giải phóng bus
{
SDALOW //Dữ liệu thấp
SCLHIGH //Đồng hồ cao
delay_us
SDAHIGH //Chuyển tiếp từ Thấp đến Cao trên đường dữ liệu SDA làm cho điều kiện
dừng
delay_us
}
void send_byte(unsigned char c) //truyền một byte dữ liệu tới bus i2c
unsigned mask=0x80;
do //transmits 8 bits
{
if(c&mask) //đặt dòng dữ liệu cho phù hợp (0 hoặc 1)
SDAHIGH //Dữ liệu cao
else
SDALOW //Dữ liệu thấp
//generate colck
SCLHIGH //Đồng hồ cao
delay_us
SCLLOW //Đồng hồ thấp
delay_us
mask/=2; //mặt nạ thay đổi
}while(mask>0);
SDAHIGH //phát hành dòng dữ liệu để xác nhận
SCLHIGH //gửi đồng hồ để xác nhận
delay_us
slave_ack=SDA; //đọc pin dữ liệu để xác nhận
SCLLOW //Đồng hồ thấp
delay_us
}
unsigned char receive_byte(unsigned char master_ack) //nhận một byte dữ liệu từ bus
i2c
{
unsigned char c=0,mask=0x80;
do //Nhận 8 bit
{
SCLHIGH //Đồng hồ ca
delay_us
if(SDA==1) //Đọc dữ liệu
c|=mask; //Lưu dữ liệu
SCLLOW //Đồng hồ thấp
delay_us
mask/=2; //mặt nạ thay đổi
}while(mask>0);
if(master_ack==1)
SDAHIGH //không thừa nhận
else
SDALOW //công nhận
SCLHIGH //Đồng hồ cao
delay_us
SCLLOW //đồng hồ thấp
delay_us
SDAHIGH //dữ liệu cao
return c;
}
void write_i2c(unsigned char device_id,unsigned char location,unsigned char c)
//ghi một byte dữ liệu (c) vào thiết bị phụ (device_id) tại địa chỉ (vị trí) nhất định
{
do
{
start();
//bắt đầu bus i2c
send_byte(device_id); //chọn thiết bị nô lệ
if(slave_ack==1) //nếu xác nhận không nhận được, dừng bus i2c
stop();
}while(slave_ack==1); //lặp lại cho đến khi nhận được xác nhận
send_byte(location); //gửi địa chỉ vị trí
send_byte(c); //Gửi dữ liệu đến bus i2c
stop(); //Dừng bus i2c
}
unsigned char read_i2c(unsigned char device_id,unsigned char location)
//đọc một byte dữ liệu (c) từ thiết bị phụ (device_id) tại địa chỉ (vị trí) nhất định
{
unsigned char c;
do
{
start(); //starts i2c bus
send_byte(device_id); //Chọn thiết bị phụ
if(slave_ack==1) //nếu xác nhận không nhận được, dừng bus i2c
stop();
}while(slave_ack==1); //lặp lại cho đến khi nhận được xác nhận
send_byte(location); //gửi địa chỉ vị trí
stop(); //stop i2c bus
start(); //starts i2c bus
send_byte(device_id+1); //Chọn thiết bị phụ từ chế độ đọc
c=receive_byte(1); //Nhận dữ liệu từ bus i2c
stop(); //Dừng bus i2c
return c;
}
void init_lcd(void)
//initialize lcd
{
delay_ms(10); //Trễ 10 mili giây
cmd_lcd(0x0e); //bật màn hình LCD, bật con trỏ
delay_ms(10);
cmd_lcd(0x38); //Khởi tạo 8 bit, phông chữ ký tự 5x7, màn hình 16x2
delay_ms(10);
cmd_lcd(0x06); //con trỏ dịch chuyển sang phải tự động sau khi mỗi ký tự được hiển
thị
delay_ms(10);
cmd_lcd(0x01); //Xoá LCD
delay_ms(10);
cmd_lcd (0x80);
}
void cmd_lcd(unsigned char c)
//truyền lệnh hoặc hướng dẫn đến LCD
{
EN=1;
RS=0; //xóa đăng ký chọn ghim
LCD=c; //Nạp 8 bit dữ liệu
EN=0; //xóa mã pin
delay_ms(2); //Trễ 2 mili giây
}
void write_lcd(unsigned char c)
//truyền một ký tự được hiển thị trên màn hình LCD
{
EN=1; //đặt cho phép ghim
RS=1; //đặt đăng ký chọn ghim
LCD=c; //Nạp dữ liệu
EN=0; //xóa mã pin
delay_ms(2); //Trễ 2 mili giây
}
void display_lcd(unsigned char *s)
//truyền một chuỗi được hiển thị trên màn hình LCD
{
while(*s)
write_lcd(*s++);
}
void delay_ms(unsigned int i)
//tạo ra độ trễ trong mili giây
{
unsigned int j;
while(i-->0)
{
for(j=0;j<500;j++)
{
;
}
}
}
void set_value(void)
//chức năng này được sử dụng để cài đặt thời gian bằng các nút hoặc chân SET &
INC
{
cmd_lcd(0x80);
display_lcd("WELCOME TO TIME");
cmd_lcd(0xC0);
display_lcd(" SET WIZARD !!!");
delay_ms(300);
cmd_lcd(0x01);
cmd_lcd(0x80);
display_lcd(" SET YOUR RTC ?");
cmd_lcd(0xC0);
display_lcd("YES
NEXT");
while(1)
{
if(SET==0)
{
set_rtc();
break;
}
if(INR==0)
{
cmd_lcd(0x01);
stpwtch();
break;
}
}
}
void init_rtc()
{
while(add<=6) //cập nhật đồng hồ thời gian thực ic tức là ds1307 với thời gian
{
write_i2c(0xd0,add,clock[add]);
add++;
}
}
void strt_msg()
{
unsigned int i,j=0;
display_lcd("Welcome to RTC");
cmd_lcd(0xc0);
display_lcd("<<<<<<<<>>>>>>>");
delay_ms(300);
cmd_lcd(0x01);
display_lcd("SKIP INTRODUCTION");
cmd_lcd(0xc0);
display_lcd("YES
NO");
while(1)
{
if(SET==0)
{
delay_ms(40);
break;
}
if(i==1000)
{
j++;
i=0;
}
if(INR==0|j==100)
{
cmd_lcd(0x01);
display_lcd("THIS PROJECT IS");
cmd_lcd(0xc0);
display_lcd("DONE BY T.E. ELN");
delay_ms(500);
cmd_lcd(0x01);
display_lcd("<ROLL NO> <NAME>");
delay_ms(250);
cmd_lcd(0x01);
display_lcd("38 AVINASH PATIL");
cmd_lcd(0xc0);
display_lcd("44 AMIT SALUNKHE");
delay_ms(550);
cmd_lcd(0x01);
display_lcd("46 SWAPNIL SANKPAL");
cmd_lcd(0xc0);
display_lcd("48 SUMIT SHEKHAR");
delay_ms(550);
cmd_lcd(0x01);
display_lcd("49 PRANAV SHINDE");
delay_ms(300);
cmd_lcd(0x01);
display_lcd("STARTING RTC....");
cmd_lcd(0xC0);
for(i=0;i<17;i++)
{
display_lcd(".");
delay_ms(15);
}
break;
}
i++;
}
cmd_lcd(0x01);
}
void set_rtc()
{
unsigned char cnt=0x00;
unsigned char q,p,i=0x00;
while(1)
{
if(SET==0x00)
{
cnt++;
delay_ms(50);
cmd_lcd(0x01); // Chuyển đến vị trí bắt đầu của dòng đầu tiên của màn hình LCD
cmd_lcd(0xc0);
display_lcd("NEXT INC");
cmd_lcd(0x80);
switch(cnt)
{
case 1:
display_lcd("Minutes:");
break;
case 2:
display_lcd("Hours :");
break;
case 3:
display_lcd("Day :");
break;
case 4:
display_lcd("Date :");
break;
case 5:
display_lcd("Month :");
break;
case 6:
display_lcd("Year :");
}
}
if(INR==0)
break;
if(cnt>6)
return;
}
cmd_lcd(0xc0);
display_lcd("SAVE INC");
while(1)
{ if(INR==0)
{
delay_ms(10);
cmd_lcd(0x8A); // Chuyển đến vị trí bắt đầu của dòng thứ 2 của màn hình LCD
p++;
delay_ms(20);
switch(cnt)
{
case 1:
if(p>59)
{
p=0;
}
break;
case 2:
if(p>23)
{
p=0;
}
break;
case 3:
if(p>7)
{
p=0;
}
break;
case 4:
if(p>31)
{
p=0;
}
break;
case 5:
if(p>12)
{
p=0;
}
break;
case 6:
if(p>99)
{
p=0;
}
}
q=(p/10)<<4;
q=q|(p%10);
write_lcd((q/16)+48);
write_lcd((q%16)+48);
}
if(SET==0)
break;
}
write_i2c(0xD0,cnt,q);
cmd_lcd(0x01);
display_lcd("SAVING CHAGES");
cmd_lcd(0xc0);
display_lcd("PLEASE WAIT");
// delay_ms(100);
for(i=0;i<6;i++)
{
display_lcd(".");
delay_ms(40);
}
cmd_lcd(0x01);
}
Download