You are on page 1of 30

BỘ GIÁO DỤC VÀ ĐÀO TẠO

ĐẠI HỌC CÔNG NGHỆ TP.HCM

BÁO CÁO THỰC HÀNH VI ĐIỀU KHIỂN

Giáo viên hướng dẫn: Hồ Nhựt Minh

Họ và tên : Nguyễn Văn Bình Mssv: 2011250920

: Đinh Huỳnh Ngọc Hiệp Mssv: 2011253133

: Nguyễn Anh Văn Mssv:2011253022

Lớp : 20DOTC1

Ngành: Công nghệ Kỹ thuật Ô tô

Khoa : Viện Kỹ Thuật

www.hutech.edu.vn
TRANG 1|🢖 THỰC HÀNH XỬ LÝ TÍN HIỆU SỐ

BÁO CÁO THỰC HÀNH VI ĐIỀU KHIỂN


Ấn bản 2018

1
TRANG 1 > THỰC HÀNH XỬ LÝ TÍN HIỆU SỐ

MỤC LỤC
MỤC LỤC 1
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN 2
BÀI 2: TIMER VÀ NGẮT 4
BÀI 3: ADC VÀ PWM 5

1
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
2

BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN

LED ĐƠN:

Bài 1.2. Sửa chương trình để nhấp nháy 2 Led D1 và D8 vô hạn, thời gian delay
500ms.
#include <16F877A.h>
#FUSES NOWDT, HS, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay (clock=8000000)
#define LED1 PIN_D0
#define LED4 PIN_D7
#define LED2 PIN_D6
#define LED3 PIN_D5
void main()
{
3 BÀI 2: TIMER VÀ NGẮT

while(TRUE)
{
output_high(LED1); delay_ms(500);
output_high(LED4); delay_ms (500);
output_low (LED1); delay_ms(100);
output_low (LED4); delay_ms(100);
output_high(LED2); delay_ms(500);
output_high(LED3); delay_ms (500);
output_low (LED2); delay_ms(100);
output_low (LED3); delay_ms(100);
}
}

Bài 1.3. Sửa chương trình để nhấp nháy 4 Led D1 – D4 vô hạn, thời gian delay 1s.
Chương trình:

3
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
4

Giải thích: Hiện tượng, Đèn D1,D2,D3,D4 sang còn lại tắt.
Khai báo port C output_c(0x0F) xuất port C chân RC0, RC1, RC2, RC3 sáng.
Delay_ms(1000) đèn sáng, tắt trong 1s.
Output_c (0x00) khai báo port C tất cá chân ở port C đều tắt.
Đặt trong vòng lặp while vô hạn.

Bài 1.4. Sửa chương trình để Led sáng dần từ D1 – D8, thời gian delay 300ms, lặp
lại vô hạn lần.
Chương trình:

Giải thích: Hiện tượng led sáng dần d1-d8 sau đó sáng vô hạn
Khai báo const, unsigned; int 8 h ; int8 i; void main
Vòng lặp for
Xuất output_c (maledsangdan[i]) ; thời gian delay_300(ms)

Bài 1.5. Sửa chương trình để Led sáng dần từ D1 – D8, thời gian delay 300ms, lặp lại 30 lần.
Chương trình:
5 BÀI 2: TIMER VÀ NGẮT

Giai thích:
Bài 1.6. Sửa chương trình để Led sáng dần từ D1 – D8, thời gian delay 300ms, lặp lại 30 lần, sau
đó tắt dần từ D1 – D8, lặp lại 257 lần.

Giải thích : Led sáng dần từ d1-d8 30 lần sau đó tắt dần từ d1-d8

5
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
6

Bài 1.7. Sửa chương trình để Led sáng dần từ D1 – D8, thời gian delay 300ms, lặp lại 30 lần,
sau đó tắt dần từ D1 – D8, lặp lại 257 lần. Lặp lại toàn bộ quá trình 40 lần.
Chương trình:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000)
int8 h,i,j,x;
void main()
{
for(h=0;h<40;h++)
{
set_tris_c(0x00);
for(j=0;j<30;j++)
{
x = 0x00;
output_c(x);
delay_ms(300);
for(i=0;i<8;i++)
{
x=(x<<1)+0x01;
output_c(x);
delay_ms(300);
}
output_c(0x00);
delay_ms(300);
}
for(j=0;j<257;j++)
{
x=0xff;
output_c(x);
delay_ms(300);
7 BÀI 2: TIMER VÀ NGẮT

for(i=0;i<8;i++)
{ x=(x<<1);
output_c(x);
delay_ms(300);
giải thích : sáng dần từ D1-D8 sau đó tắt dần từ D1-D8

Bài 1.8. Vẽ lại sơ đồ mạch trong đó D1, D3, D5, D7 tích cực mức 1, 4 Led còn lại
tích cực mức 0. Viết lại chƣơng trình như bài 1.7.
Sơ đồ mạch:

Chương trình:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
int a[9]={0xAA,0xAB,0x0A9,0xAD,0xA5,0xB5,0x95,0xD5,0X55};
int b[9]={0X55,0x54,0x56,0x52,0x5A,0x4A,0x6A,0x2A,0xAA};
int i,k,m;
Void main()
{
for(m=0;m<40;m++)
{
for(k=0;k<30;k++)

7
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
8

{
for(i=0;i<9;i++)
{
output_c(a[i]);
delay_ms(300);
}
}
for(k=0;k<257;k++)
{
for(i=0;i<9;i++)
{
output_c(a[i]);
delay_ms(300);
}
}
}
}

Bài 1.9. Vẽ lại sơ đồ mạch trong đó D1, D3, D5, D7 tích cực mức 1, 4 Led còn lại tích cực mức 0,
sơ đồ kết nối như bảng. Viết lại chương trình như bài 1.7.
Sơ đồ mạch:
9 BÀI 2: TIMER VÀ NGẮT

Chương trình:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
int a[9]={0x17,0x57,0x47,0x4F,0x4E,0xCE,0xCC,0xEC,0XE8};
int b[9]={0XE8,0xA8,0xB8,0xB0,0xB1,0x31,0x33,0x13,0x17};
int i,k,m;
Void main()
{
for(m=0;m<40;m++)
{
for(k=0;k<30;k++)
{
for(i=0;i<9;i++)
{
output_c(a[i]);
delay_ms(300);
}

9
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
10

}
for(k=0;k<257;k++)
{
for(i=0;i<9;i++)
{
output_c(a[i]);
delay_ms(300);
}
}
}
}

LED 7 ĐOẠN :

Bài 1.10 Thực hiện đoạn chương trình sau :


11 BÀI 2: TIMER VÀ NGẮT

Bài 1.11. Viết chương trình hiện số từ 0 – 9 trên Led1, thời gian delay 400 ms.
Chương trình:

11
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
12

Giải thích:
Khai báo char led7doan[10] ; void quet_LED.
Output_d(0xff) xuất port D; thời gian delay_ms(400).
Vòng lặp while.
Bài 1.12. Viết chương trình hiện số 12.34 trên 4Led, thời gian quét led 3 ms.
Chương trình:

Giải thích:
13 BÀI 2: TIMER VÀ NGẮT

Bài 1.13. Viết chương trình hiện chữ StOP trên 4Led, thời gian quét led 3 ms.

Giải thích:

Bài 1.14. Viết chương trình hiện chữ StAr trên 4Led trong 5s, thời gian quét led 3ms. Sau đó
hiện chữ StOP trên 4Led.

Giải thích:

13
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
14

Bài 1.15. Viết chương trình hiện các Led đơn sáng dần từ D1 – D8, thời gian delay 300ms, lặp lại
8 lần đồng thời hiện số lần lặp trên Led7 đoạn 4.
Chương trình:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
int led[8]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
int led7s[8]={0x9F,0X25,0x0D,0x99,0x49,0x41,0x1F,0x01};
int i=0;
int l=0;
int k=0;
Void qled()
{
FOR (i = 0; i < 8; i++)
{
output_c (0x00);
output_c (led[i]);
delay_ms (20);
}
}
Void qled7s()
{
output_d (0xff);
output_b (led7s[k]);
output_d (0xfe);
delay_ms (10);
}
Void main ()
{
output_d (0xfe);
output_b (0x03);
FOR (l = 0; l < 8; l++)
{
k = l;
qled7s ();
qled ();
}
}

Bài 1.16. Viết chương trình hiện các Led đơn sáng dần từ D1 – D8, thời gian delay 300ms, lặp lại
30 lần đồng thời hiện số lần lặp trên Led7 đoạn 3, 4.
15 BÀI 2: TIMER VÀ NGẮT

#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
int led[9]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
int led7s[10]={0x03,0x9F,0X25,0x0D,0x99,0x49,0x41,0x1F,0x01,0X09};
int i=0;
int l=0;
int dem=0;
int chuc,dvi;
Void qled ()
{
for(l=0;l<31;l++)
{
chuc=l/10;
dvi=l%10;
for(i=0;i<9;i++)
{
output_c(led[i]);
delay_ms(300);
output_d(0xff);
output_b(led7s[chuc]);
output_d(0xfc);
delay_ms(10);
output_d(0xff);
output_b(led7s[dvi]);
output_d(0xfe);
delay_ms(10);
}
}
}
Void main()
{
qled();
}

Công tắc nhấn

15
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
16

Bài 1.17:
#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
#define D5 PIN_C4
#define D6 PIN_C5
#define SW1 PIN_B4
#define SW2 PIN_B5
void nutnhan()
{
if(!input(SW1))
{
delay_ms(10);
output_high(D5);
}
if(!input(SW2))
{delay_ms(10);
output_low(D5);
}
}
void main ()
{
while(1)
{
nutnhan();
}
}

Bài 1.18. Viết chương trình kiểm tra SW


như sau:
- Nhấn SW1: D5 tắt trong khi D6 sáng/tắt
vô hạn; thời gian delay 200 ms.
- Nhấn SW2: D6 tắt trong khi D5 sáng/tắt vô
hạn; thời gian delay 500 ms.
17 BÀI 2: TIMER VÀ NGẮT

Giải thích:

Bài 1.19. Viết chương trình kiểm tra SW như sau:


- Nhấn SW1: D5 tắt trong khi D6 sáng/tắt vô hạn; thời gian delay 200 ms.
- Nhấn SW2: D6 tắt trong khi D5 đổi trạng thái khi đã nhấn SW2 3 lần.

Giải thích:

LCD
Bài 1.21. Viết chương trình hiển thị chữ: “Counter:” trên dòng 1 và số đếm từ 00– 99 trên dòng 2
từ tọa độ (x,y) = (10,2); thời gian delay để tăng số đếm là 300 ms.
Chương trình:

17
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
18

Bài 1.22. Viết chương trình thực hiện:


- Nhấn SW1: hiển thị chữ “Xin chao cac ban!” trên dòng 01 LCD tại (x,y) =(1,1)
- Nhấn SW2: hiển thị chữ “HUTECH” trên dòng 02 tại (x,y) = (10,2)
19 BÀI 2: TIMER VÀ NGẮT

Bài 1.23. Viết chương trình thực hiện:


Viết chương trình thực hiện: hiển thị chữ “Set value:” trên dòng 1 tại (x,y) = (5,1) và hiển thị biến
set_val (khởi động = 0) trên dòng 2 tại (x,y) = (8,2); và nếu:
Nhấn SW1: nếu set_val < 200: set_val = set_val + 5
Nhấn SW2: Nếu set_val > 0: set_val = set_val -1
Nội dung thay đổi của set_val đƣợc cập nhật tức thời trên dòng 2 LCD tại vị trí (x,y) = (8,2).

Bài 1.24. Viết chương trình đồng hồ đếm giây: tại (1,1) hiển thị “DONG HO DEM GIAY”, tại
(4,2) hiển thị “00:00”, và khi:
Nhấn SW1: bắt đầu đếm “giây : phần trăm giây”
Nhấn SW2: dừng đếm
Nhấn giữ SW2 hơn 5 giây sẽ xóa số đếm về 0
Chương Trình:
#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
#include <lcd.c>
#define SW1 PIN_C3
#define SW2 PIN_C4
int8 SW=0;
int8 giay=0, ptgiay=0;

19
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
20

int i=0;
void main()
{
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"DONG HO DEM GIAY");
while(TRUE)
{
lcd_gotoxy(4,2);
printf(lcd_putc,"%02u:%02U",giay,ptgiay);
if(!input(SW1)) SW=1;
if(!input(SW2)) SW=2;
switch(SW)
{
case 1:
{
delay_ms(10); ptgiay++;
if(ptgiay==100)
{
ptgiay=0;
giay++;
}
lcd_gotoxy(4,2);
printf(lcd_putc,"%02u:%02U",giay,ptgiay);
break;
}
case 2:
{
break;
}
}
}
}

Bài 1.25. Viết chương trình thực hiện: hiển thị chữ “DONG HO” trên dòng 1 tại (4,1) và hiển thị
“giờ:phút:giây” tại (6,2); thời gian bắt đầu là “00:00:00” và nếu:
Nhấn SW1: cho phép chỉnh giờ (0-23)
Nhấn SW2: cho phép chỉnh phút (0-59)
Chương trình:
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, PROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8000000)
#include <lcd.c>
#define sw1 pin_C3
21 BÀI 2: TIMER VÀ NGẮT

#define sw2 pin_C4


int8 gio,phut,giay;
void main()
{ lcd_init();
set_tris_d(0x00);
output_d(0x00);
while(true)
{for( gio=0;gio<24;gio++)
{ for( phut=0;phut<60;phut++)
{ for(giay=0; giay<60;giay++)
{ lcd_gotoxy(4,1);
printf(lcd_putc,"DONG HO");
lcd_gotoxy(6,2);
printf(lcd_putc,"%02d:%02d:%02d",gio,phut,giay);
delay_ms(1000);
if(!input(sw1))
{gio++;}
if(!input(sw2))
{phut++;}
}
giay=0;
}
phut=0;
}
gio=0;
}
}

21
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
22

BÀI 2: TIMER VÀ NGẮT

Timer:

Bài 2.1. Chương trình:


#include <16F877A.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=8M)
int i;
void delay400ms()
{
Setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
For( i = 0;i < 10;i++)
{
Set_timer1(25536);
while (get_timer1()>25536);
}
}
void main(void)
{
while(1)
{
23 BÀI 2: TIMER VÀ NGẮT

Output_c(0x01);
delay400ms();
Output_c(0x00);
delay400ms();
}
}
Bài 2.2. Thực hiện lại bài 2.1 với delay400ms dùng timer 0 có cấu hình như sau:
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);

Giải thích: Hiện tượng chỉ có đèn D1 sáng.


Khai báo: int8 i; thời gian delay 400ms
Output_c(0x01): khai báo port C đèn 1 sáng.
Output_c(0x00): khai báo port C. tất cả đèn đều tắt
i<800 :
Set_timer0(6): dùng timer 0
Thời gian ngắt:
Setup_timer_0(RTCC_DIV_4|RTCC_INTERNAL)
ftimer0 = 8Mhz / (4*4) = 0,5 MHz
T= 1/ ftimer0= 1/ 0,5 = 2 us
23
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
24

RTCC_DIV_4 = 4 * 2 = 8us
250us <=> 1 xung ; 800 us  256 xung
Vậy thời gian ngắt là 800 us

NGẮT TIMER
Bài 2.4. Dùng ngắt timer 0 để quét led, thời gian quét led là 2 ms.
Sử dụng: Setup_timer_0(RTCC_DIV_64|RTCC_INTERNAL)

Tính thời gian ngắt:


Setup_timer_0(RTCC_DIV_64|RTCC_INTERNAL)
F=FOSC / 4 = 8Mhz /4 =2 Mhz
T= 1/f =0,5 us
RTCC_DIV_64 = 64 *0,5 = 32us
32us <=> 1 xung ; 8192 us  256xung
Vậy thời gian ngắt là 8192 us

Giải thích: Khai báo: int16 dem; int tram, chuc, donvi; const unsigned char led7s[10]
25 BÀI 2: TIMER VÀ NGẮT

; int_timer0; void_qled
output_d(0xff)
output_b(LED7s[tram]; output_low(PIN_D2): xuất ; thời gian delay_ms(3)
Enable_interrupts (GLOBAL)
Enable_interrupts (INT_TIMER0)
Setup_timer_0( ): dùng timer 0

Bài 2.5. Dùng ngắt timer 1 để quét led, thời gian delay mỗi led là 3 ms.
Sử dụng: Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1)
Chương trình:
#include <16f877a.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay (clock=8M)
#define SW1 PIN_C3
#define SW2 PIN_C4
#include <lcd.c>
int gio, phut, giay;
int flag;
void main()
{
int giay,ptgiay;
lcd_init();
set_tris_d(0x00);
output_d(0x00);
int16 dem;
gio=0;
phut=0;
giay=0;
flag=1;
while(1)
{

25
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
26

lcd_gotoxy(4,1);
printf(lcd_putc,"DONG HO");
delay_ms(3);
while(flag==1)
{
lcd_gotoxy(6,2);
printf(lcd_putc,"%02u:%02u:%02u",gio,phut,giay);
delay_ms(1000);
giay=giay+1;
if(giay==60)
{
phut=phut+1;
giay=0;
}
if(phut==60)
{
gio=gio+1;
phut=0;
}
if(gio==24)
{
gio=0;
phut=0;
giay=0;
}
if(!input(SW1)||!input(SW2))
{
flag=0;
break;
}
}
while(!input(SW1))
27 BÀI 2: TIMER VÀ NGẮT

{
delay_ms(200);
gio=gio+1;
if(gio==24)
gio=0;
lcd_gotoxy(6,2);
printf(lcd_putc,"%02u:%02u:%02u",gio,phut,giay);
delay_ms(1);
}
while(!input(SW2))
{
delay_ms(200);
phut=phut+1;
if(phut==60)
phut=0;
lcd_gotoxy(6,2);
printf(lcd_putc,"%02u:%02u:%02u",gio,phut,giay);
delay_ms(1);
}
flag=1;
}
}

27
BÀI 3: ADC VÀ PWM
28

You might also like