Professional Documents
Culture Documents
Lớp : 20DOTC1
www.hutech.edu.vn
TRANG 1|🢖 THỰC HÀNH XỬ LÝ TÍN HIỆU SỐ
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
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.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();
}
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();
}
}
Giải thích:
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.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
21
BÀI 1: ĐIỀU KHIỂN CÁC THIẾT BỊ CƠ BẢN
22
Timer:
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);
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)
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