R
reinneguhn
Guest
나의 프로젝트)입니다 24.5C 예 : (세그먼트에 대한과 온도를 감지 LM35DZ - 양극 7 일반 다음을 수행 ADC를 함께 PIC16F877A 및 디스플레이 출력을 통해 4.지금까지 회로와, 이루어진다 모두 왼쪽 부분 코딩.내가 참조 전압의 2V예요 사용합니다.제가 프로그램을 내 쳤에 좀 문제가 건물.내 프로그램은 다음과 같이이다 :
코드 :/ / ************************************************ ***************************
/ / 파일 이름 : pictemp.c
/ / 버전 : 1.0
/ / 설명 : PIC는 온도계를
/ / 대상 : 마이크로 칩의 마이크로 컨트롤러를 PIC16F877a
/ / 최종 업데이트 : 28 년 3 월 2010
/ / ************************************************ ***************************#은 <pic.h> 포함(XT는 & WDTDIS 및 PWRTDIS 및 보호 해제 및 BORDIS & \ __CONFIG
LVPDIS & DEBUGEN);FOSC 20000000L를 정의 #메기 SSEG const [] = (0b11000000, / / 0, LED는 세그먼트 :, B와 C 나 디, 전자,여
0b11111001, / / 1, LED는 세그먼트 : B으로 C
0b10100100, / / 2, LED가 세그먼트 :, B와 D의 이메일은 G
0b10110000, / / 3, LED는 세그먼트 :, B와 C 나 개발은 G
0b10011001, / / 4, LED는 세그먼트 : B와 C가,여은 G
0b10010010, / / 5, LED가 세그먼트 :, C 나 D의여은 G
0b10000010, / / 6, LED는 세그먼트 :, C 나 디, 전자,여은 G
0b11111000, / / 7 세그먼트 LED에 :, B으로 C
0b10000000, / / 8, LED는 세그먼트 :, B와 C 나 디, 전자,여은 G
0b10010000, / / 9, LED는 세그먼트 :, B와 C 나 D의여은 G
0b11000110, / / C 나 LED가 세그먼트 :, 디, 전자,여);서명되지 않은 번째 문자 DispDigit [4];
서명되지 않은 번째 문자 DigitCount;정적 무효 인터럽트 ISR이 (무효)
(
면 (TMR0IF) (/ / TIMER0 인터럽트 플래그
/ * 낮은 세그먼트를 당겨 * /
PORTB = DispDigit [DigitCount];
/ * 활성화 자리와 고급 옆에 자리를 *로 /
PORTD = ~ (1 <<DigitCount );/ * 자리 개수 *를 재설정 /
(해당되는 경우 DigitCount> 3)
DigitCount = 0;TMR0 = 156;
TMR0IF = 0;
)
)/ / 지연 함수#은 _delay_us를 정의 (x)를 (서명되지 않은 우리를 메기; \
우리가 = (x)를 / (30000000/FOSC 1) |; \
= 0) 계속 (하면서 - 우리!
무효의 _delay_ms (서명 int 처지)
(
내가 번째 문자 서명되지 않은;
(합니까
전 = 4;
(합니까
_delay_us (164);
반면) (- 1);
) 동안 (- 미시시피);
)/ * 7 세그먼트 놔 번호 : 0부터 99.9 *에 떠있는 가치를 구현 /SSEG_putnum을 (플로트 번호) 무효
(
서명되지 않은 번째 문자 iDigit, iDigit1, iDecimal;
(전화 번호> 99.9)을 반환하는 경우;/ * 전역 인터럽트 비활성화 * /
GIE = 0;iDigit = (int) 번호;
/ / = 번호 - iDigit; / / 정수로 변환 부동 임시직 플로트
/ / temp2 = 임시직 * 10 플로트;
/ / iDecimal = (int) temp2;
iDecimal = (int는) (번호 - iDigit) * 10; / / 10 진수 자리 잡아
DispDigit [1] = SSEG [iDecimal]; / / 첫 번째 10 진수 자리
(iDigit> = 10) (면
iDigit1 = iDigit / 10;
DispDigit [3] = SSEG [iDigit1]; / / 둘째 자리
iDigit = iDigit - (iDigit1 * 10);
다른) (
DispDigit [3] = SSEG [0]; / / 제로 로그인 둘째 자리
)
DispDigit [2] = SSEG [iDigit] & 0x7F; / / 첫 번째 숫자 소수점이있는/ * 글로벌 인터럽트 활성화 * /
GIE = 1;
)메인 (무효) 무효
(
서명되지 않은 int의 iValue, iCTemp;
CentTemp 있자;TRISA = 0xFF; RA0에 RA7에 대해 / / 입력
TRISB = 0x00; RB0에 RB7에 대해 / / 출력
TRISD = 0x00; RC0에 대한 RC7 / / 출력/ * 초기 출력 포트 * /PORTB = 0xFF;
PORTD = 0xFF;/ *의 초기화 TIMER0 : 기간 : 1 / (Fosc/32) 엑스 Prescale 엑스 TMR0
0.0016 석사 엑스 64 * 100 = 10.24 미시시피 * /OPTION을 = 0b00000101; / / 1:64 Prescale
TMR0 = 156; / / 모든 인터럽트 10.24 석사
TMR0IE = 1; / / 설정 TMR0의 인터럽트는 오버플로우
GIE = 1; / / 글로벌 인터럽트 활성화/ * 초기 변수는 *를 사용하여 /DigitCount = 0;
DispDigit [0] = SSEG 정보 [10]; / / 섭씨 가입
DispDigit [1] = SSEG [0]; / / 제로 자리
DispDigit [2] = SSEG [0]; / / 제로 자리
DispDigit [3] = SSEG [0]; / / 제로 자리
(용;
(/ * 첫번째 샘플 가져오기 * /ADCON0 = 0b10000001;
ADCON1 = 0b10001101; / / 맞아, Vref 정렬 : VCFG1 및 VCFG0 (1 VoltReference)
GODONE = 1; / / 채널 0에 전환을 시작
(GODONE) 동안 계속; / / 잠깐 만요 전환 완료
iValue = ADRESL가; / / 8 비트 LSB가 결과를 가져오기
iValue 는 = (ADRESH <<8); / / 2 비트 MSB가 결과를 가져오기
iCTemp = iValue;
_delay_ms (50);/ * 예제 2 * 가져오기 /GODONE = 1; / / 채널 0에 전환을 시작
(GODONE) 동안 계속; / / 잠깐 만요 전환 완료
iValue = ADRESL가; / / 8 비트 LSB가 결과를 가져오기
iValue 는 = (ADRESH <<8); / / 2 비트 MSB가 결과를 가져오기
iCTemp = iValue;
_delay_ms (50);/ * 예제 3 * 가져오기 /GODONE = 1; / / 채널 0에 전환을 시작
(GODONE) 동안 계속; / / 잠깐 만요 전환 완료
iValue = ADRESL가; / / 8 비트 LSB가 결과를 가져오기
iValue 는 = (ADRESH <<8); / / 2 비트 MSB가 결과를 가져오기
iCTemp = iValue;/ *은 평균 섭씨 값을 계산 * /
/ * (Value/5.12 ADC)를 / Vref, LM35DZ 절판 = 10mV / C 나 Vref = 2 볼트 *를 /CentTemp = (iCTemp/3.0) / 5.12;
/ * 이제 결과 * 디스플레이 /
SSEG_putnum (CentTemp);
_delay_ms (200);
)
)
/ * EOF : pictemp.c * /
코드 :/ / ************************************************ ***************************
/ / 파일 이름 : pictemp.c
/ / 버전 : 1.0
/ / 설명 : PIC는 온도계를
/ / 대상 : 마이크로 칩의 마이크로 컨트롤러를 PIC16F877a
/ / 최종 업데이트 : 28 년 3 월 2010
/ / ************************************************ ***************************#은 <pic.h> 포함(XT는 & WDTDIS 및 PWRTDIS 및 보호 해제 및 BORDIS & \ __CONFIG
LVPDIS & DEBUGEN);FOSC 20000000L를 정의 #메기 SSEG const [] = (0b11000000, / / 0, LED는 세그먼트 :, B와 C 나 디, 전자,여
0b11111001, / / 1, LED는 세그먼트 : B으로 C
0b10100100, / / 2, LED가 세그먼트 :, B와 D의 이메일은 G
0b10110000, / / 3, LED는 세그먼트 :, B와 C 나 개발은 G
0b10011001, / / 4, LED는 세그먼트 : B와 C가,여은 G
0b10010010, / / 5, LED가 세그먼트 :, C 나 D의여은 G
0b10000010, / / 6, LED는 세그먼트 :, C 나 디, 전자,여은 G
0b11111000, / / 7 세그먼트 LED에 :, B으로 C
0b10000000, / / 8, LED는 세그먼트 :, B와 C 나 디, 전자,여은 G
0b10010000, / / 9, LED는 세그먼트 :, B와 C 나 D의여은 G
0b11000110, / / C 나 LED가 세그먼트 :, 디, 전자,여);서명되지 않은 번째 문자 DispDigit [4];
서명되지 않은 번째 문자 DigitCount;정적 무효 인터럽트 ISR이 (무효)
(
면 (TMR0IF) (/ / TIMER0 인터럽트 플래그
/ * 낮은 세그먼트를 당겨 * /
PORTB = DispDigit [DigitCount];
/ * 활성화 자리와 고급 옆에 자리를 *로 /
PORTD = ~ (1 <<DigitCount );/ * 자리 개수 *를 재설정 /
(해당되는 경우 DigitCount> 3)
DigitCount = 0;TMR0 = 156;
TMR0IF = 0;
)
)/ / 지연 함수#은 _delay_us를 정의 (x)를 (서명되지 않은 우리를 메기; \
우리가 = (x)를 / (30000000/FOSC 1) |; \
= 0) 계속 (하면서 - 우리!
(
내가 번째 문자 서명되지 않은;
(합니까
전 = 4;
(합니까
_delay_us (164);
반면) (- 1);
) 동안 (- 미시시피);
)/ * 7 세그먼트 놔 번호 : 0부터 99.9 *에 떠있는 가치를 구현 /SSEG_putnum을 (플로트 번호) 무효
(
서명되지 않은 번째 문자 iDigit, iDigit1, iDecimal;
(전화 번호> 99.9)을 반환하는 경우;/ * 전역 인터럽트 비활성화 * /
GIE = 0;iDigit = (int) 번호;
/ / = 번호 - iDigit; / / 정수로 변환 부동 임시직 플로트
/ / temp2 = 임시직 * 10 플로트;
/ / iDecimal = (int) temp2;
iDecimal = (int는) (번호 - iDigit) * 10; / / 10 진수 자리 잡아
DispDigit [1] = SSEG [iDecimal]; / / 첫 번째 10 진수 자리
(iDigit> = 10) (면
iDigit1 = iDigit / 10;
DispDigit [3] = SSEG [iDigit1]; / / 둘째 자리
iDigit = iDigit - (iDigit1 * 10);
다른) (
DispDigit [3] = SSEG [0]; / / 제로 로그인 둘째 자리
)
DispDigit [2] = SSEG [iDigit] & 0x7F; / / 첫 번째 숫자 소수점이있는/ * 글로벌 인터럽트 활성화 * /
GIE = 1;
)메인 (무효) 무효
(
서명되지 않은 int의 iValue, iCTemp;
CentTemp 있자;TRISA = 0xFF; RA0에 RA7에 대해 / / 입력
TRISB = 0x00; RB0에 RB7에 대해 / / 출력
TRISD = 0x00; RC0에 대한 RC7 / / 출력/ * 초기 출력 포트 * /PORTB = 0xFF;
PORTD = 0xFF;/ *의 초기화 TIMER0 : 기간 : 1 / (Fosc/32) 엑스 Prescale 엑스 TMR0
0.0016 석사 엑스 64 * 100 = 10.24 미시시피 * /OPTION을 = 0b00000101; / / 1:64 Prescale
TMR0 = 156; / / 모든 인터럽트 10.24 석사
TMR0IE = 1; / / 설정 TMR0의 인터럽트는 오버플로우
GIE = 1; / / 글로벌 인터럽트 활성화/ * 초기 변수는 *를 사용하여 /DigitCount = 0;
DispDigit [0] = SSEG 정보 [10]; / / 섭씨 가입
DispDigit [1] = SSEG [0]; / / 제로 자리
DispDigit [2] = SSEG [0]; / / 제로 자리
DispDigit [3] = SSEG [0]; / / 제로 자리
(용;
ADCON1 = 0b10001101; / / 맞아, Vref 정렬 : VCFG1 및 VCFG0 (1 VoltReference)
GODONE = 1; / / 채널 0에 전환을 시작
(GODONE) 동안 계속; / / 잠깐 만요 전환 완료
iValue = ADRESL가; / / 8 비트 LSB가 결과를 가져오기
iValue 는 = (ADRESH <<8); / / 2 비트 MSB가 결과를 가져오기
iCTemp = iValue;
_delay_ms (50);/ * 예제 2 * 가져오기 /GODONE = 1; / / 채널 0에 전환을 시작
(GODONE) 동안 계속; / / 잠깐 만요 전환 완료
iValue = ADRESL가; / / 8 비트 LSB가 결과를 가져오기
iValue 는 = (ADRESH <<8); / / 2 비트 MSB가 결과를 가져오기
iCTemp = iValue;
_delay_ms (50);/ * 예제 3 * 가져오기 /GODONE = 1; / / 채널 0에 전환을 시작
(GODONE) 동안 계속; / / 잠깐 만요 전환 완료
iValue = ADRESL가; / / 8 비트 LSB가 결과를 가져오기
iValue 는 = (ADRESH <<8); / / 2 비트 MSB가 결과를 가져오기
iCTemp = iValue;/ *은 평균 섭씨 값을 계산 * /
/ * (Value/5.12 ADC)를 / Vref, LM35DZ 절판 = 10mV / C 나 Vref = 2 볼트 *를 /CentTemp = (iCTemp/3.0) / 5.12;
/ * 이제 결과 * 디스플레이 /
SSEG_putnum (CentTemp);
_delay_ms (200);
)
)
/ * EOF : pictemp.c * /