Đề tài Mạch đo nhiệt độ và cảnh báo

Để hiểu khái niệm về bộ vi điều khiển, ta có thể làm phép so sánh nó với bộ vi xử lý công dụng chung nh- sau: Ta biết rằng, các bộ vi xử lý công dụng chung nh- họ Intel x86 (8086, 80286, 80386, 80486 và Pentium) hoặc họ Motorola 680x0(6800, 68010, 68020, 68030, 68040 vv.) không có RAM, ROM và không có các cổng ra vào trên chip. Với lý do đó mà chúng đ-ợc gọi là các bộ vi xử lý công dụng chung. Một nhà thiết kế hệthống sử dụng một bộ vi xử lý công dụng chung chẳng hạn nh- Pentium hay 68040 sẽ phải bổ xung thêm RAM, ROM, cáccổng vào ra và các bộ định thời ngoài để làm cho chúng hoạt động đ-ợc. Mặc dù việc bổ xung các RAM, ROM, cáccổng vào ra sẽ làm cho hệthống cồng kềnh lên nh-ng nó lại có -u điểm khi sử dụng các bộ vi xử lý này là rất linh hoạt. Chẳng hạn nh- ng-ời thiết kế có thể quyết định về số l-ợng RAM, ROM, và cáccổng vào ra cần thiết sao cho phù hợp với khả năng, mục đích sử dụng của hệthống. Điều này không thể có đối với các bộ vi điều khiển. Bởi vì, một bộ vi điều khiển đ có một CPU (một bộ vi xử lý) cùng với một số l-ợng RAM, ROM, các cổng vào ra và một bộ định thời trên cùng một chíp. Hay nói cách khác là bộ vi xử lý, RAM, ROM, cáccổng vào ra và một bộ định thời cùng đ-ợc nhúng trên một chip. Do vậy ng-ời thiết kế không thể bổ xung thêm bộ nhớ ngoài, số các cổng vào ra hoặc bộ định thời cho nó. Với số l-ợng RAM, ROM và số cáccổng vào ra cố định nh- vậy là một mặt hạn chế (kém linh hoạt) xong nó lại thật sự lý t-ởng đối với những ứng dụng mang tính chuyên biệt, tối -u về giá thành, tối -u về không gian.

pdf20 trang | Chia sẻ: tuandn | Lượt xem: 3020 | Lượt tải: 5download
Bạn đang xem nội dung tài liệu Đề tài Mạch đo nhiệt độ và cảnh báo, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI KHOA ĐIỆN TỬ VIỄN THễNG 00O00 BÁO CÁO BÀI TẬP LỚN MễN VI XỬ Lí ĐỀ TÀI MẠCH ĐO NHIỆT ĐỘ VÀ CẢNH BÁO Thầy giỏo hướng dẫn: ThS. Hàn Huy Dũng Sinh Viờn thực hiện:  Nguyễn Thọ Lợi  Đặng Đỡnh Tài  Nguyễn Huy Hoàng  Ngụ Thanh Xuõn  Đặng Đức Cường Lớp : ĐT2-K48 Hà Nội 05-2006 Chức năng của đề tài  Đo và hiển thị nhiệt độ của mụi trường ở một điểm bất kỳ trong khoảng -400C đến 1000C  Bỏo động khi nhiệt độ của mụi trường ở trong một khoảng nào đú mà ta chọn PHẦN MỞ ĐẦU GIỚI THIỆU VĐK 8 BÍT PIC16F877 VÀ SO SÁNH VỚI VĐK 8051 Ngày nay, các bộ vi điều khiển đang có ứng dụng ngày càng rộng ri trong các lĩnh vực kỹ thuật và đời sống x hội, đặc biệt là trong kỹ thuật tự động hoá và điều khiển từ xa. Giờ đây với nhu cầu chuyên dụng hoá, tối −u (thời gian, không gian, giá thành), bảo mật, tính chủ động trong công việc... ngày càng đòi hỏi khắt khe. Việc đ−a ra công nghệ mới trong lĩnh vực chế tạo mạch điện tử để đáp ứng những yêu cầu trên là hoàn toàn cấp thiết mang tính thực tế cao. Khái niệm về bộ vi điều khiển Để hiểu khái niệm về bộ vi điều khiển, ta có thể làm phép so sánh nó với bộ vi xử lý công dụng chung nh− sau: Ta biết rằng, các bộ vi xử lý công dụng chung nh− họ Intel x86 (8086, 80286, 80386, 80486 và Pentium) hoặc họ Motorola 680x0(6800, 68010, 68020, 68030, 68040 vv...) không có RAM, ROM và không có các cổng ra vào trên chip... Với lý do đó mà chúng đ−ợc gọi là các bộ vi xử lý công dụng chung. Một nhà thiết kế hệ thống sử dụng một bộ vi xử lý công dụng chung chẳng hạn nh− Pentium hay 68040 sẽ phải bổ xung thêm RAM, ROM, các cổng vào ra và các bộ định thời ngoài để làm cho chúng hoạt động đ−ợc. Mặc dù việc bổ xung các RAM, ROM, các cổng vào ra sẽ làm cho hệ thống cồng kềnh lên nh−ng nó lại có −u điểm khi sử dụng các bộ vi xử lý này là rất linh hoạt. Chẳng hạn nh− ng−ời thiết kế có thể quyết định về số l−ợng RAM, ROM, và các cổng vào ra cần thiết sao cho phù hợp với khả năng, mục đích sử dụng của hệ thống. Điều này không thể có đối với các bộ vi điều khiển. Bởi vì, một bộ vi điều khiển đ có một CPU (một bộ vi xử lý) cùng với một số l−ợng RAM, ROM, các cổng vào ra và một bộ định thời trên cùng một chíp. Hay nói cách khác là bộ vi xử lý, RAM, ROM, các cổng vào ra và một bộ định thời cùng đ−ợc nhúng trên một chip. Do vậy ng−ời thiết kế không thể bổ xung thêm bộ nhớ ngoài, số các cổng vào ra hoặc bộ định thời cho nó. Với số l−ợng RAM, ROM và số các cổng vào ra cố định nh− vậy là một mặt hạn chế (kém linh hoạt) xong nó lại thật sự lý t−ởng đối với những ứng dụng mang tính chuyên biệt, tối −u về giá thành, tối −u về không gian... Hiện nay trên thị truờng có các bộ vi điều khiển 8 bít chính là. 6811 của Motorola, 8051 của Intel, Z8 của Xilog và Pic16x của Microchip Technology. Mỗi loại trên đây đều có một tập lệnh và thanh ghi riêng duy nhất, nên chúng đều không t−ơng thích lẫn nhau. Cũng có những bộ vi điều khiển 16 bít và 32 bít đ−ợc sản xuất ra bởi các hng sản xuất chíp khác nhau. Những yêu cầu để lựa chọn một bộ vi điều khiển là: + Đáp ứng nhu cầu tính toán của bài toán một cách hiệu quả về mặt giá thành và đầy đủ chức năng có thể nhìn thấy đ−ợc, (khả dĩ). + Có sẵn các công cụ phát triển phần mềm chẳng hạn nh− các trình biên dịch trình hợp ngữ và gỡ rối. + Nguồn các bộ vi điều khiển có sẵn nhiều và tin cậy. Các tiêu chuẩn lựa chọn một bộ vi điều khiển: Tiêu chuẩn đầu tiên và tr−ớc hết trong lựa chọn một bộ vi điều khiển là nó phải đáp ứng nhu cầu bài toán về mặt công suất tính toán, giá thành và hiệu quả. Trong khi phân tích các nhu cầu của một dự án dựa trên bộ vi điều khiển, chúng ta tr−ớc hết phải biết là bộ vi điều khiển nào là 8 bít, 16 bít hay 32 bít có thể đáp ứng tốt nhất nhu cầu tính toán của bài toán một cách hiệu quả nhất. + Những tiêu chuẩn đ−ợc đ−a ra để cân nhắc là: + Tốc độ: Tốc độ lớn nhất mà bộ vi điều khiển hỗ trợ là bao nhiêu. + Kiểu đóng vỏ: Đó là kiểu 40 chân DIP hay QFP hay là kiểu đóng vỏ khác. Đây là điều quan trọng đối với yêu cầu về không gian, kiểu lắp ráp và tạo mẫu thử cho sản phẩm cuối cùng. + Công suất tiêu thụ: Điều này đặc biệt khắt khe đối với những sản phẩm dùng pin, ắc quy. + Dung l−ợng bộ nhớ RAM và ROM trên chíp. + Số chân vào – ra, bộ định thời, số ngắt trên chíp. + Khả năng dễ dàng nâng cấp cho hiệu suất cao hoặc giảm công suất tiêu thụ. + Giá thành cho một đơn vị: Điều này quan trọng quyết định giá thành cuối cùng của sản phẩm mà một bộ vi điều khiển đ−ợc sử dụng. Bộ Vi điều khiển 8 bit PIC16F877 Đặc tính nổi bật của bộ vi xử lí. + Sử dụng công nghệ tích hợp cao RISC CPU. + Ng−ời sử dụng có thể lập trình với 35 câu lệnh đơn giản. + Tất cả các câu lệnh thực hiện trong một chu kì lệnh ngoại trừ một số câu lệnh rẽ nhánh thực hiện trong 2 chu kì lệnh. + Tốc độ hoạt động là: - Xung đồng hồ vào là DC- 20MHz - Chu kỳ lệnh thực hiện trong 200ns + Bộ nhớ ch−ơng trình Flash 8Kx14 words + Bộ nhớ Ram 368x8 bytes + Bộ nhớ EFPROM 256x 8 bytes Khả năng của bộ vi xử lí này + Khả năng ngắt ( lên tới 14 nguồn ngắt trong và ngắt ngoài ) + Ngăn nhớ Stack đ−ợc phân chia làm 8 mức + Truy cập bộ nhớ bằng địa chỉ trực tiếp hoặc gián tiếp. + Nguồn khởi động lại (POR) + Bộ tạo xung thời gian (PWRT) và bộ tạo dao động (OST) + Bộ đếm xung thời gian (WDT) với nguồn dao động trên chíp (nguồn dao động RC ) hoạt động đáng tin cậy. + Có m ch−ơng trình bảo vệ. + Ph−ơng thức cất giữ SLEEP + Có bảng lựa chọn dao động. + Công nghệ CMOS FLASH /EEPROM nguồn mức thấp ,tốc độ cao. + Thiết kế hoàn toàn tĩnh . + Mạch ch−ơng trình nối tiếp có 2 chân. + Xử lý đọc /ghi tới bộ nhớ ch−ơng trình . + Dải điện thế hoạt động rộng : 2.0V đến 5.5V + Nguồn sử dụng hiện tại 25 mA + Dy nhiệt độ công nghiệp và thuận lợi . + Công suất tiêu thụ thấp: < 0.6mA với 5V, 4MHz 20 uA với nguồn 3V, 32 kHz < 1 uA nguồn dự phòng. Các đặc tính nổi bật của thiết bị ngoại vi trên chip + Timer0: 8 bít của bộ định thời, bộ đếm với hệ số tỷ lệ tr−ớc + Timer1: 16 bít của bộ định thời, bộ đếm với hệ số tỷ lệ tr−ớc, có khả năng tăng trong khi ở chế độ Sleep qua xung đồng hồ đ−ợc cung cấp bên ngoài. + Timer 2: 8 bít của bộ định thời, bộ đếm với 8 bít của hệ số tỷ lệ tr−ớc, hệ số tỷ lệ sau + Có 2 chế độ bắt giữ, so sánh, điều chế độ rộng xung(PWM). + Chế độ bắt giữ với 16 bít, với tốc độ 12.5 ns, chế độ so sánh với 16 bít, tốcđộ giải quyết cực đại là 200 ns, chế độ điều chế độ rộng xung với 10 bít. + Bộ chuyển đổi tín hiệu số sang t−ơng tự với 10 bít . + Cổng truyền thông nối tiếp SSP với SPI ph−ơng thức chủ và I2C(chủ/phụ) + Bộ truyền nhận thông tin đồng bộ, dị bộ(USART/SCL) có khả năng phát hiện 9 bít địa chỉ. + Cổng phụ song song (PSP) với 8 bít mở rộng, với RD, WR và CS điều khiển. Sơ đồ các chân PIC16F87X. Sơ đồ khối bộ vi điều khiển PIC16F87X So sánh với bộ vi điều khiển 8051 * Bộ vi điều khiển 8051 là bộ VĐK đầu tiên thuộc họ VĐK x51 đ−ợc sản xuất bởi công ty Intel, Siemens, Advanced Micro Devices, Fujitsu, Philips. Các đặc điểm chung của bộ VĐK này: + 4KB ROM + 128 B RAM + 4 cổng I/O 8 bit + 2 Timer 16 bit + Có khả năng quản lý đ−ợc 64 KB bộ nhớ m ch−ơng trình ngoài (ROM ngoài). + Có khả năng quản lý đ−ợc 64 KB bộ nhớ dữ liệu ngoài (RAM ngoài) + Có bộ xử lý logic riêng (thao tác trên các bit) + Có thể thao tác trực tiếp đ−ợc 210 bit (các bit này đ đ−ợc địa chỉ hoá) + Có 5 ngắt + Dùng nguồn dao động ngoài + Dùng điện áp 5V để cho chip hoạt động *Cổng P0: Có dạng cực máng hở và có 8 chân (8 bit) là cổng vào/ra hoặc là cổng chuyển dữ liệu và địa chỉ. *Cổng P1: Là cổng vào/ra có 8 chân (8 bit). *Cổng P2: Có 8 chân (8 bit) là cổng vào/ra hoặc là cổng chuyển dữ liệu và địa chỉ. *Cổng P3: Có 8 chân, cổng này có thể là cổng vào/ra 8 bit hay còn có các chức năng quan trọng khác nh− phục vụ cho ngắt, các bộ định thời, việc truyền nhận dữ liệu truyền thông nối tiếp, đọc và ghi các bộ nhớ ngoài… Sơ đồ khối của VĐK 8051 Nh− vậy có thể thấy đặc điểm đầu tiên mà PIC16F877 đem lại và nổi bật so với VĐK 8051 là dòng PIC16F877 những đặc tính kĩ thuật hơn hẳn so với bộ VĐK 8051 thể hiện ở những điểm sau: VĐK8051 VĐK PIC16F877 Đặc tính Số l−ợng Đặc tính Số l−ợng ROM trên chíp RAM Bộ định thời Các chân vào ra Cổng nối tiếp Nguồn ngắt 4K byte 128 byte 2 32 1 6 ROM trên chíp RAM Bộ định thời Các chân vào ra Cổng nối tiếp Nguồn ngắt 8K 368 byte 3 40 2 14 Ngoài những đặc tính trên thì bộ vi điều khiển PIC16F877 còn có một đặc điểm hơn hẳn so với 8051 là có 10 bít chuyển đổi A/D trên chíp điều này sẽ giúp chúng ta không phải mất một bộ chuyển đổi (sẽ dẫn đến kết nối dây trở nên phức tạp). Một đặc điểm nữa là bộ vi điều khiển PIC16F877 có bộ tạo dao động chủ trên chíp điều này sẽ tránh đ−ợc những sai số không cần thiết trong việc tạo xung động, VĐK PIC16F877 cú khả năng tự RESET bằng bộ WĐT, và cú thờm 256 byte EEPROM PHẦN I THIẾT KẾ PHẦN CỨNG Sơ đồ khối của mạch ♣ Khối xử lý nhiệt độ và khối ADC : Là một sensor nhiệt LM335 và một bộ ADC 10 bit Sơ đồ của sensor nhiệt LM335 LM335 cố đầu vào là nhiệt độ mụi trường và đầu ra là diện ỏp  Chõn 1 là chõn mang dấu “-”, thường được nối đất khi phõn cực  Chõn 2 là chõn mang dấu “+”, được nối với V+ thụng qua một điện trở và chõn 2 cũng là đầu ra của LM335  Chõn 3 là chõn mang chữ “ADJ”, thường được nối với một biến trở để điều chỉnh nhiệt độ ban đầu cho phự hợp Người ta thường phõn cực cho nú như sau: Nhiệt độ mụi trường Khối xử lý nhiệt độ Khối hiển thị và cảnh bỏo Khối ADC Khối xử lý vào ra Khối xử lý chung Cũn bộ biến đổi ADC , ta dựng ADC của PIC là ADC 10 bớt Nguyờn lý làm việc và cỏc cụng thức tớnh toỏn: Đo nhiệt độ mụi trường tại một điểm thụng qua sensor nhiệt LM335 (Chi tiết về LM335 xem thờm trong datasheet). LM335 là sensor đo nhiệt, đo được nhiệt độ trong khoảng từ -400C đến 1000C, đầu ra là 10mV/K. Đầu ra này được đưa vao chõn Analog của bộ ADC (Cụ thể ở đõy là đưa vào Chõn AN0 ).Vỡ ở đõy là tớnh theo độ K nờn để đo độ C ta cần cú cụng thức chuyển đổi giỏ trị từ độ K sang độ C. Ở đõy ta dựng ADC của PIC là 10 bit => max=1023, Vref=Vcc, giả thiết là Vcc = 5V nờn tại 0 độ C hay 273K thỡ đầu ra của LM335 cú giỏ trị là 2.73V. Như vậy khi muốn tớnh toỏn ra độ C ta cần phải trừ đi mức điện ỏp là 2.73V. Lấy vớ dụ: nhiệt độ là 30 độ C = 303K -> out = 303 x 10mV/K =3.03V. Ta tớnh toỏn giỏ trị đọc được từ ADC 10 bit (ADC_Vin là điện ỏp đưa vào chõn ADC của PIC, ADC_value là giỏ trị đầu ra của ADC dưới dạng thập phõn): ADC_Vin = 5V => ADC_value = 1023 ADC_Vin = 2.73V => ADC_value = (1023/5)x2.73=558.558 (tương ứng 0 độ C) ADC_Vin = 3.03V => ADC_value = (1023/5)x3.03=619.938 (tương ứng 30 độ C) Mặt khỏc do V_ref = Vcc =5V nờn ADC_value=1 tương ứng 5/1023 = 4.887mV (~ 5mV). Trong khi đú LM335 cho ra điện ỏp là 10mV/1K nờn để giỏ trị ADC thay đổi 1 đơn vị thỡ nhiệt độ phải thay đổi là 0.5K (hay gần 5mV) Từ đú ta cú cụng thức đầy đủ sau để tớnh giỏ trị độ C: C=(ADC_value - 558.558)x(4.887mV/10mV) => C=(ADC_value - 558.6)/ 2.046 ♣Khối hiển thị và cảnh bỏo Ta dựng LED 7 thanh để hiển thị nhiệt độ của mụi trường và dựng loa để phỏt ra cảnh bỏo khi nhiệt độ mụi trường ở trong khoảng nguy hiểm. Cụ thể trong mạch này ta dựng Hai LED 7 thanh Anot chung (chỳng ta cũng cú thể dựng LCD thay thế) Sau đõy là sơ đồ mạch nguyờn lý: Sơ đồ nguyờn lý LM335Z 1 2 3 10K 4 5 7910 21 3 8 6 a b cde fg VC C Vc c D O T 11 12 21 22 23 24 25 26 27 28 14 13 16 17 40 39 38 37 36 35 34 33 4 5 6 7 8 9 10 29 18 19 20 1 2 3 15 30 32 31 VDD VSS RD2/PSP2 RD3/PSP3 RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD4/PSP4 RD5/PSP5 OSC2/CLKO OSC1/CLKI RC1/CCP2 RC2/CCP1 RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT RA2/AN2 RA3/AN3 RA4 RA5/AN4 RE0/AN5 RE1/AN6 RE2/AN7 RD6/PSP6 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 VPP RA0/AN0 RA1/AN1 RC0/T1CKI RD7/PSP7 VDD1 VSS1 H I A1015 4K7 SPEAKER 4K7 HI 4K7 22pF A1015 22pF SW2 SW _ PB _ SP ST H I H I 10MHz VR10K 1K Q3 PIC16F877A HI HI 4 5 7910 21 3 8 6 a b cde fg VC C Vc c D O T Giải thớch sơ đồ nguyờn lý: Cỏc Transistor A1015 (chỳng ta gọi là cỏc đốn T1, T2, T3) được cấp nguồn 5V ở chõn E , chõn C của T1 và T2 được nối với 2 chõn Vcc của LED 7 thanh, cỏc chõn B của T1, T2 được nối lần lượt với cỏc chõn 20 và 19 của VĐK PIC16F877A (cụ thể là nối với cỏc chõn RD0 và RD1 là cỏc chõn output của PORTB). Khi RD1 ở mức thấp thỡ đầu C của đốn T1 sẽ ở mức cao lỳc đú LED 1 được phõn cực đỳng và cú thể sỏng, ngược lại thỡ LED 1 bị phõn cực sai lỳc đú nú sẽ khụng sỏng. Tương tự cho chõn RD0 và LED cũn lại. Đốn T3 cũng như vậy nhưng thay LED bằng một cỏi Loa (và chõn output là chõn RE0 của PORTE) dựng để cảnh bỏo . Đầu ra của sensor nhiệt LM335 sẽ được đưa vào chõn 2 của VĐK (là chõn Analog AN0 của ADC 10 bớt tớch hợp sẵn trong VĐK PIC, chõn AN0 này sẽ được thiết lập là chõn vào Analog của ADC) . Cuối cựng là VĐK PIC16F877A, ở đõy ta chỉ núi đến những tớnh năng mà ta dựng cho đề tài này, nú là một con VĐK tớch hợp rất nhiều chức năng mà chỳng ta cú thể tham khảo thờm trong Datasheet của nú. Nhỡn vào sơ đồ nguyờn lý ta cú thể thấy ngay rằng cỏc chõn 19, 20 là cỏc chõn output (đó được núi ở trờn) ,ngoài ra T1 T2 T3 cũn cú cỏc chõn 33 đến 39 cũng là cỏc chõn output (chớnh là cỏc bớt RB0 đến RB6 được thiết lập là cỏc chõn output của PORTB), cỏc chõn này được nối với LED 7 thanh để hiển thị nhiệt độ, khi LED được phõn cực đỳng thỡ nếu cỏc chõn này ở mưc cao thỡ LED sẽ sỏng. Chõn 2 là chõn Input, là chõn vào Analog của ADC Cỏc chõn 11,12,31,32 là cỏc chõn cấp nguồn cho VĐK, riờng chõn Vpp (chõn 1) chớnh là chõn RESET. Chõn 13, 14 là cỏc chõn dựng cho việc thiờt lập xung Clock cho VĐK PHẦN II THIẾT KẾ PHẦN MỀM Trong bài này chỳng ta sẽ dựng chương trỡnh CCS (ngụn ngữ C cho PIC của Microchip) để viết phần lập trỡnh cho VĐK, ưu điểm của nú là khỏ nhỏ gọn so với khi ta viết bằng MASM nhờ được hỗ trợ khỏ nhiều hàm, ngoài ra ta cũn cú thể chốn một đoạn chương trỡnh viết bằng ASM giũa hai chỉ thị tiền xử lý là #ASM và #ENDASM . Tài liệu tham khảo: “Tài liệu hướng dẫn CCS Tiếng việt” của tỏc giả Trần Xuõn Trường, SV K2001, ĐHBK HCM hoặc đầy đủ hơn là phần Hepl trong trỡnh cài đặt PIC C Compiler Code đầy đủ cho chương trỡnh --------------------------------------------------------------------------------------------------- #include //Khai bỏo con PIC ta sử dụng và file khai bỏo cỏc bớt,cỏc // thanh ghi quan trọng trong con PIC này #include //Khai bỏo sự định ngió cỏc thanh ghi và cỏc bớt quan trọng #device *=16 adc=10 // Khai bỏo dựng poiter 16 bớt và ADC 10 bớt #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT //Khai bỏo cỏc config #use delay(clock=20000000) //Khai bỏo sử dụng hàm Delay và tần số dao động sử dụng int8 high,low; //Khai bỏo cỏc biến số nguyờn 1byte (8bớt) //Khai bỏo mảng hằng số là số nguyen 1 byte int8 const a[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // Chương trỡnh con tỏch số hàng chục và hàng đơn vị thành hai số chứa trong hai biến //đó khai bỏo ở trờn là high và low void convert_bcd(int8 x) { low=x%10; //chia lấy phần dư, low=hàng đơn vị high=x/10; high=high%10; //high=số hàng chục } // Chương trỡnh con giải mó và hiển thị nhiệt độ void display() { PORTB=a[low]; // Gửi dữ liệu đến LED 1 RD0=0; // Bật LED1, LED1 sẽ hiển thị đỳng giỏ trị của low delay_ms(2); // Cho trễ 2ms RD0=1; // tắt LED 1 PORTB=a[high]; // LED 2 RD1=0; delay_ms(2); RD1=1; } //Chương trỡnh con thục hiện việc bỏo động void bao_dong(){ int8 i; for(i=0;i<200;i++) { RE0=0;delay_us(100); RE0=1;delay_us(100); } //Kờu 200 tiếng } // Chương trỡnh chớnh void main() { float value; int16 i; trisb = 0x00; //thiết lập cỏc chõn của PORTB là cỏc chõn Output trisc = 0x00; // thiết lập cỏc chõn của PORTC là cỏc chõn Output trisd = 0x00; // thiết lập cỏc chõn của PORTD là cỏc chõn Output trise = 0x00; // thiết lập cỏc chõn của PORTE là cỏc chõn Output trisa = 0xff; // thiết lập cỏc chõn của PORTa là cỏc chõn Intput portC = 0xff; // thiết lập cỏc chõn của PORTC xuất ra điện ỏp ở mức cao portD = 0xff; // thiết lập cỏc chõn của PORTd xuất ra điện ỏp ở mức cao //Thiết lập cho ADC setup_adc(ADC_CLOCK_INTERNAL); //Chỉ ra cỏch thức hoạt động của ADC là thời // gian lấy mẫu bằng xung clock //Thiết lõp.chõn lấy tớn hiệu Analog là chõn AN0 setup_adc_ports(AN0); setup_ADC_channel(0) delay_us(10); //Trễ 10 us value=(float)read_adc(); value = (value - 558.5)/2.048; convert_bcd((int8)value); i=0; //Vũng lặp vụ tận while(1) { i++; value = (float)read_adc(); value = (value - 558.5)/2.048; //for 5V supply if (i==150) { convert_bcd((int8)value);i=0;} if(((int8)value > 40) || ((int8)value < 15)) bao_dong(); display(); } } -------------------------------------------------------------------------------------------------- Lưu ý: ●Tại sao khi gắn a[low] =PORTB thỡ LED 1 lại hiển thị giỏ trị của low? Bởi vỡ mảng hằng số: a[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; sẽ tương đương với mảng giỏ trị cỏc số nhị phõn như sau: a[10] = {11000000,11111001,10100100,10110000,10011001,10010010,10000010, 11111000,10000000,10010000}; Kể từ phải qua trỏi (bỏ qua số nhị phõn cuối cựng bởi vỡ ta khụng sử dụng chan RB7 của PORTB) cỏc số nhị phõn này chỉ ra mức điện ỏp ở cỏc thanh a,b,c,d,e,f,g,h của LED Tức là mảng này tương ứng với cỏc giỏ trị hiển thị trờn LED là cỏc số: 0,1,2,3,4,5,6,7,8,9 ●Một số cỏc hàm trong CCS đó được sử dụng là: Hàm delay_us(time) delay_ms(time) vớ dụ: delay_us(2) ; //tạo trễ 2us delay_ms(2); //tạo trễ 2ms Hàm: setup_adc(ADC_CLOCK_INTERNAL); hàm này dựng để xỏc định cỏch thức hoạt động của bộ biến đổi ADC, cụ thể là xỏc định thời gian lấy mẫu bằng một xung clock Hàm: setup_adc_ports(AN0); setup_ADC_channel(0) cỏc hàm này dựng để xỏc định chõn lấy tớn hiệu Analog là chõn AN0 Cũn đõy là file định ngĩa “def_877a.h” mà ta đó khai bỏo ở trờn: --------------------------------------------------------------------------------------------------- // register definitions #define W 0 #define F 1 // register files #byte INDF =0x00 #byte TMR0 =0x01 #byte PCL =0x02 #byte STATUS =0x03 #byte FSR =0x04 #byte PORTA =0x05 #byte PORTB =0x06 #byte PORTC =0x07 #byte PORTD =0x08 #byte PORTE =0x09 #byte EEDATA =0x10C #byte EEADR =0x10D #byte EEDATH =0x10E #byte EEADRH =0x10F #byte ADCON0 =0x1F #byte ADCON1 =0x9F #byte ADRESH =0x9F #byte ADSESL =0x9F #byte PCLATH =0x0a #byte INTCON =0x0b #byte PIR1 =0x0c #byte PIR2 =0x0d #byte PIE1 =0x8c #byte PIE2 =0x8d #byte OPTION_REG =0x81 #byte TRISA =0x85 #byte TRISB =0x86 #byte TRISC =0x87 #byte TRISD =0x88 #byte TRISE =0x89 #byte EECON1 =0x18C #byte EECON2 =0x18D #byte SSPBUF =0x13 #byte SSPCON =0x14 #byte SSPCON2 =0x91 #byte SSPADD =0x93 #byte SSPSTAT =0x94 // SSPCON bit #bit SSPWCOL = 0x14.7 #bit SSPOV = 0x14.6 #bit SSPEN = 0x14.5 #bit SSPCKP = 0x14.4 #bit SSPM3 = 0x14.3 #bit SSPM2 = 0x14.2 #bit SSPM1 = 0x14.1 #bit SSPM0 = 0x14.0 // SSPSTAT bit #bit SSPSMP = 0x94.7 #bit SSPCKE = 0x94.6 #bit SSPDA = 0x94.5 #bit SSPP = 0x94.4 #bit SSPS = 0x94.3 #bit SSPRW = 0x94.2 #bit SSPUA = 0x94.1 #bit SSPBF = 0x94.0 //DINH NGHIA BIT #bit ra5 =0x05.5 #bit ra4 =0x05.4 #bit ra3 =0x05.3 #bit ra2 =0x05.2 #bit ra1 =0x05.1 #bit ra0 =0x05.0 #bit rb7 =0x06.7 #bit rb6 =0x06.6 #bit rb5 =