TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHỆ CẦN THƠ KHOA ĐIỆN – ĐIỆN TỬ - VIỄN THÔNG - - BÁO CÁO THỰC TẬP VI ĐIỀU KHIỂN Giảng viên: ĐƯỜNG KHÁNH SƠN Sinh viên: Ninh Bình Luận MSSV: 1400174 Lớp: CN-KT Điều Khiển & tự động hóa K2 CẦN THƠ – 11/2016 BÀI 1: LED ĐƠN Câu 1.1: Viết chương trình chớp tắt led port e với thời gian delay 250ms: #include #include #FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,N OWRT #use delay(clock=20000000) void main() { trise = 0x00; porte=0xff; while (1) { Porte = 0x00; delay_ms(250); Porte = 0xFF; delay_ms(250); }} Câu 1.2: Viết chương trình chớp tắt led port e với thời gian delay 1s: #include #include #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay (clock=20000000) void main() { trise=0x00; porte=0xff; while(1) { porte=0x00; delay_ms(1000); porte=0xFF; delay_ms(1000); } } Câu 1.3: Viết chương trình chớp tắt led D4 port e với thời gian delay 1s, led D5 với thời gian delay 0,5s: #include #include #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay (clock=20000000) void main() { trise=0x00; porte=0xff; while(1) { output_low(PIN_E1); delay_ms(1000); output_high(PIN_E1); delay_ms(1000); output_low(PIN_E2); delay_ms(500); output_high(PIN_E2); delay_ms(500); } } BÀI 2: HIỂN THỊ KÝ TỰ TRÊN LCD Câu 2.1: Viết chương trình hiển thị ký tự sau lên LCD: DAI HOC KTCN CAN THO: #include #include #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #include void main() { output_low(LCD_RW); LCD_init(); while(TRUE) { lcd_putcmd(0x85); lcd_putcmd(0x01); //xoa man hinh Printf(lcd_putchar,"DAI HOC"); delay_ms(1000); lcd_putcmd(0x01); Printf(lcd_putchar,"KTCN CAN THO"); delay_ms(1000); lcd_putcmd(0x01); } } Câu 2.2: Viết chương trình hiển thị lên LCD theo yêu cầu Hàng thứ hiển thị họ tên sinh viên Hàng thứ hai hiển thị mã số sinh viên #include #include #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #include void main() { output_low(LCD_RW); LCD_init(); while(TRUE) { lcd_putcmd(0x85); lcd_putcmd(0x01); //xoa man hinh Printf(lcd_putchar,"NINH BINH LUAN"); lcd_putcmd(0xC0); Printf(lcd_putchar,"1400174"); delay_ms(5000); lcd_putcmd(0x01); } } Câu 2.3: Viết chương trình đếm số từ đến 999 hiển thị lên LCD #include #include #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #include int16 a; void main() { output_low(LCD_RW); LCD_init(); a=0; while(true) { lcd_putcmd(0x87); printf(lcd_putchar,"%ld",a); delay_ms(200); lcd_putcmd(0x01); delay_ms(200); a=a+1; if(a==999) {a=0;} } } BÀI 3: XỬ LÝ NGẮT CÂU 3.1: Viết chương trình nhận nút nhấn chân B0 PIC 16F887, lần ấn phím đảo trạng thái led port e: #include #include #fuses HS,NOWDT,NOPROTECT,NOLVP,NOPUT,NODEBUG,NOBROWNOUT,NOCPD,N OWRT #use delay(clock=20000000) int_ext ext_isr() { porte=~porte; } void main () { trisb = 0xff; Port_B_pullups(1); trise=0x00; porte=0b00000000; enable_interrupts(int_EXT); ext_int-edge(H_TO_L); enable_interrupts(GLOBAL); while(1){ } } Câu 3.4: Viết chương trình nhận nút nhấn chân B0 PIC 16F887 có xử lý chống nhiễu: #include #include #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=200000) #byte PORTB=0x06 int16 count; // Chuong trinh ngat TMR0 #int_timer0 void interrupt_timer0() { set_timer0(6); ++count; if(count==2000) // 2000*S00us=1000000us=1s { count=0; porte=~porte; } } BÀI 4: XỬ LÝ ADC Câu 4.1: Viết chương trình đọc giá trị ADC từ biến trở R7 hiển thị lên LCD 16x02: #include #include #device *=16 ADC=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #include #use fast_io(e) int16 adc; void main() { output_low(LCD_RW); LCD_init(); //delay_us(100); setup_adc(adc_clock_internal); //set_ADC_ports(sAN3); set_ADC_channel(3); delay_us(10); while(true) { adc=read_adc(); lcd_putcmd(0x80); lcd_putcmd(0x01); delay_ms(100); printf(lcd_putchar,"GIA TRI ADC LA:"); lcd_putcmd(line_2); printf(lcd_putchar,"%04lu",adc); delay_ms(1000); } } Câu 4.2: Viết chương trình đọc giá trị ADC từ biến trở R7 xuất giá trị led port e: #include #include #device *=8 ADC=8 #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #include #use fast_io(e) int16 adc; void main() {{ output_low(LCD_RW); LCD_init(); setup_adc(adc_clock_internal); set_ADC_channel(3); delay_us(10); while(true){ adc=read_adc(); lcd_putcmd(0x80); lcd_putcmd(0x01); delay_ms(100); printf(lcd_putchar,"GIA TRI ADC LA:"); lcd_putcmd(line_2); printf(lcd_putchar,"%04lu",adc); set_tris_e(0x00); output_e(0x00); output_e(0xff); delay_ms(1000); output_e(0x00); delay_ms(1000); }}} BÀI 5: TIMER Câu 5.1: Viết chương trình chớp tắt led port e với thời gian delay 1s sử dụng timer PIC 16F887: #include #include #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=20000000) #byte PORTB=0X06 int16 count; //Chuong trinh ngat TMR0 #int_timer0 void interrupt_timer0() { set_timer0(6); ++count; if(count==2000) //2000*500us=100000us=1s { count=0; porte=~porte; } } //Chuong trinh chinh void main(void) { trise=0x00; enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); enable_interrupts(global); set_timer0(6); //T_dinhthi= 2*(256-6)*1us=500us porte=0x00; while(true) {}} BÀI 6: GIAO TIẾP I2C Câu 6.1: Viết chương trình đọc giá trị nhiệt độ từ TC74 hiển thị LCD 16x02 #include #include #fuses HS,NOWDT,NOPROTECT,NOLVP #use i2c(Master,sda= PIN_C4,scl=PIN_C3) #use delay(clock=20000000) #include int temp; void main() { output_low(LCD_RW); LCD_init(); while(true) { lcd_putcmd(0x80); lcd_putcmd(0x01); delay_ms(100); i2c_start(); i2c_write(0x90); i2c_write(0x00); i2c_start(); i2c_write(0x91); temp=i2c_read(0); i2c_stop(); Printf(lcd_putchar,"nhiet do:%i oC",temp); delay_ms(1000); }} BÀI 7: GIAO TIẾP RS232 Câu 7.1: Viết chương trình truyền liệu PC PIC 16F887 với yêu cầu sau Truyền ký tự “b” “t” từ PC thông qua chương trình MATLAB, PIC nhận ký tự “b” bật LED port e, PIC nhận ký tự “t” tắt LED port e #include #include #fuses HS,NOWDT, NOPROTECT, NOLVP #use delay(clock=20000000) #include #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) char value1; #int_RDA void RDA_interrupt(){ value1 = getc(); if(value1=='b') PORTe=0xff; if(value1=='t') PORTe=0x00;} void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); trise=0x00; ENABLE_interrupts(INT_RDA); enable_interrupts(GLOBAL); while(1){ }} BÀI 8: ĐIỀU KHIỂN ĐỘNH CƠ DC Câu 8.1: Viết chương trình điều khiển dộng DC nút nhấn nối với ngắt PIC 16F887 #include #include #fuses HS, NOWDT, NOPROTECT, NOLVP #use delay(clock=20000000) #int_ext ext_isr() { set_tris_c(0xf9); output_c(0); setup_timer_2(t2_div_by_4, 124,1); setup_ccp1(ccp_pwm); set_pwm1_duty(125); } void main() { trisb=0xff; Port_B_pullups(1); enable_interrupts(int_ext); ext_int_edge(H_TO_L); enable_interrupts(GLOBAL); while(true){ }} BÀI 9: ĐO KHOẢNG CÁCH BẰNG CẢM BIẾN SIÊU ÂM SRF05 Câu 9.1: Viết chương trình đo khoảng cách cảm biến siêu âm kết nối với VĐK PIC 16F887 #include #include #fuses HS, NOWDT, NOPROTECT, NOLVP #use delay(clock=20000000) #include #define PIN_TRIGGER PIN_A3 int1 echo=0; int16 value=0; void Trigger() { output_high(PIN_TRIGGER); delay_us(12); output_low(PIN_TRIGGER); } #int_CCP1 void CCP1_isr(void) { if(echo==1) { setup_ccp1(CCP_CAPTURE_FE); //FALLING FULSE set_timer1(0); echo=0; } else { setup_ccp1(CCP_CAPTURE_RE); //RISING FULSE value=CCP_1; echo=1; } } void main() { output_low(LCD_RW); LCD_init(); setup_adc_ports(NO_ANALOGS); setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); setup_ccp1(CCP_CAPTURE_RE); //RAISING FULSE enable_interrupts(INT_CCP1); enable_interrupts(GLOBAL); float distance = 0; while (true) { Trigger(); while(echo==0) {} distance = value*0.8/58; lcd_putcmd(0x85); lcd_putcmd(0x01); //xoa man hinh printf(LCD_Putchar, "Khoang cach:"); lcd_putcmd(line_2); printf(Lcd_putchar,"%fcm",distance); delay_ms(1000); }}