1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

16 4,2K 49

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 1,06 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Thiết kế 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, giây trên LED 7 đoạn (có thể chỉnh thời gian).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).

Trang 1

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

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI

- CƠ SỞ II

MÔN HỌC: THIẾT KẾ MÔN HỌC

HỆ THỐNG NHÚNG

Trang 2

SVTH: Dương Phát Page 2

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,

giây

Trang 3

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

Trang 4

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

Trang 5

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

Trang 6

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

Trang 7

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

Trang 8

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

Trang 9

+ Khối thạch anh 20Mhz

+Khối điều khiển

Trang 10

+ 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

Trang 11

#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; //mac dinh int8

void update_1307(); //CAP NHAT DS1307

void set_sec();

void set_min();

void set_hour();

void read_time(); //DOC THOI GIAN DS1307

void update_time(); //CAP NHAT THOI GIAN

void display(); //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;

Trang 12

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);

Trang 13

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

{

Trang 14

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();

Trang 15

}

}

//////////////////////////////////////////////

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)

//==========================

Trang 16

// 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

Ngày đăng: 18/04/2016, 23:25

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w