Tải bản đầy đủ (.pdf) (15 trang)

SỬ DỤNG PIC 16f887 HIỂN THỊ THỜI GIAN THỰC RA LED 7 đoạn có CODE

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 (686.92 KB, 15 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
ĐẠI HỌC QUỐC GIA TP.HCM
----------

BÀI TẬP LỚN
ĐỀ TÀI: THIẾT KẾ MẠCH ĐỒNG HỒ ĐIỆN TỬ
HIỆN THỊ RA LED 7 ĐOẠN
GIẢNG VIÊN HƯỚNG DẪN : PHÙNG TRÍ CƠNG

STT

Mã số SV

Họ

Tên

1

2033203

Nguyễn Dỗn Ngọc

Quốc

2

2033208

Đào Quang


Duy

3

2033267

Vũ Văn

Khải

4

2033239

Trần Thanh

Duy

TP. HỒ CHÍ MINH, NĂM 2021


GVHD: PHÙNG TRÍ CƠNG

Mục lục
Chương I. GIỚI THIỆU VỀ ĐỀ TÀI
1. 1 Chức năng của mạch điện
1.2 Mô tả mạch điện
Chương II. TỔNG QUAN VỀ CÁC THIẾT BỊ SỬ DỤNG TRONG ĐỀ TÀI
2.1 Giới thiệu về PIC 16F877
2.2 Cơ chế hoạt động và chức năng của DS1307

2.3 LED 7 đoạn và nguyên tắc hoạt động
2.4 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
3.1 Giới thiệu phần mềm được sử dụng
3.2 Kết nối linh kiện và mô phỏng với Proteus 8
3.3 Ý tưởng chương trình (Thuật tốn)
3.4 Viết và biên dịch chương trình trong CCS (PIC C Compiler)
KẾT QUẢ.
TÀI LIỆU THAM KHẢO.

Page 3


GVHD: PHÙNG TRÍ CƠNG
Chương I. GIỚI THIỆU VỀ ĐỀ TÀI
1.1 Chức năng của mạch điện
- Hiển thị: giờ, phút, giây trên LED 7 đoạn.
- Giao tiếp với 3 phím : CHẾ ĐỘ - TĂNG - GIẢM . 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.
1.2 Mô tả mạch điện

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


Page 4


GVHD: PHÙNG TRÍ CƠNG
Chương II. TỔNG QUAN VỀ CÁC THIẾT BỊ SỬ DỤNG TRONG ĐỀ TÀI
2.1

Giới thiệu về VI ĐIỀU KHIỂN PIC 16F877

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

PIC 16F877 trong mạch là loại có 40 chân, với 5 cổng vào ra là 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 PIC16F877: 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.
Page 5


GVHD: PHÙNG TRÍ CƠ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, PIC16F877 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 ln 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.
2.2

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

Page 6


GVHD: PHÙNG TRÍ CƠNG
Vbat: đầu vào pin
SDA: chuỗi data
SCL: dãy xung clock
SOUT: đầ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 xố 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.

Page 7



GVHD: PHÙNG TRÍ CƠNG

2.3

LED 7 đoạn và ngun 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 <100ms.
2.4
Khối điều chỉnh thời gian
Gồm 4 phím bấm: CHẾ ĐỘ (button2)-TĂNG (button1)-GIẢM (button3)
- 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.

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
3.1
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 qt 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ị…
3.2
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

Page 8


GVHD: PHÙNG TRÍ CƠNG
+ Khối thạch anh 20Mhz

+Khối điều khiển

Page 9


GVHD: PHÙNG TRÍ CƠNG
+ Khối hiển thị

3.3

Ý tưởng chương trình (Thuật tố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.
3.4

Viết và biên dịch chương trình trong CCS (PIC C Compiler)

#INCLUDE <16f887.H>
// ten vi dieu khien
#FUSES HS
// cho phep su dung thach anh ngoai
#use delay(clock=20M)
// thach anh ngoai 20m
#INCLUDE <TV_DS13B07.C>
#define mod PIN_a0
#define up
PIN_a1
#define dw
PIN_a2
unsigned int8 tt_mod,EXIT,bdn;
signed int8 led0,led1,led2,led3,led4,led5;
unsigned int8 ma7doan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
#INT_TIMER1
// tao ngat de chop, moi lan ngat say ra duoc 100ms
VOID INTERRUPT_TIMER1()
{

bdn++;
set_timer1(3036);
// so xung bat dau, dem tu 3036 - 65536 = 2^16, duoc 100ms vi timer1 la
16 bit
}
void giaima()
Page 10


GVHD: PHÙNG TRÍ CƠNG
{
led0 = ma7doan[gio_ds13/10];
led1 = ma7doan[gio_ds13%10];
led2 = ma7doan[phut_ds13/10];
led3 = ma7doan[phut_ds13%10];
led4 = ma7doan[giay_ds13/10];
led5 = ma7doan[giay_ds13%10];
}
void hienthi()
// ham hien thi trong 1 giay lam bao nhieu lan
{
output_d(led0);
output_high(pin_b0);
delay_ms(1);
100ms thi hien thi lam 5 lan 2 led
output_d(led1);
output_high(pin_b1);
delay_ms(1);
output_d(led2);
output_high(pin_b2);

delay_ms(1);
100ms thi hien thi lam 5 lan
output_d(led3);
output_high(pin_b3);
delay_ms(1);
output_d(led4);
output_high(pin_b4);
delay_ms(1);
100ms thi hien thi lam 5 lan
output_d(led5);
output_high(pin_b5);
delay_ms(1);
}
void phim_mod()
// kiem tra nut nhan mod
{
if(input(mod)==0)
// kiem tra co nhan nut khong
{
hienthi();
hienthi();
hienthi();
hienthi(); // chong doi nut nhan
if(!input(mod)) // con nhan nut khong
{
exit = 0;
tt_mod++;
// gio, phut, giay, khong chinh
if(tt_mod>3)
tt_mod=0;

while(!input(mod))
// cho nha phim
{
hienthi();
}
}
}
}
void phim_up()
{
if(!input(up))
{
hienthi();
Page 11

output_low(pin_b0);

//

output_low(pin_b1);
output_low(pin_b2);

//

output_low(pin_b3);
output_low(pin_b4);

//

output_low(pin_b5);



GVHD: PHÙNG TRÍ CƠNG
hienthi();
hienthi();
hienthi();
if (!input(up))
{
exit = 0;
if(tt_mod==1)
{
gio_ds13++;
if(gio_ds13>23)
gio_ds13=0;
BIN_BCD(gio_ds13);
// chuyen so bin (thap phan) sang bcd
NAP_THOI_GIAN_HTAI_VAO_DS13B07();
// nap lai thoi gian cho ds13
}
else if(tt_mod==2)
{
phut_ds13++;
if(phut_ds13>59)
phut_ds13=0;
BIN_BCD(phut_ds13);
NAP_THOI_GIAN_HTAI_VAO_DS13B07();
}
else if(tt_mod==3)
{
giay_ds13++;

if(giay_ds13>59)
giay_ds13=0;
BIN_BCD(giay_ds13);
NAP_THOI_GIAN_HTAI_VAO_DS13B07();
}
while(input(up)==0)
{
hienthi();
}
}
}
}
void phim_dw()
{
if (!input(dw))
{
hienthi();
hienthi();
hienthi();
hienthi();
if (!input(dw))
{
exit = 0;
if(tt_mod==1)
{
gio_ds13--;
Page 12


GVHD: PHÙNG TRÍ CƠNG

if(gio_ds13<0)
gio_ds13=23;
BIN_BCD(gio_ds13);
NAP_THOI_GIAN_HTAI_VAO_DS13B07();
}
else if(tt_mod==2)
{
phut_ds13--;
if(phut_ds13<0)
phut_ds13=59;
BIN_BCD(phut_ds13);
NAP_THOI_GIAN_HTAI_VAO_DS13B07();
}
else if(tt_mod==3)
{
giay_ds13--;
if(giay_ds13<0)
giay_ds13=59;
BIN_BCD(giay_ds13);
NAP_THOI_GIAN_HTAI_VAO_DS13B07();
}
while(input(dw)==0)
{
hienthi();
}
}
}
}
void nhap_nhay()
{

if(bdn<4)
// nua giay dau
{
if(tt_mod==1)
{
led0=0xff;
led1=0xff;
}
else if(tt_mod==2)
{
led2=0xff;
led3=0xff;
}
else if(tt_mod==3)
{
led4=0xff;
led5=0xff;
}
else giaima();
}
else
giaima();
// nua giay sau
Page 13


GVHD: PHÙNG TRÍ CƠNG
}
void main()
{

SET_TRIS_D(0X00);
// khoi tao port tin hieu vao vi dieu khien cho len 1, ra cho xuong 0
SET_TRIS_C(0X00);
SET_TRIS_a(0Xff);
// 1111 1111
SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8);
// khoi tao timer 1, bo chia
SET_TIMER1(3036);
ENABLE_INTERRUPTS(GLOBAL);
// cho phep ngat say ra
ENABLE_INTERRUPTS(INT_TIMER1);
//! THIET_LAP_THOI_GIAN_HIEN_TAI();
// lan dau dung ds1307 thi mo len nap lai
//! NAP_THOI_GIAN_HTAI_VAO_DS1307();
// sau khi set xong roi thi an di nap lai lan
tiep theo
//! DOC_THOI_GIAN_TU_REALTIME();
tt_mod=0;
exit = 0;
bdn=0;
while(true)
{
if(bdn<8)
// ngat say ra duoc 100ms, <10 chua du 1s
{
hienthi();
phim_mod();
phim_dw();
phim_up();
nhap_nhay();

// nhap nhay khi chinh
}
else
// du 1s bdn = 10
{
if(tt_mod==0)
DOC_THOI_GIAN_TU_REALTIME();
// doc thoi gian tu ds13 ve
vdk
bdn = 0;
// xoa bdn
exit++;
if(exit==20)
// sau 20s khong chinh thi tra ve trang thai ban dau
{
tt_mod=0;
exit = 0;
}
}
}
}

KẾT QUẢ
Page 14


GVHD: PHÙNG TRÍ CƠNG
Mạch hồn chỉnh.
Mạch khi chạy mơ phỏng.


Page 15


GVHD: PHÙNG TRÍ CƠNG

1.
2.
3.
4.

TÀI LIỆU THAM KHẢO
/> /> /> />
Page 16



×