at89c52 마이크로컨트롤러를 사용하고 현재 시간과 온도 프로그래밍을 표시하기 위해 1602 LCD를 사용해야 하는 C 언어 프로그램을 작성할 수 있습니까?
#include?
#include?
#include?"LCD1602.h"
#include?"DS1302.h"
sbit?DQ=P3^0;//ds18b20?Port
unsigned?int?ReadTemperature(void);
bit?Init_DS18B20(void);
unsigned?char?ReadOneChar(void);
void?WriteOneChar(unsigned?char?dat);
void?DelayUs2x(unsigned?char);
void?Delay1ms(unsigned?int);
/*--------------- -------------------
이름: 18B20 온도 센서
웹사이트: www.doflye.net
작성자: shifang
날짜: 2009.5년
수정: 없음
내용: 18B20 싱글 라인 온도 감지 응용 샘플 프로그램
------------------------- --- --------*/
/*------------- -- -----
18b20 초기화
--------------- - ----------------------*/
bit?Init_DS18B20(void) p>
{ bit?dat=0; DQ?=?1;//DQ는 DelayUs2x(5)를 재설정합니다.?//약간의 DQ 지연?=?0;?//마이크로컨트롤러는 DQ를 낮게 설정합니다. DelayUs2x ( 200);?//정확한 지연? 480us보다 큼? DelayUs2x(200);//높은 버스를 가져옵니다. DelayUs2x(50)?//15~60us?수신 60 -240us 존재 펄스 dat=DQ;//x=0이면 초기화 성공,?x=1이면 초기화 실패 DelayUs2x(25);?//약간 지연된 상태로 반환 return?dat;
}
void?DelayUs2x(unsigned?char?t)
{? while(--t);
}
/*- -------------------------------- --
바이트 읽기
------------------ -- --------------*/
unsigned?char?ReadOneChar(void)
{
unsigned? char? i=0;
unsigned?char?dat?=?0;
for?(i=8;i>0;i--) {
DQ?=?0;?//?펄스 신호 제공
dat>>=1;
DQ?=?1;?//?펄스 신호 제공< /p >
if(DQ) dat|=0x8
0;
DelayUs2x(25); } return(dat);
}
/*------------ ---------------------
바이트 쓰기
-------------------------------------- --*/
void?WriteOneChar(unsigned?char?dat)
{ unsigned?char?i=0; for?(i=8;?i>0;? i--) {
DQ?=?0;
DQ?=?dat&0x01;
DelayUs2x(25);
DQ?=?1;
dat>>=1; }
DelayUs2x(25);
}
/*- ---------------------
온도 읽기
------------------------- -------- ------------*/
unsigned?int?ReadTemperature(void)
{
unsigned?char?a= 0;
unsigned?int?b=0;
unsigned?int?t=0;
Init_DS18B20() ;
WriteOneChar(0xCC);?//?일련번호 및 열번호 읽기 작업 건너뛰기
WriteOneChar(0x44);?//?온도 변환 시작
p>
Delay1ms(10);
p>Init_DS18B20();
WriteOneChar(0xCC);?//일련번호 읽기 작업을 건너뛰시겠습니까?
WriteOneChar(0xBE);?//온도 레지스터 읽기 등(***9개 읽기 가능한 레지스터)? 처음 두 개는 온도입니다.
a=ReadOneChar();?//낮은 비트
b=ReadOneChar();? //높은 비트
b<<=8;
t=a+b;
return(t);
}
void?Delay1ms(unsigned?int?count)
{
unsigned?int? i,j;
for(i= 0;i for(j=0;j<120;j++); } main() { SYSTEMTIME?CurrentTime; int?temp; float? 온도; unsigned?char?dist[ 4]; LCD_Initial(); 초기_DS1302(); Init_DS18B20() ; GotoXY(14,0); Print("."); GotoXY(15,1); Print("C"); while (1) { DS1302_GetTime(&CurrentTime); TimeToStr( &CurrentTime); DateToStr(&CurrentTime); GotoXY(0,0);Print("20"); GotoXY(2,0); Print(CurrentTime.DateString); GotoXY(0,1); Print(CurrentTime.TimeString); 임시 =ReadTemperature(); 온도=(float)temp*0.0625; sprintf(dist,"%4f",온도); GotoXY(9 ,1); 인쇄(거리); 지연1ms(400); } }