I. GIỚI THIỆU
Ở chương này khảo sát vi điều khiển giao tiếp với vi mạch chuyển đổi tương tự sang số (ADC) và vi điều khiển có tích hợp ADC để thực hiện các ứng dụng trong đo lường và điều khiển.
Sau khi kết thúc chương này bạn có thể kết nối vi điều khiển không có tích hợp bộ chuyển đổi ADC với các vi mạch ADC, sử dụng được vi điều khiển có tích hợp ADC, biết trình tự thực hiện quá trình chuyển đổ i ADC, biết tính toán độ phân giải, chuyển đổi và tính trung bình kết quả.
II. ADC CỦA VI ĐIỀU KHIỂN PIC 16F887
Vi điều khiển PIC 16F877A có bộ chuyển đổi tín hiệu tương tự sang tín hiệu số ADC 10 bit đa hợp 8 kênh và PIC 16F887 có 14 kênh. Mạch ADC dùng cho các ứng dụng giao tiếp với tín hiệu tương tự có thể nhận từ các cảm biến như cảm biến nhiệt độ LM35, cảm biến áp suất, cảm biến độ ẩm, cảm biến khoảng cách, …
Phần này sẽ khảo sát chi tiết khối ADC của PIC, các thanh ghi của khối ADC, trình tự thực hiện chuyển đổi, tập lệnh lập trình C cho ADC và ứng dụng ADC để đo nhiệt độ.
1. KHẢO SÁT ADC CỦA PIC 16F887
ADC của PIC16F887 có sơ đồ khối như hình 7-1:
Chức năng các thành phần:
AN0 đến AN13 (analog) là 14 ngõ vào của 14 kênh tương tự được đưa đến mạch đa hợp.
CHS<3:0> là các ngõ vào chọn kênh của bộ đa hợp tương tự.
Tín hiệu kênh tương tự đã chọn sẽ được đưa đến bộ chuyển đổi ADC.
Điện áp tham chiếu dương Vref+ có thể lập trình nối với nguồn cung cấp dương AVDD
hoặc điện áp tham chiếu bên ngoài nối với ngõ vào Vref+ của chân AN3, bit lựa chọn là
VCFG0.
Điện áp tham chiếu âm Vref- có thể lập trình nối với nguồn cung cấp AV
SS hoặc điện áp tham chiếu bên ngoài nối với ngõ vào Vre- của chân AN2, bit lựa chọn là VCFG1.
Hai ngõ vào Vref+ và Vref- có chức năng thiết lập độ phân giải cho ADC.
Bit ADON có chức năng cho phép ADC hoạt động hoặc tắt bộ ADC khi không hoạt
động để giảm công suất tiêu tán, ADON bằng 1 thì cho phép, bằng 0 tắt.
Kết quả chuyển đổi là số nhị phân 10 bit sẽ lưu vào cặp thanh ghi 16 bit có tên là ADRESH và ADRESL, 10 bit kết quả lưu vào thanh ghi 16 bit nên có dạng lưu là canh lề trái và canh lề phải tùy thuộc vào bit lựa chọn có tên ADFM.
ADC có 14 kênh nhưng mỗi thời điểm chỉ chuyển đổi 1 kênh và chuyển đổi kênh nào thì phụ thuộc vào 4 bit chọn kênh CHS4:CHS0. Hai ngõ vào điện áp tham chiếu dương và âm có thể lập trình nối với nguồn VDD và VSS hoặc nhận điện áp tham chiếu từ bên ngoài qua 2 chân RA3 và RA2.
Khối ADC độc lập với CPU nên có thể hoạt động khi CPU đang ở chế độ ngủ do xung cung cấp cho ADC lấy từ dao động RC bên trong của khối ADC.
2. KHẢO SÁT CÁC THANH GHI CỦA PIC 16F887
Khối ADC có 4 thanh ghi:
Thanh ghi lưu kết quả byte cao: ADRESH (A/D Result High Register)
Thanh ghi lưu kết quả byte thấp: ADRESL (A/D Result Low Register)
Thanh ghi điều khiển ADC thứ 0: ADCON0 (A/D Control Register 0)
Thanh ghi điều khiển ADC thứ 1: ADCON1 (A/D Control Register 1)
a. Thanh ghi ADCON0 (ADC Control register)chứa các bit điều khiển khối ADC như sau:
- Bit 7-6 ADCS<1:0>: Các bit lựa chọn xung chuyển đổi AD (AD Conversion Clock Select bits) :
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (xung clock lấy từ bộ dao động nội bên trong có tần số lớn nhất là 500 kHz)
Bit 5-3 CHS<3:0>: Các bit lựa chọn kênh tương tự (Analog Channel Select bits) như bảng 7-1:
- Bit 2 DONE GO /: bit báo trạng thái chuyển đổi ADC (A/D Conversion status bit)
Khi cho GO/DONE = 1 để bắt đầu thực hiện quá trình chuyển đổi.
Sau khi chuyển đổi xong thì mạch chuyển đổi làm bit GO/DONE xuống mức 0.
- Bit 0 ADON: bit mở nguồn cho ADC hoạt động (AD ON bit):
ADON = 1 có chức năng mở nguồn cho khối chuyển đổi ADC hoạt động.
ADON = 0 sẽ tắt nguồn khối chuyển đổi ADC để giảm công suất tiêu thụ.
b. Thanh ghi ADCON1 thiết lập các chân của port là tương tự hoặc xuất nhập số IO.
- Bit 7 ADFM: bit lựa chọn định dạng kết quả ADC (AD Result Format Select bit):
ADFM = 1: có chức năng canh lề phải, 6 bit MSB của ADRESH có giá trị là „0‟.
ADFM = 0: có chức năng canh lề trái, 6 bit LSB của ADRESL có giá trị là „0‟.
- Bit 5 VCFG1: bit lựa chọn điện áp tham chiếu (Voltage reference bit)
VCFG1 = 1: có chức năng nối điện áp tham chiếu Vref- với ngõ vào AN3.
VCFG1 = 0: có chức năng nối điện áp tham chiếu Vref- với VSS.
- Bit 4 VCFG0: bit lựa chọn điện áp tham chiếu (Voltage reference bit)
VCFG0 = 1: có chức năng nối điện áp tham chiếu Vref+ với ngõ vào AN3 .
VCFG0 = 0: có chức năng nối điện áp tham chiếu Vref+ với VDD
- Bit 6, 3-0: chưa dùng nếu đọc sẽ có giá trị là „0‟
c. Thanh ghi ADRESH và ADRESL
Cặp thanh ghi 16 bit ADRESH: ADRESL dùng để lưu kết quả chuyển đổi 10 bit của ADC sau khi chuyển đổi xong. Do kết quả chỉ có 10 bit nhưng lưu trong cặp thanh ghi 16 bit nên có 2 kiểu định dạng tùy thuộc vào bit ADFM (ADC Format).
Hình sau trình bày 2 kiểu định dạng của cặp thanh ghi kết quả:
Chức năng của canh lề phục vụ cho 2 khả năng xử lý kết quả: nếu lấy kết quả 10 bit để xử lý thì nên chọn chế độ canh lề phải, còn nếu lấy kết quả 8 bit thì chọn chế độ canh lề trái và chỉ lấy kết quả của thanh ghi byte cao ADRESH, bỏ đi 2 bit có trọng số thấp nhất của thanh ghi ADRESL và chú ý đến tính toán giá trị, trong chương trình C nếu không khai báo thuộc tính ADC 10 bit thì phần mềm tự động lấy giá trị 8 bit cao.
3. TRÌNH TỰ THỰC HIỆN CHUYỂN
Để thực hiện chuyển đổi ADC thì phải thực hiện các bước sau:
- Bước 1: Cấu hình cho port:
Cấu hình cho các port ở chế độ ngõ vào tương tự.
Không được định cấu hình cho các port ở chế độ xuất dữ liệu.
- Bước 2: Cấu hình cho module ADC:
Chọn xung clock cho chuyển đổi ADC.
Định cấu hình cho điện áp chuẩn.
Chọn kênh ngõ vào tương tự cần chuyển đổi.
Chọn định dạng cho 2 thanh ghi lưu kết quả.
Mở nguồn cho ADC.
- Bước 3: Thiết lập cấu hình ngắt ADC nếu sử dụng:
Xóa cờ báo ngắt ADIF của ADC.
Cho bit ADIE bằng 1 để cho phép ADC ngắt.
Cho bit PEIE bằng 1 để cho phép ngắt ngoại vi.
Cho bit GIE bằng 1 để cho phép ngắt toàn cục.
- Bước 4: Chờ hết thời gian ổn định theo yêu cầu.
- Bước 5: Bắt đầu chuyển đổi bằng cách cho bit GO/DONE lên 1.
- Bước 6: Kiểm tra chuyển đổi ADC kết thúc bằng cách:
Kiểm tra liên tục bit GO/DONE nếu về 0 thì quá trình chuyển đổi kết thúc. Nếu dùng ngắt thì chờ ngắt ADC xảy ra.
- Bước 7: Đọc cặp thanh ghi kết quả (ADRESH: ADRESL), xóa bit ADIF nếu dùng ngắt.
- Bước 8: Thực hiện chuyển đổi kế tiếp.
4. LỰA CHỌN NGUỒN XUNG CHO CHUYỂN ĐỔI ADC
Tần số xung clock cho bộ chuyển đổi ADC được lựa chọn bằng phần mềm bởi các bit ADCS nằm trong thanh ghi ADCON0. Có 4 lựa chọn cho nguồn xung clock như sau:
FOSC/2
FOSC/8
FOSC/32
FRC lấy từ bộ dao động bên trong.
Tần số xung clock tùy chọn phụ thuộc vào tần số bộ dao động như bảng 7-2:
Thời gian chuyển đổi ADC cho mỗi bit được xác định bởi chu kỳ TAD. Để chuyển đổi hoàn tất 10 bit sẽ dùng tối thiểu 11 chu kỳ TAD
như hình 7-5.
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
- Link download project Click here
Ở chương này khảo sát vi điều khiển giao tiếp với vi mạch chuyển đổi tương tự sang số (ADC) và vi điều khiển có tích hợp ADC để thực hiện các ứng dụng trong đo lường và điều khiển.
Sau khi kết thúc chương này bạn có thể kết nối vi điều khiển không có tích hợp bộ chuyển đổi ADC với các vi mạch ADC, sử dụng được vi điều khiển có tích hợp ADC, biết trình tự thực hiện quá trình chuyển đổ i ADC, biết tính toán độ phân giải, chuyển đổi và tính trung bình kết quả.
II. ADC CỦA VI ĐIỀU KHIỂN PIC 16F887
Vi điều khiển PIC 16F877A có bộ chuyển đổi tín hiệu tương tự sang tín hiệu số ADC 10 bit đa hợp 8 kênh và PIC 16F887 có 14 kênh. Mạch ADC dùng cho các ứng dụng giao tiếp với tín hiệu tương tự có thể nhận từ các cảm biến như cảm biến nhiệt độ LM35, cảm biến áp suất, cảm biến độ ẩm, cảm biến khoảng cách, …
Phần này sẽ khảo sát chi tiết khối ADC của PIC, các thanh ghi của khối ADC, trình tự thực hiện chuyển đổi, tập lệnh lập trình C cho ADC và ứng dụng ADC để đo nhiệt độ.
1. KHẢO SÁT ADC CỦA PIC 16F887
ADC của PIC16F887 có sơ đồ khối như hình 7-1:
Chức năng các thành phần:
AN0 đến AN13 (analog) là 14 ngõ vào của 14 kênh tương tự được đưa đến mạch đa hợp.
CHS<3:0> là các ngõ vào chọn kênh của bộ đa hợp tương tự.
Tín hiệu kênh tương tự đã chọn sẽ được đưa đến bộ chuyển đổi ADC.
Điện áp tham chiếu dương Vref+ có thể lập trình nối với nguồn cung cấp dương AVDD
hoặc điện áp tham chiếu bên ngoài nối với ngõ vào Vref+ của chân AN3, bit lựa chọn là
VCFG0.
Điện áp tham chiếu âm Vref- có thể lập trình nối với nguồn cung cấp AV
SS hoặc điện áp tham chiếu bên ngoài nối với ngõ vào Vre- của chân AN2, bit lựa chọn là VCFG1.
Hai ngõ vào Vref+ và Vref- có chức năng thiết lập độ phân giải cho ADC.
Bit ADON có chức năng cho phép ADC hoạt động hoặc tắt bộ ADC khi không hoạt
động để giảm công suất tiêu tán, ADON bằng 1 thì cho phép, bằng 0 tắt.
Kết quả chuyển đổi là số nhị phân 10 bit sẽ lưu vào cặp thanh ghi 16 bit có tên là ADRESH và ADRESL, 10 bit kết quả lưu vào thanh ghi 16 bit nên có dạng lưu là canh lề trái và canh lề phải tùy thuộc vào bit lựa chọn có tên ADFM.
ADC có 14 kênh nhưng mỗi thời điểm chỉ chuyển đổi 1 kênh và chuyển đổi kênh nào thì phụ thuộc vào 4 bit chọn kênh CHS4:CHS0. Hai ngõ vào điện áp tham chiếu dương và âm có thể lập trình nối với nguồn VDD và VSS hoặc nhận điện áp tham chiếu từ bên ngoài qua 2 chân RA3 và RA2.
Khối ADC độc lập với CPU nên có thể hoạt động khi CPU đang ở chế độ ngủ do xung cung cấp cho ADC lấy từ dao động RC bên trong của khối ADC.
2. KHẢO SÁT CÁC THANH GHI CỦA PIC 16F887
Khối ADC có 4 thanh ghi:
Thanh ghi lưu kết quả byte cao: ADRESH (A/D Result High Register)
Thanh ghi lưu kết quả byte thấp: ADRESL (A/D Result Low Register)
Thanh ghi điều khiển ADC thứ 0: ADCON0 (A/D Control Register 0)
Thanh ghi điều khiển ADC thứ 1: ADCON1 (A/D Control Register 1)
a. Thanh ghi ADCON0 (ADC Control register)chứa các bit điều khiển khối ADC như sau:
- Bit 7-6 ADCS<1:0>: Các bit lựa chọn xung chuyển đổi AD (AD Conversion Clock Select bits) :
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (xung clock lấy từ bộ dao động nội bên trong có tần số lớn nhất là 500 kHz)
Bit 5-3 CHS<3:0>: Các bit lựa chọn kênh tương tự (Analog Channel Select bits) như bảng 7-1:
- Bit 2 DONE GO /: bit báo trạng thái chuyển đổi ADC (A/D Conversion status bit)
Khi cho GO/DONE = 1 để bắt đầu thực hiện quá trình chuyển đổi.
Sau khi chuyển đổi xong thì mạch chuyển đổi làm bit GO/DONE xuống mức 0.
- Bit 0 ADON: bit mở nguồn cho ADC hoạt động (AD ON bit):
ADON = 1 có chức năng mở nguồn cho khối chuyển đổi ADC hoạt động.
ADON = 0 sẽ tắt nguồn khối chuyển đổi ADC để giảm công suất tiêu thụ.
b. Thanh ghi ADCON1 thiết lập các chân của port là tương tự hoặc xuất nhập số IO.
- Bit 7 ADFM: bit lựa chọn định dạng kết quả ADC (AD Result Format Select bit):
ADFM = 1: có chức năng canh lề phải, 6 bit MSB của ADRESH có giá trị là „0‟.
ADFM = 0: có chức năng canh lề trái, 6 bit LSB của ADRESL có giá trị là „0‟.
- Bit 5 VCFG1: bit lựa chọn điện áp tham chiếu (Voltage reference bit)
VCFG1 = 1: có chức năng nối điện áp tham chiếu Vref- với ngõ vào AN3.
VCFG1 = 0: có chức năng nối điện áp tham chiếu Vref- với VSS.
- Bit 4 VCFG0: bit lựa chọn điện áp tham chiếu (Voltage reference bit)
VCFG0 = 1: có chức năng nối điện áp tham chiếu Vref+ với ngõ vào AN3 .
VCFG0 = 0: có chức năng nối điện áp tham chiếu Vref+ với VDD
- Bit 6, 3-0: chưa dùng nếu đọc sẽ có giá trị là „0‟
c. Thanh ghi ADRESH và ADRESL
Cặp thanh ghi 16 bit ADRESH: ADRESL dùng để lưu kết quả chuyển đổi 10 bit của ADC sau khi chuyển đổi xong. Do kết quả chỉ có 10 bit nhưng lưu trong cặp thanh ghi 16 bit nên có 2 kiểu định dạng tùy thuộc vào bit ADFM (ADC Format).
Hình sau trình bày 2 kiểu định dạng của cặp thanh ghi kết quả:
Chức năng của canh lề phục vụ cho 2 khả năng xử lý kết quả: nếu lấy kết quả 10 bit để xử lý thì nên chọn chế độ canh lề phải, còn nếu lấy kết quả 8 bit thì chọn chế độ canh lề trái và chỉ lấy kết quả của thanh ghi byte cao ADRESH, bỏ đi 2 bit có trọng số thấp nhất của thanh ghi ADRESL và chú ý đến tính toán giá trị, trong chương trình C nếu không khai báo thuộc tính ADC 10 bit thì phần mềm tự động lấy giá trị 8 bit cao.
3. TRÌNH TỰ THỰC HIỆN CHUYỂN
Để thực hiện chuyển đổi ADC thì phải thực hiện các bước sau:
- Bước 1: Cấu hình cho port:
Cấu hình cho các port ở chế độ ngõ vào tương tự.
Không được định cấu hình cho các port ở chế độ xuất dữ liệu.
- Bước 2: Cấu hình cho module ADC:
Chọn xung clock cho chuyển đổi ADC.
Định cấu hình cho điện áp chuẩn.
Chọn kênh ngõ vào tương tự cần chuyển đổi.
Chọn định dạng cho 2 thanh ghi lưu kết quả.
Mở nguồn cho ADC.
- Bước 3: Thiết lập cấu hình ngắt ADC nếu sử dụng:
Xóa cờ báo ngắt ADIF của ADC.
Cho bit ADIE bằng 1 để cho phép ADC ngắt.
Cho bit PEIE bằng 1 để cho phép ngắt ngoại vi.
Cho bit GIE bằng 1 để cho phép ngắt toàn cục.
- Bước 4: Chờ hết thời gian ổn định theo yêu cầu.
- Bước 5: Bắt đầu chuyển đổi bằng cách cho bit GO/DONE lên 1.
- Bước 6: Kiểm tra chuyển đổi ADC kết thúc bằng cách:
Kiểm tra liên tục bit GO/DONE nếu về 0 thì quá trình chuyển đổi kết thúc. Nếu dùng ngắt thì chờ ngắt ADC xảy ra.
- Bước 7: Đọc cặp thanh ghi kết quả (ADRESH: ADRESL), xóa bit ADIF nếu dùng ngắt.
- Bước 8: Thực hiện chuyển đổi kế tiếp.
4. LỰA CHỌN NGUỒN XUNG CHO CHUYỂN ĐỔI ADC
Tần số xung clock cho bộ chuyển đổi ADC được lựa chọn bằng phần mềm bởi các bit ADCS nằm trong thanh ghi ADCON0. Có 4 lựa chọn cho nguồn xung clock như sau:
FOSC/2
FOSC/8
FOSC/32
FRC lấy từ bộ dao động bên trong.
Tần số xung clock tùy chọn phụ thuộc vào tần số bộ dao động như bảng 7-2:
Thời gian chuyển đổi ADC cho mỗi bit được xác định bởi chu kỳ TAD. Để chuyển đổi hoàn tất 10 bit sẽ dùng tối thiểu 11 chu kỳ TAD
như hình 7-5.
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000
#include <xc.h>
// CONFIG1
#pragma config FOSC = XT // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
const unsigned char maled7[] = {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void ADCinit (void);
unsigned int ReadADC (void);
unsigned int ADCvalue = 0;
unsigned int nghin = 0, tram = 0, chuc = 0, donvi = 0;
float Temp = 0;
void main(void)
{
TRISD = 0;
PORTD = 0;
TRISC = 0;
PORTC = 0;
ADCinit();
__delay_us(10);
while(1)
{
ADCvalue = ReadADC();
Temp = ADCvalue;
// tach so
nghin = (unsigned int)Temp/1000;
tram = (unsigned int)(Temp - nghin*1000)/100;
chuc = (unsigned int)(Temp - nghin*1000 - tram*100)/10;
donvi = (unsigned int)Temp - nghin*1000 - tram*100 - chuc*10;
// hien thi
PORTC = maled7[nghin];
RD0=1;
__delay_ms(5);
RD0=0;
PORTC = maled7[tram];
RD1=1;
__delay_ms(5);
RD1=0;
PORTC = maled7[chuc];
RD2=1;
__delay_ms(5);
RD2=0;
PORTC = maled7[donvi];
RD3=1;
__delay_ms(5);
RD3=0;
}
}
void ADCinit (void)// adc
{
// chon tan so clock cho bo adc
ADCON0bits.ADCS1 = 0, ADCON0bits.ADCS0 = 1;
// chon kenh ADC
ADCON0bits.CHS0 = 0, ADCON0bits.CHS1 = 0, ADCON0bits.CHS2 = 0, ADCON0bits.CHS3 = 0;
// chon cach luu data
ADCON1bits.ADFM = 1;
// cap nguon cho khoi adc
ADCON0bits.ADON = 1;
}
unsigned int ReadADC (void)// doc len 7 doan
{
unsigned int TempValue = 0;
ADCON0bits.GO_nDONE = 1;
while(ADCON0bits.GO_nDONE);
TempValue = ADRESH*256 + ADRESL;
return (TempValue);
}
#include <stdlib.h>
#define _XTAL_FREQ 4000000
#include <xc.h>
// CONFIG1
#pragma config FOSC = XT // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
const unsigned char maled7[] = {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void ADCinit (void);
unsigned int ReadADC (void);
unsigned int ADCvalue = 0;
unsigned int nghin = 0, tram = 0, chuc = 0, donvi = 0;
float Temp = 0;
void main(void)
{
TRISD = 0;
PORTD = 0;
TRISC = 0;
PORTC = 0;
ADCinit();
__delay_us(10);
while(1)
{
ADCvalue = ReadADC();
Temp = ADCvalue;
// tach so
nghin = (unsigned int)Temp/1000;
tram = (unsigned int)(Temp - nghin*1000)/100;
chuc = (unsigned int)(Temp - nghin*1000 - tram*100)/10;
donvi = (unsigned int)Temp - nghin*1000 - tram*100 - chuc*10;
// hien thi
PORTC = maled7[nghin];
RD0=1;
__delay_ms(5);
RD0=0;
PORTC = maled7[tram];
RD1=1;
__delay_ms(5);
RD1=0;
PORTC = maled7[chuc];
RD2=1;
__delay_ms(5);
RD2=0;
PORTC = maled7[donvi];
RD3=1;
__delay_ms(5);
RD3=0;
}
}
void ADCinit (void)// adc
{
// chon tan so clock cho bo adc
ADCON0bits.ADCS1 = 0, ADCON0bits.ADCS0 = 1;
// chon kenh ADC
ADCON0bits.CHS0 = 0, ADCON0bits.CHS1 = 0, ADCON0bits.CHS2 = 0, ADCON0bits.CHS3 = 0;
// chon cach luu data
ADCON1bits.ADFM = 1;
// cap nguon cho khoi adc
ADCON0bits.ADON = 1;
}
unsigned int ReadADC (void)// doc len 7 doan
{
unsigned int TempValue = 0;
ADCON0bits.GO_nDONE = 1;
while(ADCON0bits.GO_nDONE);
TempValue = ADRESH*256 + ADRESL;
return (TempValue);
}
- Link download project Click here
EmoticonEmoticon