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

thiết kế đồng hồ điện tử

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 (257.55 KB, 25 trang )

Báo CáoBài Tập Lớn Vi Xử Lý
Tên đề tài: Thiết kế đồng hồ điện tử Nhóm : 2 TC-301
Thành viên trong nhóm :
#1: Đinh Huy Cương Chữ ký: ____________________ Ngày: _______
#2: Đỗ Đức Cường Chữ ký: ____________________ Ngày: _______
#3: Phan Duy Chinh Chữ ký: ____________________ Ngày: _______
#4: Nguyễn Văn Duẩn Chữ ký: ____________________ Ngày: _______
#5: Nguyễn Thành Chung Chữ ký: ____________________ Ngày: _______
Place a photograph of the project team (annotated with names) along with the completed
project here.
Delete this text box before pasting in your photo!
ĐÁNH GIÁ BÁO CÁO
Thành phần/Tiêu chuẩn Điểm H/s nhân Điểm
Mở đầu 0 1 2 3 4 5 6 7 8 9 10 X 1
Tổng quan hệ thống 0 1 2 3 4 5 6 7 8 9 10 X 2
Yêu cầu kỹ thuật 0 1 2 3 4 5 6 7 8 9 10 X 2
Kiến trúc và chi tiết thiết kế 0 1 2 3 4 5 6 7 8 9 10 X 4
Tóm tắt và kết luận 0 1 2 3 4 5 6 7 8 9 10 X 1
Tài liệu tham khảo 0 1 2 3 4 5 6 7 8 9 10 X 1
Phụ lục A: Phân công công việc 0 1 2 3 4 5 6 7 8 9 10 X 2
Phụ lục B: Danh sách phần mềm sử dụng 0 1 2 3 4 5 6 7 8 9 10 X 2
Văn phong 0 1 2 3 4 5 6 7 8 9 10 X3
CD 0 1 2 3 4 5 6 7 8 9 10 X 2
TỔNG
Đánh giá phần mềm
Nhận xét:
Mục lục
Lời mở đầu
?
1. Tổng quan hệ thống
?


2. Yêu cầu ?
3. Kế hoạch thực hiện
?
4. Thiết kế kiến trúc hệ thống
?
5. Chi tiết thiết kế
Lời kết
?
Tài liệu tham khảo
?
Phụ lục A: Phân công công việc ?
Phụ lục B: Danh sách phần mềm sử dụng ?
Phụ lục C: Hóa đơn ?
Lời mở đầu
Trong những thập niên cuối thế kỷ 20, kỹ thuật điện tử đã liên tục có những tiến bộ vượt
bậc, đặc biệt là trong kỹ thuật chế tạo vi mạch điện tử. Sự ra đời và phát triển nhanh chóng của kỹ
thuật điện tử mà đặc trưng là kỹ thuật vi xử lý đã tạo ra một bước ngoặt quan trọng trong sự phát
triển của khoa học tính toán và xử lý thông tin, nó ảnh hưởng quyết định đến con đường “tin học
hoá” xã hội, tứ là con đường mà thông tin đã và đang trở thành lực lượng sản xuất trực tiếp trong
nền sản xuất của kỷ nguyên tới.
Năm 1970, công ty Intel cho ra đời bộ vi xử lý đầu tiên, có tên gọi là Intel – 4004, nhằm đáp
ứng nhu cầu cần thiết của một công ty kinh doanh là hãng truyền thông BUSICOM. Intel – 4004 là
kết quả một ý tưởng quan trọng trong sự phát triển kỹ thuật vi xử lý số. Đó là một kết cấu logic mà
có thể thay đổi chức năng của nó bằng chương trình ngoài chứ không phát triển theo hướng một cấu
trúc chỉ thực hiện một số chức năng nhất định như trước đây. Do khả năng mềm dẻo hoá trong các
thao tác của mình, năm 1970 Intel – 4004 đã trở thành bộ vi xử lý đầu tiên trên thị trường thế giới.
Intel - 4004 là bộ vi xử lý 4 bits song song, được chế tạo theo quy trình công nghệ MOS kênh cảm
ứng loại P. Thời gian tối thiểu để thực hiện một lệnh là 10,8µs. Năm 1972, hãng Intel cho xuất
xưởng bộ vi xử lý có tên gọi là Intel – 8008. Kiểu này vẫn được chế tạo theo công nghệ PMOS
nhưng là laọi 8 bits song song. Bộ vi xử lý này là CPU của máy tính MICRAL do Pháp chế tạo.

Đến đây, hàng loạt các hãng điện tử nổi tiếng hàng đầu của hế giới như National, Rockwell, … đã
nhanh chóng đi vào công nghệ sản xuất và chế tạo các bộ vi xử lý.
Năm 1974, hãng Intel cho ra đời bộ vi xử lý 8080 – 8 bits song song được chế tạo theo công
nghệ NMOS với thời gian thực hiện một lệnh là 2µs, đã đánh dấu một bước tiến lớn trên con đường
làm chủ tốc độ xử lý tin của kỹ thuật điện tử hiện đại. Các hãng khác cũng cho ra đời những bộ vi
xử lý có tín năng tương ứng: 6800 (Motorola), 8080 (Texas Intrusment), …Năm 1978, laọi 8080
được cải tiến thành loại 8085. Lúc này đã xuất hiện những máy tính mini sử dụng các bộ vi xử lý
nói trên. Theo đà đó các thông số cơ bản của bộ vi xử lý ngày càng cải thiện: tốc độ nagỳ càng cao
(các bộ vi xử lý hiện đại của Intel đã đạt tới tốc độ 500 – 800 MHz), độ rộng kênh thông tin ngày
càng lớn (các bộ vi xử lý hiện đại của Intel có kênh dữ liệu 16/32/64 bit). Điều đó đã giúp cho bài
toán thiết kế các hệ vi xử lý chuyên dụng với tính năng rộng lớn trở nên dễ dàng hơn.
Một hệ vi xử lý được thiết kế tối thiểu bao gồm một bộ vi xử lý (đây là khối điều khiển
trung tâm), một bộ nhớ RAM, một bộ nhớ cố định ROM và các cổng vào ra số liệu cùng những
thiết bị ngoại vi cần thiết. Một hệ vi xử lý tối đa khôngcó giới hạn về số lượng thành phần, về chức
năng thực hiện và về quy mô ứng dụng.
Ngày nay, những ứng dụng của vi điều khiển đã đi sâu vào đời sống sinh hoạt và sản xuất
của con người, là một phần tất yếu không thể thiếu trong đời sông hiện đại. Thế kỷ 21 được xem là
thế kỷ của khoa học công nghệ, là thế kỷ mà máy móc được thiết kế và lập trình một cách tự động
để thay thế các hoạt động của con người trong sản xuất, cũng như để phục vụ các công việc trong
sinh hoạt. Trong một cuộc sống mang tính tự động hoá cao thì các mạch vi xử lý như là một công
cụ đắc lực, quan trọng , hỗ trợ cho con người thực hiện nhu cầu ngày càng cao và càng hoàn thiện
của mình.
Đang là sinh viên ngồi trên ghế nhà trường, cơ hội tiếp cận, học tập những công nghệ tiên
tiến, hiện đại chưa nhiều, nên trong quá trình tự học và nghiên cứu, nhóm chúng em đã cố gắng tìm
hiểu về bộ vi xử lý, cũng như các ứng dụng của nó trong các hệ vi xử lý. Với những gì nghiên cứu
được, nhóm chúng em đã làm thực hành ứng dụng thông qua việc thiết kế đồng hồ điện tử.Đây là
cơ hội rất tốt cho chúng em trau dồi kiến thức thực tế,áp dụng lý thuyết đã học và rèn luyện bản
thân trong môi trường làm việc nhóm.
Chúng em cũng xin trân trọng cảm ơn thầy giáo Phạm Ngọc Nam và anh Phạm Văn Hà đã
nhiệt tình hướng dẫn chúng em suốt quá trình học tập và làm sản phẩm.

1. Tổng quan hệ thống
Đề tài nhằm thiết kế và xây dựng một mạch đồng hồ điện tử, trong đó hệ thống sẽ thông báo
nhiệt độ, ngày giờ theo thời gian thực hay một dòng thông báo bất kì. Mạch cần đảm bảo chức năng
đo nhiệt độ, căn chỉnh ngày giờ, chuyển hiệu ứng thông báo. Thông báo được thực hiện nhờ LED
ma trận.
Sơ đồ khối hệ thống:
IC Thời
gian thực
Mạch mô phỏng :
2. Yêu cầu
a. Yêu cầu chức năng
- Hiển thị giờ,phút , ngày ,tháng,năm, nhiệt độ trên bảng ma trận LED
32x16.
- Hiện thị chữ trên bảng ma trận LED 32x16.
- Sử dụng 4 hiệu ứng hiển thị text.
- Sử dụng nút bấm để cài đặt thời gian và thay đổi hiển thị.
- Thiết kế với LED indoor.
b. Yêu cầu phi chức năng
• Sử dụng vi điều khiển PIC 16f877a.
• Thiết kế với LED indoor.
• Thiết kế mạch nhỏ hơn 2dm
2
.
• Chi phí <= 300.000 VNĐ.
• Hệ thống sử dụng đơn giản với số ít các nút bấm điều khiển.
• Thời gian thực hiện đề tài: từ lúc nhận đề tài( đầu kì ) tới trước 01/06/2011.
c. Mục tiêu thiết kế
• Ghép 8 LED ma trận 8x8 cỡ nhỏ tạo thành bảng LED ma trận 32x16.
• Sử dụng 8 IC dịch 74HC595 để đưa dữ liệu ra cột.
• Sử dụng IC cảm biến nhiệt LM35 để đo nhiệt độ phòng.

• Sử dụng IC thời gian thực DS1307 để đếm thời gian
3. Kế hoạch thực hiện

4. Thiết kế kiến trúc hệ thống
Hệ thống gồm các khối chính sau:
• Thời gian thực : dùng IC DS1307.
• Đo nhiệt độ : dùng sensor LM35
• Vi điều khiển : PIC 16F877A
• Điều khiển Led ma trận : dùng các IC dịch 74HC595 và các nút bấm thay
đổi chế độ hiển thị, chinh thời gian …
• Hiển thị : Led ma trận 32x16 ghép từ 8 led 8x8.
5. Chi tiết thiết kế
• Khối thời gian thực : DS1307
Vcc: nối với nguồn 5V
X1,X2 : nối với thạch anh 32,768kHz
SDA : chân data nối với chân C4 của PIC
SCL : chân clock nối với chân C3 của PIC
GND: đất.
• Khối đo nhiệt độ phòng : sensor LM35
+5V
Vout
Vout : nối với chân A0 để đưa vào bộ ADC của PIC
• Khối vi điều khiển : PIC 16F877A
Chân MCLR : dùng để reset PIC.
Chân AN0 : nhận tín hiệu tương tự từ LM35 để chuyển vào bộ ADC
Các chân CLKI, CLKO : nối với thạch anh tạo xung dao động cho PIC
Chân SCL,SDA : giao tiếp với DS 1307.
Các chân B0 – B5 : điều khiển 74 HC595
LM35
Các chân A1 – A4 : điều khiển các nút bấm.

• Khối điền khiển led : các IC dịch 74HC595 (8 IC đưa dữ liệu ra cột, 1 IC
đưa dữ liệu ra hàng của led ma trận)
DS : chân dữ liệu vào
Q0 – Q7 : 8 chân dữ liệu ra ; Q7’ : chân nối với IC 74HC595 kế tiếp
SH_CP : xung CLK chốt dữ liệu vào IC
ST_CP : xung CLK chốt dữ liệu ra IC
• Các nút bấm :
MODE : thay đổi chế độ hiển thị.
SET : cài đặt thời gian .
UP : Tăng giá trị
DOWN : giảm giá trị.

-
Lời kết
Trên đây là toàn bộ nguyên lý hoạt động và sơ đồ cấu tạo của chiếc đồng hồ báo giờ.Tuy
nhiên do thời gian và năng lực còn hạn chế nên nhóm làm báo cáo chưa thể tìm hiểu được hết về
các chức năng của từng linh kiện trong mạch,chưa hoàn thành sản phẩm hoàn thiện.
Song qua việc thiết kế mạch đồng hồ này, nhóm cũng đã có thêm những hiểu biết cơ bản về
dòng vi điều khiển 8 bit của Microchip - PIC16f877A. Có cái nhìn tổng quan về vi điều khiển. Sụ
khác nhau giữa vi điều khiển và vi xử lý. Nắm rõ hơn lý thuyết về các kiến trúc vi xử lý: Harvard -
RISC, CISC. Khả năng tự tìm hiểu các dòng vi xử lý cao hơn của Microchip( 16 bit, 32 bit ) cũng
như các họ vi xử lý thông dụng khác : Atmel, Intel, Philips…Đã làm quen và sử dụng các phần
mềm hỗ trợ như: ORCAD, Proteus, CCS, MPLAP.Đặc biệt là tăng khả năng làm việc theo nhóm, từ
đó tạo tiền đề cho việc giải quyết các vấn đề phức tạp hơn sau này.
Tài Liệu Tham khảo
Trong quá trình thiết kế, thực hiện đề tài, chúng em có tham khảo các tài liệu và
nguồn sau:
Datasheet:
PIC16F877A
DS1307

HC595
Nguồn web:




/>


Phụ lục A: Phân công công việc
Đinh Huy Cương : Sơ đồ nguyên lý và layout
Đỗ Đức Cường : Mua linh kiện và đặt mạch
Phan Duy Chinh : Sơ đồ nguyên lý và layout
Nguyễn Văn Duẩn : Viết code và tối ưu mạch
Nguyễn Thành Chung : Viết code và tối ưu mạch
Phụ lục B: Danh sách phần mềm sử dụng
Phần mềm lập trình : CCS
Phần mềm mô phỏng : Proteus 7.6
Phần mềm layout : Orcad 9.2
Phần mềm nạp chương trình cho PIC : PIC KIT 2
CODE CCS:
#include <16F877A.h>
#include <def_877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset

#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=20000000)
#include "ds1307.c"
int sec,min,hour,date,month,year;
int adc,adc1,adc2,sec1,sec2,min1,min2,hour1,hour2,date1,date2,month1,month2,year1,year2,i,j,k;
#bit clk1 = 0x06.0 //SHcp1
#bit data1 = 0x06.1 //Ds1
#bit latch1 = 0x06.2 //STcp1
#bit clk2 = 0x06.3 //SHcp2
#bit data2 = 0x06.4 //Ds2
#bit latch2 = 0x06.5 //STcp2
#bit mode = 0x05.1
#bit set = 0x05.2
#bit up = 0x05.3
#bit down = 0x05.4
char const chu[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0x80,0xFD,0xFB,0xF7,0x80,0xFF,0xFF,//N
0xFF,0x80,0xF7,0xF7,0xF7,0x80,0xFF,0xFF,//H
0xFF,0xC1,0xBE,0xBE,0xBE,0xC1,0xFF,0xFF,//O
0xFF,0x80,0xFD,0xF3,0xFD,0x80,0xFF,0xFF,//M

0xFF,0x8D,0xB6,0xB6,0xB6,0xB9,0xFF,0xFF,//2
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFE,0xFE,0x80,0xFE,0xFE,0xFF,0xFF,//T
0xFF,0xC1,0xBE,0xBE,0xBE,0xDD,0xFF,0xFF,//C
0xFF,0xF7,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,//-
0xFF,0xDD,0xBE,0xB6,0xB6,0xC9,0xFF,0xFF,//3
0xFF,0xC1,0xAE,0xB6,0xBA,0xC1,0xFF,0xFF,//0
0xFF,0xFF,0xBD,0x80,0xBF,0xFF,0xFF,0xFF,//1
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
char const bangma[]={
0xFF,0xC1,0xAE,0xB6,0xBA,0xC1,0xFF,0xFF,//0 16
0xFF,0xFF,0xBD,0x80,0xBF,0xFF,0xFF,0xFF,//1 17
0xFF,0x8D,0xB6,0xB6,0xB6,0xB9,0xFF,0xFF,//2 18
0xFF,0xDD,0xBE,0xB6,0xB6,0xC9,0xFF,0xFF,//3 19
0xFF,0xE7,0xEB,0xED,0x80,0xEF,0xFF,0xFF,//4 20
0xFF,0xD8,0xBA,0xBA,0xBA,0xC6,0xFF,0xFF,//5 21
0xFF,0xC3,0xB5,0xB6,0xB6,0xCF,0xFF,0xFF,//6 22
0xFF,0xFE,0x8E,0xF6,0xFA,0xFC,0xFF,0xFF,//7 23
0xFF,0xC9,0xB6,0xB6,0xB6,0xC9,0xFF,0xFF,//8 24
0xFF,0xF9,0xB6,0xB6,0xD6,0xE1,0xFF,0xFF,//9 25
0xFC,0XFC,0xC1,0xBE,0xBE,0xBE,0xDD,0XFF,
};

char const cot[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void send1_595(int8 temp) {
#bit flag_bit = temp.7 // bien temp la du lieu 8-bit can gui
int8 i;
for(i=0;i<=7;i++)
{
data1 = flag_bit;
clk1=1;
DELAY_US(1);
clk1=0;
latch1=1;
latch1=0;
temp<<=1; // Dich trai 1 bit
}
}
void send2_595(int8 temp) {
#bit flag_bit = temp.7 // bien temp la du lieu 8-bit can gui
int8 i;
for(i=0;i<=7;i++)
{
data2=flag_bit;
clk2=1;
DELAY_US(1);
clk2=0;
temp<<=1; // Dich trai 1 bit
}
}
void read_time(void){
adc=read_adc();


adc=adc*500/255;
min=read_ds1307(1); // read minute
hour=read_ds1307(2); // read hour
date=read_ds1307(4); // read date
month=read_ds1307(5); // read month
year=read_ds1307(6); // read year
adc1=adc%10;
adc2=adc/10;
min1=min&0x0f;
min2=(min&0x70)>>4;
hour1=hour&0x0f;
hour2=(hour&0x70)>>4;
date1=date&0x0f;
date2=(date&0x70)>>4;
month1=month&0x0f;
month2=(month&0x70)>>4;
year1=year&0x0f;
year2=(year&0x70)>>4;
}
void chaychu(void)
{
for(k=0;k<144;k++){
for(i=0;i<8;i++)
{
send1_595(cot[i]);
send2_595(chu[k+56+i]);
send2_595(chu[k+48+i]);
send2_595(chu[k+40+i]);
send2_595(chu[k+32+i]);
send2_595(chu[k+24+i]);

send2_595(chu[k+16+i]);
send2_595(chu[k+8+i]);
send2_595(chu[k+i]);
latch2=1;
latch2=0;
delay_us(1500);
}
}
}
void hienthi1(void)
{
for(k=0;k<40;k++){
for(i=0;i<8;i++)
{
send1_595(cot[i]);
send2_595(bangma[80+i]);
send2_595(bangma[adc1*8+i]);
send2_595(bangma[adc2*8+i]);
send2_595(0XFF);
send2_595(bangma[min1*8+i]);
send2_595(bangma[min2*8+i]);
send2_595(bangma[hour1*8+i]);
send2_595(bangma[hour2*8+i]);
latch2=1;
latch2=0;
delay_us(1000);
}
}
}
void hienthi2(void)

{
for(k=0;k<2000;k++){
for(i=0;i<8;i++)
{
send1_595(cot[i]);
send2_595(bangma[year1*8+i]);
send2_595(bangma[year2*8+i]);
send2_595(bangma[i]);
send2_595(bangma[16+i]);
send2_595(bangma[month1*8+i]);
send2_595(bangma[month2*8+i]);
send2_595(bangma[date1*8+i]);
send2_595(bangma[date2*8+i]);
latch2=1;
latch2=0;
delay_us(1000);
}
}
}
void set_year(void)
{
while (set==0) {} // cho phim nhan
do {
if (up==1) { // neu phim 2 duoc nhan
while (up==1) {} // khong lam gi cho phim nha
year1++;
if ((year2==9)&(year1==10)) {year1=year2=0;}
if (year1==10) {year1=0;year2++;}
}


if (down==1) { // neu phim 3 duoc nhan
while (down==0) {} // khong lam gi cho phim nhan
year1 ;
if ((year2==0)&(year1==255)) {year1=year2=9;}
if (year1==255) {year1=9;year2 ;}
}
for( k=0;k<=7;k++){
for(i=0;i<8;i++)
{
send1_595(cot[i]);
send2_595(bangma[year1*8+i]);
send2_595(bangma[year2*8+i]);
send2_595(bangma[i]);
send2_595(bangma[16+i]);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
latch2=1;
latch2=0;

delay_us(2000);
}
}
}
while (set==1);
write_DS1307(6,year1+(year2<<4));
}
void set_month(void) { // Cai dat thang
while (set==0) {} // cho phim nhan

do {
if (up==1) { // neu phim 2 duoc nhan
while (up==1) {} // khong lam gi cho phim nha
month1++;
if ((month2==1) & (month1==3)) { month2=0;month1=1;}
if (month1==10) { month2++;month1=0;}
}
if (down==1) { // neu phim 3 duoc nhan
while (down==1) {} // cho phim nha
month1 ;
if ((month2==0) & (month1==0)) {month2=1;month1=2; }
if (month1==0) {month2 ;month1=9;}
}
for( k=0;k<=7;k++){

for(i=0;i<8;i++)
{
send1_595(cot[i]);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(bangma[month1*8+i]);
send2_595(bangma[month2*8+i]);
send2_595(0xFF);
send2_595(0xFF);
latch2=1;
latch2=0;

delay_us(2000);

}
}
}
while (set==1);
write_DS1307(5,month1+(month2<<4));
}
void set_date(void) { // Cai dat ngay
while (set==0) {} // cho phim nhan
do {
if (up==1) { // neu phim 2 duoc nhan
while (up==1) {} // khong lam gi cho phim nha
date1++;
if ((date2==3) & (date1==2)) { date2=0;date1=1;}
if (date1==10) { date2++;date1=0;}
}
if (down==1) { // neu phim 3 duoc nhan
while (down==1) {} // cho phim nha
date1 ;
if ((date2==0) & (date1==0)) {date2=3;date1=1; }
if (date1==255) {date2 ;date1=9;}
}
for( k=0;k<=7;k++){

for(i=0;i<8;i++)
{
send1_595(cot[i]);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);

send2_595(0xFF);
send2_595(0xFF);
send2_595(bangma[date1*8+i]);
send2_595(bangma[date2*8+i]);
latch2=1;
latch2=0;

delay_us(2000);
}
}
}
while (set==1);
write_DS1307(4,date1+(date2<<4));
}

void set_hour(void) { // Cai dat thang
while (set==0) {} // cho phim nha
do {
if (up==1) { // neu phim 2 duoc nhan
while (up==1) {} // khong lam gi cho phim nhan
hour1++;
if ((hour2==2) & (hour1==4)) { hour2=0;hour1=0;}
if (hour1==10) { hour2++;hour1=0;}
}
if (down==1) { // neu phim 3 duoc nhan
while (down==1) {} // cho phim nha
hour1 ;
if ((hour2==0) & (hour1==255)) {hour2=2;hour1=3; }
if (hour1==255) {hour2 ;hour1=9;}
}

for( k=0;k<=7;k++){

for(i=0;i<8;i++)
{
send1_595(cot[i]);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(bangma[hour1*8+i]);
send2_595(bangma[hour2*8+i]);
latch2=1;
latch2=0;

delay_us(2000);
}
}
}
while (set==1);
write_DS1307(2,hour1+(hour2<<4));
}

void set_min(void) { // Cai dat thang
while (set==0) {} // cho phim nha
do {
if (up==1) { // neu phim 2 duoc nhan
while (up==1) {} // khong lam gi cho phim nha
min1++;

if ((min2==5) & (min1==10)) { min2=0;min1=0;}
if (min1==10) { min2++;min1=0;}
}
if (down==1) { // neu phim 3 duoc nhan
while (down==1) {} // cho phim nha
min1 ;
if ((min2==0) & (min1==255)) {min2=5;min1=9; }
if (min1==255) {min2 ;min1=9;}
}
for( k=0;k<=7;k++){

for(i=0;i<8;i++)
{
send1_595(cot[i]);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(0xFF);
send2_595(bangma[min1*8+i]);
send2_595(bangma[min2*8+i]);
send2_595(0xFF);
send2_595(0xFF);
latch2=1;
latch2=0;

delay_us(2000);
}
}
}
while (set==1);

write_DS1307(1,min1+(min2<<4));
}
void main()
{
set_tris_b(0x00);
init_DS1307();
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

chaychu();
while(1)
{
read_time();
if(mode==0)
{
hienthi1();
if(set==1)
{
set_hour();
set_min();
}
}

else
{hienthi2();
if(set==1)
{
set_year();
set_month();
set_date();
set_hour();
set_min();
}
}
}
}
Phụ lục C: Hóa đơn
TT Tên Giá trị Số lượng Giá đơn vị Thành tiền
1 PIC16F877A 1 65.000 65.000
2 IC 74HC595 9 5.000 45.000
3 Sensor LM35 1 1.500 1.500
4 DS1307 1 8.000 8.000
5 Led ma trận 8 23.000 184.000
6 Cầu 5A 1 4.000 4.000
7 7805 2 3.000 6.000
8 Thạch anh
32.768K 1 1.000 1.000
20M 1 1.000 1.000
10 Điện trở
1K 100 50d 5.000
10K 10 100đ 1.000
11 Tụ điện 33p 2 100

×