S
sidartha
Guest
내가 sotware UART 및 8051C410위한 하드웨어 킷에는 UART .. 코드에 대한 노력
하드웨어 킷에는 UART 부착된 센서를 ..위한 PC 소프트웨어 킷에는 UART와 통신을위한하지만 그래도 괜찮 아요 킷에는 UART 하드웨어 소프트웨어 킷에는 UART 작동하지 않습니다 ..
내가 코드가 붙어있다면 누군가가 여기에 ... 좀 도와 주시면 좋겠 는데요[/ 코드]
/ / #에서 Pragma 대형
# 포함 <c8051f410.h>
# 포함 <stdio.h>
# 포함 <string.h>
# 포함 <stdlib.h>SYSCLK 24,500,000 정의 # / 8
전송 속도 정의 # 9600TIME_COUNT SYSCLK/9600/12 / / PCA와 정의 # 1 비트 시간이 계산됩니다.
정의 # TH_TIME_COUNT TIME_COUNT * 3 / 2 / / 3 / 2 비트 - 시간, PCA와 / SWUART//------------------------------------------------ ----------------------------------------------
sbit SW_TX = P2 ^ 6;
sbit SW_RX = P1과 ^ 0;비트 SM_BUSY;
비트 SRI는; / / SW_UART 받기 완료 표시기
비트 STI는; / / SW_UART 전송 완료 표시기
비트 STXBSY; / / SW_UART 텍사스 깃발 없음
비트 SREN; / / SW_UART RX 활성화
비트 SES는; / / SW_UART 사용자 - 레벨 인터럽트 지원
숯불 TDR; / / SW_UART 텍사스 데이터 등록
숯불 rdr; / / SW_UART RX 데이터 등록
//------------------------------------------------ ----------------------------------------------
/ / 함수 프로토 타입
//------------------------------------------------ ----------------------------------------------
무효 init_uart0 (무효);
무효 SYSCLK_Init (무효);
무효 PORT_Init (무효);
무효 enable_intr (무효);
무효 init_swuart (무효);
무효 WriteSwuart (숯불 * ptr);//------------------------------------------------ ----------------------------------------------
/ / 메인 루틴
//------------------------------------------------ ----------------------------------------------
메인 (무효) 무효 (
xdata 숯불 str [100];
int 전 = 0, n = 0;
PCA0MD & = ~ 0x40; / / = 0 (취소 워치독 타이머 WDTE
PCA0MD = 0x00;
PORT_Init (); / / 초기화 크로스바 가능 GPIO
SYSCLK_Init (); / / 초기화 시스템 클럭
init_uart0 ();
init_swuart ();
enable_intr ();
STI는 = 1;
(1) 동안
(
sprintf ( "안녕 % d 개 \ r에"n은 ); str
WriteSwuart (str);
)
)
//------------------------------------------------ ----------------------------------------------
무효 WriteSwuart (숯불 * ptr) (
전송 비트 = 1;
반면 () 전송 (
(STI는 경우) (
STI는 = 0;
TDR = * ptr;
(* ptr == 경우 '에 \ r') = 0 전송;
CCF1 = 1;
ptr ;
)
)
)
//------------------------------------------------ ----------------------------------------------
무효 SYSCLK_Init (무효)
(
OSCICN = 0x84;
)
//------------------------------------------------ ----------------------------------------------
무효 PORT_Init (무효)
(
P0SKIP = 0xCF;
XBR0 = 0x01; / / uart0, SPI는 선택된 SMBus는
XBR1 = 0x41; / / 크로스바 약한 풀다운 활성화 팝업
P1MDOUT | = 0xFF;
P2MDOUT | = 0xFF;
헤 = 0;
P0MDIN = ~ 0x08;
)
//------------------------------------------------ ----------------------------------------------
무효 init_uart0 (무효)
(
SCON0 = 0x10;
TH1 = - (SYSCLK/BAUDRATE/2);
CKCON & = ~ 0x0B;
CKCON | = 0x08;
TL1 = TH1;
TMOD & = ~ 0XF0;
TMOD | = 0x20;
TR1 = 1;
TI0 = 1;
)
//------------------------------------------------ ----------------------------------------------
무효 enable_intr (무효) (
SREN = 0; / / 비활성화 SW_UART 리시버
CR = 1; / / PCA와 카운터를 시작합니다.
EIE1 | = 0x10;
EIE1 | = 0x81; / / SPI는, SMBus는 인터럽트를 활성화
EIP1 | = 0x01;
EX0 = 1;
IT0 = 1;
ET2 = 1;
ES0 = 1;
EA 코리아 = 1;
)
//------------------------------------------------ ----------------------------------------------
무효 init_swuart (무효) (
PCA0CPM0 = 0x10; 부정적인 캡처 모드에서 / / Module0;
/ / 모듈을 사용할 수 인터럽트 0.
PCA0CPM1 = 0x48; / / 모듈 1 소프트웨어 타이머 모드에서;
/ / 모듈 비활성화 인터럽트.
PCA0CN = 0; / / 비활성화 PCA와 떠나
PCA0MD | = 0x00; / / PCA와 타임베이스 = SYSCLK / 4; PCA와 카운터
/ / 인터럽트 비활성화.
CCF0 = 0; / / 삭제 보류 PCA와 모듈 0
CCF1 = 0; / / 모듈 1을 캡처 / 비교 인터럽트.
SRI는 = 0; / / 수신 완료 플래그 지우기.
STI는 = 0; / / 지우기 전송 완료 플래그.
SW_TX = 1; / / 텍사스 라인을 처음 고등학교.
STXBSY = 0; / / 지우기 SW_UART 플래그 없음
PCA0CPM0 | = 0x01; / / () 인터럽트를 수신 모듈은 0을 활성화합니다.
PCA0CPM1 | = 0x01; / / () 인터럽트 전송 모듈 1을 활성화합니다.
)
//------------------------------------------------ ----------------------------------------------
/ / 소프트웨어 킷에는 UART ////////////////////////////////////////////// //////////////////
//------------------------------------------------ ----------------------------------------------
무효 PCA_ISR (무효) 11 인터럽트 (
정적 숯불 SUTXST = 0;
정적 숯불 SURXST = 0;
정적 서명 숯불 RXSHIFT;
서명 int PCA_TEMP;
(CCF0) 만약 (
CCF0 = 0;
(SURXST) 스위치 (
경우에는 0 :
만약 (SREN & ~ SW_RX) (
PCA_TEMP = (PCA0CPH0 ""8);
PCA_TEMP | = PCA0CPL0;
PCA_TEMP = TH_TIME_COUNT;
PCA0CPL0 = PCA_TEMP;
PCA0CPH0 = (PCA_TEMP ""8);
PCA0CPM0 = 0x49;
SURXST ;
)
휴식 시간;
사례 1 : 사례 2 : 사례 3 : 사례 4 : 사례 5 : 케이스 6 : 케이스 7 : 경우 8 :
RXSHIFT = RXSHIFT ""1;
(SW_RX 경우)
RXSHIFT | = 0x80으로;
PCA_TEMP = (PCA0CPH0 ""8);
PCA_TEMP | = PCA0CPL0;
PCA_TEMP = TIME_COUNT;
PCA0CPL0 = PCA_TEMP;
PCA0CPH0 = (PCA_TEMP ""8);
SURXST ;
휴식 시간;
사례 9 :
rdr = RXSHIFT;
SRI는 = 1;
PCA0CPM0 = 0x11;
SURXST = 0;
휴식 시간;
)
)
/ / 체크 전송 인터럽트; 서비스를하는 경우 CCF1 설정됩니다.
다른 경우 (CCF1) (
CCF1 = 0;
(SUTXST) 스위치 (
경우에는 0 :
SW_TX = 0;
PCA_TEMP = PCA0L;
PCA_TEMP | = (PCA0H ""8);
PCA_TEMP = TIME_COUNT;
PCA0CPL1 = PCA_TEMP;
PCA0CPH1 = (PCA_TEMP ""8);
PCA0CPM1 | = 0x48;
SUTXST ;
휴식 시간;
사례 1 : 사례 2 : 사례 3 : 사례 4 : 사례 5 : 케이스 6 : 케이스 7 : 경우 8 : 사건 9 :
SW_TX = (TDR & 0x01);
TDR ""= 1;
TDR | = 0x80으로;
PCA_TEMP = (PCA0CPH1 ""8);
PCA_TEMP | = PCA0CPL1;
PCA_TEMP = TIME_COUNT;
PCA0CPL1 = PCA_TEMP;
PCA0CPH1 = (PCA_TEMP ""8);
SUTXST ;
휴식 시간;
사례 10 :
STI는 = 1;
SUTXST = 0;
SW_TX = 1;
PCA0CPM1 = 0x01;STXBSY = 0;
휴식 시간;
)
)
)
하드웨어 킷에는 UART 부착된 센서를 ..위한 PC 소프트웨어 킷에는 UART와 통신을위한하지만 그래도 괜찮 아요 킷에는 UART 하드웨어 소프트웨어 킷에는 UART 작동하지 않습니다 ..
내가 코드가 붙어있다면 누군가가 여기에 ... 좀 도와 주시면 좋겠 는데요[/ 코드]
/ / #에서 Pragma 대형
# 포함 <c8051f410.h>
# 포함 <stdio.h>
# 포함 <string.h>
# 포함 <stdlib.h>SYSCLK 24,500,000 정의 # / 8
전송 속도 정의 # 9600TIME_COUNT SYSCLK/9600/12 / / PCA와 정의 # 1 비트 시간이 계산됩니다.
정의 # TH_TIME_COUNT TIME_COUNT * 3 / 2 / / 3 / 2 비트 - 시간, PCA와 / SWUART//------------------------------------------------ ----------------------------------------------
sbit SW_TX = P2 ^ 6;
sbit SW_RX = P1과 ^ 0;비트 SM_BUSY;
비트 SRI는; / / SW_UART 받기 완료 표시기
비트 STI는; / / SW_UART 전송 완료 표시기
비트 STXBSY; / / SW_UART 텍사스 깃발 없음
비트 SREN; / / SW_UART RX 활성화
비트 SES는; / / SW_UART 사용자 - 레벨 인터럽트 지원
숯불 TDR; / / SW_UART 텍사스 데이터 등록
숯불 rdr; / / SW_UART RX 데이터 등록
//------------------------------------------------ ----------------------------------------------
/ / 함수 프로토 타입
//------------------------------------------------ ----------------------------------------------
무효 init_uart0 (무효);
무효 SYSCLK_Init (무효);
무효 PORT_Init (무효);
무효 enable_intr (무효);
무효 init_swuart (무효);
무효 WriteSwuart (숯불 * ptr);//------------------------------------------------ ----------------------------------------------
/ / 메인 루틴
//------------------------------------------------ ----------------------------------------------
메인 (무효) 무효 (
xdata 숯불 str [100];
int 전 = 0, n = 0;
PCA0MD & = ~ 0x40; / / = 0 (취소 워치독 타이머 WDTE
PCA0MD = 0x00;
PORT_Init (); / / 초기화 크로스바 가능 GPIO
SYSCLK_Init (); / / 초기화 시스템 클럭
init_uart0 ();
init_swuart ();
enable_intr ();
STI는 = 1;
(1) 동안
(
sprintf ( "안녕 % d 개 \ r에"n은 ); str
WriteSwuart (str);
)
)
//------------------------------------------------ ----------------------------------------------
무효 WriteSwuart (숯불 * ptr) (
전송 비트 = 1;
반면 () 전송 (
(STI는 경우) (
STI는 = 0;
TDR = * ptr;
(* ptr == 경우 '에 \ r') = 0 전송;
CCF1 = 1;
ptr ;
)
)
)
//------------------------------------------------ ----------------------------------------------
무효 SYSCLK_Init (무효)
(
OSCICN = 0x84;
)
//------------------------------------------------ ----------------------------------------------
무효 PORT_Init (무효)
(
P0SKIP = 0xCF;
XBR0 = 0x01; / / uart0, SPI는 선택된 SMBus는
XBR1 = 0x41; / / 크로스바 약한 풀다운 활성화 팝업
P1MDOUT | = 0xFF;
P2MDOUT | = 0xFF;
헤 = 0;
P0MDIN = ~ 0x08;
)
//------------------------------------------------ ----------------------------------------------
무효 init_uart0 (무효)
(
SCON0 = 0x10;
TH1 = - (SYSCLK/BAUDRATE/2);
CKCON & = ~ 0x0B;
CKCON | = 0x08;
TL1 = TH1;
TMOD & = ~ 0XF0;
TMOD | = 0x20;
TR1 = 1;
TI0 = 1;
)
//------------------------------------------------ ----------------------------------------------
무효 enable_intr (무효) (
SREN = 0; / / 비활성화 SW_UART 리시버
CR = 1; / / PCA와 카운터를 시작합니다.
EIE1 | = 0x10;
EIE1 | = 0x81; / / SPI는, SMBus는 인터럽트를 활성화
EIP1 | = 0x01;
EX0 = 1;
IT0 = 1;
ET2 = 1;
ES0 = 1;
EA 코리아 = 1;
)
//------------------------------------------------ ----------------------------------------------
무효 init_swuart (무효) (
PCA0CPM0 = 0x10; 부정적인 캡처 모드에서 / / Module0;
/ / 모듈을 사용할 수 인터럽트 0.
PCA0CPM1 = 0x48; / / 모듈 1 소프트웨어 타이머 모드에서;
/ / 모듈 비활성화 인터럽트.
PCA0CN = 0; / / 비활성화 PCA와 떠나
PCA0MD | = 0x00; / / PCA와 타임베이스 = SYSCLK / 4; PCA와 카운터
/ / 인터럽트 비활성화.
CCF0 = 0; / / 삭제 보류 PCA와 모듈 0
CCF1 = 0; / / 모듈 1을 캡처 / 비교 인터럽트.
SRI는 = 0; / / 수신 완료 플래그 지우기.
STI는 = 0; / / 지우기 전송 완료 플래그.
SW_TX = 1; / / 텍사스 라인을 처음 고등학교.
STXBSY = 0; / / 지우기 SW_UART 플래그 없음
PCA0CPM0 | = 0x01; / / () 인터럽트를 수신 모듈은 0을 활성화합니다.
PCA0CPM1 | = 0x01; / / () 인터럽트 전송 모듈 1을 활성화합니다.
)
//------------------------------------------------ ----------------------------------------------
/ / 소프트웨어 킷에는 UART ////////////////////////////////////////////// //////////////////
//------------------------------------------------ ----------------------------------------------
무효 PCA_ISR (무효) 11 인터럽트 (
정적 숯불 SUTXST = 0;
정적 숯불 SURXST = 0;
정적 서명 숯불 RXSHIFT;
서명 int PCA_TEMP;
(CCF0) 만약 (
CCF0 = 0;
(SURXST) 스위치 (
경우에는 0 :
만약 (SREN & ~ SW_RX) (
PCA_TEMP = (PCA0CPH0 ""8);
PCA_TEMP | = PCA0CPL0;
PCA_TEMP = TH_TIME_COUNT;
PCA0CPL0 = PCA_TEMP;
PCA0CPH0 = (PCA_TEMP ""8);
PCA0CPM0 = 0x49;
SURXST ;
)
휴식 시간;
사례 1 : 사례 2 : 사례 3 : 사례 4 : 사례 5 : 케이스 6 : 케이스 7 : 경우 8 :
RXSHIFT = RXSHIFT ""1;
(SW_RX 경우)
RXSHIFT | = 0x80으로;
PCA_TEMP = (PCA0CPH0 ""8);
PCA_TEMP | = PCA0CPL0;
PCA_TEMP = TIME_COUNT;
PCA0CPL0 = PCA_TEMP;
PCA0CPH0 = (PCA_TEMP ""8);
SURXST ;
휴식 시간;
사례 9 :
rdr = RXSHIFT;
SRI는 = 1;
PCA0CPM0 = 0x11;
SURXST = 0;
휴식 시간;
)
)
/ / 체크 전송 인터럽트; 서비스를하는 경우 CCF1 설정됩니다.
다른 경우 (CCF1) (
CCF1 = 0;
(SUTXST) 스위치 (
경우에는 0 :
SW_TX = 0;
PCA_TEMP = PCA0L;
PCA_TEMP | = (PCA0H ""8);
PCA_TEMP = TIME_COUNT;
PCA0CPL1 = PCA_TEMP;
PCA0CPH1 = (PCA_TEMP ""8);
PCA0CPM1 | = 0x48;
SUTXST ;
휴식 시간;
사례 1 : 사례 2 : 사례 3 : 사례 4 : 사례 5 : 케이스 6 : 케이스 7 : 경우 8 : 사건 9 :
SW_TX = (TDR & 0x01);
TDR ""= 1;
TDR | = 0x80으로;
PCA_TEMP = (PCA0CPH1 ""8);
PCA_TEMP | = PCA0CPL1;
PCA_TEMP = TIME_COUNT;
PCA0CPL1 = PCA_TEMP;
PCA0CPH1 = (PCA_TEMP ""8);
SUTXST ;
휴식 시간;
사례 10 :
STI는 = 1;
SUTXST = 0;
SW_TX = 1;
PCA0CPM1 = 0x01;STXBSY = 0;
휴식 시간;
)
)
)