1

[at_nightfall_09] - Mạch đo nhiệt độ điều khiển động cơ, hiển thị LCD.

Nội dung:
MẠCH ĐO NHIỆT ĐỘ ĐIỀU KHIỂN ĐỘNG CƠ HIỂN THỊ LCD .......................................................... 2
I. KHÁI NIỆM CƠ BẢN VỀ MẠCH ĐO NHIỆT ĐỘ ĐIỀU KHIỂN ĐỘNG CƠ. ................................ 2
1.1. Khái niệm mạch đo nhiệt độ. ......................................................................................................... 2
1.2. Mô hình điều khiển động cơ. ......................................................................................................... 2
1.3. Hiển thị LCD.................................................................................................................................. 2
II. NGUYÊN LÝ HOẠT ĐỘNG PIC16F877A. ....................................................................................... 2
2.1. Chức năng ADC trong PIC16F877A. ............................................................................................ 2
2.2. Cài đặt chế độ ADC. ...................................................................................................................... 3
III. NGUYÊN LÝ HOẠT ĐỘNG CỦA IC LM35. .................................................................................. 6
IV. KHỐI HIỂN THỊ LCD. ...................................................................................................................... 7
4.1. Cách nối dây trong LCD ................................................................................................................ 7
4.2. Các hàm cơ bản trong LCD ........................................................................................................... 7
V. CÁC CHẾ ĐỘ ĐIỀU KHIỂN ĐỘNG CƠ. .......................................................................................... 8
5.1. Chế độ chọn mode hiển thị .......................................................................................................... 10
5.2. Chế độ giảm mức điều chỉnh ngưỡng nhiệt độ bật/tắt động cơ. .................................................. 10
5.3. Chế độ tăng mức điều chỉnh ngưỡng nhiệt độ bật/tắt động cơ..................................................... 11
5.4. Chế độ bật - tắt động cơ. .............................................................................................................. 11
VI. CÁC KHỐI CHỨC NĂNG KHÁC. ................................................................................................. 12
6.1. Tần số hoạt động .......................................................................................................................... 12
6.2. Nguồn cung cấp cho PIC ............................................................................................................. 12
VII. CODE NẠP CHO PIC16F877A ..................................................................................................... 13
VIII. SƠ ĐỒ MẠCH THIẾT KẾ. ........................................................................................................... 18
IX. SƠ ĐỒ MẠCH IN. ........................................................................................................................... 19
X. SẢN PHẨM THỰC TẾ. .................................................................................................................... 19

Page 1

Để làm được điều này thì chúng ta phải có một thiết bị đo nhiệt độ. Mạch đo nhiệt độ dùng các loại bộ cảm biến LM35.3. Page 2 . Bộ cảm biến LM35 cũng không yêu cầu cân chỉnh ngoài vì vốn chúng đã được cân chỉnh. nhóm dùng LCD để hiển thị kết qua đo và hiển thị các chế độ điều khiện động cơ. Mạch chuyển đổi tương tự sang số ta có thể dùng IC ADC0804. Nhiệt độ là một đại lượng vật lý vô hướng. bật thì quay và tắt thì ngừng. PIC16F877A có 8 ngõ vào Analog (RA4:RA0) và RE2:RE0).1. Khi nhiệt đo được qua bộ cảm biến và được chuyển đổi qua tín hiệu số. Chúng đưa ra điện áp 10mV cho mỗi sự thay đổi 10C. ứng với mỗi thay đổi 10C. vừa chuyển đổi ADC. Thiết bị đó có thể là LED hoặc LCD. Như đã nói ở trên. Quan trọng là bật khi nào và tắt khi nào và phải được thực hiện một cách tự động. qua một bộ chuyển đổi tín hiệu tương tự (điện áp) sang tín hiệu số (bit) để hiển thị kết quả đo đạc và tính toán.2 [at_nightfall_09] . hiển thị LCD. vừa điều khiển động cơ.1. giá trị đầu ra sẽ tăng thêm 10mV. KHÁI NIỆM CƠ BẢN VỀ MẠCH ĐO NHIỆT ĐỘ ĐIỀU KHIỂN ĐỘNG CƠ. Vi điểu khiển. 1. 2. Như vậy chỉ cần 1 bộ cảm biến LM35 ta có thể tính được giá trị nhiệt độ tại thời điểm xác định dựa vào giá trị điện áp đầu ra LM35. Hiển thị LCD.… Trong đề tài này. xử lý kết quả. 1. Chức năng ADC trong PIC16F877A. Pic… Ở đây chúng ta dùng PIC16F877A. Tức là với 2 hàng chữ. MẠCH ĐO NHIỆT ĐỘ ĐIỀU KHIỂN ĐỘNG CƠ HIỂN THỊ LCD I. Để đo đạc và tính toán giá trị của nó ta phải dùng các bộ cảm biến. NGUYÊN LÝ HOẠT ĐỘNG PIC16F877A. mạch tích hợp chính xác cao mà điện áp đầu ra của nó tỷ lệ tuyến tính với nhiệt độ theo thang độ Celsius(*). và khi nhiệt độ hiện tại lớn hơn hay nhỏ hơn mức điện áp ngưỡng đã cài đặt thì động cơ (quạt) sẽ được điều khiển theo chế độ đã định sẵn. Chương sau sẽ hướng dẫn chúng ta chọn các cảm biến họ LM35 sao cho phù hợp với mạch đo nhiệt độ cần thiết kế. LCD ở đây là thiết bị hiện thị trên màn hình với kích cỡ 2x16. Chương sau chúng ta sẽ tìm hiểu sâu hơn về nguyên lý điều khiển cung như các chế độ khác nhau dùng để điều khiện động cơ.Trong PIC 16F877A có hỗ trợ bộ chuyển đổi ADC 10 bit 8 kênh. Mô hình điều khiển động cơ. mỗi hàng 16 ký tự. Khái niệm mạch đo nhiệt độ. hiển thị LCD. Các bộ cảm biến LM35 là bộ cảm biến nhiệt. . Để hiển thị nhiều dòng ký tự ta phải hiển thị lần lượt. Giống như khi nhiệt độ trong phòng ở mức 26oC thì quạt tự bật và khi nhiệt độ trong phòng xuống thấp hơn 22oC thì quạt tự động tắt.2. II. Tùy thuộc vào mức và quy mô mà ta lựa chọn thiết bị hiển thị phù hợp. Để điều khiện động cơ quay hay ngừng quay thì cũng giống như công tắc điện. Do đo. Chúng ta cần một thiết bị để hiện thị giá trị đo được. 1.Mạch đo nhiệt độ điều khiển động cơ.

Trả về: Không được định nghĩa. Setup_adc2(mode). Clear bit ADIF Set bit ADIE Set bit PEIE Set bit GIE 3.Yêu cầu: Những hằng số đã được định nghĩa trong tập tin .h cho tất cả sự lựa chọn. Cài đặt chế độ ADC: Setup_adc(mode): Cú pháp: Setup_adc (mode). Thiết lập các thông số cho bộ chuyển đổi ADC Chọn ngõ vào alalog.2. Cài đặt chế độ ADC. . 4. Sự lựa chọn hợp lý thay đổi phụ thuộc vào thiết bị. Cho phép bộ chuyển đổi AD hoạt động.chế độ tín hiệu tương tự sang tín hiệu số. . .3 [at_nightfall_09] . Kết quả chuyển đổi từ tín hiệu tương tự sang tín hiệu số là 10 bít tương ứng và được lưu trong thanh ghi ADRESH:ADRESL. 2.h của thiết bị. Tiếp tục thực hiện các bước 1 và 2 cho quá trình chuyển đổi tiếp theo. Thiết lập các cờ ngắt cho bộ AD. các thanh ghi này có thể được sử dụng như các thanh ghi thông thường. Thông số: Mode . 5. hiển thị LCD. chọn điện áp mẫu. Quá trình chuyển đổi tương tự sang số bao gốm các bước sau: 1. Cờ ngắt ADIF được set. 2. Khi không sử dụng bộ chuyển đổi ADC. Bắt đầu quá trình chuyển đổi. Page 3 . kết quả sẽ được lưu vào hai thanh ghi ADRESH:ADRESL. Chọn kênh chuyển đổi AD (Thanh ghi ADCON0) Chọn xung Clock cho kênh chuyển đổi AD.Tiện lợi: Chỉ có trong những thiết bị có bộ chuyển đổi tín hiệu tương tự sang tín hiệu số.Chức năng: Định hình thể chuyển từ tín hiệu tương tự sang tín hiệu số. Đọc kết quả chuyển đổi và xóa cờ ngắt.Mạch đo nhiệt độ điều khiển động cơ. 7. Đợi cho tới khi quá trình chuyển đổi hoàn tất. Một vài sự lựa chọn tiêu biểu bao gồm: ADC_OFF ADC_CLOCK_INTERNAL ADC_CLOCK_DIV_32 . Đợi cho tới khi quá trình lấy mẫu hoàn tất. Xem những thiết bị có tập tin . Khi quá trình chuyển đôi hoàn tất. set bit. 6.

RA1. //Chân A0. . Sự kết hợp các chân tín hiệu tương tự đã được cho phép thay đổi phụ thuộc vào con chip và được định nghĩa bằng cách sử dụng từng bit OR để ghép những chân đã được chọn cùng với nhau. tín hiệu số hoặc một sự kết hợp và điện áp tham chiếu để sử dụng khi tính tóan giá trị ADC. value = read_adc().Tiện lợi: Chức năng này có sẵn trong các thiết bị với phần cứng Analog/Digital . Một vài ví dụ khác định nghĩa chân là: ANALOG_RA3_REF . Hằng số ALL_ANALOG và NO_ANALOG là hợp lý cho tất cả con chip. hiển thị LCD. setup_adc( ADC_OFF ). Chân A0. Cú pháp: Setup_adc_ports (value) Thông số: Value .4 [at_nightfall_09] . Cú pháp: set_adc_channel (chan) Thông số: Chân là số kênh được chọn. Setup_adc_ports(value): Thiết lập những chân ADC có sẵn để chuyển từ tín hiệu tương tự sang tín hiệu số.A1. Setup_adc_ports( RA0_RA1_RA3_ANALOG ). .h của thiết bị.Yêu cầu: Những hằng số đã được định nghĩa trong tập tin . Điện áp +5V được sử dụng như điện áp tham chiếu.chân A3 được sử dụng cho điện áp tham chiếu và tất cả các chân còn lại là digital Setup_adc_ports( A0_RA1_ANALOGRA3_REF ). RA3 là tín hiệu tương tự . Page 4 .Chức năng: Cài đặt những chân ADC là tín hiệu tương tự.A3 là analog.Chỉ có chân RA0.Trả về: Không được định nghĩa.Trả về: Không được định nghĩa.Kích hoạt tất cả các chân tín hiệu tương tự và chân RA3 là điện áp tham chiếu. Kiểm tra thiết bị bao gồm tập tin các chân và điện áp tham chiếu đã được sắp đặt trong danh sách hòan chỉnh.AN1. và tất cả các chân còn lại là digital. . setup_adc (ADC_CLOCK_INTERNAL ).A1 là analog. set_adc_channel( 0 ). RA0_RA1_RA3_ANALOG .Một hằng số được định nghĩa trong tập tin .h của thiết bị Ví dụ: //Tất cả các chân analog Setup_adc_ports( ALL_ANALOG ).Số chân bắt đầu tại 0 và đã được đặt nhãn trong datasheet AN0. Set_adc_channel(channel): Chỉ rõ những kênh dung để sử dụng cho việc gọi Analog/Digital.Mạch đo nhiệt độ điều khiển động cơ. Ví dụ: setup_adc_ports( ALL_ANALOG ).

Trả về: 8 bit hoặc 16 bit số nguyên phụ thuộc vào #DEVICE ADC= directive (directive:lời chỉ dẫn. value).Chức năng: Đây là chức năng đọc giá trị số từ bộ chuyển đổi tín hiệu tương tự sang tín hiệu số.Yêu cầu: Những chân cố định đã được định nghĩa trong tập tin . Ví dụ: Set_adc_channel(2).và đây là mặc định ) ADC_START_ONLY (Bắt đầu quá trình chuyển đổi và trả về giá trị) ADC_READ_ONLY (Đọc kết quả chuyển đổi cuối cùng ) .Chế độ này có thể cũng điều khiển chức năng. printf("A/D value = %2x\n\r". read_adc(mode): Bắt đầu quá trình chuyển đổi và đọc giá trị. . Không cần thay đổi kênh trước mỗi lần đọc nếu kênh không thay đổi. While ( input(PIN_B0) { delay_ms( 5000 ). Tiện lợi: Chức năng này có sẵn trong các thiết bị với phần cứng Analog/Digital . } Page 5 . value = read_adc().Nếu được sử dụng giá trị có thể: ADC_START_AND_READ (Liên tục đọc. Cú pháp: value = read_adc ([mode]). Dãy giá trị trả về phụ thuộc vào số lượng bit tbộ chuyển đổi Analog/Digital trong con chip và sự sắp đặt trong DEVICE ADC= directive như sau: #DEVICE 8 bit 10 bit 11 bit 12 bit 16 bit ADC=8 00-FF 00-FF 00-FF 00-FF 00-FF ADC=10 x 0-3FF X 0-3FF x ADC=11 x x 0-7FF x x ADC=16 0-FF00 0-FFC0 0-FFEO 0-FFF0 0-FFFF Lưu ý: X không được định nghĩa .Yêu cầu:Không cần thứ gì. Set_adc_channel(1). Gọi lệnh setup_adc(). delay_us(10). Thời gian thay đổi phụ thuộc vào trở kháng của nguồn đầu vào.Mạch đo nhiệt độ điều khiển động cơ. value = read_adc(). setup_adc_ports() and set_adc_channel() nên được làm vài lần trước khi chức năng này được gọi.Tiện lợi: Chức năng này có sẵn trong các thiết bị với phần cứng Analog/Digital . Phải chờ 1 khoảng thời gian ngắn sau khi thay đổi kênh trước khi nhận được giá trị đọc hợp lý. Thông số: mode là một thông số không bắt buộc.5 [at_nightfall_09] .Chức năng: Chỉ rõ những kênh được sử dụng cho việc gọi lệnh READ_ADC(). hiển thị LCD. .h của thiết bị Ví dụ: Setup_adc( ADC_CLOCK_INTERNAL ). Khoảng 10us nói chung là tốt cho hầu hết các ứng dụng. 8 hoặc 16). Setup_adc_ports( ALL_ANALOG ).

Hình 1: Hình 2 Để đo lường nhiệt độ thì có thể dùng nhiều loại cảm biến nhiệt khác. LM 35 là cảm biến nhiệt độ. III. LM35 có 3 chân (2 chân cấp nguồn và 1 chân xuất điện áp ra tùy theo nhiệt độ). sleep(). sử dụng 1 con PIC với 10 bit A/D bạn có thể sử dụng 8 hoặc 10 cho xx.Mạch đo nhiệt độ điều khiển động cơ. Nhiệt độ tăng 1C thì điện áp xuất ra ở chân out của LM35 tăng 10mV.. Page 6 .tất cả chức năng được cài đặt sẵn Các thông số getenv() có liên quan: ADC_CHANNELS : Số kênh Analog/Digital ADC_RESOLUTION : Số lượng bit trả về bởi lệnh read_adc. Ví dụ. value=read_adc(ADC_READ_ONLY). Ở đây đề tài là đo nhiệt độ môi trường bình thường nên sử dụng LM35 là tối ưu nhất vì: đây là loại cảm biến có độ chính xác cao. ADC_done():Trả về 1 nếu bộ chuyển đổi đã hòan thành việc chuyển đổi của nó . mỗi loại có một ưu điểm riêng phù hợp với từng nhu cầu riêng. read_adc(ADC_START_ONLY). tiêu tán công suất thấp. hiển thị LCD. NGUYÊN LÝ HOẠT ĐỘNG CỦA IC LM35.6 [at_nightfall_09] . tầm hoạt động tuyến tính từ 0-128 độ C.Tiền xử lý có liên quan: #DEVICE ADC=xx : Định hình thể read_adc rồi trả về kính thước.8 sẽ trả về bye có trọng số cao nhất. 10 sẽ trả về tòan bộ giá trị đọc A/D 10 bit Các ngắt có liên quan: INT_AD: Ngắt xảy ra khi quá trình chuyển đổi đã hoàn tất INT_ADOF: Ngắt xảy ra khi quá trình chuyển đổi trong thời gian chờ Các tập tin có liên quan: Không có.

C” trong thư viện Driver của CCS. ta hãy đọc file “LCD.h> #device *=16 ADC=10 #include <lcd. mỗi hàng 16 ký tự.Wrtchar("char") : hàm để xuất ký tự ra LCD.h> Page 7 .1. KHỐI HIỂN THỊ LCD. Nguồn cung cấp có thể từ 4V đến 20V tùy từng loại IC LM35 sử dụng.Setcursor(x. // D0 Enable // D1 RS (Reset) // D2 RW (Rewrite) // D4 D4 // D5 D5 // D6 D6 // D7 D7 // LCD chân D0-D3 không được sử dụng.y) trên LCD. Ứng với mỗi giá trị nhiệt độ đầu vào ta có mức điện áp ra tương ứng. LCD dùng ở đây là LCD 2 hàng. Với mỗi chênh lệch 1oC thì điện áp đầu ra sẽ chênh lệch 10mV.7 [at_nightfall_09] . Như đã đề cấp trước. Ở đó CCS hướng dẫn cách ta đi dây cho các chân của LCD. Cách nối dây trong LCD Cách nối dây: // Định nghĩa chức năng các chân. 4. đồng thời CCS viết sẵn cho ta các hàm thao tác cho LCD: 4.2.y) : hàm cho phép con trỏ nhảy tới vị trí (x. Để sử dụng LCD .  Chân 3: Chân nối đất. Sơ đồ mạch như hình bên: (Hình 3) (Hình 3) IV. hiển thị LCD. Các hàm cơ bản trong LCD . .  Chân 1: Đấu với nguồn. Mô phỏng ví dụ dùng LCD bằng Proteus: Code : #include <16F877A.h> #include <def_877a.  Chân 2: Chân Vout cho giá trị ra thay đổi theo nhiệt độ môi trường.Mạch đo nhiệt độ điều khiển động cơ.

if(INPUT(PIN_C0)==0) // Neu phim 1 duoc an (phim chon mode) { delay_ms(150).mode. .0).Mạch đo nhiệt độ điều khiển động cơ. // Tach so hang chuc va hang don vi donvi = t%10 + 48. wrtchar(". // Tang mode len 1 de chuyen sang mode ke tiep if(mode==3) mode=0. Code chọn chế độ điều khiện ứng với 4 nút bấm. // Hien thi dong tren t = ct.  Phím 1: Chọn chế độ .donvi. setcursor(0. } V. wrtchar("NHIET DO: ").Các chế độ điều khiển.  Phím 4: Chế độ bật tắt động cơ.8 [at_nightfall_09] . { anphim=0.  Phím 2: Chỉnh tăng ngưỡng nhiệt độ. #use delay(clock=20000000) void hiennhietdo() // Ham hien thi nhiet do do duoc tu LM35 { int8 t. hiển thị LCD. delay_ms(50). Page 8 . wrtchar(donvi). setcursor(0.DO NHIET DO -"). chuc = t/10 + 48. // Lap lai mode 0 khi da chuyen qua het cac mode anphim=1. // Ham delay chong rung phim while(INPUT(PIN_C0)==0). // Cho den khi nut duoc tha ra mode++. CÁC CHẾ ĐỘ ĐIỀU KHIỂN ĐỘNG CƠ.  Phím 3: Chỉnh giảm ngưỡng nhiệt độ. Void readkb() // Ham phat hien phim bam. // Hien thi so do nhiet do len LCD wrtchar(chuc). wrtchar("*C").1).chuc.

"tmin" >0 thì giảm 1 if(mode==2) { if(tmax>tmin+1) tmax--. Tmin khong the >tmax-1 } if(mode==2) { if(tmax<90) tmax++. anphim=1.9 [at_nightfall_09] . } } } else if(INPUT(PIN_C3)==0) // Neu phim 4 duoc an (phim bat/tat) { delay_ms(150). } // de "tmax" không nhỏ hơn "tmin" +1 } } else { if(INPUT(PIN_C2)==0) // Neu phim 3 duoc an (phim tang) { delay_ms(150). // Chong rung phim (cho phim duoc an trong 1 luc) if(INPUT(PIN_C1)==0) { if(mode==1) { if(tmin>0) tmin--.Mạch đo nhiệt độ điều khiển động cơ. } // Giam nguong tuy theo mode. } else { if(INPUT(PIN_C1)==0) // Neu phim 2 duoc an (phim giam) { delay_ms(150). // Cho phim duoc an trong 1 luc if(INPUT(PIN_C2)==0) { if(mode==1) { if(tmin<tmax-1) tmin++. // Tang nguong tuy theo mode. anphim=1. Page 9 . // tmax khong lon hon 90do. anphim=1. anphim=1. hiển thị LCD.

1.0). if(bat==1) OUTPUT_BIT(PIN_D0. anphim=1. Chế độ chọn mode hiển thị Trong chế độ này. // Lap lai mode 0 khi da chuyen qua het cac mode anphim=1. while(INPUT(PIN_C3)==0). // Ham delay chong rung phim while(INPUT(PIN_C0)==0). if(INPUT(PIN_C0)==0) // Neu phim 1 duoc an (phim chon mode) { delay_ms(150). Có 3 mức hiển thị:  Đo nhiệt độ: Nhiệt độ là: 0C  Hẹn bật quạt: Hiển thị mức nhiệt độ đã cài để bật quạt. // Cho den khi nut duoc tha ra mode++. khi bấm phím 1 chế độ này sẽ được kích hoạt. // Tang mode len 1 de chuyen sang mode ke tiep if(mode==3) mode=0.Mạch đo nhiệt độ điều khiển động cơ. Chế độ giảm mức điều chỉnh ngưỡng nhiệt độ bật/tắt động cơ.1). Khi chọn chế độ mode tắt hoặc bật động cơ thì chế độ điều khiển này sẽ làm giảm giá trị ngưỡng cài đặt nhiệt độ để tắt hoặc bật động cơ. Code: Page 10 . } } } } } 5.2. if(bat==0) OUTPUT_BIT(PIN_D0.  Hẹn tắt quạt: Hiển thị mức nhiệt độ đã cài để tắt quạt. } 5. // Cho den khi nut duoc tha ra if (ct>=tmin&&ct<=tmax) // Neu nhiet do nam trong khoang 2 nguong { // thi nut 4 co chuc nang bat/tat quat bat=~bat. Phím bấm thứ 2 sẽ kích hoạt chế độ điều khiển này.10 [at_nightfall_09] . hiển thị LCD.

Code: Page 11 . Khi chọn chế độ mode tắt hoặc bật động cơ thì chế độ điều khiển này sẽ làm tăng giá trị ngưỡng cài đặt nhiệt độ để tắt hoặc bật động cơ.Mạch đo nhiệt độ điều khiển động cơ. Chế độ bật . // tmax khong lon hon 90do. // Cho phim duoc an trong 1 luc if (INPUT(PIN_C2)==0) { If (mode==1) { If (tmin<tmax-1) tmin++. anphim=1. // Tang nguong tuy theo mode. Code: If (INPUT(PIN_C2)==0) // Neu phim 3 duoc an (phim tang) { delay_ms(150). } // de "tmax" khong nho hon "tmin" +1 } } 5.4. "tmin" >0 thi giam 1 if(mode==2) { if(tmax>tmin+1) tmax--. Phím bấm thứ 3 sẽ kích hoạt chế độ điều khiển này. anphim=1. Khi chọn chế độ mode tắt hoặc bật động cơ thì chế độ điều khiển này sẽ tắt hoặc bật động cơ. If (INPUT(PIN_C1)==0) // Neu phim 2 duoc an (phim giam) { delay_ms(150). } } } 5. anphim=1.tắt động cơ. } // Giam nguong tuy theo mode. anphim=1. hiển thị LCD.3. Chế độ tăng mức điều chỉnh ngưỡng nhiệt độ bật/tắt động cơ. // Tmin khong the >tmax-1 } if(mode==2) { if(tmax<90) tmax++. // Chong rung phim (cho phim duoc an trong 1 luc) if(INPUT(PIN_C1)==0) { if(mode==1) { if(tmin>0) tmin--. Phím bấm thứ 3 sẽ kích hoạt chế độ điều khiển này.11 [at_nightfall_09] .

6. anphim=1. Việc có thêm các bộ ổn áp này giúp mạch hoạt động hiểu quả hơn. Page 12 . người ta thường dùng các bộ ổn áp. if(bat==1) OUTPUT_BIT(PIN_D0. Nguồn cung cấp cho PIC Thông thường khi cần cung cấp nguồn cho mạch. while(INPUT(PIN_C3)==0). Các bộ ổn áp này có chức năng cung cấp một nguồn điện ổn định.0). } } VI. tức là giá trị điện áp cung cấp ổn định.1. If (INPUT(PIN_C3)==0) // Neu phim 4 duoc an (phim bat/tat) { delay_ms(150).Mạch đo nhiệt độ điều khiển động cơ. CÁC KHỐI CHỨC NĂNG KHÁC.12 [at_nightfall_09] .2. tránh việc dòng cung cấp quá lớn làm hỏng linh kiện. hiển thị LCD. // Cho den khi nut duoc tha ra if (ct>=tmin&&ct<=tmax) // Neu nhiet do nam trong khoang giua 2 nguong { // thi nut 4 co chuc nang bat/tat quat bat=~bat. IC trong mạch. Tần số hoạt động Tần số hoạt động: 20Hz 6. if(bat==0) OUTPUT_BIT(PIN_D0.1).

. // Khai bao cac bien dung trong ct int16 ct.tmax. int8 cnt=0.Mạch đo nhiệt độ điều khiển động cơ.h> #FUSES NOWDT //No Watch Dog Timer #FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD) #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NODEBUG //No Debug mode for ICD #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming.h> #include <def_877a. // Ham delay chong rung phim while(INPUT(PIN_C0)==0). // Tang mode len 1 de chuyen sang mode ke tiep if(mode==3) mode=0.anphim.13 [at_nightfall_09] .. B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #FUSES NOWRT //Program memory not write protected #FUSES RESERVED //Used to set the reserved FUSE bits #use delay(clock=20000000) int8 mode. CODE NẠP CHO PIC16F877A Code: #include <16F877A. 79XX.tmin. Ổn áp hay ổn dòng người ta thường dùng Tranzito cung suất hoặc các IC 3 chân.h> #device *=16 ADC=10 #include <lcd. int1 bat. // Cho den khi nut duoc tha ra mode++. Trong đó họ 78XX là ổn áp điện áp dương và dòng 79XX là ổn áp điện áp âm. VII. // Lap lai mode 0 khi da chuyen qua het cac mode Page 13 . Đối với IC 3 chân thì ta có các họ 78XX.docnhietdo. hiển thị LCD. void readkb() // Ham phat hien phim bam { anphim=0. if(INPUT(PIN_C0)==0) // Neu phim 1 duoc an (phim chon mode) { delay_ms(150).

anphim=1. } else { if(INPUT(PIN_C1)==0) // Neu phim 2 duoc an (phim giam) { delay_ms(150). anphim=1. } // de "tmax" không nhỏ hơn "tmin" +1 } } else { if(INPUT(PIN_C2)==0) // Neu phim 3 duoc an (phim tang) { delay_ms(150).14 [at_nightfall_09] . anphim=1. "tmin" >0 thì giảm 1 if(mode==2) { if(tmax>tmin+1) tmax--. // tmax khong lon hon 90do. // Tang nguong tuy theo mode. // Cho phim duoc an trong 1 luc if(INPUT(PIN_C2)==0) { if(mode==1) { if(tmin<tmax-1) tmin++. hiển thị LCD. anphim=1. Tmin khong the >tmax-1 } if(mode==2) { if(tmax<90) tmax++. // Chong rung phim (cho phim duoc an trong 1 luc) if(INPUT(PIN_C1)==0) { if(mode==1) { if(tmin>0) tmin--.Mạch đo nhiệt độ điều khiển động cơ. anphim=1. } // Giam nguong tuy theo mode. } } } else if(INPUT(PIN_C3)==0) // Neu phim 4 duoc an (phim bat/tat) { Page 14 .

1). hiển thị LCD.Mạch đo nhiệt độ điều khiển động cơ.donvi. wrtchar("NHIET DO: "). } void settmin() // Ham cai dat nguong nhiet do min { int8 t. delay_ms(50). wrtchar("*C"). delay_ms(150). bat=0. // Hien thi so do nhiet do len LCD wrtchar(chuc).DO NHIET DO -"). // Hien thi dong tren t = ct. wrtchar(donvi). } } void hiennhietdo() // Ham hien thi nhiet do do duoc tu LM35 { int8 t. while(INPUT(PIN_C3)==0). setcursor(0. if(bat==0) OUTPUT_BIT(PIN_D0. } } } } } void check() // Ham kiem tra nguong (tat quat neu nhiet do duoi tmin { // va bat quat neu nhiet do tren tmax) if (ct<tmin) { OUTPUT_BIT(PIN_D0.donvi. chuc = t/10 + 48.chuc. // Tach so hang chuc va hang don vi donvi = t%10 + 48. anphim=1.0).1). // Cho den khi nut duoc tha ra if (ct>=tmin&&ct<=tmax) // Neu nhiet do nam trong khoang giua 2 nguong { // thi nut 4 co chuc nang bat/tat quat bat=~bat. bat=1. Page 15 .15 [at_nightfall_09] . if(bat==1) OUTPUT_BIT(PIN_D0.0). wrtchar(". setcursor(0.1). } if (ct>tmax) { OUTPUT_BIT(PIN_D0.chuc.0).

1).HEN TAT QUAT -"). donvi = t%10 + 48. } void selectmode() // Ham lua chon mode hien thi { switch (mode) { case 0: hiennhietdo(). Page 16 .16 [at_nightfall_09] . wrtchar("NEU TREN: "). wrtchar(chuc).0). wrtchar(donvi). setcursor(0. break. } void settmax() // Ham cai dat nguong nhiet do max (tuong tu ham setmin) { int8 t. wrtchar(". t = tmin. wrtchar(". donvi = t%10 + 48. delay_ms(50).1). setcursor(0. // Tach hang chuc va don vi cua tmin va hien thi ra LCD chuc = t/10 + 48. wrtchar("*C"). chuc = t/10 + 48.donvi. setcursor(0. case 1: settmin().chuc.0). wrtchar("*C"). hiển thị LCD. t = tmax. setcursor(0.HEN BAT QUAT -"). delay_ms(50). wrtchar("NEU DUOI: "). wrtchar(chuc).Mạch đo nhiệt độ điều khiển động cơ. wrtchar(donvi). break.

// Khoi tao LCD wrtcmd(0x01).49. } void main() // Ham ct chinh { Setup_ADC(ADC_CLOCK_INTERNAL). // va hien thi mode do nhiet do dau tien tmax = 27. lcd_init().Mạch đo nhiệt độ điều khiển động cơ. // Khong cho phep ngat khac cnt++. } } #INT_TIMER1 // Khai bao su dung ngat timer1 void ct_phuc_vu_ngat() { CLEAR_INTERRUPT(INT_TIMER1). // Cai dat bo chuyen doi ADC setup_adc_ports(AN0). // Sau moi ngat ta tang bien dem if(cnt==10) // khi cnt=10 thi da dem duoc 10 lan tuong ung voi 1s { docnhietdo=1. // Khoi tao ban dau voi tmin=20*C va tmax=27*C tmin = 20. // Chon kenh chuyen doi ADC la kenh 0 delay_us(20). ct = READ_ADC(). // Ngo vao Analog la chan AN0 SET_ADC_CHANNEL(0). SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8). // Xoa co ngat timer1 DISABLE_INTERRUPTS(GLOBAL). wrtcmd(0x0c). wrtcmd(0x28). SET_TIMER1(3035).17 [at_nightfall_09] . } else docnhietdo=0. case 2: settmax(). ct = ct*0. // Cai dat timer1 voi bo chia tan 1:8 Page 17 . ENABLE_INTERRUPTS(GLOBAL). cnt=0. break. mode = 0. hiển thị LCD.

// Lien tuc lap lai viec kiem tra xem nhiet do } // co duoc doc hay ko va kiem tra phim bam } VIII. } check(). // Cho phep ngat timer1 ENABLE_INTERRUPTS(GLOBAL). // Cho phep ngat toan cuc ct = READ_ADC(). SET_TIMER1(3035). // Gia tri khoi tao cho timer1 ( dem den 65535 // voi clock 20Mhz chia 8 => mot ngat tuong ung voi 0. do { if(docnhietdo==1) // Neu nhiet do duoc doc thi hien thi ra LCD neu dang { // o mode hien thi va tien hanh kiem tra nguong if(mode==0) { hiennhietdo(). SƠ ĐỒ MẠCH THIẾT KẾ. } while(anphim==0). // Doc gia tri nhiet do dau tien ct = ct*0.18 [at_nightfall_09] . // Kiem tra nguong } readkb().Mạch đo nhiệt độ điều khiển động cơ.49. while(1) // Vong lap vo han { selectmode().1s ) ENABLE_INTERRUPTS(INT_TIMER1). hiển thị LCD. Page 18 .

19 [at_nightfall_09] . X.Mạch đo nhiệt độ điều khiển động cơ. hiển thị LCD. Page 19 . SẢN PHẨM THỰC TẾ. SƠ ĐỒ MẠCH IN. Mạch được mô phỏng trên phần mềm Protues 7.6 IX.

Sign up to vote on this title
UsefulNot useful