Professional Documents
Culture Documents
Tuần6 nút nhấn
Tuần6 nút nhấn
Bài 1: (Mô phỏng, thực tế) Mô phỏng, lắp ráp sử dụng PIC16F877A và viết chương trình để thực hiện các
yêu cầu sau:
Cấu hình phần cứng: Một biến trở được nối tới chân analog RA2 hoặc RA3, một LCD được nối với Port
D của PIC. Đọc giá trị ADC từ biến trở, và hiển thị lên hàng 1 LCD.
Chuyển đổi giá trị ADC đọc được sang điện áp, và hiển thị giá trị điện áp lên LCD.
Chú ý: dùng VOM để kiểm tra giá trị điện áp tại chân vừa mới đọc ADC.
#include <adc_pwm_thvxl.h>
#define LCD_ENABLE_PIN PIN_d2 ////
#define LCD_RS_PIN PIN_d0 ////
#define LCD_RW_PIN PIN_d1 ////
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7
#include <lcd.c>
int16 val1,val2;
float gt1,gt2;
void bai1()
{
set_adc_channel(2);
delay_us(10);
val1 =read_adc();
lcd_gotoxy(1,1);
printf(lcd_putc,"val1=%4lu",val1);
gt1 = (val1*5/1023.0);
lcd_gotoxy(12,1);
printf(lcd_putc,"%f",gt1);
}
void main()
{
lcd_init();
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
while(TRUE)
{
Bai1();
}
}
Bài 2: (Mô phỏng, thực tế) Mô phỏng, lắp ráp sử dụng PIC16F877A và viết chương trình để thực hiện các
yêu cầu sau:
Cấu hình phần cứng: Hai biến trở được nối tới chân analog RA2 ,RA3, một LCD được nối với Port D của
PIC.
Chuyển đổi giá trị ADC đọc được sang điện áp, và hiển thị giá trị điện áp lên LCD.
#include <adc_pwm_thvxl.h>
#define LCD_ENABLE_PIN PIN_d2 ////
#define LCD_RS_PIN PIN_d0 ////
#define LCD_RW_PIN PIN_d1 ////
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7
#include <lcd.c>
int16 val1,val2;
float gt1,gt2;
#include <adc_pwm_thvxl.h>
void bai2()
{
set_adc_channel(2);
delay_us(10);
val1 =read_adc();
lcd_gotoxy(1,1);
printf(lcd_putc,"val1=%4lu",val1);
gt1 = (val1*5/1023.0);
lcd_gotoxy(12,1);
printf(lcd_putc,"%f",gt1);
set_adc_channel(3);
delay_us(10);
val2 =read_adc();
lcd_gotoxy(1,2);
printf(lcd_putc,"val2=%4lu",val2);
gt2 = (val2*5/1023.0);
lcd_gotoxy(12,2);
printf(lcd_putc,"%f",gt2);
}
void main()
{
lcd_init();
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
while(TRUE)
{
Bai2();
}
}
Bài 3: Viết chương trình nhấn các nút kết nối chân RA0, giá trị analog nút nhấn hiển thị ra LCD ở hàng
trên. Hàng dưới hiển thị tên nút đang nhấn (RIGHT, UP, DOWN, LEFT, SELECT).
#include <adc_pwm_thvxl.h>
#define LCD_ENABLE_PIN PIN_d2 ////
#define LCD_RS_PIN PIN_d0 ////
#define LCD_RW_PIN PIN_d1 ////
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7
#include <lcd.c>
int16 val1,val2;
float gt1,gt2;
void bai3()
{
set_adc_channel(0);
delay_us(10);
val1 =read_adc();
if(val1==0)
{
LCD_PUTC('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"val1=%4lu",val1);
lcd_gotoxy(1,2);
lcd_putc("RIGHT");
}
else if(val1==254)
{
LCD_PUTC('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"val1=%4lu",val1);
lcd_gotoxy(1,2);
lcd_putc("UP");
}
else if(val1==584)
{
LCD_PUTC('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"val1=%4lu",val1);
lcd_gotoxy(1,2);
lcd_putc("DOWN");
}
else if(val1==716)
{
LCD_PUTC('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"val1=%4lu",val1);
lcd_gotoxy(1,2);
lcd_putc("LEFT");
}
else if(val1==787)
{
LCD_PUTC('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"val1=%4lu",val1);
lcd_gotoxy(1,2);
lcd_putc("SELECT");
}
}
void main()
{
lcd_init();
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
while(TRUE)
{
bai3();
}
}
Bài 4: Mô phỏng, lắp ráp sử dụng PIC16F877A và viết chương trình để thực hiện các yêu cầu sau:
Cấu hình phần cứng: Một cảm biến LM35 được nối tới chân analog bất kỳ, một LCD được nối với Port D
của PIC.
Đọc giá trị cảm biến, quy đổi sang nhiệt độ và hiển thị nhiệt độ lên LCD.
Hiển thị thêm trạng thái tương ứng với khoảng nhiệt độ:
Mô phỏng, lắp ráp sử dụng PIC16F877A và viết chương trình để thực hiện các yêu cầu sau:
Cấu hình phần cứng: Một biến trở được nối tới chân analog RA2, một LCD được nối với Port D của PIC,
một led đơn nối với chân RC2.
Đọc giá trị ADC của biến trở và hiển thị giá trị này lên LCD.
Độ sáng đèn phụ thuộc vào giá trị ADC của biến trở, ADC càng lớn thì đèn sáng mạnh.
Cho biết tần số xung xuất ra để thỏa mãn yêu cầu trên?
#include <adc_pwm_thvxl.h>
#define LCD_ENABLE_PIN PIN_d2 ////
#define LCD_RS_PIN PIN_d0 ////
#define LCD_RW_PIN PIN_d1 ////
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7
#include <lcd.c>
int16 val1,val2;
float gt1,gt2;
void bai5()
{
set_adc_channel(2);
delay_us(10);
val1 =read_adc();
lcd_gotoxy(1,1);
printf(lcd_putc,"PWM: %4lu",val1);
set_pwm1_duty(val1);
}
void main()
{
lcd_init();
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
while(TRUE)
{
Bai5();
}
}
Bài 6: (Mô phỏng và thực nghiệm) PWM
Mô phỏng, lắp ráp sử dụng PIC16F877A và viết chương trình để thực hiện các yêu cầu sau:
o Nhận lệnh: 1 nút nhấn có chức năng đảo chiều động cơ. (SW1-đảo chiều) 2 nút nhấn giúp tăng
giảm tốc độ động cơ.(SW2- tăng tốc; SW3-giảm tốc)
o Chấp hành Các chân IN1 và IN2 của module L298 được nối tới các chân bất kỳ Chân ENA nối với
chân CCP1
o Hiển thị: Một LCD được nối với Port D của PIC.
Chức năng:
o Động cơ được điều khiển qua các nút nhấn. Bấm SW1 thì động cơ đảo chiều, còn tốc độ động cơ phụ
thuộc vào sw2 và sw3
o LCD hiển thị thông tin về chiều quay và tốc độ của động cơ.
(Lưu ý: ta coi tốc độ của động cơ tương ứng với số PWM xuất ra, PWM lớn thì tốc độ động cơ càng tăng).
#include <adc_pwm_thvxl.h>
#define LCD_ENABLE_PIN PIN_d2 ////
#define LCD_RS_PIN PIN_d0 ////
#define LCD_RW_PIN PIN_d1 ////
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7
#include <lcd.c>
int i=0;
int16 val1,val2,dc;
float gt1,gt2;
#INT_EXT
void EXT_isr(void)
{
output_toggle(PIN_C0);
output_toggle(PIN_C1);
i++;
if(i==2) i=0;
}
void bai6()
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Chieu quay: %d",i);
lcd_gotoxy(1,2);
printf(lcd_putc,"PWM: %4lu",dc);
set_pwm1_duty(dc);
if(input(pin_b4)==0)
{
while(input(pin_b4)==0);
dc=dc+10;
}
if(input(pin_b5)==0)
{
while(input(pin_b5)==0);
dc=dc-10;
}
}
void main()
{
lcd_init();
clear_interrupt(INT_EXT);
enable_interrupts(INT_EXT_H2L);
enable_interrupts(GLOBAL);
setup_timer_2(T2_DIV_BY_16, 255, 1);
setup_ccp1(CCP_PWM);
dc=500;
output_high(pin_C0);
output_low(pin_C1);
while(TRUE)
{
bai6();
}