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 3 (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 theo yêu cầu sau : − Nhấn RB0 hiển thị giá trị điện áp ở chân AN3 lên LCD, đồng thời gởi lên Terminal. − Nhấn RB1 hiển thị giá trị điện áp ở chân AN4 lên LCD, đồng thời gởi lên Terminal. − Nhấn RB2 hiển thị giá trị điện áp ở chân AN5 lên LCD, đồng thời gởi lên Terminal. Yêu cầu: Đọc trạng thái nút nhấn sử dụng ngõ vào I/O Port, lcd kết nối với PORTD (từ RD1 tới RD7), UART tốc độ baud 9600. Bài 2: Viết chương trình theo yêu cầu sau: − Nhấn giữ RB0 gởi lên máy tính giá trị tăng dần từ 00 đến 99, bắt đầu từ 00, mỗi lần tăng 1 đơn vị, thời gian mỗi lần tăng là 0.5(s) . − Nhấn giữ RB1 gởi lên máy tính giá trị giảm dần từ 99 về 00, bắt đầu từ 99, mỗi lần giảm 1 đơn vị, thời gian mỗi lần giảm là 0.5(s). Yêu cầu: Sử dụng UART 9600 để gởi lên máy tính, sử dụng hàm delay để định thời khoảng thời gian 0.5(s). Bài 3: Viết chương trình theo yêu cầu sau: − Gởi từ máy tính xuống vi điều khiển kí tự “A” thì tạo xung PWM 50% ở chân CCP1, chân CCP2 sẽ ở mức thấp (0V), đồng thời led RE1 sáng, RE2 tắt . − Gởi từ máy tính xuống vi điều khiển kí tự “B” thì tạo xung PWM 70% ở chân CCP2, chân CCP1 sẽ ở mức thấp (0V), RE1 tắt, RE2 sáng . Yêu cầu: UART baud rate 9600, PWM 8 bit có tần số 15Khz. Bài 4: Viết chương trình theo yêu cầu sau: − Nhấn nút RB0 thì gởi chuỗi “RB0 button” lên máy tính. − Nhấn nút RB1 thì gởi chuỗi “RB1 button”lên máy tính. − Nhấn nút RB2 thì gởi chuỗi “RB2 button” lên máy tính. − Nhấn nút RB3 thì gởi chuỗi “RB3 button” lên máy tính. − Nhấn nút RB4 thì gởi chuỗi “RB4 button” lên máy tính. − Nhấn nút RB5 thì gởi chuỗi “RB5 button” lên máy tính. − Nhấn nút RB6 thì gởi chuỗi “RB6 button” lên máy tính. − Nhấn nút RB7 thì gởi chuỗi “RB7 button” lên máy tính. Yêu cầu : UART baud rate 9600. Bài 5: Viết chương trình theo yêu cầu sau: − Điếm số lần nhấn nút ở chân T0CKI, và hiển thị lên terminal của máy tính , khi số lần nhấn bằng 50 thì gởi chuỗi “Full ” lên máy tính, đồng thời chớp tắt led ở cả PORTD với chu kỳ T=2s. Yêu cầu: UART baud rate 9600, sử dụng chức năng counter của timer 0 để đếm sản phẩm, sử dụng hàm delay để định thời chu kỳ T=2s. Bài 6: Điếm số lần nhấn nút ở chân T1CKI, và hiển thị lên terminal của máy tính, khi số lần nhấn bằng 10 thì đọc giá trị ADC ở chân AN3 hiển thị kết quả điện áp đọc được lên terminal. Yêu cầu: UART baud rate 9600 , sử dụng chức năng counter của timer 1 để đếm nút nhấn, sử dụng hàm delay để định thời chu kỷ T=2s, ADC 10 bit , điện áp tham chiếu trong. Bài 7: Viết chương trình thực hiện theo yêu cầu sau: − Gởi từ máy tính xuống VĐK kí tự “A”, đọc ADC ở chân AN2, hiển thị điện áp lên LCD . − Gởi từ máy tính xuống VĐK kí tự “B”, đọc ADC ở chân AN3, hiển thị điện áp lên LCD . − Gởi từ máy tính xuống VĐK kí tự “C”, đọc ADC ở chân AN4, hiển thị điện áp lên LCD . Yêu cầu : UART baud rate 9600 , ADC 10-bit. Bài 8: Viết chương trình thực hiện theo yêu cầu sau: − Viết chương trình đếm số lần nhấn nút ở chân RB0 hiển thị lên lcd , số lần nhấn nút ở chân RB1 hiển thị lên máy tính . Yêu cầu : UART baud rate 9600.
Trang 1Bộ 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 3 (Lưu ý: Code được trình bày từ trên xuống dưới và từ trái qua phải) Chú ý: Vì trong bài tập mình sử dụng thư viện khác nên mọi người nếu chưa có hãy cài thư viện để tiện sử dụng nhé
Các bước tạo một thư viện của riêng mình:
B1: Tạo một file mới trong CCS C Compiler với tên và code như bên dưới
B2: Mọi người lưu lại và thêm vào thư mục PICC/Devices nơi các bạn lưu phần mềm CCS C Compiler
Trang 2Thư viện sử dụng trong bài tập
Trang 3LCD_SendCommand( 0x01 ); // Clear Display (also clear DDRAM content)
delay_ms(10);
} void LCD_PutC ( unsigned char Data ) {
output_high(LCD_RS);
LCD_SendCommand( Data );
output_low(LCD_RS);
} void LCD_Clear() {
LCD_SendCommand(0x01);
delay_ms(10);
} void LCD_Gotoxy(unsigned char row, unsigned char col)
{ unsigned char address;
if(!row) address = (0x80 + col);
else address = (0xC0 + col);
delay_us(500);
LCD_SendCommand(address);
delay_us(50);
}
Trang 4Bài 1: Viết chương trình theo yêu cầu sau :
− Nhấn RB0 hiển thị giá trị điện áp ở chân AN3 lên LCD, đồng thời gởi lên
Yêu cầu: Đọc trạng thái nút nhấn sử dụng ngõ vào I/O Port, lcd kết nối với
PORTD (từ RD1 tới RD7), UART tốc độ baud 9600
Trang 5UNSIGNED INT16 CA3,CA5,CE0;
UNSIGNED INT8 RDATA=0,VITRI_H2=0;
UNSIGNED INT8 d,e,f;
} VOID MAIN() {
SET_TRIS_D(0x00);
SET_TRIS_B(0x00);
SETUP_ADC(ADC_CLOCK_INTERNAL); LCD_Init();
d=1;
e=0;
f=0;
} IF(TTB1 == 1) {
d=0;
e=1;
f=0;
} IF(TTB2 == 1) {
d=0;
Trang 6a = CA3/204.6;
LCD_GOTOXY(0,1);
PRINTF(LCD_PUTC,"%04LU",CA3); LCD_GOTOXY(0,6);
PRINTF(LCD_PUTC,"%2.2f V",a); DELAY_US(10);
b = CA5/204.6;
LCD_GOTOXY(0,1);
PRINTF(LCD_PUTC,"%04LU",CA5); LCD_GOTOXY(0,6);
PRINTF(LCD_PUTC,"%2.2f V",b); putc(CA5);
c = CE0/204.6;
LCD_GOTOXY(0,1);
PRINTF(LCD_PUTC,"%04LU",CE0); LCD_GOTOXY(0,6);
PRINTF(LCD_PUTC,"%2.2f V",c); printf("%f V\r",c);
Trang 7Bài 2: Viết chương trình theo yêu cầu sau:
− Nhấn giữ RB0 gởi lên máy tính giá trị tăng dần từ 00 đến 99, bắt đầu từ 00, mỗi lần tăng 1 đơn vị, thời gian mỗi lần tăng là 0.5(s)
− Nhấn giữ RB1 gởi lên máy tính giá trị giảm dần từ 99 về 00, bắt đầu từ 99, mỗi lần giảm 1 đơn vị, thời gian mỗi lần giảm là 0.5(s)
Yêu cầu: Sử dụng UART 9600 để gởi lên máy tính, sử dụng hàm delay để định thời khoảng thời gian 0.5(s)
IF(!INPUT(PIN_B1)) {
DELAY_MS(10);
IF(!INPUT(PIN_B1)) {
DELAY_MS(10);
while(!INPUT(PIN_B1)) {
if(dem > 0) {
dem ;
delay_ms(500);
} lcd_gotoxy(1,1);
Trang 8SET_TRIS_E(0x00); SET_TRIS_D(0x00); LCD_Init();
dem = 0;
WHILE(TRUE) {
VRB1();
VRB0();
} }
Trang 9Bài 3: Viết chương trình theo yêu cầu sau:
− Gởi từ máy tính xuống vi điều khiển kí tự “A” thì tạo xung PWM 50% ở chân CCP1, chân CCP2 sẽ ở mức thấp (0V), đồng thời led RE1 sáng, RE2 tắt
− Gởi từ máy tính xuống vi điều khiển kí tự “B” thì tạo xung PWM 70% ở chân CCP2, chân CCP1 sẽ ở mức thấp (0V), RE1 tắt, RE2 sáng
Yêu cầu: UART baud rate 9600, PWM 8 bit có tần số 15Khz
Trang 11Code:
#INCLUDE <TV_16F887.C>
#INCLUDE <TVLCD.C>
#USE rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)
UNSIGNED INT8 RDATA=0;
unsigned int16 c1,c2; //captocdo1,captocdo2
putc('A') ; // goi duoc nhieu ki tu //dieu khien den
output_high(pin_E1);
output_low(pin_E2);
//dieu khien pwm c1= 40;
set_pwm1_duty(c1);
c2= 0;
set_pwm2_duty(c2);
} else if(RDATA == 'B') {
set_pwm1_duty(c1);
c2= 56;
set_pwm2_duty(c2);
} else putc ('@') ; // chi goi dc 1 ki tu }
} }
Trang 12Bài 4: Viết chương trình theo yêu cầu sau:
− Nhấn nút RB0 thì gởi chuỗi “RB0 button” lên máy tính
− Nhấn nút RB1 thì gởi chuỗi “RB1 button”lên máy tính
− Nhấn nút RB2 thì gởi chuỗi “RB2 button” lên máy tính
− Nhấn nút RB3 thì gởi chuỗi “RB3 button” lên máy tính
− Nhấn nút RB4 thì gởi chuỗi “RB4 button” lên máy tính
− Nhấn nút RB5 thì gởi chuỗi “RB5 button” lên máy tính
− Nhấn nút RB6 thì gởi chuỗi “RB6 button” lên máy tính
− Nhấn nút RB7 thì gởi chuỗi “RB7 button” lên máy tính
Yêu cầu : UART baud rate 9600
Trang 13IF(!INPUT(PIN_B4)) {
DELAY_MS(10);
IF(!INPUT(PIN_B4)) {
DELAY_MS(10);
while(!INPUT(PIN_B4)) {} printf("RB4 button \r"); }
} } VOID VRB5() {
IF(!INPUT(PIN_B5)) {
DELAY_MS(10);
IF(!INPUT(PIN_B5)) {
DELAY_MS(10);
while(!INPUT(PIN_B5)) {} printf("RB5 button \r"); }
} } VOID VRB6() {
IF(!INPUT(PIN_B6)) {
DELAY_MS(10);
IF(!INPUT(PIN_B6)) {
DELAY_MS(10);
while(!INPUT(PIN_B6)) {} printf("RB6 button \r"); }
} } VOID VRB7() {
IF(!INPUT(PIN_B7)) {
DELAY_MS(10);
IF(!INPUT(PIN_B7)) {
DELAY_MS(10);
while(!INPUT(PIN_B7)) {} printf("RB7 button \r"); }
} } VOID MAIN() {
Trang 14dem = 0;
WHILE(TRUE) {
Trang 15Bài 5: Viết chương trình theo yêu cầu sau:
− Điếm số lần nhấn nút ở chân T0CKI, và hiển thị lên terminal của máy tính , khi
số lần nhấn bằng 50 thì gởi chuỗi “Full ” lên máy tính, đồng thời chớp tắt led ở cả PORTD với chu kỳ T=2s
Yêu cầu: UART baud rate 9600, sử dụng chức năng counter của timer 0 để đếm sản phẩm, sử dụng hàm delay để định thời chu kỳ T=2s
Trang 16unsigned int dem;
unsigned int8 solannhan = 0;
solannhan = 0;
while(true) { if(solannhan < 50) {
nutnhan();
} if(dem < 1) {
if(T0 == 50) {
printf("FULL\r\n");
dem++;
} } if(T0 == 50) {
Trang 17Bài 6: Điếm số lần nhấn nút ở chân T1CKI, và hiển thị lên terminal của máy tính, khi số lần nhấn bằng 10 thì đọc giá trị ADC ở chân AN3 hiển thị kết quả điện áp đọc được lên terminal
Yêu cầu: UART baud rate 9600 , sử dụng chức năng counter của timer 1 để đếm nút nhấn, sử dụng hàm delay để định thời chu kỷ T=2s, ADC 10 bit , điện áp tham chiếu trong
unsigned int dem;
UNSIGNED INT16 CA3;
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_1 );
nutnhan();
if(dem < 1) {
if(x == 10) {
khoitao_ADC0();
DELAY_MS(10);
Trang 18PRINTF(LCD_PUTC,"%2.2f V",a); DELAY_US(10);
printf(" %f V\r",a);
dem++;
x=0;
} } } }
Trang 19Bài 7: Viết chương trình thực hiện theo yêu cầu sau:
− Gởi từ máy tính xuống VĐK kí tự “A”, đọc ADC ở chân AN2, hiển thị điện áp lên LCD
− Gởi từ máy tính xuống VĐK kí tự “B”, đọc ADC ở chân AN3, hiển thị điện áp lên LCD
− Gởi từ máy tính xuống VĐK kí tự “C”, đọc ADC ở chân AN4, hiển thị điện áp lên LCD
Yêu cầu : UART baud rate 9600 , ADC 10-bit
Trang 20UNSIGNED INT16 CA3,CA5,CA2;
UNSIGNED INT8 RDATA=0,VITRI_H2=0;
IF (KBHIT() == 1) // co data {
RDATA = GETC ();
IF (RDATA == 'A') {
putc('A') ; khoitao_ADC2();
PRINTF(LCD_PUTC,"%2.2f V",a); DELAY_US(10);
printf("%f V\r",a);
} else if(RDATA == 'B') {
PRINTF(LCD_PUTC,"%2.2f V",b); DELAY_US(10);
printf("%f V\r",b);
} else if(RDATA == 'C') {
PRINTF(LCD_PUTC,"%2.2f V",c); DELAY_US(10);
printf("%f V\r",c);
} else putc ('@') ; // chi goi dc 1 ki tu }
} }
Trang 21Bài 8: Viết chương trình thực hiện theo yêu cầu sau:
− Viết chương trình đếm số lần nhấn nút ở chân RB0 hiển thị lên lcd , số lần nhấn nút ở chân RB1 hiển thị lên máy tính
Yêu cầu : UART baud rate 9600
Trang 22SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_1 );