BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HỒ CHÍ MINH BÀI TIỂU LUẬN Tên học phần: Thực hành Vi Điều Khiển Kỳ thi học kỳ đợt B năm học 2020 -2021 Giảng viên hướng dẫn: Phạm Quốc Thiện Sinh viên thực hiện: Nguyễn Vũ Hoàng Huy MSSV Nguyễn Văn Pháp MSSV Lê Minh Tiến MSSV Nguyễn Văn Phước MSSV Lớp: 19DOTD2 Ngành: Công nghệ kỹ thuật ô tô Khoa/Viện: Viện kỹ thuật Tp.HCM, ngày … tháng … năm … Tieu luan Câu 1: Viết chương trình điều khiển led hai cách sử dụng ngắt ngồi khơng ngắt ngồi theo qui luật sau: Mỗi lần bấm vào phím bấm nối với chân RB0, đèn sáng theo số lần bấm: bấm lần đèn D1 sáng, bấm lần đèn D2 sáng,… bấm lần đèn D9 sáng, bấm lần quay lại chu trình BÀI LÀM: Cách 1: Ngắt #include #fuses HS #use delay(clock = 20000000) unsigned int8 maled[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; signed int16 tt; #int_ext void ktr_nn() { tt++; if(tt>8) tt=0; } void main() { set_tris_b(0x01); set_tris_c(0x00); enable_interrupts(int_ext); enable_interrupts(global); ext_int_edge(INT_EXT_H2L); tt=0; while(true) { output_c(maled[tt]); } } Tieu luan Cách 2: Khơng ngắt ngồi #include #fuses HS #use delay(clock = 20000000) #define nn pin_b0 unsigned int8 maled[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; signed int16 tt; void main() { set_tris_b(0x01); set_tris_c(0x00); tt=0; while(true) { output_c(maled[tt]); if(input(nn)==0) { delay_ms(20); if(input(nn)==0) { tt++; if(tt>8) tt=0; output_c(maled[tt]); while(input(nn)==0); } } } } Tieu luan Câu 2: Cho sơ đồ mạch viết giải thích ý nghĩa câu lệnh sử dụng chương trình a Thực đếm - 59 hiển thị led dùng ngắt Timer (Thạch anh 4Mhz) b Thực hai cách dùng ngắt ngồi khơng ngắt ngồi cho nút nhấn Mỗi lần nhấn nút số đếm tăng lên lớn 59 quay lại BÀI LÀM: Cách 1: Ngắt #include #fuses HS #use delay(clock = 4000000) unsigned int8 maled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; signed int16 int1 tt; quet; #int_ext void ktr_nn() { tt++; if(tt>59) tt=0; } #int_timer1 void ngat_timer() { set_timer1(60536); quet=~quet; if(quet==0) { output_c(0x00); output_d(maled[tt/10]); output_c(0x02); } else { output_c(0x00); output_d(maled[tt%10]); Tieu luan output_c(0x01); } void main() { set_tris_b(0x01); set_tris_c(0x00); set_tris_d(0x00); setup_timer_1(t1_internal|t1_div_by_1); set_timer1(60536); enable_interrupts(int_timer1); enable_interrupts(int_ext); enable_interrupts(global); ext_int_edge(INT_EXT_H2L); tt=0; while(true) { } } Cách 2: Khơng ngắt ngồi #include #fuses HS #use delay(clock = 4000000) #define nn pin_b0 unsigned int8 maled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; signed int16 int1 tt; quet; #int_timer1 void ngat_timer() { set_timer1(60536); quet=~quet; if(quet==0) Tieu luan { output_c(0x00); output_d(maled[tt/10]); output_c(0x02); } else { output_c(0x00); output_d(maled[tt%10]); } } void main() { set_tris_b(0x01); set_tris_c(0x00); set_tris_d(0x00); setup_timer_1(t1_internal|t1_div_by_1); set_timer1(60536); enable_interrupts(int_timer1); enable_interrupts(global); tt=0; while(true) { if(input(nn)==0) { delay_ms(20); if(input(nn)==0) { tt++; if(tt>59) tt=0; while(input(nn)==0); } } } } Tieu luan output_c(0x01); Câu 3: Cho sơ đồ mạch, viết chương trình giải thích ý nghĩa câu lệnh, theo yêu cầu sau: a PIC (U1) sử dụng ADC kênh hiển thị giá trị lên LCD1 b Truyền giá trị ADC kênh từ PIC (U1) đến PIC (U2) giao tiếp UART hiển thị LCD2 BÀI LÀM: a #include #device adc=10 #fuses HS #use delay(clock = 20000000) //Su dung thach anh 20Mhz #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) #define LCD_ENABLE_PIN PIN_d6 #define LCD_RS_PIN PIN_d4 #define LCD_RW_PIN PIN_d5 #define LCD_DATA4 PIN_d0 #define LCD_DATA5 PIN_d1 #define LCD_DATA6 PIN_d2 #define LCD_DATA7 PIN_d3 #include signed int32 adc,da; void main() { set_tris_a(0x01); set_tris_d(0x00); set_tris_c(0x80); lcd_init(); setup_adc(adc_clock_div_2); Tieu luan setup_adc_ports(an0); set_adc_channel(0); while(true) { adc=read_adc(); da=adc*5000/1023; putc(da/1000); delay_ms(100); putc(da/100%10+10); delay_ms(100); putc(da/10%10+20); delay_ms(100); putc(da%10+30); delay_ms(100); lcd_gotoxy(1,1); lcd_putc(" DIEN AP "); lcd_gotoxy(1,2); lcd_putc(" "); lcd_putc(da/1000+0x30); lcd_putc(da/100%10+0x30); lcd_putc(da/10%10+0x30); lcd_putc(da%10+0x30); lcd_putc("mV "); } } b #include #device adc=10 #fuses HS #use delay(clock = 20000000) //Su dung thach anh 20Mhz #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) #define LCD_ENABLE_PIN PIN_d6 #define LCD_RS_PIN #define LCD_RW_PIN PIN_d4 PIN_d5 Tieu luan #define LCD_DATA4 PIN_d0 #define LCD_DATA5 PIN_d1 #define LCD_DATA6 PIN_d2 #define LCD_DATA7 PIN_d3 #include signed int32 ng,tr,ch,dv,da,chay; unsigned int8 data; void main() { set_tris_a(0x01); set_tris_d(0x00); set_tris_c(0x80); lcd_init(); chay=0; while(true) { if(kbhit()) / { data=getch(); if(data