현재 위치 - 주공해몽공식사이트 - 랜덤 번호 뽑기 점술 - S7-200 및 LED 디지털 튜브 4 개를 사용하여 시간과 분을 표시하는 회로 및 제어 프로그램을 설계했습니다.

S7-200 및 LED 디지털 튜브 4 개를 사용하여 시간과 분을 표시하는 회로 및 제어 프로그램을 설계했습니다.

# include & ltreg52.h & gt// 헤더 파일 포함, 일반적으로 변경할 필요가 없습니다. 헤더 파일에는 특수 기능 레지스터의 정의가 포함되어 있습니다.

# include & ltintrins.h & gt

Sbit sck = P3 6; //시계

Sbit sda = P3 4; //데이터

Sbit rst = p3^5;; // DS 1302 리셋

Sbit ls138a = p2 2;

Sbit ls138b = p2 3;

Sbit ls138c = p2 4;

비트 ReadRTC _ Flag// 정의읽기 DS 1302 플래그.

부호 없는 문자 l _ tmpdate [7]; //= {0,0,13,15,5,3,8}; //태양과 달의 분초 기념일 08-05- 15 12:00:00

부호 없는 문자 l _ tmpdisplay [8];

Code unsigned charwrite _ RTC _ address [7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //일월년의 최소 읽기 및 쓰기 비트 (초).

Code unsigned char read _ RTC _ address [7] = {0x8b97531,0x83,0x85,0x87,0x89,0x8b

코드 부호 없는 char table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40};

//* * * 디지털 튜브 0-9 '-' 꺼짐' 표

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

/* 함수 선언 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Void Write_Ds 1302_byte (부호 없는 chartemp);

Void Write_Ds 1302 (부호 없는 문자 주소, 부호 없는 문자 dat);

부호 없는 문자 Read_Ds 1302 (부호 없는 문자 주소);

Void read _ RTC (void); //RTC 읽기

Voidset _ RTC (void); //RTC 설정

Void init timer 0 (void) : //초기 타이머 0

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

/* 주 함수 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

잘못된 탐색기 (잘못된 탐색기)

{

Inittimer0 (); //초기화 타이머 0

Set _ RTC (); //클럭 값을 기록합니다. 백업 배터리를 사용하면 전원을 켤 때마다 쓸 필요가 없습니다. 이 절차는 차폐되어야 한다.

While( 1)

{

If (readrtc _ flag)//readrtc _ flag = =1다음 명령문을 실행합니다.

{

Readrtc _ flag = 0;

Read _ RTC ();

L _ tmpdisplay [0] = l _ tmpdate [2]/16; //데이터 변환. 디지털 튜브 0~9 의 디스플레이로 데이터를 구분하기 때문입니다.

L _ tmpdisplay [1] = l _ tmpdate [2] & 0x0f

L _ tmpdisplay [2] =10; //추가 "-"

L _ tmpdisplay [3] = l _ tmpdate [1]/16;

L _ tmpdisplay [4] = l _ tmpdate [1] & 0x0f

L _ tmpdisplay [5] =10;

L _ tmpdisplay [6] = l _ tmpdate [0]/16;

L _ tmpdisplay [7] = l _ tmpdate [0] & 0x0f

}

}

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

/* 타이머 0 초기화 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Void InitTIMER0(void)

{

Tmod | = 0x01; //타이머 설정 16 비트

TH0 = 0xef// 초기화 값

TL0 = 0xf0

Et0 =1;

Tr0 =1;

Ea =1;

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

/* 1 바이트 쓰기 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Void Write_Ds 1302_Byte (부호 없는 문자 온도)

{

부호 없는 문자 I;

For(I = 0;; 나<8; I++)// 순환 8 회 쓰기 데이터.

{

SCK = 0;;

Sda = temp & amp0x01; //전송당 낮은 바이트 수

Temp & gt& gt= 1; //한 위치 오른쪽으로 이동

Sck =1;

}

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

/* ds1302 에 쓰기 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Void Write_Ds 1302 (부호 없는 문자 주소, 부호 없는 문자 데이터)

{

RST = 0;;

_ nop _ ();

SCK = 0;;

_ nop _ ();

Rst =1;

_ nop _ (); //시작

Write_Ds 1302_Byte (주소); //송신 주소

Write _ ds1302 _ byte (dat); //데이터 보내기

RST = 0;; //이력서

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

/* DS 1302 데이터 읽기 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

부호 없는 문자 Read_Ds 1302 (부호 없는 문자 주소)

{

부호 없는 문자 I, temp = 0x00

RST = 0;;

_ nop _ ();

_ nop _ ();

SCK = 0;;

_ nop _ ();

_ nop _ ();

Rst =1;

_ nop _ ();

_ nop _ ();

Write_Ds 1302_Byte (주소);

For(I = 0;; 나<8; I++)// 데이터 읽기 8 회.

{

중간 주파수 (SDA)

Temp | = 0x80// 전송당 낮은 바이트 수

SCK = 0;;

Temp & gt& gt= 1; //한 위치 오른쪽으로 이동

_ nop _ ();

_ nop _ ();

_ nop _ ();

Sck =1;

}

RST = 0;;

_ nop _ (); //다음은 DS 1302 재설정 생성 시간입니다.

_ nop _ ();

RST = 0;;

SCK = 0;;

_ nop _ ();

_ nop _ ();

_ nop _ ();

_ nop _ ();

Sck =1;

_ nop _ ();

_ nop _ ();

SDA = 0;;

_ nop _ ();

_ nop _ ();

Sda =1;

_ nop _ ();

_ nop _ ();

반환 (임시); //돌아가기

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

/* 클럭 데이터 읽기 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Void Read _ RTC(void)// 달력 읽기

{

부호 없는 문자 I, * p;;

P = read _ RTC _ 주소 : //주소 전달

For(I = 0;; 나<7; I++)// 분 7 회 읽기 초 분 일월 기념일

{

L _ tmpdate [I] = read _ ds1302 (* p); //주소 Read_Ds 1302 에 l_tmpdate[i] 의 번호를 기록합니다.

P++;+;

}

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

/* 클럭 데이터 설정 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Void Set _ RTC(void)// 달력 설정.

{

부호 없는 char I, *p, tmp

For(I = 0;; 나<7; I++){ //BCD 처리

Tmp = l _ tmpdate [I]/10;

L _ tmpdate [I] = l _ tmpdate [I]%10;

L _ tmpdate [I] = l _ tmpdate [I]+tmp *16;

}

Write_Ds 1302(0x8E, 0x00);

P = 쓰기 _ RTC _ 주소; //주소

For(I = 0;; 나<7; I++)// 초 7 회, 일월 기념일.

{

Write_Ds 1302(*p, l _ tmpdate [I]);

P++;+;

}

Write_Ds 1302(0x8E, 0x80);

}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

/* 타이머 인터럽트 기능 */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Void tim(void) 인터럽트 1 사용 1

//인터럽트, 디지털 튜브 스캔용.

{

정적 부호 없는 문자 I, num

TH0 = 0xf5

TL0 = 0xe0

P0 = 테이블 [l _ tmpdisplay [I]; //테이블 찾기 방법은 표시할 숫자의 숫자 필드를 가져옵니다.

스위치 (1)

{

사례 0: ls138 a = 0; Ls138 b = 0; Ls138 c = 0; 깨뜨리다

사례1:ls138a =1; Ls138 b = 0; Ls138 c = 0; 깨뜨리다

사례 2: ls138 a = 0; Ls138b =1; Ls138 c = 0; 깨뜨리다

사례 3: ls138a =1; Ls138b =1; Ls138 c = 0; 깨뜨리다

사례 4: ls138 a = 0; Ls138 b = 0; Ls138c =1; 깨뜨리다

사례 5: ls138a =1; Ls138 b = 0; Ls138c =1; 깨뜨리다

사례 6: ls138 a = 0; Ls138b =1; Ls138c =1; 깨뜨리다

사례 7: ls138a =1; Ls138b =1; Ls138c =1; 깨뜨리다

}

I++;+;

다음 경우 (i==8)

{

I = 0;;

Num++;+;

If( 10==num) // 정기적으로 1302 의 데이터를 읽습니다. 시간 간격은 조정할 수 있습니다

{

Readrtc _ flag =1; //로고 비트를 사용하여 판단하다

Num = 0;;

}

}

}

이것은 DS 1302 디스플레이 시간의 C 프로그램입니다. 잘 보세요.