# 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 프로그램입니다. 잘 보세요.