Tải bản đầy đủ (.docx) (16 trang)

Thiết kế đồng hồ thời gian thực dùng PIC16F877A hiển thị LED 7 đoạn

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 (552.78 KB, 16 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI

- CƠ SỞ II

-

KHOA ĐIỆN-ĐIỆN TỬ
MÔN HỌC: THIẾT KẾ MÔN HỌC
HỆ THỐNG NHÚNG

BÀI BÁO CÁO THIẾT KẾ MÔN HỌC
HỆ THỐNG NHÚNG

SVTH: DƯƠNG PHÁT
LỚP: TỰ ĐỘNG HÓA & ĐIỀU KHIỂN K53
MÃ SV: 5351031015
GVHD: LÊ MẠNH TUẤN

TP.HCM - 2015


Thiết THIẾT
kếKẾ MÔN HỌC HỆ THỐNG NHÚNG
mạch
đồng hồ
điện tử
sử dụng
PIC
16F877A
&


IC
thời
gian
thực
DS1307
hiển thị
giờ,
phút,

SVTH: Dương Phát

Page 2


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG

Mục lục
---------

Chương I. GIỚI THIỆU VỀ ĐỀ TÀI
I. Chức năng của mạch điện
II. Mô tả mạch điện
Chương II. TỔNG QUAN VỀ CÁC THIẾT BỊ SỬ DỤNG TRONG ĐỀ TÀI
I. Giới thiệu về PIC 16F877A
II. Cơ chế hoạt động và chức năng của DS1307
III. LED 7 đoạn và nguyên tắc hoạt động
IV. Khối điều chỉnh thời gian
Chương III. SỬ DỤNG PHẦN MỀM TRÊN MÁY TÍNH ĐỂ VIẾT CHƯƠNG
TRÌNH VÀ THỰC HIỆN MÔ PHỎNG
I. Giới thiệu phần mềm được sử dụng

II. Kết nối linh kiện và mô phỏng với Proteus 8
III. Ý tưởng chương trình (Thuật toán)
IV. Viết và biên dịch chương trình trong CCS (PIC C Compiler)
KẾT LUẬN

SVTH: Dương Phát

Page 3


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG
Chương I. GIỚI THIỆU VỀ ĐỀ TÀI
I. Chức năng của mạch điện

- Hiển thị: giờ, phút, giây trên LED 7 đoạn, nhấp nháy led mỗi giây.
- Giao tiếp với 4 phím : CHẾ ĐỘ - TĂNG - GIẢM - OK. Phím CHẾ ĐỘ dùng để
điều chỉnh giờ và phút.
- Nguyên tắc hoạt động: Mạch sử dụng IC thời gian thực DS 1307 giao tiếp I2C với
PIC, sau đó hiển thị các thông tin về giờ, phút, giây, nếu có điều chỉnh thời gian từ
các phím chức năng thì sự thay đổi đó sẽ được lưu lại vào DS1307 cho lần hoạt động
sau (nếu DS1307 có pin nuôi khi ngắt điện cả mạch).
II. Mô tả mạch điện

- Dùng 3 led 7 thanh loại 2 led/1 con.
- Dùng 6 Tranzito để điều khiển việc đóng ngắt các led.
- Vi điều khiển được dùng là PIC 16F877A
- Dùng thạch anh 20MHz để tạo dao động cho PIC.

SVTH: Dương Phát


Page 4


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG
Chương II. TỔNG QUAN VỀ CÁC THIẾT BỊ SỬ DỤNG TRONG ĐỀ TÀI
I. Giới thiệu về VI ĐIỀU KHIỂN PIC 16F877A

Ta có sơ đồ chân PIC 16F877A như sau:

PIC 16F877A trong mạch là loại có 40 chân, với 5 cổng vào ra la Port A(RA0÷RA5),
Port B(RB0÷RB7), Port C(RC0÷RC7),Port D(RD0÷RD7), Port E(RE0÷RE2). Có 3 bộ
định thời là timer0, timer1, timer2. 8K bộ nhớ chương trình flash.
Tổ chức bộ nhớ: Có 3 khối bộ nhớ trong PIC16F877A: bộ nhớ chương trình, bộ nhớ dữ
liệu và khối bộ nhớ EEPROM. Bộ nhớ chương trình và bộ nhớ dữ liệu có đường bus
riêng vì vậy có thể truy cập vào từng bộ nhớ một cách riêng rẽ.
Port A: có 6 bit (tương ứng với 6 chân RA0÷RA5) các chân của cổng A có tích hợp một
số chức năng ngoại vi, nếu một thiết bị ngoại vi được enable thì cổng này sẽ không hoạt
động như một cổng vào ra. Bình thường Port A sẽ là một cổng vào ra 2 chiều. Thanh ghi
xác đinh chiều tương ứng của các chân Port A là thanh ghi TrisA. Các bit ở thanh ghi
TrisA bằng 1 sẽ xác định các chân ở Port A là đầu vào ngược lại sẽ là đầu ra.
Port B: rộng 8 bit(tương ứng với 8 chân RB0÷RB7), là một cổng vào ra 2 chiều. Thanh
ghi qui định chiều của cổng B là thanh ghi Tris B. Thiết lập các bit ở thanh ghi TrisB
bằng 1 sẽ làm cho cổng B là cổng vào ngược lại sẽ là cổng ra.

SVTH: Dương Phát

Page 5


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG

Port C: rộng 8 bit (tương ứng với các chân RC0÷RC7), bình thường nó là một cổng vào
ra 2 chiều, thanh ghi qui định chiều của cổng là thanh ghi TrisC. Các chân RC3,RC4
dùng để kết nối truyền nhân thông tin với các thiết bị ngoại vi.
Port D: rộng 8 bit (RD0÷RD7), nó có thể là cổng vào hoặc cổng ra. Port D có thể được
cấu hình như một cổng vi xử lý rộng 8 bit (cổng slave song song) bằng cách thiết lập bit
điều khiển PSPSTATUS (TrisE.4). Ở chế độ này thì đầu vào là tín hiệu TTL.
Port E: rộng 3 bit(RE0÷RE2), được cấu hình là đầu ra hoặc đầu vào. Port E có thể là đầu
vào điều khiển I/O khi bit PSPSTATUS (TrisE.4) được thiết lập.
Từ hình vẽ ta có thể thấy, PIC16F877A có 2 chân Vcc và 2 chân GND, để PIC có thể
hoạt động được ta phải cấp nguồn cho tất cả các chân này.
Ngoài cấp nguồn cung cấp ta phải cấp nguồn xung dao động để cho vi điều khiển hoạt
động, ta sẽ dùng một thạch anh 20MHz để cấp xung dao động. Nguồn dao động được cấp
thông qua 2 chân 13 và 14 của PIC.
Mạch reset cho vi điều khiển là một công tắc để hở thông qua chân MCLR của vi điều
khiển. mạch sẽ thực hiện reset khi chân này từ mức logic 1 xuống logic 0. khi công tắc để
hở thì chân này luôn mang mức logic 1 do luôn được nối với nguồn thông qua một điện
trở hạn dòng R1, điện trở này phải có giá trị nhỏ hơn 40k để đảm bảo điện áp cung cấp
cho vi điều khiển.
II.

Cơ chế hoạt động và chức năng của DS1307

SVTH: Dương Phát

Page 6


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG
Vcc: nối với nguồn
X1,X2: nối với thạch anh 32,768 kHz

Vbat: đầu vào pin 3V
GND: nối đất, Mass
SDA: chuỗi data
SCL: dãy xung clock
SQW/OUT: xung vuông/đầu ra driver
DS1307 là một IC thời gian thực với nguồn cung cấp nhỏ, dùng để cập nhật thời gian và
ngày tháng với 56 bytes SRAM. Địa chỉ và dữ liệu được truyền nối tiếp qua 2 đường bus
2 chiều. Nó cung cấp thông tin về giờ, phút, giây, thứ, ngày, tháng, năm. Ngày cuối tháng
sẽ tự động được điều chỉnh với các tháng nhỏ hơn 31 ngày,bao gồm cả việc tự động nhảy
năm. Đồng hồ có thể hoạt động ở dạng 24h hoặc 12h với chỉ thị AM/PM. DS1307 có một
mạch cảm biến điện áp dùng để dò các điện áp lỗi và tự động đóng ngắt với nguồn pin
cung cấp.
DS 1307 hoạt động với vai trò slave trên đường bus nối tiếp. Việc truy cập được thi hành
với chỉ thị START và một mã thiết bị nhất định được cung cấp bởi địa chỉ các thanh ghi.
Tiếp theo đó các thanh ghi sẽ được truy cập liên tục đến khi chỉ thị STOP được thực thi.
Sơ đồ địa chỉ RAM và RTC:
Thông tin về thời gian và ngày tháng được lấy ra bằng cách đọc
các byte thanh ghi thích hợp. Thời gian và ngày tháng được thiết
lập cũng thông qua các byte thanh ghi này bằng cách viết vào đó
những giá trị thích hợp. Nội dung của các thanh ghi dưới dạng mã
BCD (binary coded decreaseimal). Bit 7 của thanh ghi seconds là
bit clock halt(CH),khi bit này được thiết lập 1 thì dao động disable,
khi nó được xoá về 0 thì dao động được enable. Chú ý là phải
enable dao động trong suốt quá trình cấu hình thiết lập (CH=0).
DS1307 có thể chạy ở chế độ 24h cũng như 12h. Bit thứ 6 của
thanh ghi hours là bit chọn chế độ 24h hoặc 12h. Khi bit này ở mức cao thì chế độ 12h
được chọn. Ở chế độ 12h thì bit 5 là bit AM/PM với mức cao là PM. Ở chế độ 24h thì bit
5 là bit chỉ 20h(từ 20h đến 23h).
Trong quá trình truy cập dữ liệu, khi chỉ thị START được thực thi thì dòng thời gian
được

truyền tới một thanh ghi thứ 2, thông tin thời gian sẽ được đọc từ thanh ghi thứ cấp này,
trong khi đó đồng hồ vẫn tiếp tục chạy.
SVTH: Dương Phát

Page 7


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG

III. LED 7 đoạn và nguyên tắc hoạt động

Khối hiển thị dùng 6 LED 7 đoạn: 2 led dùng để hiển thị giờ, 2 led dùng để hiển thị phút,
2 led dùng để hiển thị giây & 4 LED đơn nhấp nháy mỗi giây
Tất cả các led chung đường tín hiệu a,…,g còn các chân điều khiển thì mắc với các khoá
điện
tử (8 Tranzito A1015) hoặc cổng logic not để điều khiển việc đóng ngắt các led.
- Việc cấp nguồn cho các led dựa trên thuật toán quét led, tức mỗi thời điểm chỉ có 1 Led
7 đoạn được cấp nguồn sáng, thời gian giãn cách sáng mỗi Led <30ms.
IV. Khối điều chỉnh thời gian
Gồm 4 phím bấm: CHẾ ĐỘ (button1)-TĂNG (button2)-GIẢM (button3)-OK (button4)
- Phím CHẾ ĐỘ nhấn lần 1 để điều chỉnh giờ và nhấn lần 2 để điều chỉnh phút.

- Phím TĂNG, GIẢM dùng để tăng hoặc giảm giá trị của giờ và phút trong chế độ điều
chỉnh.
- Phím OK để hoàn tất quá trình chỉnh sửa.

Chương III. SỬ DỤNG PHẦN MỀM TRÊN MÁY TÍNH ĐỂ VIẾT
CHƯƠNG TRÌNH VÀ THỰC HIỆN MÔ PHỎNG
I.


Giới thiệu phần mềm được sử dụng
- Phần mềm Proteus 8 Professional, đây là phần mềm phổ biến được sử dụng trong
việc mô phỏng hoạt động của mạch điện với nguồn thư viện rất đa dạng.
- Ngôn ngữ lập trình cho PIC là C, dùng CCS (PIC C Compiler) để biên dịch
- Sử dụng I2C tích hợp sẵn trong PIC để giao tiếp với DS1307
- Sử dụng các hàm có sẵn trong CCS là: I2C_START; I2C_STOP; I2C_READ;
I2C_WRITE dùng để khởi tạo, đọc giá trị từ DS1307 sang PIC.
- Việc hiển thị thời gian là liên tục, ta dùng 8 byte RAM để làm bộ đệm hiển thị (các
biến led1,..led6), các giá trị thời gian đọc từ DS1307 sau khi đã chuyển sang BCD sẽ
được lưu trong các biến này.
- Chương trình quét bàn phím sẽ xác định phím chức năng và gọi hàm xử lý tương ứng
như: chuyển chế độ, chỉnh giờ, tăng, giảm giá trị…
II. Kết nối linh kiện và mô phỏng với Proteus 8

- Ta lấy linh kiện mô phỏng từ Proteus và kết nối chúng như hình sau:
+ Khối vi điều khiển
+ Khối thời gian thực DS1307
SVTH: Dương Phát

Page 8


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG
+ Khối thạch anh 20Mhz

+Khối điều khiển

SVTH: Dương Phát

Page 9



THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG
+ Khối hiển thị

III. Ý tưởng chương trình (Thuật toán)

- Ta mô tả sơ lược hoạt động của chương trình thông qua các bước sau:
+ B1: Thực hiện đọc chương trình từ DS1307, hiển thị ra LED7.
+ B2: Đọc các nút nhấn, nếu nhấn “chế độ” thì hiển thị giao điện chỉnh sửa.
+ B3: Đọc các nút nhấn, thực hiện tăng, giảm các giá trị tương ứng & lưu lại.
+ B4: Đọc các nút nhấn, nếu nhấn “OK”, thì thoát chế độ chỉnh sửa.
Lưu ý: Các giá trị đọc từ DS1307 ghi vào nó là mã BCD, còn giá trị hiển thị ra
LED là mã nhị phân nên ta phải có chương trình con để thực hiện việc chuyển đổi
này.
IV. Viết và biên dịch chương trình trong CCS (PIC C Compiler)
#include <16F877a.h> // KHAI BAO SU DUNG PIC 16F877A
#include <def_877a.h> // FILE DINH NGHIA CAC THANH GHI VA CAC BIT
#FUSES WDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP,NOCPD,
NOWRT
#use delay(clock=20000000)
#include <DS1307.c>
/////////////////////////////////////////////////////////////////////////////
byte sec,min,hour;
byte const LED[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
byte TG1,TG2,TG3,TG4,TG5,TG6; //bien hien led trung gian giay, phut, gio
SVTH: Dương Phát

Page 10



THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG
#bit SW1 = 0x08.0 // D0 - chon che do chinh
#bit SW2 = 0x08.1 // D1 - tang thoi gian
#bit SW3 = 0x08.2 // D2 - giam thoi gian
#bit SW4 = 0x08.3 // D3 - ok
#bit lednhay= 0x09.0
#bit gic = 0x05.5 // gio- hang chuc
#bit gid = 0x09.1 // gio- hang don vi
#bit pc = 0x05.3 // phut- hang chuc
#bit pd = 0x05.2 // phut- hang don vi
#bit gc = 0x05.1 // giay- hang chuc
#bit gd = 0x07.0 // giay- hang don vi
byte chinh_phut, chinh_gio;
void update_1307();

//mac dinh int8
//CAP NHAT DS1307

void set_sec();
void set_min();
void set_hour();
void read_time();
void update_time();
void display();

//DOC THOI GIAN DS1307
//CAP NHAT THOI GIAN
//HIEN THI


// BAT DAU CHUONG TRINH CHINH///////////////////////////
void main()
{
byte u;
//doc time
set_Tris_d(0x0F);
//00001111
set_Tris_b(0x00);
set_Tris_a(0x00);
set_Tris_c(0x18);
//00011000
set_Tris_e(0x00);
u=read_ds1307(0);
sec=u & 0x0F;
setup_wdt (WDT_1152MS);
//////////////////////////////////////////////
write_ds1307(0,sec);
// ket noi dong ho(gan bit7=0)
chinh_gio=0; chinh_phut=0;
SVTH: Dương Phát

Page 11


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG
gic=1; gid=1; pc=1; pd=1; gc=1; gd=1;//tat cac led
while(true)
{
read_time();
display();

if(sec%2==0)
// chan tat, le sang
{ lednhay=1; }
else
{ lednhay=0; }
if(sw1==0)
// chon 'che do'
{
if(chinh_phut==0&&sw4==1)
{
while(sw1==0) {}
set_min(); chinh_phut=1;
}
else if(chinh_gio==0&&sw4==1)
{
while(sw1==0) {}
set_hour(); chinh_gio=1;
}
else if(chinh_phut==1&&chinh_gio==1)
{
chinh_phut=0; chinh_gio=0;
}
}
if(sw4==0)
{
chinh_gio=0;chinh_phut=0;
}
restart_wdt();
}
}

//////////////////////////////////////////////////
void read_time()
{
sec = read_DS1307(0);
min = read_DS1307(1);
hour = read_DS1307(2);
SVTH: Dương Phát

Page 12


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG
update_time();

//goi chuyen doi

}
/////////////////////////////////////////////////////
void update_1307()
{
write_DS1307(0,sec);
write_DS1307(1,min);
write_DS1307(2,hour);
}
////////////////////////////////////////////////////
void update_time()
{
TG1= sec & 0x0F;
TG2=(sec & 0xF0)>>4; //convert to BCD SEC
TG3= min & 0x0F;

TG4=(min & 0xF0)>>4; //convert to BCD MIN
TG5= hour & 0x0F;
TG6=(hour & 0x30)>>4; //convert to BCD HOUR
}
//////////////////////////////////////////////////////
void set_min()
{
gic=1; gid=1; pc=1; pd=1; gc=1; gd=1;
min= read_DS1307(1);
TG3= min & 0x0F;
TG4=(min & 0xF0)>>4;
while(sw1==1&&sw4==1)
{
portb= LED[TG3]; pd=0; delay_us(500); pd=1;
portb= LED[TG4]; pc=0; delay_us(500); pc=1;
if(sw2==0)//tang
{
while(sw2==0) {}
if(TG4==5&&TG3==9) { TG4=0; TG3=0;}
else if(TG3==9) { TG4++; TG3=0;}
else TG3++;
}
if(sw3==0)//giam
{
SVTH: Dương Phát

Page 13


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG

while(sw3==0) {}
if(TG4==0&&TG3==0) {TG4=5; TG3=9;}
else if(TG3==0) {TG4--; TG3=9;}
else TG3--;
}
min= (TG4<<4) + TG3;
write_DS1307(1,min);
delay_us(10);
restart_wdt();
}
}
////////////////////////////////////////////////////
void set_hour()
{
gic=1; gid=1; pc=1; pd=1; gc=1; gd=1;
hour= read_DS1307(2);
TG5= hour & 0x0F;
TG6=(hour & 0x30)>>4;
while(sw1==1&&sw4==1)
{
portb= LED[TG5]; gid=0; delay_us(500); gid=1;
portb= LED[TG6]; gic=0; delay_us(500); gic=1;
if(sw2==0)//tang
{
while(sw2==0) {}
if(TG6==2&&TG5==3) {TG6=0;TG5=0;}
else if(TG5==9) {TG6++; TG5=0;}
else TG5++;
}
if(sw3==0)//giam

{
while(sw3==0) {}
if(TG6==0&&TG5==0) {TG6=2; TG5=3;}
else if(TG5==0) {TG6--; TG5=9;}
else TG5--;
}
hour= (TG6<<4) + TG5;
write_DS1307(2,hour);
delay_us(10);
restart_wdt();
SVTH: Dương Phát

Page 14


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG
}
}
//////////////////////////////////////////////
void display()
{
// sec - min - hour
PortB=LED[TG6];//gio chuc
gic=0;
delay_us(500);
gic=1;
PortB=LED[TG5];//gio don vi
gid=0;
delay_us(500);
gid=1;

PortB=LED[TG4];//phut chuc
pc=0;
delay_us(500);
pc=1;
PortB=LED[TG3];//phut don vi
pd=0;
delay_us(500);
pd=1;
PortB=LED[TG2];//giay chuc
gc=0;
delay_us(500);
gc=1;
PortB=LED[TG1];//giay don vi
gd=0;
delay_us(500);
gd=1;
restart_wdt();
}

Chương trình con DS1307.c
#define DS1307_SDA PIN_C4
#define DS1307_SCL PIN_C3
#use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL)
//==========================
SVTH: Dương Phát

Page 15


THIẾT KẾ MÔN HỌC HỆ THỐNG NHÚNG

// write data one byte to
// DS1307
//==========================
void write_DS1307(byte address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xd0);
while(status==1)
{
i2c_start();
status=i2c_write(0xd0);
}
}
//==========================
// read data one byte from DS1307
//==========================
BYTE read_DS1307(byte address)
{
BYTE data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);

data=i2c_read(0);
i2c_stop();
return(data);
}

Lưu ý: Đối với đoạn chương trình trên, việc điều khiển led sáng tắt có thông qua cổng
Not, vì vậy đối với mạch thực tế dùng transistor thì ta chỉ việc đổi việc gán các biến
gic,gid,pc,pd,gc,gd từ 0 thành 1 và từ 1 thành 0.
000---Hết---000

SVTH: Dương Phát

Page 16



×