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

Bài tập bộ môn Thực tập vi xử lý (có lời giải) Phần 1 DH SPKT HCM

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 (641.01 KB, 17 trang )

Bộ môn Thực tập vi xử lý
Trường đại học Sư Phạm Kỹ Thuật thành phố Hồ Chí Minh
Một số bài tập vi xử lý có lời giải
Phần 1
(Lưu ý: Code được trình bày từ trên xuống dưới và từ trái qua phải)
Bài 1: Hãy viết chương trình điều khiển 8 led đơn của mạch điện sáng dần và tắt
dần từ trên xuống dưới, sau đó sáng dần và tắt dần từ dưới lên trên.

Code:
#INCLUDE <16F887.H>
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK = 20M)
UNSIGNED INT8 I, X;
VOID MAIN()

FOR(I=8;I>0;I--) //Sang dan tu duoi len tren
{
X = (X>>1)+0X80; //1111 1111
OUTPUT_D(X);
DELAY_MS(200);


{
SET_TRIS_D(0X00);
X = 0X00;
OUTPUT_D(X);
DELAY_MS(200);
WHILE(TRUE)
{
FOR(I=0;I<8;I++) //Sang dan tu tren xuong duoi
{


X = (X<<1)+0X01; // 1111 1111
OUTPUT_D(X);
DELAY_MS(200);
}
FOR(I=0;I<8;I++) //Tat dan tu tren xuong duoi
{
X = (X<<1)+0X00; // 0000 0000
OUTPUT_D(X);
DELAY_MS(200);
}

}
FOR(I=8;I>0;I--) //Tat dan tu duoi len tren
{
X = (X>>1)+0X00; //0000 0000
OUTPUT_D(X);
DELAY_MS(200);
}
}
}


Bài 2: Một nút nhấn RA0: - Nhấn (không giữ) nút nhấn nối với chân RA0 lần
(2n+1) : 8 led sáng dần từ trên xuống dưới. - Nhấn (không giữ) nút nhấn nối với
chân RA0 lần (2n) : 8 led sáng dần từ dưới lên.
(Lưu ý: Bài tập này không sử dụng ngắt ngoài)

Code:
#INCLUDE <16F887.H>
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP

#USE DELAY(CLOCK = 20M)
UNSIGNED INT8 I, X, DEM;
#DEFINE NUT PIN_A0
VOID CHAY()
{
IF(DEM%2==0)
{
SET_TRIS_D(0X00);
X = 0X00;
OUTPUT_D(X);
FOR(I=8;I>0;I--) //ON
{
X = (X>>1)+0X80;
OUTPUT_D(X);
DELAY_MS(200);

VOID MAIN()
{
DEM = 0;
SET_TRIS_D(0X00);
X = 0X00;
OUTPUT_D(X);
DELAY_MS(200);
WHILE(TRUE)
{
IF(!INPUT(NUT))
{
DELAY_MS(20);
IF(!INPUT(NUT))
{

DEM++;
}
}


}
}
IF(DEM%2!=0)
{
SET_TRIS_D(0X00);
X = 0X00;
OUTPUT_D(X);
FOR(I=0;I<8;I++) //ON
{
X = (X<<1)+0X01;
OUTPUT_D(X);
DELAY_MS(200);
}
}
DELAY_MS(200);
}

CHAY();
}
}


Bài 3: Viết chương trình đọc nút nhấn key1, key2, key3. Nhấn nút key1 3 led L1,
L2, L3 sáng. Nhấn nút key2 3 led tắt. Nhấn key3 thì 3 led đang sáng thì chuyển
sang tắt và ngược lại. Yêu cầu có chống dội.


Code:
#INCLUDE <16F887.H>
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK = 20M)
UNSIGNED INT8 I, X;
#DEFINE KEY1 PIN_C0
#DEFINE KEY2 PIN_C1
#DEFINE KEY3 PIN_C2
INT1 TT_KEY3;
VOID NUTNHAN1()
{
//KEY1 NHÂN 3 LED SÁNG
IF(!INPUT(KEY1))
{
DELAY_MS(20);
IF(!INPUT(KEY1))
{
OUTPUT_D(0XFF);
}
}
}
VOID NUTNHAN2()
{
//KEY2 NHÂN 3 LED TAT

VOID NUTNHAN3()
{
//NUT KEY3 NHÂN CHUYEN TRANG THAI TU
TAT-->SANG VÀ SANG-->TAT

IF(!INPUT(KEY3))
{
DELAY_MS(10);
IF(!INPUT(KEY3))
{
TT_KEY3=~TT_KEY3;
IF(TT_KEY3==1)
{
OUTPUT_D(0X00);
}
IF(TT_KEY3==0)
{
OUTPUT_D(0XFF);
}
}
}
}
VOID MAIN()
{


IF(!INPUT(KEY2))
{
DELAY_MS(20);
IF(!INPUT(KEY2))
{
OUTPUT_D(0X00);
}
}


SET_TRIS_D(0X00);
X = 0X00;
I = 0X00;
OUTPUT_D(X);
DELAY_MS(200);
WHILE(TRUE)
{
NUTNHAN1();
NUTNHAN2();
NUTNHAN3();
}

}

}


Bài 4: Viết chương trình điều khiển led theo yêu cầu sau :
Nhấn (không giữ) nút nhấn nối với chân RA0 : led 1 và led 2 chớp tắt xen kẽ trong
thời gian T=0.2(s).
Nhấn (không giữ) nút nhấn nối với chân RA1 : led 1 và led 2 cùng chớp tắt trong
thời gian T=0.5(s).
Nhấn (không giữ) nút nhấn nối với chân RA2 : led 1 sáng và led 2 tắt trong thời
gian T=0.1(s) , led 1 tat và led 2 sáng T=0.7(s).
(Lưu ý: Bài tập này không sử dụng ngắt ngoài)

Code:
#INCLUDE <16F887.H>
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK = 20M)

UNSIGNED INT8 I,X,C;
#DEFINE N1 PIN_A0
#DEFINE N2 PIN_A1
#DEFINE N3 PIN_A2
VOID CHONGDOINUT1()

VOID MAIN()
{
SET_TRIS_D(0X00);
X = 0X00;
I = 0X00;
C = 0;
OUTPUT_D(X);
DELAY_MS(200);


{

WHILE(TRUE)
{
CHONGDOINUT1();
CHONGDOINUT2();
CHONGDOINUT3();
IF(C==1)
{
OUTPUT_HIGH(PIN_D0);
OUTPUT_LOW(PIN_D1);
DELAY_MS(200);
OUTPUT_HIGH(PIN_D1);
OUTPUT_LOW(PIN_D0);

DELAY_MS(200);
CHONGDOINUT1();
CHONGDOINUT2();
CHONGDOINUT3();
}
IF(C==2)
{
OUTPUT_D(0X00);
DELAY_MS(500);
OUTPUT_D(0XFF);
DELAY_MS(500);
CHONGDOINUT1();
CHONGDOINUT2();
CHONGDOINUT3();
}
IF(C==3)
{
OUTPUT_HIGH(PIN_D0);
OUTPUT_LOW(PIN_D1);
DELAY_MS(100);
OUTPUT_HIGH(PIN_D1);
OUTPUT_LOW(PIN_D0);
DELAY_MS(700);
CHONGDOINUT1();
CHONGDOINUT2();
CHONGDOINUT3();
}
}

IF(!INPUT(N1))

{
DELAY_MS(20);
IF(!INPUT(N1))
{
C=1;
}
}
}
VOID CHONGDOINUT2()
{
IF(!INPUT(N2))
{
DELAY_MS(20);
IF(!INPUT(N2))
{
C=2;
}
}
}
VOID CHONGDOINUT3()
{
IF(!INPUT(N3))
{
DELAY_MS(20);
IF(!INPUT(N3))
{
C=3;
}
}
}


}


Bài 5: Viết chương trình điều khiển LED L1, L2, L3 (trên PIC board) theo yêu cầu
sau: L1 và L2 cùng chớp tắt với chu kì 4s (2s sáng, 2s tắt dùng hàm delay). Đọc
nút nhấn key1 (RB0), key2 (RB1). Nhấn nút key1 thì L3 sáng. Nhấn nút key2 L3
tắt. Yêu cầu sử dụng ngắt (IOCB).

Code:
#include<16f887.h>
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK = 20M)
void led1vs2()
{
output_high(pin_c0);
output_high(pin_c1);
delay_ms(2000);
output_low(pin_c0);
output_low(pin_c1);
delay_ms(2000);
}
#INT_RB
void nutnhan(void)
{
if(!input(pin_b0))
{
output_high(pin_c2);
}
if(!input(pin_b1))

{
output_low(pin_c2);
}
}

void main()
{
set_tris_d(0);
set_tris_c(0x00);
set_tris_b(0);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
while(true)
{
led1vs2();
}
}


Bài 6: Viết chương trình đọc giá trị điện áp ở chân AN0 và hiển thị lên LCD 16x2
theo yêu cầu sau : Hiển thị giá trị đọc ADC ở hàng 1 của LCD. Hiển thị giá trị điện
áp đo được ở hàng 2 của LCD.

Code:
#INCLUDE <16F887.H>
#device ADC=10
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK = 20M)
#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN

PIN_D1
#define LCD_RW_PIN
PIN_D2
#define LCD_DATA4
PIN_D4
#define LCD_DATA5
PIN_D5
#define LCD_DATA6
PIN_D6
#define LCD_DATA7
PIN_D7
#INCLUDE <LCD.C>
#define VREF_VREF
0x3000
//| Range VrefVref

VOID MAIN()
{
LCD_INIT();
SET_TRIS_D(0x00);
SETUP_ADC(ADC_CLOCK_INTERNAL);
Setup_adc_ports(SAN0|VREF_VREF);
DELAY_US(20);
SET_ADC_CHANNEL(0);
WHILE(TRUE)
{
B = DEM/85.25; // DEM/(1023/12)
DELAY_MS(2);
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"ADC=%04LU",DEM);



UNSIGNED INT16 DEM;
float B;

DELAY_MS(20);
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"GTDA=%2.2f V",B);
DELAY_MS(20);
}
}


Bài 7: Viết chương trình đọc giá trị điện áp ở chân AN0, RB0, RE0 và hiển thị lên
LCD 16x2 theo yêu cầu sau : Hiển thị giá trị đọc ADC ở hàng 1 của LCD. Hiển thị
giá trị điện áp đo được ở hàng 2 của LCD.

Code:
#INCLUDE <16F887.H>
#device ADC=10
#define VREF_VREF 0x3000 //| Range Vref-Vref
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK = 20M)
#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN
PIN_D1
#define LCD_RW_PIN
PIN_D2
#define LCD_DATA4
PIN_D4

#define LCD_DATA5
PIN_D5
#define LCD_DATA6
PIN_D6
#define LCD_DATA7
PIN_D7
#INCLUDE <LCD.C>
UNSIGNED INT16 A0,B0,B1;
float a,b,c;
VOID MAIN()

B0 = READ_ADC();
DELAY_MS(10);
set_adc_channel(5);
DELAY_MS(10);
B1 = READ_ADC();
DELAY_MS(2);
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"%04LU",A0);
LCD_GOTOXY(6,1);
PRINTF(LCD_PUTC,"%04LU",B0);
LCD_GOTOXY(11,1);
PRINTF(LCD_PUTC,"%04LU",B1);
a = A0/102.3;
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"%2.2f",a);


{


b = B0/102.3;
LCD_GOTOXY(6,2);
PRINTF(LCD_PUTC,"%2.2f",b);

LCD_INIT();
SET_TRIS_c(0x00);
SET_TRIS_D(0x00);
SETUP_ADC(ADC_CLOCK_DIV_32);

c = B1/102.3;
LCD_GOTOXY(11,2);
PRINTF(LCD_PUTC,"%2.2f",c);
DELAY_MS(20);

Setup_adc_ports(SAN0|SAN10|SAN5|VREF_VREF);
WHILE(TRUE)
{
set_adc_channel(0);
DELAY_MS(10);
A0 = READ_ADC();
set_adc_channel(12);

}
}


Bài 8: Viết chương trình sử dụng khối ADC của vi điều khiển PIC16F887 đo nhiệt
độ của 5 phòng và hiển thị lên LCD, sử dụng LM35 theo yêu cầu sau :
Nút RE0 là nút chuyển đổi giữa chế độ auto và manual
Ở chế độ manual:

RB0 ở mức 1 thì LCD hiển thị giá trị giá trị nhiệt độ của phịng 1.
RB1 ở mức 1 thì LCD hiển thị giá trị giá trị nhiệt độ của phòng 2.
RB2 ở mức 1 thì LCD hiển thị giá trị giá trị nhiệt độ của phịng 3.
RB3 ở mức 1 thì LCD hiển thị giá trị giá trị nhiệt độ của phòng 4.
RB4 ở mức 1 thì LCD hiển thị giá trị giá trị nhiệt độ của phòng 5.
Ở chế độ Auto:
Mỗi kênh đo trong khoảng thời gian 1s, định thời 1 giây chuyển kênh dùng Timer
T1.

Code:
#INCLUDE <16F887.H>
#device ADC=10
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP

void nutbam()
{
if(input(pin_B0)==1)


#USE DELAY(CLOCK = 20M)
#define LCD_ENABLE_PIN PIN_D3
#define LCD_RS_PIN
PIN_D1
#define LCD_RW_PIN
PIN_D2
#define LCD_DATA4
PIN_D4
#define LCD_DATA5
PIN_D5
#define LCD_DATA6

PIN_D6
#define LCD_DATA7
PIN_D7
#INCLUDE <LCD.C>
#BIT TMR1IF = 0x0C.0
#DEFINE nut PIN_E0
float nhietdo;
UNSIGNED INT8 i,a,TRAN;
UNSIGNED INT1 TT_nut;
void khoitao_ADC0()
{
setup_adc_ports(SAN0);//thiet lap
setup_adc(ADC_CLOCK_DIV_2);
set_adc_channel(0); //chon kenh 0
delay_us(100);//on dinh
}
void khoitao_ADC1()
{
setup_adc_ports(sAN1);//thiet lap
setup_adc(ADC_CLOCK_DIV_2);
set_adc_channel(1); //chon kenh 1
delay_us(100);//on dinh
}
void khoitao_ADC2()
{
setup_adc_ports(sAN2);//thiet lap
setup_adc(ADC_CLOCK_DIV_2);
set_adc_channel(2); //chon kenh 2
delay_us(100);//on dinh
}

void khoitao_ADC3()
{
setup_adc_ports(sAN3);//thiet lap
setup_adc(ADC_CLOCK_DIV_2);
set_adc_channel(3); //chon kenh 3
delay_us(100);//on dinh
}
void khoitao_ADC4()
{
setup_adc_ports(sAN4);//thiet lap
setup_adc(ADC_CLOCK_DIV_2);
set_adc_channel(4); //chon kenh 4
delay_us(100);//on dinh
}
void autorun()
{
IF (TMR1IF==1) // dem het 62500 = 0.1s
{
TMR1IF=0; SET_TIMER1(3036); TRAN++;

{
khoitao_ADC0();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);
printf(lcd_putc,"LM35: 01");
lcd_gotoxy(1,2);
printf(lcd_putc,"%f",nhietdo);
}
if(input(pin_B1)==1)
{

khoitao_ADC1();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);
printf(lcd_putc,"LM35: 02");
lcd_gotoxy(1,2);
printf(lcd_putc,"%f",nhietdo);
}
if(input(pin_B2)==1)
{
khoitao_ADC2();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);
printf(lcd_putc,"LM35: 03");
lcd_gotoxy(1,2);
printf(lcd_putc,"%f",nhietdo);
}
if(input(pin_B3)==1)
{
khoitao_ADC3();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);
printf(lcd_putc,"LM35: 04");
lcd_gotoxy(1,2);
printf(lcd_putc,"%f",nhietdo);
}
if(input(pin_B4)==1)
{
khoitao_ADC4();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);

printf(lcd_putc,"LM35: 05");
lcd_gotoxy(1,2);
printf(lcd_putc,"%f",nhietdo);
}
}
void main()
{
lcd_init();
SET_TRIS_D(0x00);
SET_TRIS_C(0x00);
SETUP_TIMER_1(T1_INTERNAL |
T1_DIV_BY_8);
SET_TIMER1(3036);
i=0;
while(TRUE)
{


}
IF (TRAN == 10)
{
TRAN=0;
i++;
if(i==1)
{
khoitao_ADC0();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);
printf(lcd_putc,"LM35: 01");
lcd_gotoxy(1,2);

printf(lcd_putc,"%f",nhietdo);
}
if(i==2)
{
khoitao_ADC1();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);
printf(lcd_putc,"LM35: 02");
lcd_gotoxy(1,2);
printf(lcd_putc,"%f",nhietdo);
}
if(i==3)
{
khoitao_ADC2();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);
printf(lcd_putc,"LM35: 03");
lcd_gotoxy(1,2);
printf(lcd_putc,"%f",nhietdo);
}
if(i==4)
{
khoitao_ADC3();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);
printf(lcd_putc,"LM35: 04");
lcd_gotoxy(1,2);
printf(lcd_putc,"%f",nhietdo);
}
if(i==5)

{
khoitao_ADC4();
nhietdo = read_adc()/2.046;
lcd_gotoxy(1,1);
printf(lcd_putc,"LM35: 05");
lcd_gotoxy(1,2);
printf(lcd_putc,"%f",nhietdo);
}
if(i==6)
{
i=0;
}
}
}

IF(!INPUT(PIN_E0))
{
DELAY_MS(10);
IF(!INPUT(PIN_E0))
{
while(!INPUT(PIN_E0)) {}
TT_nut=~TT_nut;
IF(TT_nut==1)
{
a=1;
}
IF(TT_nut==0)
{
a=0;
}

}
}
if(a==0)
{
autorun();
}
if(a==1)
{
nutbam();
}
}
}




×