1.1. MỤC TIÊU
Sau khi học xong bài này người học có khả năng:
- Vẽ được sơ đồ kết nối mạch hiển thị đồng hồ trên phần mềm Proteus.
- Thành lập lưu đồ chương trình hiển thị mạch đồng hồ đếm giây trên LED 7 đoạn và LCD.
- Lập trình được chương trình điều khiển hiển thị đồng hồ số sử dụng PIC 16F877
- Thực hiện tốt các biện pháp an toàn cho người và thiết bị, tự tin trong lập trình các ứng dụng.
- Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng dụng các phần mềm khi lập trình.
1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG
- Board Kit thí nghiệm Vi Xử Lý.
- Máy tính, phần mềm mô phỏng Proteus, Keil C
- Vi điều khiển 89S52 và PIC 16F877A
1.3. NỘI DUNG
137 trang |
Chia sẻ: Tiểu Khải Minh | Ngày: 21/02/2024 | Lượt xem: 94 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Thí nghiệm vi xử lý (Trình độ: Cao đẳng) - Nguyễn Thị Thu Lan, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
nt n)
{
output_d((MAP[n%10]) ^ 0x00);
output_low(PIN_A0);
delay_ms(10);
output_high(PIN_A0);
}
//============================================
// main program
//============================================
void main()
{
int i,count;
count=0;
while(TRUE)
{
for (i=0;i<=50;i++)
display(count); // dispay 50 times
count=(count==9) ? 0: count+1;
}
}
1.3.1.4. NHỮNG SAI HỎNG THƢỜNG GẶP
- Lập sai bảng mã LED 7 ĐOẠN cho bộ thí nghiệm đa năng ĐTVT 03 của
phòng thí nghiệm.
- Chú ý các lệnh SETB và CLR port khi thực hiện phương pháp chốt hoặc
quét trên LED 7 ĐOẠN.
- Khi thực cắm chốt giao tiếp các port của vi điều khiển đến LED 7 ĐOẠN
đơn cần chú ý thứ tự port được lập trình tăng hay giảm.
- Vấn đề an toàn cho thiết bị khi giao tiếp với máy tính cần ngắt nguồn thiết
bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03
BÀI 3: ĐIỀU KHIỂN LED 7 ĐOẠN
Trang 65
1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM
1 Vẽ sơ đồ mạch điều khiển led 7 đoạn trên phần mềm Proteus
2. Viết chương trình điều khiển led 7 đoạn dùng vi điều khiển 8 bit, 16 bit
3. Viết chương trình con tạo trễ
4. Biên dịch và nạp chương trình thực thi vào bộ kit thí nghiệm vi xử lý.
1.3.3 BÀI TẬP THÍ NGHIỆM
PHẦN 1: Lập trình cho vi điều khiển 8 bit AT89S52
‒ Viết chương trình trên để giá trị xuất ra 2 Led 7 đoạn tăng dần từ 00 - 59.
‒ Viết đoạn chương trình trên để giá trị xuất ra 2 Led 7 đoạn tăng dần từ 00 - 23.
‒ Viết đoạn chương trình trên để giá trị xuất ra 2 Led 7 đoạn giảm dần từ 99 - 00.
‒ Viết đoạn chương trình trên để giá trị xuất ra 2 Led 7 đoạn giảm dần từ 59 - 00.
‒ Viết đoạn chương trình trên để giá trị xuất ra 2 Led 7 đoạn giảm dần từ 23 - 00.
PHẦN 2: Lập trình cho vi điều khiển 16 bit PIC 16F887A
Bài tập 1:
‒ Lập trình điều khiển hiển thị giá trị thập phân đếm từ 00-99 lên 2 led 7 đoạn trên
mô phỏng và trên board thí nghiệm
a. Vẽ sơ đồ nguyên lý
b. Lập lưu đồ chương trình
c. Chương trình tham khảo
//2 led 7 đoạn được chọn trong chương trình này là led ở chân PIN_A0 và PIN_A1, giải
mã mềm sử dụng phương pháp quét led, tạo trễ 2ms, tần số xung clock là 8MHz
#include
#fuses HS,NOLVP,NOWDT,PUT
#use delay (clock=8000000) // defind crystal = 8MHz
byte const MAP[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//===========================================
// this function use to display number 00=99
// input : n = number to display
//===========================================
void display(int n)
{
BÀI 3: ĐIỀU KHIỂN LED 7 ĐOẠN
Trang 66
char b;
b=((MAP[n/10]) ^ 0x00);
if ((n/10)==(0)) b=0xC0;
output_d(b);
output_low(PIN_A1);
delay_ms(2);
output_high(PIN_A1);
output_d((MAP[n%10]) ^ 0x00);
output_low(PIN_A0);
delay_ms(2);
output_high(PIN_A0);
}
//============================================
// main program
//============================================
void main()
{
int i,count;
count=0;
while(TRUE)
{
for (i=0;i<=50;i++)
display(count); // dispay 50 times
count=(count==99) ? 0: count+1;
}
}
Bài tập 2:
‒ Viết chương trình hiển thị giá trị đếm thập phân từ 0-7 lên 1 led 7 đoạn tại chân
PIN_A5 trên phần mềm và trên board thí nghiệm
a. Vẽ sơ đồ nguyên lý
b. Lập lưu đồ chương trình
BÀI 3: ĐIỀU KHIỂN LED 7 ĐOẠN
Trang 67
c. Viết và thực thi chương trình theo yêu cầu trên
Bài tập 3:
‒ Viết chương trình hiển thị giá trị từ 00-59 lên 2 led 7 đoạn tại chân PIN_A4 và
PIN_A5.
a. Vẽ sơ đồ nguyên lý
b. Lập lưu đồ chương trình
c. Viết và thực thi chương trình theo yêu cầu trên
Bài tập 4:
‒ Viết chương trình hiển thị giá trị từ 000-999 lên 3 led 7 đoạn tại chân PIN_A0,
PIN_A1 và PIN_A2.
a. Vẽ sơ đồ nguyên lý
b. Lập lưu đồ chương trình
c. Viết và thực thi chương trình theo yêu cầu trên
Bài tập 5:
‒ Viết chương trình hiển thị giá trị từ 999 – 000 lên 3 led 7 đoạn tại chân PIN_A0,
PIN_A1 và PIN_A2.
a. Vẽ sơ đồ nguyên lý
b. Lập lưu đồ chương trình
c. Viết và thực thi chương trình theo yêu cầu trên
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 68
Bài thí nghiệm số 4:
GIAO TIẾP THIẾT BỊ NGOẠI VI – LCD
Thời lƣợng: 12 giờ
1.1. MỤC TIÊU
- Viết đúng chương trình hiển thị dữ liệu trên LCD sử dụng vi điều khiển
PIC.
- Sử dụng thành thạo phần mềm trong biên soạn và biên dịch và sửa lỗi
chương trình.
- Nạp và thực thi được các ứng dụng cơ bản trong điều khiển LCD hiển thị
chuỗi dữ liệu bất kỳ.
- Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng
dụng các phần mềm khi lập trình.
1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG
- Board Kit thí nghiệm Vi Xử Lý.
- Máy tính, phần mềm mô phỏng Proteus, Keil C
- Vi điều khiển 89S52 và PIC 16F877A
1.3. NỘI DUNG
1.3.1 CƠ SỞ LÝ THUYẾT
1.3.1.1. GIỚI THIỆU LCD
Hình dáng và sơ đồ chân LCD 16x2
Hình 4.1: Hình dáng – Sơ đồ chân LCD 16x2
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 69
Chức năng chân LCD 16x2
Chân số Kí hiệu Mức logic I/O Chức năng
1 Vss - - Cấp mass(GND)
2 Vdd - - Cấp nguồn (5V)
3 Vee - I Điều chỉnh độ tương phản LCD
4 RS 0/1 I
Lựa chọn thanh ghi lệnh
0: thanh ghi lệnh
1: thanh ghi dữ liệu
5 R/W 0/1 I
0: ghi vào LCD
1: đọc từ LCD
6 E 1,1>=0 I Tín hiệu cho phép
7 DB1 0/1 I/O Data bus line 0 (LSB)
8 DB2 0/1 I/O Data bus line 1
9 DB3 0/1 I/O Data bus line 2
10 DB4 0/1 I/O Data bus line 3
11 DB5 0/1 I/O Data bus line 4
12 DB6 0/1 I/O Data bus line 5
13 DB7 0/1 I/O Data bus line 6
14 DB8 0/1 I/O Data bus line 7 (MSB)
15 Vcc - - Nguồn cấp
16 GND - - Mass
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 70
1.3.1.2. SƠ ĐỒ NGUYÊN LÝ
Hình 4.2: Sơ đồ nguyên lý mạch điều khiển LCD
1.3.1.3. LƢU ĐỒ GIẢI THUẬT HIỂN THỊ THÔNG TIN TRÊN 2 HÀNG
Hình 4.3: Lƣu đồ giải thuật
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 71
1.3.1.4. CÁC LỆNH ĐIỀU KHIỂN LCD
- lcd_init(); khởi tạo lcd
- lcd_gotoxy(1,1); di chuyển con trỏ đến vị trí cột 1, hàng 1
- printf(lcd_putc,"Nguyen Van A"); xuất nội dung trong “” ra lcd
- lcd_moveRight(16); dịch phải lcd
- lcd_moveLeft(16); dịch trái lcd
1.3.1.5. HÌNH DÁNG VÀ SƠ ĐỒ CHÂN LM335:
Hình 4.4: Sơ đồ chân vi mạch LM335
- Trong phần này ta có biểu thức chuyển đổi nhiệt độ từ giá trị độ K về độ C.
Do có biểu thức này là do LM335 thay đổi 10mV/K, ta lại cần hiển thị độ
C. Vì 0oC = 273oK. Giả sử Vref = VCC = 5V thì 0oC LM335 sẽ xuất hiện
1 điện áp là 2.73V và với điện áp này sẽ cho giá trị:
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 72
- Như vậy khi tính toán giá trị để hiển thi nhiệt độ C ta cần trừ đi giá trị
558.558. Vậy công thức chuyển đổi sang độ C đầy đủ là:
- Giá trị 2.048 trong công thức có được là do ta dùng ADC 10 bit. Nếu với
điện áp lấy mẫu 5V thì mỗi mức lượng tử tương ứng:
- Ta biết rằng LM335 thay đổi 10mV/K do đó ứng với sự thay đổi 1 độ C sẽ
thay đổi 2.048 mức lượng tử (10mV/4.883 = 2.048). Công thức trên là cho
ADC 10 bit, với các bộ ADC 10 bit hay 12 bit việc tính toán chuyển đổi giá
trị cũng tương tự
1.3.1.6. NHỮNG SAI HỎNG THƢỜNG GẶP
- Cần chú ý sơ đồ chân khi giao tiếp với LCD 16x2, không cắm lộn chân.
- Tính toán đúng giá trị điện áp đặt cho vi mạch LM335
- Thực hiện giao tiếp với modul cảm biến nhiệt độ với nhiều hình thức
khác nhau như:
o Dùng độ nóng/ lạnh của nước tránh làm đổ nước vào thiết bị và
máy tính.
o Dùng độ nóng của mỏ hàn tránh làm phỏng người xung quanh và
bản thân.
o Dùng nguồn điện tránh chạm chập làm hư hỏng thiết bị.
- Vấn đề an toàn cho người và thiết bị khi giao tiếp với máy tính cần ngắt
nguồn thiết bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03
1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM
1. Vẽ sơ đồ mạch nguyên lý hiển thị LCD
2. Lập lưu đồ chương trình điều khiển
3. Biên soạn code trong CCS hoặc Proteus
4. Biên dịch, sửa lỗi, nạp chương trình kiểm chứng kết quả
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 73
1.3.3 BÀI TẬP THÍ NGHIỆM
Bài tập 1: Biên dịch và kiểm chứng kết quả đoạn code sau
#include
#fuses HS, NOLVP, NOWDT, NOPROTECT
#use delay (clock=8000000) //Use built-in function: delay_ms() & delay_us()
#include "LCD_TM.c" //use module function
void main(void)
{
while(true)
{
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"Nguyen Van A");
lcd_gotoxy(1,2);
printf(lcd_putc,"LOP C18A TĐH");
delay_ms(500);
lcd_moveRight(16);
lcd_init();
lcd_gotoxy(5,1);
printf(lcd_putc, "The best of");
lcd_gotoxy (1,2);
printf(lcd_putc, "PIC,AVR,8051...");
delay_ms(500);
lcd_moveRight(16);
}
}
- Thay đổi chuỗi dữ liệu hiển thị trên LCD và kiểm chứng kết quả
- Thực hiện thay đổi chuỗi dữ liệu bất kỳ khi được yêu cầu
Bài tập 2: Viết chương trình hiển thị nhiệt độ lên LCD sử dụng cảm biến LM335
- Sơ đồ mạch hiển thị
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 74
Hình 4.5: Sơ đồ mạch hiển thị
- Lập lưu đồ chương trình
- Chương trình tham khảo
#include
#device ADC=10
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(clock=8000000)
#include
float tam,nhietdo;
void main()
{
lcd_init();
setup_adc(adc_clock_internal);
setup_adc_ports(AN0_AN1_AN3); // A0 , A1 va A3 la chan Analog
set_adc_channel(3); // Chon ADC tu chan 3
delay_ms(10);
while (true)
{
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 75
tam=(read_adc()-558.558);
nhietdo=(tam/2.048);
lcd_gotoxy(1,1); printf(lcd_putc," NHIET DO:");
lcd_gotoxy(12,1); printf(lcd_putc,"%1.0f",nhietdo);
lcd_gotoxy(14,1); lcd_putc(223);
lcd_gotoxy(15,1);printf(lcd_putc,"C");
}
}
Bài tập 3: Vẽ sơ đồ phần cứng, tóm tắt bảng chức năng, thành lập lưu đồ, lập chương
trình điều khiển chuỗi kí tự trên cột 16, hàng 1 của LCD 16x2 là “ KHOA DIEN DIEN
TU” dịch trái 10 lần, sau đó đi đến cột 1, hàng 2 hiển thị chuỗi kí tự “TRUONG CD
GIAO THONG VAN TAI” dịch phải 15 lần.
- Sơ đồ mạch điều khiển
Hình 4.6: Sơ đồ mạch điều khiển
- Lập lƣu đồ giải thuật cho chƣơng trình điều khiển
- Chƣơng trình tham khảo
#include
#fuses HS, NOLVP, NOWDT, NOPROTECT
#use delay (clock=8000000)
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 76
#define rs PIN_B4
#define enabled PIN_B5
#define DB4 PIN_B0
#define DB5 PIN_B1
#define DB6 PIN_B2
#define DB7 PIN_B3
char const lcd_type=2;
char const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
//=======================================
// Ham xuat 4 bit du lieu ra 4 chan RB0, RB1, RB2, RB3
//=======================================
void make_out_data(char buffer_data)
{
output_bit(DB4,bit_test(buffer_data,0));
output_bit(DB5,bit_test(buffer_data,1));
output_bit(DB6,bit_test(buffer_data,2));
output_bit(DB7,bit_test(buffer_data,3));
}
//===================================
//Ham goi nua byte du lieu
//===================================
void lcd_send_nibble(char buffer_nibble)
{
make_out_data(buffer_nibble);
delay_us(10);
output_high(enabled);
delay_us(10);
output_low(enabled);
}
//====================================
// Ham goi 1 byte du lieu
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 77
//====================================
void lcd_send_byte( char address, char n)
{
output_low(rs);
delay_ms(1);
output_bit(rs,address);//lcd.rs = address;
delay_us(40);
output_low(enabled);//lcd.enable = 0;
lcd_send_nibble(n>>4);
lcd_send_nibble(n&0x0f);
delay_ms(1);
}
//Ham khoi tao LCD
//===============================================
void lcd_init()
{
char i;
output_low(rs); //lcd.rs = 0;
output_low(enabled); //lcd.enable = 0;
delay_ms(500);
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
//================================================
// Ham di den toa do x, y de hien thi du lieu
//================================================
void lcd_gotoxy( char x, char y)
{
char address;
switch(y)
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 78
{
case 1 : address=0x80;break;
case 2 : address=0xc0;break;
}
address=address+(x-1);
lcd_send_byte(0,address);
}
//=================================================
void lcd_putc( char c)
{
lcd_send_byte(1,c);
}
//=================================================
void LCD_ShiftRight()
{
lcd_send_byte(0,0x18);
}
//===============================================
void LCD_ShiftLeft()
{
lcd_send_byte(0,0x1C);
}
void LCD_MoveLeft(char p)
{
char i;
for(i=0;i<p;i++)
{
LCD_ShiftLeft();
delay_ms(100);
}
}
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 79
void LCD_MoveRight(char p)
{
char i;
for(i=0;i<p;i++)
{
LCD_ShiftRight();
delay_ms(200);
}
}
void main(void)
{
lcd_init();// khoi tao LCD
while(true)
{
lcd_send_byte(0,1);
lcd_gotoxy(17,1);
printf(lcd_putc,"TRUONG CAO DANG ");
lcd_gotoxy(20,2);
printf(lcd_putc,"GIAO THÔNG VẬN TẢI ");
LCD_MoveLeft(40) ;
lcd_send_byte(0,1);// xoa
lcd_gotoxy(17,1);
printf(lcd_putc,"THONG BAO");
LCD_MoveLeft(25) ;
/*
lcd_send_byte(0,1);
lcd_gotoxy(17,1);
printf(lcd_putc,"TUYEN SINH");
LCD_MoveLeft(26) ;
*/
lcd_send_byte(0,1);
BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD
Trang 80
lcd_gotoxy(32,1);
printf(lcd_putc,"NAM 2020");
LCD_MoveRight(24) ;
*/
lcd_send_byte(0,1);
lcd_gotoxy(23,1);
printf(lcd_putc,"THOI KHOA BIEU HK3");
lcd_gotoxy(25,2);
printf(lcd_putc,"LOP C18A TDH");
LCD_MoveRight(33) ;
}
}
BÀI 6: INTERRUPT – NGẮT
Trang 81
Bài thí nghiệm số 5:
MẠCH ĐỊNH THỜI - TIMER
Thời lƣợng: 12 giờ
1.1. MỤC TIÊU
- Viết đúng chương trình hiển thị dữ liệu trên tải sử dụng timer lập trình vi
điều khiển PIC.
- Sử dụng thành thạo phần mềm trong biên soạn và biên dịch và sửa lỗi
chương trình.
- Nạp và thực thi được các ứng dụng cơ bản trong điều khiển hiển thị sử
dụng timer.
- Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng
dụng các phần mềm khi lập trình
1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG
- Board Kit thí nghiệm Vi Xử Lý.
- Máy tính, phần mềm mô phỏng Proteus, Keil C
- Vi điều khiển 89S52 và PIC 16F877A
1.3. NỘI DUNG
1.3.1 CƠ SỞ LÝ THUYẾT
1.3.1.1. CẤU TRÚC LỆNH LIÊN QUAN ĐẾN TIMER
- setup_counters(rtcc_state,wdt_state): Khởi động bộ đếm của timer
- rtcc_state: Trạng thái đồng hồ thời gian thực, thông số này cho biết nguồn
xung clock được lấy từ đâu và mức tác động như thế nào. Rtcc_state có thể
là một trong các dạng sau:
- RTCC_INTERNAL: Xung clock lấy từ dao động nội.
- RTCC_EXT_L_TO_H: Xung clock lấy từ bên ngoài ( chân RA4/T0CKI),
tác động cạnh lên
- RTCC_EXT_H_TO_L: Xung clock lấy từ bên ngoài ( chân RA4/T0CKI),
tác động cạnh xuống
- wdt_state: Thời gian lấy mẫu của xung clock . Wdt_state có thể là một
trong các dạng sau:
- RTCC_DIV_1: Lấy mẫu 1 lần trong chu kỳ xung
BÀI 6: INTERRUPT – NGẮT
Trang 82
- RTCC_DIV_2: Lấy mẫu 2 lần trong chu kỳ xung
- RTCC_DIV_4: Lấy mẫu 4 lần trong chu kỳ xung
- RTCC_DIV_8: Lấy mẫu 8 lần trong chu kỳ xung
- RTCC_DIV_16: Lấy mẫu 16 lần trong chu kỳ xung
- RTCC_DIV_32: Lấy mẫu 32 lần trong chu kỳ xung
- RTCC_DIV_64: Lấy mẫu 64 lần trong chu kỳ xung
- RTCC_DIV_128: Lấy mẫu 128 lần trong chu kỳ xung
- RTCC_DIV_256: Lấy mẫu 256 lần trong chu kỳ xung
- setup_timer0(value): Khởi động giá trị cho timer. Bộ timer đếm lên từ giá
trị value, đến 255 sẽ tràn về 0 và tiếp tục chu kỳ đếm lên tiếp theo.
- get_timer0(): Đọc thanh ghi timer, trả về giá trị thời gian thực của bộ đếm
a. SƠ ĐỒ MẠCH HIỂN THỊ LED ĐƠN
Hình 5.1: Sơ đồ nguyên lý mạch hiển thị LED ĐƠN
b. SƠ ĐỒ KHỐI SW CHỌN TÍN HIỆU XUNG BÊN NGOÀI
Hình 5.2: Sơ đồ phần cứng trên board TN đa năng DTVT03
BÀI 6: INTERRUPT – NGẮT
Trang 83
1.3.1.2. BÀI TẬP MẪU
Ví dụ 1: Dùng vi điêu khiển PIC 16F877A điều khiển 8 led đơn sang tắt dùng Timer T1
với thạch anh 8MHz
- Sơ đồ mạch:
- Sử dụng Port D để điều khiển 8 LED đơn. Với thạch anh sử dụng là 8MHz
- Lưu đồ giải thuật.
# include
#BIT TMR1IF = 0x0C.0
#Unsigned int8 X;
Void main ()
BÀI 6: INTERRUPT – NGẮT
Trang 84
{ SET_TRIS_D(0x00); X=0X00; OUTPUT_D(X)
SETUP_TIMER_1(T1_INTRENAL| T1_DIV_BY_4);
SET_TIMER1(0)
White (TRUE)
{
IF(TMR1IF==1)
{
X=X; OUTPUT_D(X); TMR1IF=0;
}
}
}
Giải thích chƣơng trình và tính toán thời gian delay:
Khởi tạo timer 1 đếm xung nội có tần số 8MHz qua bộ chia 4 còn
1MHz. Sử dụng bộ chia trước với tỉ lệ chia là 4 nên xung vào bộ đếm với tần số còn lại
là 2MHz/4 = 0.5MHz hay bằng 500KHz từ đó ta có chu kỳ là 2µs.
Ta khởi tạo biến X bằng 00 và gởi biến đếm ra Port D sẽ làm các LED tắt.
Lệnh IF sẽ kiểm tra cờ tràn TMR1IF của timer 1: Nếu chưa tràn thì chờ
cho đến khi tràn TMR1IF bằng 1, Lệnh dảo biến X, giá trị này gởi ra port sẽ làm các
LED sang, xóa cờ tràn để báo hiệu tràn cho lần sau.
Nếu tràn lần tiếp theo thì lệnh X=X sẽ nghịch đảo biến X bằng 0x00,
giá trịn này gởi ra Port sẽ làm các LED tắt,
Timer T1 đếm 65,536 thời gian đếm bằng số xung đếm nhân với chu kỳ
mỗi xung:
Xung nhân với chu kỳ xung = 65,536 x 2µs = 131,072µs 131ms nên
thời gian sang và tắt của 8 LED đều bằng 131ms hay chu kỳ bằng 262ms
Trong chương trình này sử dụng TMR1IF để kiểm tra thư viện
không định nghĩa bit này, nên có them hang lệnh “#BIT TMR1IF=0x)C.0”
để định nghĩa bit cờ tràn.
Cờ tràn nằm ở bit thứ 0, trong thanh ghi PIR1 có địa chỉ 0x0C.
BÀI 6: INTERRUPT – NGẮT
Trang 85
Ví dụ 2: Biên soạn và biên dịch chương trình điều khiển 8 led đơn ở port C: Sáng dần 2
led ( từ RC7)- Tắt 8 led – lặp lại. Xác định thời gian trễ của chương trình là
bao nhiêu giây, xung clock là 8MHz
#include
#fuses HS,NOLVP,NOWDT,PUT
#use delay(clock=8000000)
void delay()
{
int counter;
int16 n;
set_timer0(0);
for(n=0;n<50000;n++)
{
counter=get_timer0();
if (counter==255)
{
counter=0;
set_timer0(0);
}
}
}
void main()
{
set_TRIS_C(0x00);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
while(1)
{
output_c(0xc0);
delay ();
output_c(0xf0);
delay ();
output_c(0xfc);
delay ();
BÀI 6: INTERRUPT – NGẮT
Trang 86
output_c(0xff);
delay ();
output_c(0x00);
delay ();
}
}
1.3.1.3. NHỮNG SAI HỎNG THƢỜNG GẶP
- Vẽ đúng sơ đồ kết nối đúng để mô phỏng trên Proteus
- Kiểm tra giới hạn kết nối của thạch anh để gọi dung chương trình con tạo trễ.
- Thực thi chương trình, biên dịch và nạp chương trình vào vi điều khiển đúng
quy trình.
- Vấn đề an toàn cho người và thiết bị khi giao tiếp với máy tính cần ngắt
nguồn thiết bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03
1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM
1. Vẽ sơ đồ mạch điều khiển
2. Lập lưu đồ chương trình điều khiển
3. Biên soạn code trong CCS hoặc Proteus
4. Biên dịch, sửa lỗi, nạp chương trình kiểm chứng kết quả
1.3.3 BÀI TẬP THÍ NGHIỆM
Bài tập 1: Viết chương trình điều khiển 8 led đơn ở port B: sáng 8 led- tắt 8 led- sáng
dần từ RB0- Tắt dần từ RB7 – lặp lại. Có sử dụng timer 0 để tạo trễ 0.5s, xung clock là
8MHz
a. Sơ đồ mạch hiển thị
b. Lập lưu đồ giải thuật cho chương trình điều khiển
c. Viết đoạn chương trình hiển thị yêu cầu trên sử dụng timer0
Bài tập 2: Viết chương trình điều khiển 16 led đơn ở port B, C: Sáng 16 Led – tắt 16
Led – sáng dần từ RB0, RC0 - Tắt dần từ RB7, RC7 – lặp lại. Có sử dụng timer 0 để tạo
trễ 0.5s, xung clock là 8MHz
a. Sơ đồ mạch hiển thị
b. Lập lưu đồ chương trình
c. Viết đoạn chương trình hiển thị yêu cầu trên sử dụng timer0
BÀI 6: INTERRUPT – NGẮT
Trang 87
Bài thí nghiệm số 6:
INTERRUPT – NGẮT
Thời lƣợng: 12 giờ
1.1. MỤC TIÊU
- Viết đúng chương trình hiển thị dữ liệu trên tải sử dụng ngắt trong lập trình
vi điều khiển PIC.
- Sử dụng thành thạo phần mềm trong biên soạn và biên dịch và sửa lỗi
chương trình.
- Nạp và thực thi được các ứng dụng cơ bản trong điều khiển hiển thị sử
dụng ngắt.
- Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng
dụng các phần mềm khi lập trình.
- Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng
dụng các phần mềm khi lập trình.
1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG
- Board Kit thí nghiệm Vi Xử Lý.
- Máy tính, phần mềm mô phỏng Proteus, Keil C
- Vi điều khiển 89S52 và PIC 16F877A
1.3. NỘI DUNG
1.3.1 CƠ SỞ LÝ THUYẾT
1.3.1.1. CÁC LỆNH ĐIỀU KHIỂN NGẮT
#int_ext: Ngắt ngoài, nguồn tác động từ chân (RB0/INT)
#int_timer0: Ngắt khi Timer 0 tràn
#int_rtcc: Ngắt khi Timer 0 tràn
#int_rb: Ngắt ở Port B khi có bất cứ thay đổi nào từ chân B4-B7
* enable_interrupts(level): cho phép nguồn ngắt nằm trong ()
* ext_int_edge (source,edge)
+ source: =0
+edge : Cạnh tác động ngắt có hai dạng : H_TO_L (tác động cạnh xuống) hoặc
L_TO_H (tác động cạnh lên)
* disable_interrupts (level) : Cấm ngắt nằm trong ()
BÀI 6: INTERRUPT – NGẮT
Trang 88
* clear_interrupt (level) : Xóa cờ ngắt của nguồn ngắt nằm trong ()
1.3.1.2. SƠ ĐỒ MẠCH ĐIỀU KHIỂN
Hình 6.1 Ngắt ngoài điều khiển 8 led đơn
Hình 6.2 Sơ đồ điều khiển ngắt RB
BÀI 6: INTERRUPT – NGẮT
Trang 89
1.3.1.3. CÁC BƢỚC CÔNG VIỆC
a. Vẽ sơ đồ mạch điều khiển
b. Lập lưu đồ chương trình
c. Biên soạn, biên dịch chương trình trong CCS
d. Nạp, kiểm chứng và chỉnh sửa chương trình đúng yêu cầu
1.3.1.4. NHỮNG SAI HỎNG THƢỜNG GẶP
- Vẽ đúng sơ đồ kết nối đúng để mô phỏng trên Proteus
- Kiểm tra giới hạn kết nối của thạch anh để gọi đúng chương trình con tạo
ngắt.
- Thực thi chương trình, biên dịch và nạp chương trình vào vi điều khiển
đúng quy trình.
- Vấn đề an toàn cho người và thiết bị khi giao tiếp với máy tính cần ngắt
nguồn thiết bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03
1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM
1. Vẽ sơ đồ mạch điều khiển ngắt ngoài 0 điều khiển led đơn và led 7 đoạn
2. Lập lưu đồ chương trình điều khiển
3. Biên soạn code trong CCS hoặc Proteus
4. Biên dịch, sửa lỗi, nạp chương trình kiểm chứng kết quả
1.3.3 BÀI TẬP THÍ NGHIỆM
1. Bài tập 1:
Yêu cầu: Biên soạn , biên dịch và quan sát hoạt động chương trình trên phần mềm
Proteus
a. Vẽ sơ đồ mạch hiển thị
.
b. Lập lƣu đồ chƣơng trình
.
c. Chƣơng trình tham khảo
#include
#use delay(clock=20000000)
#int_ext
void isrtext()
BÀI 6: INTERRUPT – NGẮT
Trang 90
{
output_c(0x01);
delay_ms(500);
output_c(0x03);
delay_ms(500);
output_c(0x07);
delay_ms(500);
output_c(0x0f);
delay_ms(500);
output_c(0x1f);
delay_ms(500);
output_c(0x3f);
delay_ms(500);
output_c(0x7f);
delay_ms(500);
output_c(0xff);
delay_ms(500);
}
void main()
{
int x;
set_tris_B(0x01);
set_tris_c(0x00);
enable_interrupts(int_ext);
enable_interrupts(global);
ext_int_edge(H_TO_L);
while(1)
{
output_c(x);
delay_ms(500);
x++;
BÀI 6: INTERRUPT – NGẮT
Trang 91
}
}
2. Bài tập 2:
Yêu cầu: Biên soạn , biên dịch và quan sát hoạt động chương trình trên phần mềm
Proteus
a. Sơ đồ mạch hiển thị
Hình 6.3 Ngắt ngoài 0 điều khiển led đơn và led 7 đoạn
b. Lập lƣu đồ chƣơng trình
c.Chƣơng trình tham khảo
#include
#use delay(clock=20000000)
#int_ext
void isrtext()
{
output_high(PIN_B1);
BÀI 6: INTERRUPT – NGẮT
Trang 92
output_high(PIN_B2);
output_C(0x7f);
delay_ms(1000);
output_C(0xbf);
delay_ms(1000);
output_C(0xdf);
delay_ms(1000);
output_C(0xef);
delay_ms(1000);
output_C(0xf7);
delay_ms(1000);
output_C(0xfb);
delay_ms(1000);
output_C(0xfd);
delay_ms(1000);
output_C(0xfe);
delay_ms(1000);
output_low(PIN_B1);
output_low(PIN_B2);
}
int bin2BCD(int bin)
{
int BCD;
BCD=((bin/10<<4)+bin%10);
3. Bài tập 3:
+ Sử dụng ngắt ngoài 0 ( tác động cạnh lên), viết chương trình thỏa 2 điều kiện
Bình thường: 8 led đơn ở port C sáng dần từ trong ra ngoài, tạo trễ 0.5s
Ngắt ngoài 0: Tăng giá trị đếm ở 2 led 7 đoạn lên 1 đơn vị. Giá trị bắt đầu của 2 led là
00, tăng đến 59 thì quay về.
a. Vẽ sơ đồ mạch điều khiển
.
BÀI 6: INTERRUPT – NGẮT
Trang 93
b. Lập lƣu đồ chƣơng trình
.
c. Viết chƣơng trình thực hiện đúng yêu cầu trên
.
4. Bài tập 4:
+ Sử dụng ngắt ngoài 0 ( tác động cạnh lên), viết chương trình thỏa 2 điều kiện
Bình thường: 8 led đơn ở port C sáng dần từ trong ra ngoài, tạo trễ 0.75s
Ngắt ngoài 0: Tăng giá trị đếm ở 2 led 7 đoạn lên 1 đơn vị. Giá trị bắt đầu của 2 led là
05, tăng đến 99 thì quay về.
a. Vẽ sơ đồ mạch điều khiển
.
b. Lập lƣu đồ chƣơng trình
.
c. Viết chƣơng trình thực hiện đúng yêu cầu trên
.
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 93
Bài thí nghiệm số 7:
LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Thời lƣợng: 18 giờ
1.1. MỤC TIÊU
Sau khi học xong bài này người học có khả năng:
- Vẽ được sơ đồ kết nối mạch hiển thị đồng hồ trên phần mềm Proteus.
- Thành lập lưu đồ chương trình hiển thị mạch đồng hồ đếm giây trên LED 7
đoạn và LCD.
- Lập trình được chương trình điều khiển hiển thị đồng hồ số sử dụng PIC
16F877
- Thực hiện tốt các biện pháp an toàn cho người và thiết bị, tự tin trong lập trình
các ứng dụng.
- Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng dụng
các phần mềm khi lập trình.
1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG
- Board Kit thí nghiệm Vi Xử Lý.
- Máy tính, phần mềm mô phỏng Proteus, Keil C
- Vi điều khiển 89S52 và PIC 16F877A
1.3. NỘI DUNG
1.3.1 CƠ SỞ LÝ THUYẾT
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 94
1.3.1.1. SƠ ĐỒ MẠCH HIỂN THỊ ĐỒNG HỒ DÙNG LCD
Hình 7.1: Sơ đồ mạch hiển thị đồng hồ dùng LCD
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 95
1.3.1.2. SƠ ĐỒ MẠCH HIỂN THỊ LỊCH VẠN NIÊN DÙNG LED 7
ĐOẠN
Hình 7.2: Sơ đồ mạch hiển thị lịch vạn niên dùng LED 7 đoạn
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 96
Hình 7.3: Sơ đồ chân DS1307
1.3.1.3. SƠ ĐỒ CHÂN:
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 97
- Chức năng:
Các chân của DS1307 được mô tả như sau:
+ X1 và X2: là 2 ngõ kết nối với thạch anh 32.768KHz để tạo dao động cho IC
DS1307
+ VBAT: cực dương của một nguồn pin 3V nuôi IC
+ GND: Chân mass chung cho cả pin 3V và Vcc
+ VCC: Nguồn cho giao diện I2C, thường là 5V và dung chung với vi điều khiển.
Nếu VCC không được cấp nguồn nhưng VBAT được cấp nguồn thì DS1307 vần đang hoạt
động nhưng không ghi và đọc được.
+ SQW/OUT: một ngõ phụ tạo xung vuông, tần số của xung được tạo có thể được
lập trình. Như vậy chân này hầu như không liên quan đến chức năng của DS1307 là
đồng hồ thời gian thực.
+ SCL và SDA là 2 đƣờng giao xung nhịp và dữ liệu của giao diện I2C
Một số hàm cần lƣu ý trong DS1307
Khai báo và hàm đọc, ghi DS1307:
//==========================
// Khai báo DS1307
//==========================
#define DS1307_SDA PIN_C4
#define DS1307_SCL PIN_C3
#use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL)
//==========================
// Khởi tạo DS1307
//==========================
void init_DS1307()
{
output_float(DS1307_SCL);
output_float(DS1307_SDA);
}
//==========================
// Ghi dữ liệu đến DS1307
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 98
//==========================
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);
}
}
//==========================
// Đọc dữ liệu từ 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);
}
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 99
1.3.1.4. NHỮNG SAI HỎNG THƢỜNG GẶP
- Vẽ đúng sơ đồ kết nối đúng để mô phỏng trên Proteus
- Kiểm tra giới hạn kết nối của thạch anh để gọi đúng chương trình con tạo
ngắt.
- Thực thi chương trình, biên dịch và nạp chương trình vào vi điều khiển
đúng quy trình.
- Vấn đề an toàn cho người và thiết bị khi giao tiếp với máy tính cần ngắt
nguồn thiết bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03
1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM
1. Vẽ sơ đồ mạch hiển thị đồng hồ dùng LCD.
2. Lập lưu đồ chương trình
3. Chương trình tham khảo
1.3.3 BÀI TẬP THÍ NGHIỆM
1. Bài tập 1:
Vẽ sơ đồ phần cứng, tóm tắt bảng chức năng, thành lập lưu đồ, viết chương trình điều
khiển hiển thị đồng hồ số, dữ liệu giờ, phút, giây lấy từ DS1307.
a. Vẽ sơ đồ mạch hiển thị đồng hồ dùng LCD
b. Lập lưu đồ chương trình
c. Chương trình tham khảo
#include
#fuses HS
#use delay(clock=8000000)
#include
#include
byte sec,min,hour;
byte const MAP[10] = {0,1,2,3,4,5,6,7,8,9};
byte temp_sec_low, temp_sec_high, temp_min_low, temp_min_high;
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 100
byte temp_hour_low, temp_hour_high;
float sec_low,sec_high, min_low, min_high, hour_low, hour_high;
byte mode; // Che do
int1 blink_sec, blink_min, blink_hour;
#bit SW_mode = 0x08.0 // Cho che do
#bit SW_inc = 0x08.1 // Chinh tang
#bit SW_dec = 0x08.2 // Chinh giam
#bit SW_clear = 0x08.3 // Ngung chinh
//***************************
//***** Khai bao prototype
void read_rtc();
void bcd_to_dec();
void display();
void key_test();
void chinhgiay();
void chinhphut();
void chinhgio();
void set_blink();
//********************************
void read_rtc()
{
sec = read_ds1307(0);
min = read_ds1307(1);
hour = read_ds1307(2);
temp_sec_low = sec & 0x0F;
temp_sec_high = (sec & 0xF0)>>4;
temp_min_low = min & 0x0F;
temp_min_high = (min & 0xF0)>>4;
temp_hour_low = hour & 0x0F;
temp_hour_high = (hour & 0x30)>>4;
}
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 101
//******************************************************************
void bcd_to_dec()
{
sec_high = MAP[temp_sec_high];
sec_low = MAP[temp_sec_low];
min_high = MAP[temp_min_high];
min_low = MAP[temp_min_low];
hour_high = MAP[temp_hour_high];
hour_low = MAP[temp_hour_low];
/**************************************/
}
//*************************************************************
void display()
{
lcd_gotoxy(15,2); printf(lcd_putc,"%1.0f",sec_high);
lcd_gotoxy(16,2); printf(lcd_putc,"%1.0f",sec_low);
lcd_gotoxy(14,2); printf(lcd_putc,":");
lcd_gotoxy(12,2); printf(lcd_putc,"%1.0f",min_high);
lcd_gotoxy(13,2); printf(lcd_putc,"%1.0f",min_low);
lcd_gotoxy(11,2); printf(lcd_putc,":");
lcd_gotoxy(9,2); printf(lcd_putc,"%1.0f",hour_high);
lcd_gotoxy(10,2); printf(lcd_putc,"%1.0f",hour_low);
}
//***************************************************
void key_test()
{
if (SW_mode==0)
{
mode++;
delay_ms(150);
}
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 102
else if (SW_clear==0)
{
mode=0;
blink_sec=0;
blink_min=0;
blink_hour=0;
}
switch (mode)
{
case 1:
{
blink_sec =1;
blink_min=0;
blink_hour=0;
chinhgiay();
break;
}
case 2:
{
blink_min =1;
blink_sec=0;
blink_hour=0;
chinhphut();
break;
}
case 3:
{
blink_hour=1;
blink_sec=0;
blink_min=0;
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 103
chinhgio();
break;
}
case 4:
{
mode=0;
blink_sec=0;
blink_min=0;
blink_hour=0;
break;
}
}
}
//**************************************************************
void chinhgiay()
{
set_blink();
if (SW_inc==0)// nut tang duoc nhan
{
delay_ms(1);
if (sec<0x30)
{
write_ds1307(0,0x00);
}
else
{
write_ds1307(0,0x00);
min++;
write_ds1307(1,min);
}
}
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 104
}
//**************************************************************
void chinhphut()
{
set_blink();
if (SW_inc==0)
{
delay_ms(1);
if (min==0x09)
{
write_ds1307(1,0x10);
}
else if (min==0x19)
{
write_ds1307(1,0x20);
}
else if (min==0x29)
{
write_ds1307(1,0x30);
}
else if (min==0x39)
{
write_ds1307(1,0x40);
}
else if (min==0x49)
{
write_ds1307(1,0x50);
}
else if (min==0x59)
{
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 105
write_ds1307(1,0x00);
}
else
{
min++;
write_ds1307(1,min);
}
}
else if (SW_dec==0)
{
delay_ms(1);
if (min==0x50)
{
write_ds1307(1,0x49);}
else if (min==0x40)
{write_ds1307(1,0x39);}
else if (min==0x30)
{
write_ds1307(1,0x29);
}
else if (min==0x20)
{
write_ds1307(1,0x19);
}
else if (min==0x10)
{
write_ds1307(1,0x09);
}
else if (min==0x00)
{
write_ds1307(1,0x59);
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 106
}
else
{
min--;
write_ds1307(1,min);
}
}
}
//**************************************************************
void chinhgio()
{
set_blink();
if (SW_inc==0)
{
delay_ms(1);
if (hour==0x09) {write_ds1307(2,0x10);}
else if (hour==0x19) {write_ds1307(2,0x20);}
else if (hour==0x23) {write_ds1307(2,0x00);}
else {hour++; write_ds1307(2,hour);}
}
else if (SW_dec==0)
{
delay_ms(1);
if (hour==0x20) {write_ds1307(2,0x19);}
else if (hour==0x10) {write_ds1307(2,0x09);}
else if (hour==0x00) {write_ds1307(2,0x23);}
else {hour--; write_ds1307(2,hour);}
}
}
//**************************************************************
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 107
///***********************************//
void set_blink()
{
if (blink_sec==1)
{
lcd_gotoxy(15,2);
printf(lcd_putc," "); // hai khoang trong
delay_ms(250);
lcd_gotoxy(15,2);
printf(lcd_putc,"%1.0f",sec_high);
lcd_gotoxy(16,2);
printf(lcd_putc,"%1.0f",sec_low);
}
if (blink_min==1)
{
lcd_gotoxy(12,2);
printf(lcd_putc," ");
delay_ms(250);
lcd_gotoxy(12,2);
printf(lcd_putc,"%1.0f",min_high);
lcd_gotoxy(13,2);
printf(lcd_putc,"%1.0f",min_low);
}
if (blink_hour==1)
{
lcd_gotoxy(9,2);
printf(lcd_putc," ");
delay_ms(250);
lcd_gotoxy(9,2);
printf(lcd_putc,"%1.0f",hour_high);
lcd_gotoxy(10,2); printf(lcd_putc,"%1.0f",hour_low);
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 108
}
}
//************************************************************
void main()
{
mode=0;
blink_sec=0;
blink_min=0;
blink_hour=0;
byte u;
set_tris_b(0x00);
u=read_ds1307(0);
sec=u & 0x7F;// mo RTC
write_ds1307(0,sec);
lcd_init();
init_ds1307();
while(true)
{
read_rtc();
bcd_to_dec();
display();
key_test();
//*********************
}
}
2. Bài tập 2:
Vẽ sơ đồ phần cứng, tóm tắt bảng chức năng, thành lập lưu đồ, viết chương trình điều
khiển hiển thị LED 7 đoạn lịch vạn niên lấy từ DS1307.
a. Vẽ sơ đồ mạch hiển thị
..
..
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 109
b. Lập lưu đồ chương trình
..
..
c. Chương trình tham khảo
/*************************************************************
Chip type : PIC16F877A
Program type : Application
Clock frequency : 20 MHz
Project : Realtime Clock
Version : V1.0
Date : 01/09/2020
Author : NGUYEN THI THU LAN
Gmail : nttlan@hcmct.edu.vn
Mobile : 0908071828
Company : Khoa KT Dien Dien Tu – Truong CD GiaoThong Van Tai
Comments : Chuong trinh dong ho thoi gian thuc
Su dung RTC Ds1307
Hien thi Led 7 doan
Hien thi thoi gian, Gio, Phut
Hien thi ngay, thang, nam duong lich
Hien thi ngay, thang, nam am lich
Hien thi nhiet do su dung Ds1307
************************************************************/
#include
#include "ds1307.c"
//#include
//#include
#include "PIC16F877A_registers.h"
/******************* Khai bao bien toan cuc************************/
//int1 StEn=false; //
unsigned char StSet=0; //bien tao nhap nhay vung cai dat //
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 110
unsigned char StNumber=0;//bien cho phep cai dat 0-11 //
unsigned char Number=0; //bien phuc vu quet led 0-22 //
unsigned char Temp; //Nhuet do //
unsigned char sec,min,hrs,day_d,month_d,year_d,date; //thoi gian duong lich //
unsigned char day_a,month_a,year_a; //thoi gian am lich //
unsigned char dsec=0; //bien phuc vu update time //
//unsigned char
CharCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/* Bang ma LED Anot chung */
unsigned char CharCode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/* Bang ma LED CAtot chung */
unsigned char ADC_Convert(); //chuong trinh chuyen doi ADC 10bit chanel 0 //
void VietNam_Calendar(unsigned char day_d,month_d,year_d);/*Chuyen doi am lich//
VietNam den nam 2030*/
void OutLed(unsigned char DATA);// Chuong trinh Xuat data ra PORTD //
void Sys_init(); //Chuong trinh khoi tao chip //
void Program_init(); // chuong trinh khoi tao //
void Setup();//Chuong trinh cai dat thoi gian //
void Led7segment(unsigned char day_d,month_d,year_d,day_a,month_a,year_a,date,//
Temp,hrs,min,sec ); //chuong trinh quet LED dung ngat hoan toan tan so fV=25Hz//
//
/*************************************************************/
/*************************************************************
/////////////////Chuong trinh dinh thoi Timer0 1.8ms////////////////////////////
****************************************************************/
#int_RTCC
void RTCC_isr(void)
{
Set_timer0(115); //tao tan so quet fV=25Hz
Number++;
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 111
//if(Number>22){Number=1;en=1;clk=0;clk=1;en=0;}//xoa khi Scan du 22led
if(Number>22){Number=1;en=0;clk=0;clk=1;en=1;}//xoa khi Scan du 22led
clk=0;clk=1; //tao xung clock
OutLed(0xFF); //xoa bong ma
Led7segment(day_d,month_d,year_d,day_a,month_a,year_a,date,Temp,hrs,min,sec);
}
/*************************************************************
/////////////////Chuong trinh dinh thoi Timer1 2ms//////////////////////////////
*************************************************************/
#int_TIMER1
void TIMER1_isr(void)
{
Set_timer1(0xBDB);
dsec++;
if(dsec>=10) { //sau 1s cap ngat time gom gio, phut,giay
dsec=0;
ds1307_get_time(hrs,min,sec);
if((hrs==00)&&(min==00)&&(sec<=10))//10s ngay moi update time.....
{
ds1307_get_date(day_d,month_d,year_d,date);
VietNam_Calendar(day_d,month_d,year_d);
}
if(sec%10==0) Temp=ADC_convert(); //sau 10s update nhiet do
}
}
/************************************************************
/////////////////Chuong trinh quet LED7 dung timer khong dung delay/////////////
**********************************************************/
void Led7segment( unsigned char day_d,month_d,year_d,day_a,month_a,year_a,date,
Temp,hrs,min,sec )
{
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 112
StSet++;if(StSet>=200) StSet=0;
Switch(Number)
{
case 1:{
if(StNumber==1){if(StSet<=70) {OutLed(0);break;}}
if(day_d<10) OutLed(0); //tat so 0
else OutLed(CharCode[day_d/10]);
break;
};
case 2:{
if(StNumber==1){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[day_d%10]);
break;
};
case 3:{
if(StNumber==2){if(StSet<=70) {OutLed(0);break;}}
if(month_d<10) OutLed(0);//tat so 0
else OutLed(CharCode[month_d/10]);
break;
};
case 4:{
if(StNumber==2){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[month_d%10]);
break;
};
case 5:{
if(StNumber==3){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[year_d/10]);
break;
};
case 6:{
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 113
if(StNumber==3){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[year_d%10]);
break;
};
case 7:{
//if(StNumber==4){if(StSet<=200) {OutLed(0xff);break;}}
if(day_a<10) OutLed(0);//tat so 0
else OutLed(CharCode[day_a/10]);
break;
};
case 8:{
//if(StNumber==4){if(StSet<=200) {OutLed(0xff);break;}}
OutLed(CharCode[day_a%10]);
break;
};
case 9:{
//if(StNumber==5){if(StSet<=200) {OutLed(0xff);break;}}
if(month_a<10) OutLed(0);//tat so 0
else OutLed(CharCode[month_a/10]);
break;
};
case 10:{
//if(StNumber==5){if(StSet<=200) {OutLed(0xff);break;}}
OutLed(CharCode[month_a%10]);
break;
};
case 11:{
//if(StNumber==6){if(StSet<=200) {OutLed(0xff);break;}}
OutLed(CharCode[year_a/10]);
break;
};
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 114
case 12:{
//if(StNumber==6){if(StSet<=200) {OutLed(0xff);break;}}
OutLed(CharCode[year_a%10]);
break;
};
case 13:{
if(StNumber==4){if(StSet<=70) {OutLed(0);break;}}
if(date==1) OutLed(0X39);//ngay CN hien thi chu C
else OutLed(0x78); //hien thi chu t
break;
};
case 14:{
if(StNumber==4){if(StSet<=70) {OutLed(0);break;}}
if(date==1) OutLed(0x37);//ngay CN hien thi chu n
else OutLed(CharCode[date%10]);
break;
};
case 15:{
//if(StNumber==8){if(StSet<=200) {OutLed(0xff);break;}}
if(Temp<10) OutLed(0);//tat so 0
else OutLed(CharCode[Temp/10]);
break;
};
case 16:{
//if(StNumber==8){if(StSet<=200) {OutLed(0xff);break;}}
OutLed(CharCode[Temp%10]);
break;
};
case 17:{
if(StNumber==5){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[hrs/10]);
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 115
break;
};
case 18:{
if(StNumber==5){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[hrs%10]);
break;
};
case 19:{
if(StNumber==6){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[min/10]);
break;
};
case 20:{
if(StNumber==6){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[min%10]);
break;
};
case 21:{
if(StNumber==7){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[sec/10]);
break;
};
case 22:{
if(StNumber==7){if(StSet<=70) {OutLed(0);break;}}
OutLed(CharCode[sec%10]);
};
}
}
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 116
/**************************************************************
/////////////////Chuong trinh chuyen doi ADC doc nhiet do tu LM35///////////////
**************************************************************/
unsigned char ADC_Convert()
{ int16 Value;
Value=read_adc();
Value=(FLOAT)((Value*500)/1023);
return((char)Value); //tra ve gia tri do C
}
/***************************************************************
///////////////////////Chuong trinh am lich Viet Nam////////////////////////////
***************************************************************/
void VietNam_Calendar(unsigned char day_1,mon_1,year_1)
{
unsigned char luu,tam_1;
unsigned char da,db;
unsigned char lmon;
if(year_1<=30) //cho phep den nam 2030
{
da = ALdauthangDL[year_1-10][mon_1-1];
db = DLdauthangAL[year_1-10][mon_1-1];
luu= db-day_1;
if(luu<=0)
{
day_a = (day_1-db+1);
month_a = thangALdauthangAL[year_1-10][mon_1-1];
}
else
{
if(luu>31){day_a = (day_1-db+1);
month_a = thangALdauthangDL[year_1-10][mon_1];}
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 117
else
{
day_a = (day_1+da-1);
month_a = thangALdauthangDL[year_1-10][mon_1-1];
}
}
lmon = month_a;
tam_1=mon_1-lmon;
if(tam_1>100&&tam_1<255)
year_a = (year_1-1);
else year_a = year_1;
}
}
//!void VietNam_Calendar(unsigned char day,month,year)
//!{
//! char da,db;
//! if(year<=30) //cho phep den nam 2030
//! {
//! da = ALdauthangDL[year-10][month-1];
//! db = DLdauthangAL[year-10][month-1];
//! if(db <= day){
//! day_a = day-db+1;
//! month_a = thangALdauthangAL[year-10][month-1];
//! } else {
//! day_a = (day_d+da-1);
//! month_a =thangALdauthangDL[year-10][month-1];
//! }
//! if(month < day_a)
//! year_a = year-1;
//! else
//! year_a = year;
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 118
//! }
//!}
/*************************************************************
///////////////////////Chuong trinh Xuat data ra PORTD//////////////////////////
************************************************************/
void OutLed(unsigned char data)
{
PORTD = data;
}
char key(char data, char never)
{
//Cho phep tang ngay,thang,nam,thu
if((!Up)&&(StNumber<=4)){
delay_ms(300);
data++;
if(data>never) data=1;
}
//Cho phep tang gio,phut,giay
if((!Up)&&(StNumber>4)){
delay_ms(300);
data++;
if(data>never) data=0;
}
//Cho phep giam ngay,thang,nam,thu
if((!Down)&&(StNumber<=4)){
delay_ms(300);
if(data>1) data--;
}
//Cho phep giam ngay,thang,nam,thu
if((!Down)&&(StNumber>4)){
delay_ms(300);
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 119
(signed)data--;
if(data<0) data=never;
}
//thoat ra menu cai dat
if(!ESC){
while(!ESC){;};
StNumber=0;
break;
}
VietNam_Calendar(day_d,month_d,year_d);
return(data);
}
void Set_time()
{
switch(StNumber)
{
//restart_WDT(); //WDT
case 1:{
day_d=key(day_d,31);
if((!Enter))
{
while(!Enter){;};
ds1307_set_date(day_d,month_d,year_d,date);
delay_ms(500);
StNumber++;
}
break;
};
case 2:{
month_d=key(month_d,12);
if((!Enter))
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 120
{
while(!Enter){;};
ds1307_set_date(day_d,month_d,year_d,date);
delay_ms(500);
StNumber++;
}
break;
};
case 3:{
year_d=key(year_d,30);
if((!Enter))
{
while(!Enter){;};
ds1307_set_date(day_d,month_d,year_d,date);
delay_ms(500);
StNumber++;
}
break;
};
case 4:{
date=key(date,7);
if((!Enter))
{
while(!Enter){;};
ds1307_set_date(day_d,month_d,year_d,date);
delay_ms(500);
StNumber++;
}
break;
};
case 5:{ disable_interrupts(INT_TIMER1);
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 121
hrs=key(hrs,24);
if((!Enter))
{
while(!Enter){;};
ds1307_set_time(hrs,min,sec);
delay_ms(500);
StNumber++;
}
break;
};
case 6:{ disable_interrupts(INT_TIMER1);
min=key(min,59);
if((!Enter))
{
while(!Enter){;};
ds1307_set_time(hrs,min,sec);
delay_ms(500);
StNumber++;
}
break;
};
case 7:{ disable_interrupts(INT_TIMER1);
sec=key(sec,59);
if((!Enter))
{
while(!Enter){;};
ds1307_set_time(hrs,min,sec);
delay_ms(500);
StNumber=255;
}
break;
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 122
};
case 255:{
enable_interrupts(INT_TIMER1);
dsec=10; //update time
StNumber=0;
break;
}
}
}
void Setup()
{
StNumber=1;
while(StNumber!=0)
{
//restart_WDT(); //WDT
if(!Enter){
while(!Enter){;}
if(StNumber<10)StNumber++;
}
if(!MenuDown){
while(!MenuDown){;};
if(StNumber>1)StNumber--;
}
if(!ESC){
while(!ESC){;};
StNumber=0;
break;
}
Set_time();
}
ds1307_get_date(day_d,month_d,year_d,date);
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 123
VietNam_Calendar(day_d,month_d,year_d);
}
/***********************************************************
/////////////////////////////Chuong trinh chinh ////////////////////////////////
**************************************************************/
#zero_ram
void main()
{
Sys_init();
Program_init();
while(TRUE)
{
restart_WDT(); //WDT
if(!Enter) {while(!Enter){;}; Setup();}
//if(StEn) {Setup();};
}
}
void Sys_init()
{
TRISA=0X01;
TRISB=0X3F;
TRISD=0X00;
TRISE=0X00;
setup_adc_ports(AN0); //AN0 =ADC 10bit
setup_adc(ADC_CLOCK_DIV_32);//
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_bit);//3.2 ms overflow
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); //104 ms overflow flow
//setup_wdt(WDT_ON);
//setup_wdt(WDT_1152MS);
enable_interrupts(GLOBAL);
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 124
}
void Program_init()
{
ds1307_init(0,0,0); // initialize 1307
//ds1307_set_date_time(31,6,13,2,23,59,55);
//ds1307_set_date(1,1,13,3);
delay_ms(100);
ds1307_get_date(day_d,month_d,year_d,date);
ds1307_get_time(hrs,min,sec);
VietNam_Calendar(day_d,month_d,year_d);
Temp=ADC_convert();
delay_ms(200);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
}
BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ
Trang 125
TÀI LIỆU THAM KHẢO
[1] Khoa Điện – Điện Tử – Vi Xử Lý – Trường Cao Đẳng Giao Thông Vận Tải
[2] Hoàng Đức Hải – Họ vi điều khiển 8051 - NXB Lao Động Xã Hội -2007
[3] Phạm Thanh Liêm – Giáo trình Cấu trúc máy vi tính và vi xử lý - NXB GD –
2006
[4] Lê Hải Sâm – Giáo trình Cấu trúc máy vi tính và vi xử lý - NXB GD – 2006
[5] Hệ vi điều khiển 8051-NXB Lao động & Xã Hội, 2001. (Bản dịch quyển “The
8051 Microcontroller”, I.Scott Mackenzie, NXB Prentice Hall ( 2nd Ed.) 1995
[6] Ngô Diên Tập, Vi điều khiển với lập trình C, NXB KH&KT, 2006.
[7] Nguyễn Đình Phú, Vi Xử Lý 2, Trường ĐH SPKT TP.HCM - 2007
[8] Phụ lục kỹ thuật vi xử lý (tham khảo cho hệ vi điều khiển 8051), Bộ môn Kỹ
thuật điện tử – Đại học Bách khoa TP HCM.
[9] Bài thí nghiệm vi xử lý (hệ vi điều khiển 8051) , Bộ môn Kỹ thuật điện tử – Đại
học Bách khoa TP HCM.
[10] Martin Bates – Picmicrocontrollers an introduction to microelectronics, NXB
Elsevier Linacre House – 2004.
[11] Các trang web tham khảo:
Các file đính kèm theo tài liệu này:
- bai_giang_thi_nghiem_vi_xu_ly_trinh_do_cao_dang_nguyen_thi_t.pdf