1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

FULL CODE VI XỬ LÍ PIC16F887 LẬP TRÌNH NGẮT, PWM, LCD, TIMER1,ADCLM35, LED 7 ĐOẠN

30 252 4
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Full Code Vi Xử Lí PIC16F887 Lập Trình Ngắt, PWM, LCD, TIMER1, ADCLM35, LED 7 Đoạn
Trường học Trường Đại Học Công Nghiệp TP.HCM
Chuyên ngành Kỹ Thuật Vi Xử Lý
Thể loại Tiểu Luận
Năm xuất bản 2020-2021
Thành phố TP.HCM
Định dạng
Số trang 30
Dung lượng 1,24 MB
File đính kèm Thu vien lcd.h.rar (4 KB)

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Câu 1: Nguyên lý hoạt động và các bước lập trình modul TIMER1 của PIC16F887Câu 2: Lập trình PIC16F887, sử dụng ngắt PORTB điều khiển led bảy đoạn: Nhấn SW0: led đếm lên từ 00 đến 24 một lần. thời gian tồn tại mỗi trạng thái là 300ms Nhấn SW1: led đếm xuống từ 60 đến 00 và lặp lại hai lần. thời gian tồn tại mỗi trạng thái là 300ms Nhấn SW2: led hiển thị số FP chớp tắt ba lần với f = 1 HzCâu 3: Lập trình PIC16F887, sử dụng modul TIMER1 để tạo delay, kết quả hiển thị trên 8 led đơn theo yêu cầu sau: Nhấn SW0: led 0,2,4,6 sáng trong 1s rồi tắt, (led thứ i nối với chân RDi) Nhấn SW1: led 1,3,5,7 sáng trong 2s rồi tắt, (led thứ i nối với chân RDi) Nhấn SW2: 8 led chớp tắt 3 lần với f = 1 Hzcâu 4: Lập trình PIC16F887, sử dụng modul CCP chế PWM, tạo xung tại chân RC2, kết quả hiển thị theo yêu cầu sau: Yêu cầu: Nhấn SW0: LCD hiển thị: line 0: họ và tên sinh viên (chữ có dấu) line 1: lớp MSSV Nhấn SW1: Xuất xung PWM có f = 10KHz, D = 40% và LCD hiển thị: line 0: Thi kết thúc môn line 1: Good luck câu 5: Lập trình PIC16F887, sử dụng modul ADC đo giá trị nhiệt độ từ cảm biến LM35, cảm biến nối với chân RA0 (trả về điện áp), chuyển đổi giá trị điệp áp ra giá trị số và hiển thị giá trị nhiệt độ đo được trên led bảy đoạn.

Trang 1

BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP.HCM

KHOA CÔNG NGHỆ ĐIỆN TỬ

Trang 2

MỤC LỤC

NỘI DUNG 1

Câu 1: Nguyên lý hoạt động và các bước lập trình modul TIMER1 của PIC16F887 1

a Nguyên lý hoạt động 1

b Các bước lập trình modul TIMER1 của PIC16F887 1

Câu 2: Lập trình PIC16F887, sử dụng ngắt PORTB điều khiển led bảy đoạn theo yêu cầu sau: 3

a Trình bày lý thuyết hoặc tính toán các công thức liên quan đến bài làm: 3

b Lưu đồ giải thuật 3

c Viết code bằng ngôn ngữ c, mô phỏng bằng phần mềm protues: 6

Câu 3: Lập trình PIC16F887, sử dụng modul TIMER1 để tạo delay, kết quả hiển thị trên 8 led đơn theo yêu cầu sau: 10

a Trình bày lý thuyết hoặc tính toán các công thức liên quan đến bài làm: 10

b Lưu đồ giải thuật 10

c Viết code bằng ngôn ngữ c, mô phỏng bằng phần mềm proteus: 12

Câu 4: Lập trình PIC16F887, sử dụng modul CCP chế PWM, tạo xung tại chân RC2, kết quả hiển thị theo yêu cầu sau: 15

a Trình bày lý thuyết hoặc tính toán các công thức liên quan đến bài làm: 15

c Lưu đồ giải thuật 16

c Viết code bằng ngôn ngữ c, mô phỏng bằng phần mềm proteus: 19

Câu 5: Lập trình PIC16F887, sử dụng modul ADC 23

a Trình bày lý thuyết hoặc tính toán các công thức liên quan đến bài làm: 23

b Lưu đồ giải thuật 24

c Viết code bằng ngôn ngữ c, mô phỏng bằng phần mềm proteus: 25

Trang 3

NỘI DUNG

Câu 1: Nguyên lý hoạt động và các bước lập trình modul TIMER1 của PIC16F887

a Nguyên lý hoạt động

Bộ dao động của Timer 1:

• Được kết nối thông qua chân RC0 và RC1

• Mạch điện bổ sung (xem hình) được thiết kế chủ yếu cho các hoạt động ở tần số thấp

• Không phụ thuộc vào xung clock bên trong nên có thể hoạt động ngay cả trong chế độ "ngủ"

• Sau khi được kích hoạt thì người sử dụng phải chờ khoảng vài ms để bộ dao động hoạt động ổn định

• Không thể tắt Prescaler mà chỉ có thể thay đổi giá trị tỉ lệ của nó

• Prescaler sẽ bị xóa bằng cách ghi dữ liệu vào các thanh ghi TMR1H và TMR1L

• Sự kiện ngắt khi Timer 1 tràn chỉ có thể "đánh thức" vi điều khiển khỏi chế độ "ngủ" trong trường hợp sử dụng nguồn xung clock bên ngoài và không

sử dụng tính năng đồng bộ

b Các bước lập trình modul TIMER1 của PIC16F887

Để định thời gian (Timer):

• BƯỚC 1: Ghi vào thanh ghi TMR1 (bao gồm TMR1H:TMR1L) giá trị tương ứng cho thời gian cần định thời

- Pre: Giá trị hệ số Prescaler (Pre = 1, 2, 4, 8)

- [TMR1]: Giá trị cần ghi vào thanh ghi

- TMR1H = Byte cao của [TMR1]

- TMR1L= Byte thấp của [TMR1]

*Lưu ý:

Trang 4

Công thức tính t DELAY trên áp dụng cho trường hợp sử dụng nguồn xung clock bên trong

Trong trường hợp sử dụng nguồn xung clock bên ngoài lấy từ bộ dao động Timer 1 (T1OSI và T1OSO) thì công thức tính t DELAY như sau :

• BƯỚC 2: Xóa cờ báo tràn (cờ ngắt) TMR1IF

• BƯỚC 3: Chọn chế độ hoạt động của Timer 1

- Chế độ định thời gian (Timer)

- Kích hoạt hoặc vô hiệu hóa ngắt (tùy chọn)

- Chọn giá trị tỉ lệ của Prescaler

• BƯỚC 4: Cho phép Timer 1 bắt đầu hoạt động

• BƯỚC 5: Xác định thời điểm Timer 1 bị tràn (đủ thời gian cần định thời của Timer) bằng cách

- Kiểm tra cờ TMR1IF (nếu dùng thăm dò)

- Xử lý ISR của Timer 1 (nếu dùng ngắt)

Để đếm các sự kiện (Counter):

• BƯỚC 1: Xóa giá trị trong thanh ghi TMR1 (hoặc đặt giá trị ban đầu của

bộ đếm)

• BƯỚC 2: Xóa cờ báo tràn (cờ ngắt) TMR1IF

• BƯỚC 3: Chọn chế độ hoạt động của Counter 1

- Chế độ đếm sự kiện (Counter)

- Kích hoạt hoặc vô hiệu hóa ngắt (tùy chọn)

- Chọn giá trị tỉ lệ của Prescaler

- Chọn tính năng đồng bộ hoặc không đồng bộ xung

• BƯỚC 4: Cho phép Counter 1 bắt đầu

• BƯỚC 5: Đọc về và xử lý số xung đếm được trong thanh ghi TMR1 (TMR1H:TMR1L); Dựa vào cờ báo tràn TMR1IF để xử lý các trường hợp

số xung đếm vượt quá 65535

Trang 5

Câu 2: Lập trình PIC16F887, sử dụng ngắt PORTB điều khiển led bảy đoạn theo yêu cầu sau:

Yêu cầu:

- Nhấn SW0: led đếm lên từ 00 đến 24 một lần thời gian tồn tại mỗi trạng thái là 300ms

- Nhấn SW1: led đếm xuống từ 60 đến 00 và lặp lại hai lần thời gian tồn tại mỗi trạng thái là 300ms

- Nhấn SW2: led hiển thị số FP chớp tắt ba lần với f = 1 Hz

a Trình bày lý thuyết hoặc tính toán các công thức liên quan đến bài làm:

• Ngắt PORTB (sử dụng RB0 : RB7)

GIE=1 : cho phép ngắt toàn cục RBIF=0 : xoá cờ ngắt PORTB RBIE=1 : cho phép ngắt PORT B IOCBX=1 (X=0 :7) : cho phép ngắt chân RBX của PORTB

• Cách biến đổi tách các chữ số thuộc hàng chục hàng, đơn vị :

Hàng chục = Y/10 Hàng đơn vị = Y%10

b Lưu đồ giải thuật

dem24()

Hàng chục: i/10 Hàng đơn vị:i%10

end

Sai dem()

Trang 6

Hàng chục: i-1/10 Hàng đơn vị:i-1%10

end

While(n )

Sai Đúng

Sai dem60()

dem60()

FPchoptat()

Hiện thị FP 300ms While(n )

Tắt FP 300ms

end

Sai

Đúng Fpchoptat()

Trang 7

SW0 chân RB0 nhả?

Sai

Led 7 đoạn đếm xuống từ 60-00 2 lần dem60(2)

SW1 chân RB1 nhả?

Sai

SW2 chân RB2 nhả?

Sai Led 7 đoạn hiện thị FP

chóp tắt 3 lần FPchoptat(3)

Input → Digital I/O

Cấu hình PORT nối led 7

thanh PORTD; PORTC:

Trang 8

c Viết code bằng ngôn ngữ c, mô phỏng bằng phần mềm protues:

delay_ms(300);

PORTD=PORTC=0xFF; }

else if(!RB1) {

dem60(2);

delay_ms(300);

PORTD=PORTC=0xFF; }

else if(!RB2) {

FPchoptat(3);

delay_ms(500);

PORTD=PORTC=0xFF; }

} void main(void) {

ANSEL=ANSELH=0;

Trang 9

• Kết quả mô phỏng bằng phần mềm protues :

Nhấn SW0: led đếm lên từ 00 đến 24 một lần thời gian tồn tại mỗi trạng thái là 300ms

Trang 10

Nhấn SW1: led đếm xuống từ 60 đến 00, lặp lại hai lần thời gian tồn tại mỗi trạng thái là 300ms

Trang 11

Nhấn SW2: led hiển thị số FP chớp tắt ba lần với f = 1 Hz

Trang 12

Câu 3: Lập trình PIC16F887, sử dụng modul TIMER1 để tạo delay, kết quả hiển thị trên

8 led đơn theo yêu cầu sau:

Yêu cầu:

- Nhấn SW0: led 0,2,4,6 sáng trong 1s rồi tắt, (led thứ i nối với chân RDi)

- Nhấn SW1: led 1,3,5,7 sáng trong 2s rồi tắt, (led thứ i nối với chân RDi)

+ TMR1CS=0 : Bên trong (FOSC/4) :Timer T1SYNC : Đồng bộ xung ck bên ngoài với xung ck bên trong

+ T1SYNC=1 : Không đồng bộ + T1SYNC=0 : Đồng bộ

T1OSCEN :Cho phép bộ dao động LP (bộ dao động phụ : 32.768Hz)

+ T1OSCEN =1 : Chọn T1OSC (RC1) + T1OSCEN =0 : Chọn T1CKI (RC0) T1CKPS1, T1CKPS0 : các bit chọn tỉ lệ cho prescaler

• Tính TMR1 suy ra TMR1H,TMR1L từ công thức:

Chọn tdelay =100μs, prescaler =4

1(65536 [TMR1]) 4 Pr

Trang 13

Begin

Cấu hình tất cả Analog

Input → Digital I/O

Cấu hình PORT nối led

SW1 nhả?

Điều khiển bật led 1;3;5; của PORTD: delay_100us(20000)

SW2 nhả?RB1 nhả?

SW2 nhả?

Chóp tắt tất cả các led 3 lần mỗi trạng thái:

Sai Sai

Sai Sai

Đúng

Đúng

Đúng Đúng

Đúng

Đúng Loop

delay100_us delay100_us

Ghi vào thanh ghi TMR1H:TMR1L

Xoá cờ ngắt TMR1IF

Chọn chế độ Timer, kích hoạt hoặc

vô hiệu hoá ngắt, chọn giá trị Pre Cho phép timer 1 hoạt động

While(n )

end

Sai Đúng

Hoàn thành định thời?

Sai Đúng

Trang 14

c Viết code bằng ngôn ngữ c, mô phỏng bằng phần mềm proteus:

delay_100us(5);

while(!RB0);

{ delay_100us(5); PORTD=0x55; delay_100us(10000); PORTD=0x00; }

} if(!RB1) {

delay_100us(5);

while(!RB1);

{ delay_100us(5); PORTD=0xAA; delay_100us(20000); PORTD=0x00; }

} if(!RB2) {

delay_100us(5);

while(!RB2);

{ delay_100us(5);

Trang 15

} }

• Mô phỏng bằng phần mềm proteus:

Nhấn SW0: led 0,2,4,6 sáng trong 1s rồi tắt, (led thứ i nối với chân RDi)

Trang 16

Nhấn SW1: led 1,3,5,7 sáng trong 2s rồi tắt, (led thứ i nối với chân RDi)

Nhấn SW2: 8 led chớp tắt 3 lần với f = 1 Hz

Trang 17

Câu 4: Lập trình PIC16F887, sử dụng modul CCP chế PWM, tạo xung tại chân RC2, kết quả hiển thị theo yêu cầu sau:

Yêu cầu:

- Nhấn SW0: LCD hiển thị: line 0: họ và tên sinh viên (chữ có dấu) line 1: lớp - MSSV

- Nhấn SW1: Xuất xung PWM có f = 10KHz, D = 40% và LCD hiển thị:

line 0: Thi kết thúc môn line 1: Good luck!

a Trình bày lý thuyết hoặc tính toán các công thức liên quan đến bài làm:

• Modul CPP chế PWM

Tạo ra sóng vuông có chu kỳ nhiệm vụ thay đổi được tại một tần số xác định

Cung cấp những tính năng nâng cao cho nhiều kết nối yêu cầu khác nhau

TMR2ON=1/0 :cho phép/cấm Timer 2

Các bit chọn tỉ lệ cho Prescaler T2CKPS1=0/1, T2CKPS0=0/1

Các bit chọn tỉ lệ cho postscaler TOUTPS3=1/0; TOUTPS2=1/0;

TOUTPS1=1/0; TOUTPS0=1/0

• Tính toán giá trị thanh ghi

Trang 19

Good luck!

SW0 nhả?

Cấm xuất xung; Khởi động LCD 16x2 lcd_init Lấy kí tự từ mảng đã tạo kí tự có dấu

line[1 4], mảng dat[i]={kí tự có dấu}

SW1 nhả? Xuất xung D= 40%; xung40() Khởi động LCD 16x2 lcd_init

Lấy kí tự từ mảng đã tạo kí tự có dấu line[1 4], mảng dat[i]={kí tự có dấu}

Sai Sai

Sai Loop

Main

Trang 20

xung(40)

Cấm xuất xung PWM CCP1(RC2):input

Xoá Timer 2; TMR2=0

Đặt chu kì xung PWM (PR2)f=10KHz (T=100us)

xung(40)

Đặt chu kì xung PWM (PR2)f=10KHz (T=100us)

Đặt độ rộng xung PWM (CCPRxL:CCPxCON<5:4>)

Trang 21

c Viết code bằng ngôn ngữ c, mô phỏng bằng phần mềm proteus:

#include "lcd.h" // Cau hinh ket noi

va khai bao lenh dung cho LCD

unsigned char i;

lcd_init();

i = 0;

lcd_put_byte(0,0x40); while(lcd_busy());

while(dat[i]!=0x99) {

lcd_put_byte(1,dat[i]); while(lcd_busy()); i++;

} lcd_gotoxy(0,0);

for(i=0;i<=15;i++) lcd_putc(line1[i]); lcd_gotoxy(0,1);

for(i=0;i<=15;i++) lcd_putc(line2[i]); }

} } if(!RB1) {

delay_ms(5);

while(!RB1);

{

Trang 22

unsigned char i;

lcd_init();

i = 0;

lcd_put_byte(0,0x40); while(lcd_busy());

while(dat[i]!=0x99) {

lcd_put_byte(1,dat[i]); while(lcd_busy()); i++;

} lcd_gotoxy(0,1);

for(i=0;i<=15;i++) lcd_putc(line4[i]);

lcd_gotoxy(0,0);

for(i=0;i<=15;i++) lcd_putc(line3[i]);

} } } }}

Trang 23

• Mô phỏng bằng phần mềm protues:

Nhấn SW0: LCD hiển thị: line 0: họ và tên sinh viên (chữ có dấu) line 1: lớp – MSSV

Nhấn SW1: Xuất xung PWM có f = 10KHz, D = 40% và LCD hiển thị:

line 0: Thi kết thúc môn line 1: Good luck!

Trang 25

Câu 5: Lập trình PIC16F887, sử dụng modul ADC

Yêu cầu: đo giá trị nhiệt độ từ cảm biến LM35, cảm biến nối với chân RA0 (trả về điện áp), chuyển đổi giá trị điệp áp ra giá trị số và hiển thị giá trị nhiệt độ đo được trên led bảy đoạn

a Trình bày lý thuyết hoặc tính toán các công thức liên quan đến bài làm:

• Modul ADC :

Khi cấu hình sử dụng modul ADC cần phải:

+ Cấu hình port

+ Chọn kênh ADC + Chọn điện áp tham chiếu ADC + Chọn nguồn xung clock chuyển đổi ADC + Điều khiển ngắt

+ Định dạng kết quả

Bắt đầu quá trình chuyển đổi AD:

+ Đặt bit GO/DONE bởi người sử dụng (cần lưu ý rằng bit này không nên được cùng thời điểm với việc kích hoạt modul ADC)

Kết thúc quá trình chuyển đổi:

+ Bit GO/DONE được xóa bởi modul ADC + Cờ ADIF được đặt bởi modul ADC

+ Giá trị ADRESH:ADRESL được cập nhật bởi modul ADC Hủy quá trình chuyển đổi:

+ Xóa bit GO/DONE bởi người sử dụng

• Tính toán quan hệ giữa điện áp tương đương ngõ vào và giá trị số sau khi chuyển đổi, chuyển đổi giá trị điện áp thành nhiệt độ:

Quan hệ giữa điện áp tương đương ngõ vào và giá trị số sau khi chuyển đổi

1023

REF

DV V

Trang 26

Chuyển đổi giá trị điện áp thành giá trị nhiệt độ đọc từ cảm biến LM35

Ta có 10mV/1oC Vậy t o =Vcd.100

Giả sử điện áp ngõ ra của LM35 =1,5V thì Vin=1,5 thì giá trị số khi chuyển đổi là:

b Lưu đồ giải thuật

Cấu hình kiểu chân

Analog Input: AN0

Digital I/O: các chân còn lại

Cấu hình PORT kết nối

RA0: Input cảm biến LM35

PORTC: LED 7 đoạn

PORTD: LED 7 đoạn

PORTB: LED 7 đoạn

Điều khiển tắt 3 led 7 đoạn

Main

Begin

Cấu hình modul ADC

Cấu trúc dữ liệu: Canh phải

Điện áp tham chiếu:

VREF+=Vcc VREF-=Vss Tần số chuyển đổi: Fosc/32

Kênh vào: AN0 Kích hoạt module: Bật

Đọc giá trị: byte cao*256+byte thấp Chuyển đổi giá trị điện áp sang nhiệt độ: giá trị adc đọc*100

Tách số hàng trăm,chục,đơn vị:

TR=nhietdoLM35/100 CH=(nhietdoLM35%100)/10) DV=(nhietdoLM35%100)%10

Hiện thị giá trị trên led 7 thanh bằng cách lấy mã led trên mảng đã tạo

Trang 27

c Viết code bằng ngôn ngữ c, mô phỏng bằng phần mềm proteus:

{ ANSEL =0x01;

unsigned int nhietdoLM35,TR,CH,DV;

float Vcd;

const unsigned char a[10]= {0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90}; unsigned int gtnhietdo = 0; delay_us(6);

GO= 1;

while(GO);

gtnhietdo = ADRESH*256 + ADRESL;

gtADC = gtnhietdo;

Vcd= (float)(gtADC*5)/1023; nhietdoLM35=Vcd*100;

TR=nhietdoLM35/100;

CH=(nhietdoLM35%100)/10; DV=(nhietdoLM35%100)%10; PORTC=a[TR];

- Đo giá trị nhiệt độ từ cảm biến LM35, cảm biến nối với chân RA0 (trả về điện

áp), chuyển đổi giá trị điệp áp ra giá trị số và hiển thị giá trị nhiệt độ đo được

trên led bảy đoạn

Trang 30

TÀI LIỆU THAM KHẢO

1 Trong bài tiểu luận có tham khảo giáo trình tài liệu học tập do giảng viên bộ môn cô

cung cấp

2 Trong bài tiểu luận có sử dụng thư viện LCD.h do giảng viên bộ môn cung cấp giảng

dạy cung cấp và cho phép sử dụng

Ngày đăng: 11/11/2021, 23:18

HÌNH ẢNH LIÊN QUAN

Cấu hình tất cả Analog Input → Digital I/O  - FULL CODE VI XỬ LÍ PIC16F887 LẬP TRÌNH NGẮT, PWM, LCD, TIMER1,ADCLM35, LED 7 ĐOẠN
u hình tất cả Analog Input → Digital I/O (Trang 7)
Cấu hình tất cả Analog Input → Digital I/O  - FULL CODE VI XỬ LÍ PIC16F887 LẬP TRÌNH NGẮT, PWM, LCD, TIMER1,ADCLM35, LED 7 ĐOẠN
u hình tất cả Analog Input → Digital I/O (Trang 13)
Cấu hình tất cả Analog Input → Digital I/O  - FULL CODE VI XỬ LÍ PIC16F887 LẬP TRÌNH NGẮT, PWM, LCD, TIMER1,ADCLM35, LED 7 ĐOẠN
u hình tất cả Analog Input → Digital I/O (Trang 19)
Cấu hình modul CCP ở chế độ PWM  - FULL CODE VI XỬ LÍ PIC16F887 LẬP TRÌNH NGẮT, PWM, LCD, TIMER1,ADCLM35, LED 7 ĐOẠN
u hình modul CCP ở chế độ PWM (Trang 20)
Cấu hình kiểu chân Analog Input: AN0  Digital I/O: các chân còn lại  - FULL CODE VI XỬ LÍ PIC16F887 LẬP TRÌNH NGẮT, PWM, LCD, TIMER1,ADCLM35, LED 7 ĐOẠN
u hình kiểu chân Analog Input: AN0 Digital I/O: các chân còn lại (Trang 26)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w