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

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

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 (411.52 KB, 13 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 2
(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: Viết chương trình đọc giá trị phím và hiển thị giá trị lên led 7 đoạn theo sơ
đồ phần cứng sau : (Phím từ 0-9 , led hiển thị số tương ứng , phím “*” thể hiện chữ
“U”, phím “#” thể hiện chữ “H”, ban đầu thể hiện chữ “b”).

Code:
//0x7C: b , 0x3E: U , 0x76: H
#INCLUDE <16F887.H>
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK = 20M)
UNSIGNED INT8 COT=0,MAQUETCOT;
//UNSIGNED INT1 CP;

VOID MAIN()
{
SET_TRIS_B(0XF0);
SET_TRIS_C(0X00);
OUTPUT_C(0X7C);
//DELAY_MS(5000);
WHILE(TRUE)


UNSIGNED INT8 MAQUET[4] =
{0XFE,0XFD,0XFB,0XF7};
UNSIGNED INT16 MA7DOANCA[16] = {0x06,
0x66, 0x07, 0x3E, 0x5B, 0x6D, 0x7F, 0x3F, 0x4F,
0x7D, 0x6F, 0x76};


// 1 4 7 U 2 5 8 0 3 6 9 H
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13
VOID QUETMTPHIM()
{
//SET_TRIS_D(0XF0);
FOR(COT=0;COT<4;COT++)
{
OUTPUT_D(MAQUET[COT]);
//MAQUETCOT = 12;
IF (INPUT(PIN_D4)==0) {MAQUETCOT =
COT*4+0; BREAK;}
ELSE IF(INPUT(PIN_D5)==0) {MAQUETCOT =
COT*4+1; BREAK;}
ELSE IF(INPUT(PIN_D6)==0) {MAQUETCOT =
COT*4+2; BREAK;}
ELSE IF(INPUT(PIN_D7)==0) {MAQUETCOT =
COT*4+3; BREAK;}
}
}

{
QUETMTPHIM();
IF(INPUT(PIN_D4)==0 || INPUT(PIN_D5)==0 ||
INPUT(PIN_D6)==0 || INPUT(PIN_D7)==0)
{
OUTPUT_C(0X00);
QUETMTPHIM();
OUTPUT_C(MA7DOANCA[MAQUETCOT]);
DELAY_MS(50);
}

}
}


Bài 2: Viết chương trình dùng vi điều khiển PIC16F887 thực hiện chức năng như
một máy tính theo sơ đồ phần cứng sau: Yêu cầu thực hiện được các phép tính đơn
giản một tốn tử và số hạng có một chữ số.

Code:
#INCLUDE <16F887.H>
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK = 20M)
#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>
#use fast_io(C)
float kq,bien1,bien2,gt,bientg;
unsigned int8 mp,column,mpt,row,test;
unsigned int8
ten_phim[]={'7','4','1','C','8','5','2','0','9','6','3','=',':','*','','+'};
unsigned int16
gia_tri[]={7,4,1,0,8,5,2,0,9,6,3,0,0,0,0,0};
void find_row()
{

row=0xff;
if(input(pin_B0)==0) {row=0;}
else if(input(pin_B1)==0) {row=1;}
else if(input(pin_B2)==0) {row=2;}
else if(input(pin_B3)==0) {row=3;}
}
void keypress()
{
mp=0xff;
for(column=0;column<4;column++)
{
switch(column)

void main()
{
bien1=0xff;
bien2=0xff;
int dem=0;
int number=0;
set_tris_C(0);PORT_B_PULLUPS(0X0F);
set_tris_D(0);
lcd_init();
DELAY_MS(10);
//lcd_putc("000");
while(true)
{
key_4x4();
if(mp!=0xff)
{
if((mp!='C')&&(mp!='=')&&(mp!='+')&&(mp!='')&&(mp!='*')&&(mp!=':'))

{
lcd_putc(mp);
switch(dem)
{
case 0:
if(number==1)
{
bientg=gt;
bien1=bientg+bien1*10; // nhan so 12
break;
}
bien1=gt;
number=1;
break;
case 1:
if(number==1)


{

{
case 0: output_low(pin_B4);
find_row();
output_high(pin_B4);
break;
case 1: output_low(pin_B5);
find_row();
output_high(pin_B5);
break;
case 2: output_low(pin_B6);

find_row();
output_high(pin_B6);
break;
case 3: output_low(pin_B7);
find_row();
output_high(pin_B7);
break;

}
if(row!=0xff)
{
mp=(column*4)+row;
break;
}
}
}
void key_4x4()
{
keypress();
if(mp!=0xff)
{
delay_ms(5);
keypress();
if(mp!=0xff)
{
mpt=mp;
while(mp!=0xff)
{
keypress();//cho tha phim
}

mp=ten_phim[mpt];
gt=gia_tri[mpt];
}
}
}

bientg=gt;
bien2=bientg+bien2*10;// vd 12 x 10
break;
}
bien2=gt;
number=1;
break;
}
}
else if(mp=='+')
{
lcd_putc(mp);
dem=1;
number=0; // nhap so khac
test=0;
}
else if(mp=='-')
{
lcd_putc(mp);
dem=1;
number=0;
test=1;
}
else if(mp=='*')

{
lcd_putc(mp);
dem=1;
number=0;
test=2;
}
else if(mp==':')
{
lcd_putc(mp);
dem=1;
number=0;
test=3;
}
else if(mp=='C')
{
lcd_send_byte(0,1);// 0x01 xóa lcd
bien1=0xff;
bien2=0xff;
mp=0xff;
dem=0;
number=0;
}
else if(mp=='=')
{
lcd_gotoxy(13,2);// vi tri hien thi ket qua
switch(test)
{
case 0:kq=bien1+bien2;
break;
case 1:kq=bien1-bien2;

break;


case 2:kq=bien2*bien1;
break;
case 3:kq=bien1/bien2;
break;
}
printf(lcd_putc,"%0.1f",kq);// bien float
}
}
}
}


Bài 3: Hãy viết chương trình đếm giờ phút giây hiển thị trên LCD. Định thời bằng
Timer 1.

Code:
#INCLUDE <TV_16F887.C>
#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
UNSIGNED INT8 TRAN,PHUT,GIAY,GIO;
VOID MAIN()
{
LCD_INIT();
SET_TRIS_D(0x00);
SETUP_TIMER_1(T1_INTERNAL |
T1_DIV_BY_8);
SET_TIMER1(3036);
GIO = 23; //Setup time
PHUT = 59;

WHILE(TRUE)
{
LCD_Gotoxy(9,1);
LCD_PutC((GIAY/10)+0X30);
LCD_PutC((GIAY%10)+0X30);
LCD_Gotoxy(6,1);
LCD_PutC((PHUT/10)+0X30);
LCD_PutC((PHUT%10)+0X30);
LCD_Gotoxy(3,1); LCD_PutC((GIO/10)+0X30);
LCD_PutC((GIO%10)+0X30);
IF (TMR1IF==1) // dem het 62500 = 0.1s
{
TMR1IF=0; SET_TIMER1(3036); TRAN++;
}

IF (TRAN == 10)
{
TRAN=0;
LCD_Gotoxy(9,1); GIAY++;
LCD_PutC((GIAY/10)+0X30);
LCD_PutC((GIAY%10)+0X30);


GIAY = 55;
TRAN=0;

IF (GIAY == 60) { GIAY = 0;
LCD_Gotoxy(6,1);
PHUT++;LCD_PutC((PHUT/10)+0X30);
LCD_PutC((PHUT%10)+0X30); }
IF (PHUT == 60) { PHUT = 0;
LCD_Gotoxy(3,1); GIO++;
LCD_PutC((GIO/10)+0X30);
LCD_PutC((GIO%10)+0X30); }
IF(GIO==23 && PHUT==59 && GIAY==59) {
GIO=PHUT=GIAY=0;}
}
}
}


Bài 4: Hãy viết chương trình điều khiển 8 led đơn nối với port D sáng 2 giây, tắt 1
giây, dùng Timer1 định thời.

Code;

#include <16F887.h>
#BIT TMR1IF = 0x0C.0
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK=20M)
UNSIGNED INT8 TRAN=0;

VOID MAIN()
{
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8);
SET_TIMER1(3036);
SET_TRIS_D(0X00);
OUTPUT_D(0X00);


WHILE(TRUE)
{
IF (TMR1IF==1)
{
SET_TIMER1(3036);
TRAN++;
TMR1IF=0;
}
IF(TRAN <= 20) OUTPUT_D(0XFF);
IF(TRAN>20 && TRAN <30) OUTPUT_D(0X00);
IF(TRAN == 30) TRAN = 0 ;
}
}


Bài 5: Viết chương trình đọc số lần nhấn nút tại chân T0CKI(RA4), T1CKI(RC0)

và hiển thị kết quả lên LCD.

Code;
#INCLUDE <TV_16F887.c>
#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 INT8 T0, T1;
VOID MAIN()
{
LCD_init();
SETUP_TIMER_0(T0_EXT_H_TO_L | T0_DIV_1);
SET_TIMER0(0);
SETUP_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1);
SET_TIMER1(0);
WHILE(true)
{
T0=GET_TIMER0();
T1=GET_TIMER1();
LCD_gotoxy(3,1);
LCD_PutC((T0%10)+0x30);
LCD_gotoxy(3,2);
LCD_PutC((T1%10)+0x30);
}
}


Bài 6: Viết chương trình hiển thị giá trị khoảng cách đo được bằng CB siêu âm lên
lcd theo sơ đồ phần cứng sau:

Code:
#include <TV_16F887.C>
#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>
#fuses INTRC_IO, NOMCLR, NOBROWNOUT,
NOLVP
#use delay(clock = 20MHz)
#use fast_io(B)

int16 i, distance;
int1 wait_sensor()
{
i = 0;
set_timer1(0);

// Reset Timer1

while(TRUE)
{
// Send 10us pulse to HC-SR04 Trigger pin
output_high(PIN_B1);
delay_us(10);
output_low(PIN_B1);

// Read pulse comes from HC-SR04 Echo pin
if(wait_sensor())
{
distance = get_distance();
if(distance > 24990)
{
lcd_gotoxy(1, 2);
// Go to column 3
row 2
lcd_putc("QUA HAN");
}
else
{
distance = i/57;
// Calculate the
distance


while(!input(PIN_B0) && (i < 1000))
i = get_timer1();
// Read Timer1
and store its value in i
if(i > 990)
return 0;
else
return 1;
}
int16 get_distance()
{
i = 0;

set_timer1(0);
while(input(PIN_B0) && (i < 25000))
i = get_timer1();
return i;
}
void main()
{
setup_oscillator(OSC_8MHZ);
// Set
internal oscillator to 8MHz
output_b(0);
set_tris_b(1);
// Configure RB0
pin as input
delay_ms(1000);
lcd_init();
// Initialize LCD
module
lcd_putc('\f');
// Clear LCD
lcd_gotoxy(1, 1);
// Go to column 4
row 1
lcd_putc("KHOANG CACH:");
SETUP_TIMER_1(T1_INTERNAL |
T1_DIV_BY_2);
// Configure Timer 1 to increment
by 1 every 1 us

lcd_gotoxy(1, 2);

// Go to column 3
row 2
lcd_putc("
cm ");
lcd_gotoxy(1, 2);
// Go to column 6
row 2
printf(lcd_putc, "%3Lu", distance);
}
}
else
{
lcd_gotoxy(1, 2);
// Go to column 3
row 2
lcd_putc(" Time Out ");
}
delay_ms(100);
}
}



×