ĐỒ ÁN TỐT NGHIỆP ĐIỆN tử THIẾT KẾ MẠCH ĐÈN GIAO THÔNG KẾT HỢP VỚI QUANG BÁO
NỘI DUNG ĐỒ ÁN
THIẾT KẾ MẠCH ĐÈN GIAO THÔNG KẾT HỢP VỚI QUANG BÁO
Với sự phát triển không ngừng của khoa học công nghệ, cuộc sống con người ngày càng trở nên tiện nghi và hiện đại hơn. Điều đó đem lại cho chúng ta nhiều giải pháp tốt hơn, đa dạng hơn trong việc xử lý những vấn đề tưởng chừng như rất phức tạp gặp phải trong cuộc sống. Việc ứng dụng các thành tựu khoa học kỹ thuật hiện đại trong tất cả các lĩnh vực đã và đang rất phổ biến trên toàn thế giới, thay thế dần những phương thức thủ công , lạc hậu và ngày càng được cải tiến hiện đại hơn, hoàn mỹ hơn.
Cùng với sự phát triển chung đó, nước ta cũng đang mạnh mẽ tiến hành công cuộc công nghiệp hóa và hiện đại hóa đất nước để theo kịp sự phát triển của các nước trong khu vực và trên thế giới. Trong đó lĩnh vực điện tử đang ngày càng đóng vai trò quan trọng trong việc phát triển kinh tế và đời sống con người. Sự phổ biến của nó đóng góp không nhỏ tới sự phát triển của tất cả các ngành sản xuất, giải trí, ...trong những năm gần đây đặc biệt trong lĩnh vực giao thông và quảng cáo đã có sự phát triển mạnh mẽ với nhiều hình thức, phương pháp tiếp cận, quảng bá và chia sẻ thông tin hiện đại và toàn diện hơn.
Với lòng đam mê, yêu thích của mình trong lĩnh vực này, nhóm đã quyết định chọn đề tài “Đèn Giao Thông Kết Hợp Với Quang Báo” làm đề tài tốt nghiệp.
Trong thời gian ngắn thực hiện đề tài cộng với kiến thức còn nhiều hạn chế, nên trong cuốn đồ án này không tránh khỏi những thiếu sót, nhóm thực hiện rất mong được sự đóng góp ý kiến của thầy cô và các bạn sinh viên.
M ỤC L ỤC
Chuơng dẩn nhập................................................................................................... Trang 1
Chương 2 :Giới thiệu về các linh kiện có trong mạch
2.1/Giới thiệu về pic
2.1.1/Tổng quan về họ vi điều khiển................................................................... Trang 2
2.1.1.1/Một số đặc tính của Vi điều khiển PIC................................................... Trang 2
2.1.1.2/Những đặc tính ngoại vi............................................................................ Trang 3
2.1.1.3/Đặc điểm về tương tự................................................................................ Trang 3
2.1.1.4/Các đặc điểm đặc biệt............................................................................... Trang 3
2.1.1.5/Công nghệ CMOS...................................................................................... Trang 4
2.1.2 / Giới thiệu về PIC16F8XX và PIC16F877A............................................. Trang 4
2.1.2.1/các đặc tính ngoại vi bao gồm các khối chức năng.............................. Trang 5
2.1.2.2/ Sơ lược về vi điều khiển PIC 16F877A................................................. Trang 6
2.1.2.3/ Cấu trúc phần cứng của PIC 16F877A................................................... Trang 10
2.1.2.4/ Một số chế độ đặt biệt của vi điều khiển PIC 16F877........................ Trang 12
2.1.2.4.1/ Dao động................................................................................................. Trang 12
2.1.2.4.2/ Reset........................................................................................................ Trang 13
2.1.2.4.3/ MCLR...................................................................................................... Trang 14
2.1.2.4.4/ Interrupts................................................................................................ Trang 15
2.1.2.3.5/ Chế độ nguồn thấp Sleeep (Power Down Mode).............................. Trang 16
2.1.2.4.6 Bộ định thời giám sát (Watch Dog Timer – WDT)............................ Trang 16
2.1.2.5/ Tổ chức bộ nhớ......................................................................................... Trang 17
2.1.2.5.1/ Bộ nhớ chương trình............................................................................. Trang 17
2.1.2.5.2/ Bộ nhớ dữ liệu........................................................................................ Trang 18
2.1.2.6/ Các thanh ghi chức năng đặt biệt........................................................... Trang 25
2.1.2.6.1/ Thanh ghi trạng thái (Status Register)................................................ Trang 25
2.1.2.6.2/ Thanh ghi tùy chọn (Option Reg Register)........................................ Trang 25
2.1.2.6.3/ Thanh ghi điều khiển ngắt INTCON (Interrupt ControlRegister)... Trang 26
2.1.2.6.4/ Thanh ghi cho phép ngắt ngoại vi 1 (PIE1 Register)........................ Trang 27
2.1.2.6.5/ Thanh ghi cờ của các ngắt ngoại vi 1 (PIR1 Register)..................... Trang 28
2.1.2.6.6/ Thanh ghi cho phép ngắt ngoại vi 2 (PIR2 Register)........................ Trang 29
2.1.2.6.7/ Thanh ghi cờ của các ngắt ngoại vi 2 (PIR2 Register)..................... Trang 29
2.1.2.6.8/ Thanh ghi Work và tập lệnh của PIC 16F877A................................ Trang 30
2.1.2.7/ Khái quát về chức năng các Port trong vi điều khiển.......................... Trang 31
2.1.2.7.1/ Port A và thanh ghi TRIS A.................................................................. Trang 31
2.1.2.7.2/ PORT B và thanh ghi TRISB................................................................ Trang 33
2.1.2.7.3/ Port C và thanh ghi TRISC................................................................... Trang 34
2.1.2.7.4 /Port D và thanh ghi TRISD................................................................... Trang 36
2.1.2.7.5 /PortE và thanh ghi TRISE..................................................................... Trang 37
2.1.2.8/ Bộ định thời của PIC 16F877A............................................................... Trang 38
2.1.2.8.1/ Bộ định thời Timer 0............................................................................. Trang 38
2.1.2.8.2/ Bộ định thời Timer 1............................................................................. Trang 40
2.1.2.8.3/ Bộ định thời Timer 2............................................................................. Trang 42
2.1.2.9/ Module CPP............................................................................................... Trang 44
2.1.2.9.1/ Thanh ghi điều khiển CCP................................................................... Trang 46
2.1.2.9.2/ Chế độ Capture...................................................................................... Trang 46
2.1.2.9.3/ Chế độ Campare.................................................................................... Trang 47
2.1.2.9.4/ Chế độ điều chế xung PWM................................................................ Trang 47
2.1.2.10/ Module ADC........................................................................................... Trang 50
2.1.2.10.1/ Giới thiệu Module ADC 10 bit.......................................................... Trang 50
2.1.2.10.2/ Các thanh ghi điều khiển................................................................... Trang 51
2.1.2.10.3/ Hoạt động của Module ADC............................................................. Trang 53
2.1.2.10.4/ Thời gian lấy mẫu................................................................................ Trang 54
2.1.2.10.5/ Lựa chọn xung Clock cho biến đổi ADC......................................... Trang 55
2.1.2.10.6/ Cấu hình các chân Analog ................................................................ Trang 56
2.1.2.10.7/ Chuyển đổi ADC................................................................................. Trang 56
2.1.2.10.8/ Hoạt động của Module ADC trong chế độ ngủ............................... Trang 57
2.1.2.10.9/ Ảnh hưởng của Reset.......................................................................... Trang 57
2.1.2.11/ Giao tiếp nối tiếp.................................................................................... Trang 58
2.1.2.11.1/ USART bất đồng bộ............................................................................ Trang 59
2.1.2.11.2/ USART đồng bộ................................................................................... Trang 62
2.2) giới thiệu về các linh kiện khác
2.2.1) Led 7 đoạn ................................................................................................... Trang 66
2.2.2) IC74LS247 ................................................................................................... Trang 68
2.2.3) Transistor lưỡng cực ................................................................................... Trang 70
2.2.4) Led ma trận .................................................................................................. Trang 72
2.2.5) IC TPIC6B595 ............................................................................................. Trang 73
2.2.6) IC74HC595................................................................................................... Trang 75
2.2.7) IC ULN2803................................................................................................. Trang 76
2.2.8) IC7805........................................................................................................... Trang 77
Chương 3 :Giới thiệu về ccs
3.1) Khai báo và sử dụng biến hằng và mảng..................................................... Trang 80
3.1.1) Kiểu dữ liệu.................................................................................................. Trang 80
3.1.2) Biến................................................................................................................ Trang 80
3.1.3) hằng............................................................................................................... Trang 81
3.1.4) hàm................................................................................................................ Trang 81
3.2) Các cấu trúc cơ bản........................................................................................ Trang 81
3.2.1) Cấu trúc if… else......................................................................................... Trang 81
3.2.2) Cấu trúc Switch…Case............................................................................... Trang 82
3.2.3) Cấu trúc for................................................................................................... Trang 82
3.2.4) Cấu trúc while.............................................................................................. Trang 82
3.2.5) Cấu trúc do…while..................................................................................... Trang 83
3.3) Các hàm cơ bản............................................................................................... Trang 83
3.3.1) delay.............................................................................................................. Trang 83
3.3.1.1) Delay Cycles (Count).............................................................................. Trang 83
3.3.1.2) Delay_ms (time)....................................................................................... Trang 83
3.3.1.3) Delay_ us (time)...................................................................................... Trang 84
3.3.2) ADC............................................................................................................... Trang 84
3.3.2.1) setup_adc................................................................................................... Trang 84
3.3.2.2) setup_adc_port()...................................................................................... Trang 84
3.3.2.3) setup_adc_channel()............................................................................... Trang 85
3.3.2.4) value = read_adc()................................................................................... Trang 85
3.3.3) Capture compare pwm (ccp)...................................................................... Trang 86
3.3.3.1) SET_PWM1_DUTY(value) .................................................................. Trang 86
SET_PWM2_DUTY(value)
3.3.3.2) setup_ccp1................................................................................................ Trang 86
Setup_ccp2
3.3.3.3) setup_timer1()......................................................................................... Trang 87
3.3.4) interrupts...................................................................................................... Trang 88
3.3.4.1) Ext_int_edge............................................................................................. Trang 88
3.3.4.2) #INT_xxx................................................................................................... Trang 88
4.3.5/ value = get_timer1().................................................................................... Trang 88
3.3.6) set_timer1().................................................................................................. Trang 89
3.3.7) enabel_interrupts......................................................................................... Trang 89
Chương 4:Các phương pháp hiển thị cho bảng quang báo
4.1) Phương pháp chốt
4.1.1) chốt hàng....................................................................................................... Trang 90
4.1.2) Chốt cột......................................................................................................... Trang 91
4.2) Phương Pháp hiển thị sử dụng thanh ghi dịch
4.2.1) Quét cột......................................................................................................... Trang 92
4.2.2) Quét hàng...................................................................................................... Trang 94
Chương 5 : Phân tích thiết kế và thi công mạch
5.1) Mạch đèn giao thông
5.1.1) sơ đồ nguyên lý............................................................................................ Trang 98
5.1.2) Sơ đồ khối..................................................................................................... Trang 98
5.1.2.1) Khối nguồn................................................................................................ Trang 98
5.1.2.2) Bàn phím hex............................................................................................ Trang 99
5.1.2.3) Khối xử lý trung tâm................................................................................ Trang 99
5.1.2.4) Khối giải mã.............................................................................................. Trang 100
5.1.2.5) Khối hiển thị............................................................................................. Trang 101
5.2) Mạch quang báo
5.2.1) Sơ đồ nguyên lý........................................................................................... Trang 102
5.2.2) Sơ đồ khối..................................................................................................... Trang 102
5.2.2.1) Khối xuất dữ liệu hàng............................................................................ Trang 102
5.2.2.2) Khối hiển thị............................................................................................. Trang 103
Chương 6 :Lưu đồ và giải thuật
6.1) Lưu đồ giải thuật
6.1.1) Đèn giao thông............................................................................................. Trang 106
6.1.2) Mạch quang báo........................................................................................... Trang 110
6.2) Mã code
6.2.1) Đèn giao thông............................................................................................. Trang 112
6.2.2) Mạch quang báo........................................................................................... Trang 132
Chương 7 :Kết luận............................................................................................... Trang 136
CHƯƠNG DẪN NHẬP
I) ĐẶT VẤN ĐỀ :
Trong đời sống hiện nay , một trong những vấn đề gây ra không ít khó khăng và bực bội cho mọi người chính là vấn đề giao thông ,do đất nước ta có dân số ngày càng đông trong khi đó thì đường sá tuy đuợc mở rộng nhưng không đáp ứng được yêu cầu đi lại của mỗi người cho nên tình trạng kẹt xe xảy ra ngày càng nhiều ,từ khi có những trụ đèn giao thông thì tình hình giao thông đã được cải thiện rất nhiều, khiến cho việc đi lại của người dân dễ dàng và thuận tiện hơn , hiện nay bảng quang báo ngày càng phát truyển mạnh và được ứng dụng rộng rãi trong nhiều lĩnh vực như : quãng cáo, giao thông v.v. vì vậy việc ứng dụng quang báo vào giao thông là một sáng kiến rất hay và rất phù hợp với tình hình giao thông hiện nay.
II) GIỚI HẠN ĐỀ TÀI :
Với quy mô là đồ án tốt nghiệp, nên nhóm chúng em đã cố gắng hết sức làm những gì mà giáo viên yêu cầu, nhưng do kiến thức còn hạn chế nên chúng em chỉ thực hiện được những yêu cầu sau :
1.Hiển thị led dúng thời gian thực tế.
2.sử dụng led 7 doạn hiển thị thời gian.
3.cài đặt thời gian cho mạch.
4.khi muốn nhập thời gian mới ta nhấn nút Menu, các phím số, Enter để chạy
5.kết hợp với quang báo để hiện chử
6. quang báo nhập sẳn, không dùng nút nhấn
III) MỤC ĐÍCH NGHIÊN CỨU :
Mục đích trước hết khi thực hiện đề tài này là để đủ điều kiện để tốt nghiệp.Cụ thể khi nghiên cứu đề tài là chúng em muốn phát huy những thành quả ứng dụng của vi điều khiển vào một mạch thực tế. Nó còn là tập tài liệu tham khảo cho các sinh viên khóa sau.
Ngoài ra quá trình thực hiện đề tài là một cơ hội để chúng em tự kiểm tra lại những kiến thức đã học ở trường. Đồng thời phát huy tính sáng tạo, khả năng giải quyết những vấn đề do nhu cầu đặt ra.
IV) ĐỐI T ƯỢNG NGHIÊN CỨU:
1.Các phương án điều khiển và xử lý dữ liệu
2.Tìm hiểu về vi xử lý PIC16F877A
3.Tìm hiểu về IC74LS247
4.Tìm hiểu về led ma trận
5. Tìm hiểu về IC ULN2803
6. Tìm hiểu về IC 6B595
7. Tìm hiểu về phần mềm mikroc
CHƯƠNG 2 : GIỚI THIỆU VỀ CÁC LINH KIỆN
2.1) Giới thiệu về PIC:
2.1.1) Tổng quan về họ vi điều khiển:
Dòng PIC đầu tiên là PIC1650 được phát triển Microelectronics Division thuộc General_Instrument. PIC bắt nguồn từ chữ viết tắc của “Programmable Intelligent Computer” (Máy tính khả trình thông minh) là một sản phẩm của hãng General Instruments đặt cho dong2san3 phẩm đầu tiên của họ là PIC1650. Lúc này, PIC 1650 được Pic là một ho vi điều khiển RISC được san xuất bởi công ty Mirochip Technology. dùng để giao tiếp với các thiết bị ngoại vi cho các máy chủ 15 bit CP1600, vì vậy, người ta cũng gọi PIC “Peripheral Interface Controller” (Bộ điều khiển giao tiếp ngoại vi). CP1600 là một CPU tốt, nhưng lại kém về các hoạt động xuất nhập, vì vậy PIC 8_bit được phất triển vào khoảng năm 1975 để hộ trợ hoạt động xuất nhập cho CP1600. PIC sử dụng microcode đơn giản đặt trong ROM, và mặc dù cụm từ RISC chưa được sử dủng thời bấy giờ, nhưng PIC thật sự là một vi điều khiển với kiến trúc RISC, chạy một lệnh một chu kỳ máy (4 chu kỳ của bộ dao động). Năm 1985 General Instruments bán bộ phận vi điện tử của họ, và chủ sở hữu hũy bỏ hầu hết các dự án-lúc đó quá lỗi thời. Tuy nhiên, PIC được bổ xung EPROM để tạo thành một bộ điều khiển vào ra khả trình. Ngày nay rất nhiều dòng PIC được sản xuất với hàng loạt các modele ngoại vi tích hợp sẵn (như USART,PWM,ADC….), với bộ nhớ chương trình từ 512 Word đến 32k Word.
2.1.1.1) Một số đặc tính của Vi điều khiển PIC:
Hiện nay có khá nhiều dòng PIC và có rất nhiều khác biệt về phần cứng nhưng chúng ta có thể điểm qua một vài nét sau:
- 8/16 bit CPU, xây dựng theo kiến trúc Harward co sữa đổi.
- Flsah và ROM có thể tùy chọn từ 256 byte đến 256 Kbyte.
- Các cổng xuất/nhập (I/O) mức logic thường từ 0V đến 5.5V, ứng với logic 0 và 1.
- 8/16 bit timer.
- Các chuẩn giao tiếp nối tiếp đồng bộ, khung đồng bộ USART.
- Bộ chuyển đổi ADC Analog_to_digital converters, 10/12 bit.
- Bộ so sánh điện áp.
- Các module Capture/Cmpare/PWM.
- LCD.
- MSSP Peripheral dựng cho các giao tiếp IC2,SPI.
- Bộ nhớ nội EPROM-có thể ghi/xóa lên tới một triệu lần.
- Moudle điều khiển động cơ,d0oc5 encoder.
- Hỗ trợ giao tiếp USB.
- Hỗ trợ giao tiếp CAN.
- Hỗ trợ giao tiếp LIN.
- Hỗ trợ giao tiếp IRDA.
- Một số dòng có tích hop7675bo65 RF (PIC16f639,và RFPIC).
- KEELOQ mã hóa và giải mã.
- DSP những tính năng xử lý tín hiệu số (dsPIC) đặc điểm thực thi tốc độ cao của RISC CPU của họ vi điều khiển PIC16F87XA.
- Chỉ gồm 35 lệnh đơn.
- Tất cả các lệnh là một chu kỳ ngoại trừ chương trình con là hai chu kỳ.
- Tốc độ hoạt động:
- DC_20MHz ngõ vào xung clock.
- DC_200ns chu kỳ lệnh.
2.1.1.2) Những đặc tính ngoại vi:
- Timer0 : 8_bit định thời/điếm với 8_bit, prescaler.
- Timer1 : 16_bit định thời/điếm với prescaler, có thể được tăng lên trong suốt chế độ Sleep qua thạch anh/xung clock bên ngoài.
- Timer2 : 8_bit định thời/điếm với 8_bit, prescaler, postscaler.
- Hai module Capture, Compare,PWM:
- Capture có độ rộng 16 bit, độ phân giải 12,5ns.
- Compare có độ rộng 16 bit, độ phân giải 200ns.
- Độ phân giải lớn nhất của PWM là 10bit.
- Có 13 ngõ I/O có thể điều khiển trực tiếp.
- Dòng vào và ra lớn:
- 25mA dòng vào cho mỗi chân.
- 20mA dòng ra cho mõi chan.
2.1.1.3) Đặc điểm về tương tự:
10 bit, với 8 kênh của bộ chuyển đổi tương tự sang số (A/D).
Brown_out Reset(BOR).
Module sosanh về tương tự:
- Hai bộ so sánh tương tự.
- Module điện ap chuẩn VREF có thể lập trình trên PIC.
Có thể lập trình ngõ vào đến từ những ngõ vào của PIC và trên điện áp bên trong.
Những ngõ ra của bộ so sánh có thể sử dụng cho bên ngoài.
2.1.1.4) Các đặc điểm đặc biệt:
- Có thề ghi/xóa tới 100000 lần với kiểu bộ nhớ chương trình Enhanced Flash.
- 1000000 lần ghi/xóa với kiểu bộ nhớ EPROM.
- EPROM có thể lưu trữ dư liệu hơn 40 năm.
- Có thể lập trình lại dưới sự điều khiển của phần mền,
- Mạch lập trình nối tiếp qua hai chân.
- Nguồn đơn 5V cấp cho mạch lập trình nối tiếp.
- Watchdog Timer (WDT) với bộ dao dộng RC tích hợp sẵn trên Chip cho hoạt động đáng tin cậy.
- Có thể lập trình màng bảo vệ.
- Tiết kiệm năng lượng với chế độ Sleep.
- Có thể lựa chọn bộ dao động.
2.1.1.5) Công nghệ CMOS:
- Năng lượng thấp, tốc độ caoFlash/cong nghệ EPROM.
- Việc thiết kế hoàn toàn tĩnh.
- Khỏang điện áp hoạt động từ 2V đến 5,5V.
- Tiêu tốn năng lượng thấp.
2.1.2) Giới thiệu về PIC16F8XX và PIC16F877A:
- PIC16F8XX lò nhóm PIC trong họ PIC16FXX của họ vi điều khiển 8_bit, tiêu tốn năng lượng thấp, đáp ứng nhanh, chế tạo theo công nghệ CMOS, chống tĩnh điện tuyệt đối. Bao gồm các nhóm sau:
- PIC16F83
- PIC16CR83
- PIC16F84
- PIC16CR84
- Tất cả các PIC16/17 điều có cấu trúc RICS. PIC16CXX các đặc tính nỗi bậc, 8 mắc ngăn xếp tack, nhiều nguồn ngắt tích hợp bên trong lẫn bên ngoài. Có cấu trúc Haward với các bus dữ liệu và bus thực thi chương trình riêng biệt nhau cho phép độ dài một lệnh là 14_bit và bus dữ liệu 8_bit cách biệt nhau. Tất cả các lệnh điều mất một chu kỳ lệnh ngoại trừ các lệnh rẽ nhánh chương trình mất hai chu kỳ lệnh. Chỉ có 35 lệnh và một lượng lớn các thanh ghi cho phép đáp ứng cao trong ứng dụng.
- Họ PIC16F8XX có nhiều tính năng đặc biệt làm giảm các thiết bị ngoại vi, vì vậy kinh tế cao, có hệ thống nỗi bật đáng tin cậy và sự tiêu thụ năng lượng thấp. Ở dây có bốn sự lựa chon5bo65 dao động và chỉ có chân kết nối bộ dao dộng RC nên có giải pháp tiết kiệm cao. Chế độ SLEEP tiết kiệm nguồn và có thể được dánh thức bởi các nguồn reset. Và còn nhiều phần khác đó được giới thiệu bên trên sẽ được nói ở các phần kế tiếp.
- PIC 16F877A là dòng PIC phổ biến nhất hiện nay (đủ mạnh về tính năng, 40 chân, bộ nhớ đủ cho hầu hết các ứng dụng thông thường). Cấu trúc tổng quát của PIC16F877A như sau:
- 8 K Flash ROM.
- 368 Bytes RAM.
- 256 Bytes EEPROM.
- 5 ports (A, B, C, D, E) vào ra với tín hiệu điều khiển độc lập.
- 2 bộ định thời 8 bits (Timer 0 và Timer 2).
- Một bộ định thời 16 bits (Timer 1) có thể hoạt động trong chế độ tiết kiệm năng lượng (SLEEP MODE) với nguồn xung Clock ngoài.
- 2 bô CCP( Capture / Compare/ PWM).
- 1 bộ biến đổi AD 10 bits, 8 ngõ vào.
- 2 bộ so sánh tương tự (Compartor).
- 1 bộ định thời giám sát (WatchDog Timer).
- Một cổng song song 8 bits với các tín hiệu điều khiển.
- Một cổng nối tiếp.
- 15 nguồn ngắt.
- Có chế độ tiết kiệm năng lượng.
- Nạp chương trình bằng cổng nối tiếp ICSP(In-Circuit Serial Programming)
- Được chế tạo bằng công nghệ CMOS
- 35 tập lệnh có độ dài 14 bits.
- Tần số hoạt động tối đa 20MHz.
2.1.2.1)các đặc tính ngoại vi bao gồm các khối chức năng :
- Timer0: bộ đếm 8 bit với bộ chia tần số 8 bit.
- Timer1: bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep.
- Timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler.
- Hai bộ Capture/so sánh/điều chế độ rông xung.
- Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI và I2C.
- Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ.
- Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển RD, WR,
- CS ở bên ngoài.
- Các đặc tính Analog:
- 8 kênh chuyển đổi ADC 10 bit.
- Hai bộ so sánh.
- Bên cạnh đó là một vài đặc tính khác của vi điều khiển như:
- Bộ nhớ flash với khả năng ghi xóa được 100.000 lần.
- Bộ Timer0: bộ đếm 8 bit với bộ chia tần số 8 bit.
- Timer1: bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep.
- Timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler.
- Hai bộ Capture/so sánh/điều chế độ rông xung.
- Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI và I2C.
- Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ.
- Cổng nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần.
- Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm.
- Khả năng tự nạp chương trình với sự điều khiển của phần mềm. Nạp được chương trình ngay trên mạch điện ICSP (In Circuit Serial Programming) thông qua 2 chân. Watchdog Timer với bộ dao động trong.
- Chức năng bảo mật mã chương trình.
- Chế độ Sleep.
- Có thể hoạt động với nhiều dạng Oscillator khác nhau.
2.1.2.2) Sơ lược về vi điều khiển PIC 16F877A:
- Sơ đồ chân :
Hình 2.1 Sơ đồ khối PIC 16F877A
- Sơ đồ nguyên lý:
Hình 2.2 Sơ đồ nguyên lý PIC 16F877A
l.Nhận xét:
Từ sơ đồ chân và sơ đồ nguyên lý ở trên, ta rút ra các nhận xét ban đầu như sau :
- PIC16F877A có tất cả 40 chân
- 40 chân trên được chia thành 5 PORT, 2 chân cấp nguồn, 2 chân GND, 2 chan thạch anh và một chân dùng để RESET vi điều khiển.
- 5 port của PIC16F877A bao gồm :
- PORTB : 8 chân
- PORTD : 8 chân
- PORTA : 6 chân
- PORT E : 3 chân.
Mỗi chân của vi điều khiển PIC 16F877A có một chức năng khác nhau. Trong đó có một số chân đa công dụng: mỗi chân có thể hoạt động như một đường xuất nhập hoặc là một chân chức năng đặc biệt dùng để giao tiếp với các thiết bị ngoại vi.
Hình 2.3 Sơ đồ khối cấu trúc bên trong PIC 16F877A
2.1.2.3) Cấu trúc phần cứng của PIC 16F877A:
PIC là tên viết tắt của “ Programmable Intelligent computer” do hãng General Instrument đặt tên cho con vi điều khiển đầu tiên của họ. Hãng Micrchip tiếp tục phát triển sản phầm này và cho đến hàng đã tạo ra gần 100 loại sản phẩm khác nhau.
PIC16F887A là dòng PIC khá phổ biến, khá đầy đủ tính năng phục vụ cho hầu hết tất cả các ứng dụng thực tế. Đây là dòng PIC khá dễ cho người mới làm quen với PIC có thể học tập và tạo nền tản về họ vi điều khiển PIC của mình.
- Cấu trúc tổng quát của PIC16F877A như sau :
- 8K Flash Rom
- 368 bytes Ram
- 256 bytes EFPROM
- 5 port vào ra với tín hiệu điều khiển độc lập
- 2 bộ định thời Timer0 và Timer2 8 bit
- 1 bộ định thời Timer1 16 bit có thể hoạt động ở cả chế độ tiết kiệm năng lượng với nguồn xung clock ngoài
- 2 bộ Capture/ Compare/ PWM
- 1 bộ biến đổi Analog -> Digital 10 bit, 8 ngõ vào
- 2 bộ so sánh tương tự
- 1 bộ định thời giám sát (Watch Dog Timer)
- 1 cổng song song 8 bit với các tín hiệu điều khiển
- 1 cổng nối tiếp
- 15 nguồn ngắt
- Sơ đồ khối
Hình 2.4 Sơ đồ khối bên trong của vi điều khiển 16F877A
2.1.2.4) Một số chế độ đặt biệt của vi điều khiển PIC 16F877:
2.1.2.4.1) Dao động:
PIC16F877A có thể hoạt động trong bốn chế độ dao động khác nhau:
- LP low-power crystal
- XT crystal/resonatpor
- HS high-speed crystal/resonatpor
- RC resistor/capacitor
Hình 2.5 Các chế độ lao động
Trong các chế độ LP, XT và HS chúng ta sử dụng thạch anh dao động nối vào các chân OSC1 và OSC2 để tạo dao động.
Việc lựa chọn tụ trong dao động thạch anh được lựa chọn dựa vào bảng sau:
Hình 2.6 Giá trị tụ trong dao động thạch anh
Tụ có giá trị lớn sẽ mang tính ổn định của dao động nhưng làm tăng thời gian khởi động.
Cách tính chu kỳ máy: Ví dụ ta sử dụng thạch anh 10Mhz. Khi đó: Tần số dao động của thạch anh là Fosc = 10Mhz thì chu kỳ dao động của thạch anh là Tosc = 1/Fosc= 1/10*106(s).
Chu kỳ máy:
T_instruction = 4*Tosc = 4/10*106(s) = 0.4 µs = 400 ns
2.1.2.4.2) Reset:
PIC16F877A có thể bị reset bởi nhiều nguyên nhân khác nhau:
- Power-on Reset (POR)
- MCLR Reset during sleep
- MCLR Reset during normal operation
- WDT Reset (during normal operation)
- WDT Wake-up (during sleep)
- Brown-out Reset (BOR)
Hình 2.7 Các chế độ reset
2.1.2.4.3) MCLR :
PIC16F877A có một bộ lọc nhiễu ở phần MCLR . Bộ lọc nhiễu này sẽ phát hiện và bỏ qua các tín hiệu nhiễu. Ngõ vào MCLR trên chân 4 của PIC16F877A. Khi đưa chân này xuống thấp thì các thanh ghi bên trong VĐK sẽ được tải những giá trị thích hợp để khởi động lại hệ thống. (Lưu ý: Reset do WDT không làm chân MCLR xuống mức thấp).
Hình 2.8 Mạch MCLR
2.1.2.4.4/ Interrupts:
PIC16F877A có nhiều nguồn ngắt khác nhau. Đây là một số ngắt tiêu biểu:
- Ngắt ngoài xảy ra trên chân INT.
- Ngắt do Timer0.
- Ngắt do Timer1.
- Ngắt do Timer2.
- Ngắt do thay đổi trạng thái trên các chân PortB.
- Ngắt so sánh điện thế.
- Ngắt do Port song song.
- Ngắt USART.
- Ngắt nhận dữ liệu.
- Ngắt truyền dữ liệu .
- Ngắt chuyển đổi ADC.
- Ngắt màn hình LCD.
- Ngắt hoàn tất ghi EEPROM.
- Ngắt module CCP.
- Ngắt Module SSP.
* Các thanh ghi chức năng ngắt: INTCON, PIE1, PIR1, PIE2, PIR2 (các thanh ghi này sẽ được nghiên cứu ở các phần sau).
Hình 2.9 Các chế độ ngắt
2.1.2.4.5) Chế độ nguồn thấp Sleeep (Power Down Mode):
Đây là chế độ hoạt động của VĐK khi lệnh sleep được thực thi. Khi đó nếu được cho phép hoạt động, bộ đếm của WDT sẽ bị xóa nhưng WDT vẫn tiếp tục hoạt động bit PD (STATUS <3>) được reset về không, bit TO được set, oscillator ngưng hoạt động và các PORT giữ nguyên trạng thái như trước khi lệnh sleep được thực thi.
Do khi chế độ sleep dòng cung cấp cho VĐK là rất nhỏ nên ta cần thực hiện các bước sau trước khi VĐK thực thi lệnh sleep.
• Đưa tất cả các chân về trạng thái VDD hoặc VSS.
• Cần đảm bảo rằng không có mạch ngoại vi nào được điều khiển bởi dòng
điện của VĐK vì dòng điện nhỏ không đủ khả năng cung cấp cho các mạch
ngoại vi hoạt động.
• Tạm ngưng hoạt động của khối A/D và không cho phép các xung clock bên
ngoài tác dụng vào VĐK.
• Để ý chức năng điện trở kéo lên của PORTB.
• Pin MCLR phải ở mức logic cao.
2.1.2.4.6) Bộ định thời giám sát (Watch Dog Timer – WDT):
Giả sử bạn viết một chương trình, bạn mong đợi chương trình này sẽ chạy nếu không có gì trục trặc xảy ra thì nó sẽ không bao giờ dừng lại, như vậy bạn phải làm một vòng lặp để khi chương trình chạy đến điểm cuối thì nó lại quay trở về điểm bắt đầu.
Nhưng mà hãy xem một trường hợp: Giả sử chương trình kiểm tra một chân input, nếu nó lên mức cao thì Pic16f877A sẽ tiếp tục kiểm tra một chân input thứ hai có lên mức cao hay không, nếu chân input thứ hai không lên mức cao, con Pic sẽ ngồi đó chờ và nó sẽ chỉ thoát ra khỏi chỗ ngồi của nó nếu chân input thứ hai lên mức cao.
Bây giờ hãy xem một trường hợp khác, giả sử như bạn viết một chương trình, bạn compiled nó thành công, và ngay cả bạn đã cho chạy mô phỏng từng bước, từng bước một trên máy tính, bằng MPLAB chẳng hạn, có vẻ như mọi chuyện đều tốt, bạn đem nạp vào con Pic. Sau một thời gian chạy thử, con Pic thình lình bị kẹt vào nơi nào đó trong chương trình mà không thể thoát ra được trạng thái hiện tại. Điều gì là cần thiết để giải quyết hai trường hợp trên, reset lại hay vẫn để cho nó bị kẹt không thoát ra được, đó là mục đích của mạch Watchdog.
Mạch Watchdog thì không phải là mới mẽ gì, có rất nhiều microprocessors và microcontrollers đã có mạch Watchdog, nhưng mà nó làm việc ra sao ?
Bên trong vi xử lí Pic có một mạch RC, mạch này cung cấp 1 xung Clock độc lập với bất kỳ xung Clock nào cung cấp cho Pic. Khi Watchdog Timer (viết tắt là WDT) được cho phép (enabled), nó sẽ đếm bắt đầu từ 00 và tăng lên 1 cho đến FFh, khi nó tăng từ FFh đến 00 ( FFh+1) thì con Pic sẽ bị Reset bất kể đang làm gì, chỉ có 1 cách là ngăn không cho WDT đếm tới 00.
Khi Pic16F877A bị kẹt không thể thoát ra khỏi tình trạng hiện tại thì WDT vẫn tiếp tục đếm mà không bị bất kỳ điều gì ngăn cấm nó đếm tới FF và đến FF+1, vì vậy nó sẽ reset làm cho chương trình phải khởi động lại từ đầu.
Để Sử Dụng WDT Chúng Ta Cần Làm 3 Việc
• Thứ nhất, cần thời gian bao lâu để reset WDT ?
• Thứ hai, làm sao xoá WDT ?
• Cuối cùng, chúng ta phải nói cho Pic biết chương trình cho phép WDT hoạt động.
Hình 2.10 Bộ định thời giám sát WDT
2.1.2.5) Tổ chức bộ nhớ:
Cấu trúc bộ nhớ của vi điều khiển PIC16F877A bao gồm bộ nhớ chương trình (Program memory) và bộ nhớ dữ liệu (Data Memory).
2.1.2.5.1) Bộ nhớ chương trình:
...........................
CHƯƠNG 3:GIỚI THIỆU VỀ NGÔN NGỮ LẬP TRÌNH CCS
là trình biên dịch lập trình ngôn ngữ C cho Vi điều khiển PIC của hãng Microchip. Chương trình là sự tích hợp của 3 trình biên dich riêng biết cho 3 dòng PIC khác nhau đó là:
‐PCB cho dòng PIC 12‐bit opcodes
‐PCM cho dòng PIC 14‐bit opcodes
‐PCH cho dòng PIC 16 và 18‐bit.
Tất cả 3 trình biên dich này đuợc tích hợp lại vào trong một chương trình bao gồm cả trình soạn thảo và biên dịch là CCS, phiên bản mới nhất là PCWH Compiler Version 3.227.
Giống như nhiều trình biên dich C khác cho PIC, CCS giúp cho người sử dụng nắm bắt nhanh được vi điều khiển PIC và sử dụng PIC trong các dự án. Các chương trình diều khiển sẽ được thực hiện nhanh chóng và đạt hiệu quả cao thông qua việc sử dụng ngôn ngữ lạp trình cấp cao – Ngôn ngữ C.
3.1) Khai báo và sử dụng biến hằng và mảng
3.1.1) Kiểu dữ liệu
Là tập hợp những giá trị mà một biến, hằng số có thể nhận được.
Kiểu số nguyên :
char: kiểu ký tự, có giá trị từ 0 đến 255. Mỗi biến chiếm một byte
int8: có giá trị từ -128 đến 127. Mỗi biến chiếm một byte
int16: có giá trị từ -32768 đến 32767. Mỗi biến chiếm 2 byte.
long int: hơn 1 tỉ. Mỗi biến chiếm 4 byte
Kiểu số thực :
Float: là các số thực có giá trị lên đến hàng tỉ.
Lưu ý định dạng:
Theo hệ thập phân: viết bình thường, vd: 123, 25
Theo hệ nhị phân: viết 0b ở đầu, vd: 0b01001010, 0b11111111
Theo hệ thập lục phân: viết 0x ở đầu, vd: 0x10 (hiểu là 16), 0xa0 (hiêu là 160)
3.1.2) Biến
Là một đối tượng có tên cụ thể, kiểu dữ liệu cụ thể, có giá trị thay đổi được.
Khai báo biến
Kiểu dữ liệu tên biến 1, tên biến 2,…;
VD: int8 a,b;
a,b là hai biến kiểu số nguyên 1 byte, a,b chỉ có thể nhận giá trị từ -128 đến 127.
float mang[5]={1.2, 2.0, 3.5, 23,20.4}; một mảng 5 biến số thực gồm:
mang[0] = 1.2
mang[1] = 2.0
mảng[2] = 3.5
mang[3] = 23.0
mang[4] = 20.4
3.1.3) hằng
Giá trị không đổi trong suốt chương trình, hằng có tên riêng. Có thể khai báo mảng hằng, đây là khai báo thường dùng trong CCS vì có thể tiết kiệm bộ nhớ thay vì khai báo mảng biến.
Khai báo hằng
const kiểu dữ liệu tên biến = giá trị hằng;
VD: const int16 sodem=100;//kể từ đây, sodem được hiểu là 100
const char kytu[10]={0,1,2,3,4,5,6,7,8,9};
3.1.4) hàm
Hàm là một đoạn chương trình thực thi một việc nào đó. Hàm có tên riêng, hàm có thể được lưu thành file và được khai báo để sử dụng bằng thủ tục include. Hàm có thể trả về một giá trị, có thể không trả về giá trị, lúc này ta dùng từ khóa void ( kiểu không kiểu).
Khai báo hàm.
Kiểu dữ liệu trả về tên hàm(kiểu dữ liệu đối số);
Định nghĩa hàm.
Kiểu dữ liệu trả về tên hàm(kiểu dữ liệu đối số tên đối số)
{ thân hàm;
return (trị trả về cho hàm);
}
3.2) Các cấu trúc cơ bản
3.2.1) Cấu trúc if…else
Dạng 1:
Cú pháp:
if (điều kiện)
{ lệnh;
}
Nếu đúng thì thực hiện lệnh, không thì bỏ qua
Dang 2:
Cú pháp:
if (điều kiện)
{ lệnh 1;
}
else
{ lệnh 2;
}
Nếu đúng thì thực hiện lệnh 1, không đúng thì thực hiện lệnh 2
3.2.2) Cấu trúc Switch…Case
Cú pháp
switch (biểu thức)
{
case giá trị 1:
{ lệnh 1;
break;
}
case giá trị 2:
{ lệnh 2;
break;
}
….
default:
{ lệnh ;
break ;
}
Biểu thức được tính giá trị, các giá trị 1, giá trị 2,…là các giá trị mà biểu thức có khả năng nhận được. Biểu thức nhận được giá trị nào thì lệnh tương ứng giá trị đó được thực thi. Lưu ý lệnh break; có nghĩa thoát khỏi vòng điều khiển (ở đây là cấu trúc switch). Nếu biểu thức không nhận được giá trị nào trùng với những giá trị được kể ra thì lệnh của default được thực thi.
3.2.3) Cấu trúc for
Cú pháp:
for(biểu thức khởi tạo; biểu thức điều kiện; biểu thức tác động)
{ lệnh;
}
Ban đầu biểu thức khởi tạo được thực thi, biểu thức này chỉ được thực thi một lần duy nhất vào đầu vòng lặp.
Kế tiếp là biểu thức điều kiện được thực thi, nếu biểu thức này đúng ( khác 0) thì lệnh được thực thi, sau khi thực thi xong lệnh thì biểu thức tác động sẽ thực thi. Các giá trị mới bị tác động được mang vào tính toán ở biểu thức điều kiện, nếu điều kiện vẫn đúng tthì lệnh được thực thi một lần nữa. Nếu điều kiện sai thì lệnh không được thực thi mà thoát khỏi vòng lặp for.
3.2.4) Cấu trúc while
Cú pháp:
while(biểu thức điều kiện)
{ lệnh;
}
Đầu tiên biểu thức điều kiện được tính, nếu đúng (khác 0) thì lệnh được thực thi, trong lệnh cần có những lệnh tác động lên biến gây ảnh hưởng đến kết quả biểu thức điều kiện. Sau khi thực thi xong sẽ kiểm tra lại điều kiện. Nếu biểu thức điều kiện còn đúng thì lệnh còn thực thi tiếp tục. Cấu trúc này được dùng nhiều trong CCS vì tính ngắn gọn của nó. Khi điều kiện được gán là 1 hoặc true thì ta có vòng lặp không điều kiện.
3.2.5) Cấu trúc do…while
Cú pháp
do
{ lệnh;
}
while(biểu thức điều kiện);
Đầu tiên lệnh được thực thi, bất chấp biểu thức điều kiện. Sau đó biểu thức điều kiện được tính, nếu khác 0 lệnh tiếp tục thực thi một lần nữa. Sau mỗi lần thực thi lệnh thì biểu thức điều kiện được tính toán lại. Tronhg lệnh phải có các lệnh con tác động lên biến nhằm gay ảnh hưởng kết quả biểu thức điều kiện, tránh vòng lặp vô tận.
3.3) Các hàm cơ bản
3.3.1) delay
3.3.1.1) Delay Cycles (Count)
-Cú pháp :delay_cycles(count)
-Tham số : count – hằng số 0~255
-Trị trả về : không
-Chức năng : Tạo code để thực hiện delay một số xung lệnh (instruction clock) định trước. Một xung lệnh bằng 4 xung dao động
-Yêu cầu :không
-Ví dụ :
delay_cycles(25); //Với xung clock dao động 20MHz, chương trình sẽ delay 5us
3.3.1.2) Delay_ms (time)
-Cú pháp: delay_ms(time)
-Tham số: time - 0~255 nếu time là một biến số, 0~65535 nếu time là hằng số
-Trị trả về: không
-Chức năng: Tạo code để thực hiện delay một thời gian định trước. Thới gian tính bằng milisecond. Hàm này sẽ thực hiện một số lệnh nhằm delay 1 thời gian yêu cầu. Hàm này không sử dụng bất kỳ timer nào. Nếu sử dụng ngắt (interupt), thời gian thực hiện các lệnh trong khi ngắt không được tính vào thới gian delay.
-Yêu cầu: #uses delay
3.3.1.3) Delay_ us (time)
-Cú pháp : delay_us(time)
-Tham số: time 0 ~255 nếu time là một biến số, 0 ~65535 nếu time là hằng số
-Trị trả về : không
-Chức năng: Tạo code để thực hiện delay một thời gian định trước. Thới gian tính bằng microsecond. Shorter delays will be INLINE code and longer delays and variable delays are calls to a function. Hàm này sẽ thực hiện một số lệnh nhằm delay 1 thời gian yêu cầu. Hàm này không sử dụng bất kỳ timer nào. Nếu sử dụng ngắt (interupt), thời gian thực hiện các lệnh trong khi ngắt không được tính vào thới gian delay.
-Yêu cầu: #uses delay
3.3.2) ADC
3.3.2.1) setup_adc
-Cú pháp: setup_adc(mode)
-Tham số: mode – mode chuyển đổi Analog ra Digital bao gồm
ADC_OFF : tắt chức năng sử dụng A/D
ADC_CLOCK_INTERNAL : thời gian lấy mẫu bằng clock, clock là thời gian clock trong IC
ADC_CLOCK_DIV_2 : thời gian lấy mẫu bằng clock/2
ADC_CLOCK_DIV_8 : thời gian lấy mẫu bằng clock/8
ADC_CLOCK_DIV_32 : thời gian lấy mẫu bằng clock/32
-Trị trả về :không
-Chức năng :Định cấu hình cho bộ biến đổi A/D
-Yêu cầu :các hằng số phải được định nghĩa trong device file PIC16F876.h
3.3.2.2) setup_adc_port()
-Cú pháp: setup_adc_ports(value)
-Tham số: value – hằng số được định nghĩa như sau
NO_ANALOGS : không sử dụng cổng analog
ALL_ANALOG : RA0 RA1 RA2 RA3 RA5 RE0 RE1 RE2 Ref=Vdd
ANALOG_RA3_REF : RA0 RA1 RA2 RA5 RE0 RE1 RE2 Ref=RA3
A_ANALOG : RA0 RA1 RA2 RA3 RA5 Ref=Vdd
A_ANALOG_RA3_REF : RA0 RA1 RA2 RA5 Ref=RA3
RA0_RA1_RA3_ANALOG : RA0 RA1 RA3 Ref=Vdd
RA0_RA1_ANALOG_RA3_REF : RA0 RA1 Ref=RA3
ANALOG_RA3_RA2_REF : RA0 RA1 RA5 RE0 RE1 RE2 Ref=RA2,RA3
ANALOG_NOT_RE1_RE2 : RA0 RA1 RA2 RA3 RA5 RE0 Ref=Vdd
ANALOG_NOT_RE1_RE2_REF_RA3 : RA0 RA1 RA2 RA5 RE0 Ref=RA3
ANALOG_NOT_RE1_RE2_REF_RA3_RA2 : RA0 RA1 RA5 RE0 Ref=RA2,RA3
A_ANALOG_RA3_RA2_REF : RA0 RA1 RA5 Ref=RA2,RA3
RA0_RA1_ANALOG_RA3_RA2_REF : RA0 RA1 Ref=RA2,RA3
RA0_ANALOG : RA0
RA0_ANALOG_RA3_RA2_REF : RA0 Ref=RA2,RA3
-Trị trả về :không
-Chức năng :Xác định cổng dùng để nhận tín hiệu analog
-Yêu cầu :các hằng số phải được định nghĩa trong device file PIC16F876.h
-Ví dụ :
setup_adc_ports(ALL_ANALOG) : dùng tất cả các pins để nhận tín hiệu analog.
setup_adc_ports(RA0_RA1_RA3_ANALOG) : dùng pin A0, A1 và A3 để nhận tín hiệu analog. Điện áp nguồn cấp cho IC được dùng làm điện áp chuẩn.
setup_adc_ports(A0_RA1_ANALOGRA3_REF) : dùng pin A0 và A1 để nhận tín hiệu analog. Điện áp cấp vào pin A3 được dùng làm điện áp chuẩn.
3.3.2.3) setup_adc_channel()
-Cú pháp: setup_adc_channel(chan)
-Tham số : chn : 0~7 – chọn pin để lấy tín hiệu -Analog bao gồm
1 : pin A0
2 : pin A1
3 : pin A2
4 : pin A5
5 : pin E0
6 : pin E1
7 : pin E2
-Trị trả về : không
-Chức năng : Xác định pin để đọc giá trị Analog bằng lệnh READ_ADC()
-Yêu cầu : không
3.3.2.4) value = read_adc()
-Cú pháp : value = read_adc()
-Tham số : không
-Trị trả về : 8 hoặc 10 bit
value = 0 ~255 nếu dùng A/D 8 bit (int)
value = 0 ~1023 nếu dùng A/D 10 bit (long int)
-Chức năng : Đọc giá trị Digital từ bộ biến đổi A/D. Các hàm setup_adc(), setup_adc_ports() và set_adc_channel() phải được dùng trước khi dùng hàm read_adc(). Đối với PIC16F877, bộ A/D mặc định là 8 bit. Để sử dụng A/D 10 bit ta phải dùng thêm lệnh
#device PIC16F877 *=16 ADC=10
ngay từ đầu chương trình.
-Yêu cầu : không
3.3.3) Capture compare pwm (ccp)
Các ngõ PWM: C1 và C2
Capture Mode
Compare Mode
PWM Mode (Pulse Width Modulation)
3.3.3.1) SET_PWM1_DUTY(value)
SET_PWM2_DUTY(value)
-Cú pháp : set_pwm1_duty(value)
-Tham số : value có thể là biến hay hằng số với 8 hay 16 bit
-Trị trả về : không
-Chức năng : Xác định % thời gian trong 1 chu kỳ, PWM ở mức cao
-Yêu cầu : không
-Ví dụ : set_pwm1_duty(512): đặt 50% mức cao (50% duty)
3.3.3.2) setup_ccp1
Setup_ccp2
-Cú pháp :setup_ccp1(mode)
setup_ccp2(mode)
-Tham số :mode là hằng số như sau
long CCP_1;
#byte CCP_1 = 0x15
#byte CCP_1_LOW = 0x15
#byte CCP_1_HIGH = 0x16
long CCP_2;
#byte CCP_2 = 0x1B
#byte CCP_2_LOW = 0x1B
#byte CCP_2_HIGH = 0x1C
Tắt CCP
CCP_OFF
Đặt CCP ở chế độ capture
CCP_CAPTURE_FE : Nhận cạnh xuống của xung
CCP_CAPTURE_RE : Nhận cạnh lên của xung
CCP_CAPTURE_DIV_4 : Nhận xung sau mỗi 4 xung vào
CCP_CAPTURE_DIV_16 : Nhận xung sau mỗi 16 xung vào
Đặt CCP ở chế độ compare
CCP_COMPARE_SET_ON_MATCH Output high on compare
CP_COMPARE_CLR_ON_MATCH Output low on compare
CP_COMPARE_INT : Interrupt on compare
CCP_COMPARE_RESET_TIMER : Reset timer on compare
Đặt CCP ở chế độ PWM
CCP_PWM Mở PWM
CCP_PWM_PLUS_1
CCP_PWM_PLUS_2
CCP_PWM_PLUS_3
-Trị trả về : không
-Chức năng : Khởi động CCP. Bộ đếm CCP có thể được thực hiện thông qua vịec sử dụng CCP_1 và CCP_2. CCP hoạt động ở 3 mode. Ở capture mode, CCP copy giá trị đếm timer 1 vào CCP_x khi cổng vào nhận xung. Ở compare mode, CCP thực hiện 1 tác vụ chỉ định trước khi timer 1 và CCP_x bằng nhau. Ở chế độ PWM, CCP tạo một xung vuông.
-Yêu cầu : các hằng số phải được định nghĩa trong device file PIC16F876.h
3.3.3.3) setup_timer1()
-Cú pháp :setup_timer_1(mode)
-Tham số :mode - tham số như sau
T1_DISABLED : tắt timer1
T1_INTERNAL : xung clock của timer1 bằng ¼ xung clock nội của IC (OSC/4)
T1_EXTERNAL :
T1_EXTERNAL_SYNC:
T1_CLK_OUT : enable xung clock ra
T1_DIV_BY_1 :65536-(samplingtime(s)/(4/20000000)) timemax=13.1ms
T1_DIV_BY_2 :65536-(samplingtime(s)/(8/20000000)) timemax=26.2ms
T1_DIV_BY_4 :65536-(samplingtime(s)/(16/20000000))timemax=52.4ms
T1_DIV_BY_8 :65536-(samplingtime(s)/(32/20000000)) timemax=104.8ms
-Trị trả về : không
-Chức năng : Khởi động timer 1. Sau đó timer 1 có thể được ghi hay đọc dùng lệnh set_timer1() hay get_timer1(). Timer 1 là 16 bit timer. Với xung clock là 20MHz, timer 1 tăng 1 đơn vị sau mỗi 1,6us và tràn sau 104,8576ms.
-Yêu cầu : các hằng số phải được định nghĩa trong device file PIC16F876.h
3.3.4) interrupts
3.3.4.1) Ext_int_edge
-Cú pháp : ext_int_edge(source,edge)
-Tham số : source: giá trị mặc định là 0 cho PIC16F877
edge: H_TO_L cạnh xuống 5V0V
L_TO_H cạnh lên 0V5V
-Trị trả về : không
-Chức năng : Qui định thời điểm ngắt tác động: cạnh lên hay xuống.
-Yêu cầu : các hằng số phải được định nghĩa trong device file PIC16F876.h
3.3.4.2) #INT_xxx
-Cú pháp :
#INT_AD Kết thúc biến đổi A/D
#INT_BUSCOL Xung đột bus
#INT_CCP1 Capture or Compare on unit 1
#INT_CCP2 Capture or Compare on unit 2
#INT_EEPROM Kết thúc viết vào EEPROM
#INT_EXT Ngắt ngoài
#INT_LOWVOLT Low voltage detected
#INT_PSP Parallel Slave Port data in
#INT_RB Port B any change on B4-B7
#INT_RDA RS232 receive data available
#INT_RTCC Timer 0 (RTCC) overflow
#INT_SSP SPI or I2C activity
#INT_TBE RS232 transmit buffer empty
#INT_TIMER1 Timer 1 overflow
#INT_TIMER2 Timer 2 overflow
- Mục đích : Khởi tạo hàm ngắt. Hàm ngắt có thể không có bất kỳ tham số nào. Trình biên dịch tạo code để nhảy đến hàm ngắt khi lệnh ngắt thực hiện. Trình biên dịch cũng tạo nên code để lưu trữ trạng thái của CPU và xóa cờ ngắt. Dùng lệnh NOCLEAR sau #INT_xxx để không xóa cờ ngắt này. Trong chương trình , phải dùng lệnh ENABLE_INTERRUPTS(INT_xxxx) cùng với lệnh ENABLE_INTERRUPTS (GLOBAL) để khởi tạo ngắt.
3.3.5) value = get_timer1()
-Cú pháp : value = get_timer1()
-Tham số : không
-Trị trả về : 16 bit int 0~65535
-Chức năng : Trả về giá trị biến đếm của real time clock/counter. Khi giá trị timer vượt quá 65535, value được đặt trở lại 0 và đếm tiếp tục (…, 65534, 65535, 0, 1, 2, …)
-Yêu cầu : không
3.3.6) set_timer1()
-Cú pháp : set_timer1()
-Tham số : 16 bit, value = 0~65535
-Trị trả về : không
-Chức năng : Đặt giá trị ban đầu cho real time clock/counter. Tất cả các biến đều đếm tăng. Khi giá trị timer vượt quá 65535, value được đặt trở lại 0 và đếm tiếp tục (…, 65534, 65535, 0, 1, 2, …)
-Yêu cầu : không
3.3.7) enabel_interrupts
-Cú pháp : enable_interrupts(level)
-Tham số : level - một trong các hằng số sau
GLOBAL
INT_RTCC
INT_RB
INT_EXT
INT_AD
INT_TBE
INT_RDA
INT_TIMER1
INT_TIMER2
INT_CCP1
INT_CCP2
INT_SSP
INT_PSP
INT_BUSCOL
INT_LOWVOLT
INT_EEPROM
-Trị trả về : không
-Chức năng : Khởi tạo ngắt tại mức quy định bởi level. Một thủ tục ngắt (interrupt procedure) cần được định nghĩa. Mức toàn cục (GLOBAL level) không khởi tạo bất kỳ ngắt chỉ định nào mà chỉ khởi tạo các biến ngắt đươc đã khởi tạo trước đó.
-Yêu cầu : phải dùng với #int_xxx.
...................................................
CHƯƠNG 7: KẾT LUẬN
Sau hơn 4 tuần thực hiện, với nhiều cố gắng và nổ lực của bản thân, cùng với sự tận tình hướng dẫn của cô Đinh Thị Thanh Hoa, chúng em đã hoàn thành đúng thời gian qui định theo yêu cầu đặt ra là thiết kế một mạch quang báo kết hợp với đèn giao thông dùng vi điều khiển PIC16F877A
Để thực hiện được yêu cầu trên, chúng em đã nghiên cứu, tìm hiểu những vấn đế về vi điều khiển, vi xử lí, và các vấn đề khác có liên quan đến đề tài.
Nội dung chính của đề tài này bao gồm những phần chính sau :
Phần kiến thức:
-Khảo sát bộ vi điều khiển PIC16F877A
-Tìm hiểu các linh kiện có trong mạch
-Lập trình bằng ngôn ngữ CCS và hợp ngữ
Phần thiết kế thi công:
- Thiết kế và thi công mô hình
-Viết chương trình bằng ngôn ngữ CCS và hợp ngữ trên PIC
Hạn chế:
- Hiệu ứng dịch chữ không mượt
- Đèn giao thông chua chạy được ở chế độ mặc định
- Quang báo chưa giao tiêp với nút nhấn và máy tính
Hướng phát triển:
- Mỡ rộng số led ma trận ra rộng hơn
- sử dụng led ma trận nhiều màu
- làm dèn giao thông cho ngã sáu
- Đèn giao thông chạy ở chế độ mặc định.
- Thu nhỏ kích thước sản phẩm
Mong rằng đề tài này sẽ được các bạn sinh viên khoá sau tiếp tục thực hiện những yêu cầu trên và khắc phục được những hạn chế của đề tài này, để tạo ra một sản phẩm có chất lượng cao phục vụ cho sản xuất và đời sống xã hội.
TÀI LIỆU THAM KHẢO
1.Giáo trình vi điều khiển Pic16F877A
2. các bài viết trên diển đàn điện tử :
Diễn đàn: http://dientuvietnam.net
Diễn đàn: http://picvietnam.com
Diễn đàn: http://datasheet4u.com
3. Báo Cáo PIC 16F877A_Nguyễn Chí Linh