main.c
#include<reg52.h>
#include<onewire.h>
#include<LCD.h>
#include<ds1302.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Write_addr [] ={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写地址
uchar code Read_addr [] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读地址
uchar Time [7] = {0x50,0x59,0x23,0x07,0x06,0x02,0x22};//初始值设置
// 秒 分 时 日 月 星期 年
//-----------------------------------变量区---------------------------------
uint Temp;//温度变量
//-----------------------------------函数区---------------------------------
void Int_DS1302()
{
uchar i;
Write_Ds1302_Byte( 0x8e,0x00 );
for(i = 0;i < 8;i++)
{
Write_Ds1302_Byte( Write_addr [i],Time [i] );
}
Write_Ds1302_Byte( 0x8e,0x80 );
}
void Read_DS1302_Time()
{
uchar i;
for(i = 0;i<8;i++)
{
Time [i] = Read_Ds1302_Byte( Read_addr [i] );
}
}
void Display_Time()
{
LCD_ShowNum(2,15,Time [0]%16,1);
LCD_ShowNum(2,14,Time [0]/16,1);
LCD_ShowChar(2 ,13,':');
LCD_ShowNum(2,12,Time [1]%16,1);
LCD_ShowNum(2,11,Time [1]/16,1);
LCD_ShowChar(2 ,10,':');
LCD_ShowNum(2,9,Time [2]%16,1);
LCD_ShowNum(2,8,Time [2]/16,1);
LCD_ShowChar(2 ,7,'-');
LCD_ShowNum(2,6,Time [3]%16,1);
LCD_ShowNum(2,5,Time [3]/16,1);
LCD_ShowChar(2 ,4,'-');
LCD_ShowNum(2,3,Time [4]%16,1);
LCD_ShowNum(2,2,Time [4]/16,1);
}
void main()
{
Int_DS1302();
LCD_initial();
while(1)
{
Read_DS1302_Time();
Temp = Read_Temp();
string(0x82,"Temp");
LCD_ShowChar(1 ,7,':');
LCD_ShowChar(1 ,11,'C');
LCD_ShowNum(1,8,Temp,3);//第一行直接显示温度占四个单元格
//---------------------------------显示时间----------------------------------------
Display_Time();
}
}
onewire.c
#include "reg52.h"
#include<LCD.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P3^3; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
while(t--);
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(12);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
uint Read_Temp()
{
uint high,low,Date_T;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(225);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low = Read_DS18B20();
high = Read_DS18B20();
Date_T = high<<8;
Date_T = Date_T+low;
Date_T = Date_T * 0.0625+0.5;//
return Date_T;
}
onewire.h
#ifndef __ONEWIRE_H #define __ONEWIRE_H #define uchar unsigned char #define uint unsigned int unsigned char rd_temperature(void); //; ; unsigned char Read_DS18B20(void); void Write_DS18B20(unsigned char dat); bit init_ds18b20(void); uchar Read_Temp(void); #endif
LCD.c
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P2
sbit rs = P1^5;
sbit rw = P1^4;
sbit e = P1^3;
void delay(uint j)
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
void check_busy(void)
{
uchar dt;
do
{
dt=0xff;
e=0;
rs=0;
rw=1;
e=1;
dt=out;
}while(dt&0x80);
e=0;
}
void write_command(uchar com)//写命令
{
check_busy();
e=0;
rs=0;
rw=0;
out=com;
e=1;
_nop_();
e=0;
delay(1);
}
void write_data(uchar dat)//写数据
{
check_busy();
e=0;
rs=1;
rw=0;
out=dat;
e=1;
_nop_();
e=0;
delay(1);
}
void LCD_initial(void)//初始化
{
delay(2);
write_command(0x38);
delay(1);
write_command(0x38);
write_command(0x08);
write_command(0x01);
write_command(0x06);
write_command(0x0c);
//delay(1);
}
void string(uchar ad,uchar *s)//显示字符
{
write_command(ad);
while(*s>0)
{
write_data(*s++);
delay(100);
}
}
int LCD_Pow(uint x,uint y)//
{
unsigned char i = 0;
int result = 1;
for(i=0;i<y;i++)
{
result *= x;
}
return result;
}
void LCD_SetCursor(uchar Line,uchar Columu)//行选择
{
if(Line == 1)
{
write_command(0x80|(Columu-1));
}
else
{
write_command(0x80|( Columu-1)+0x40);
}
}
// 行 格 数字 长度
void LCD_ShowNum(uchar Line,uchar Columu,uint Num,uint Length)//显示数字
{
uint i = 0;
LCD_SetCursor(Line,Columu);
for(i=Length;i>0;i--)
{
write_data('0'+Num/LCD_Pow(10,i-1)%10);
}
}
void LCD_ShowChar(unsigned char Line , unsigned char Columu , unsigned char Char)//写一个字符
{
LCD_SetCursor(Line,Columu);
write_data(Char);
}
LCD.h
#ifndef __LCD_H__
#define __LCD_H__
#define uchar unsigned char
#define uint unsigned int
void check_busy(void);
void write_command(unsigned char com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
void LCD_ShowNum(uchar Line,uchar Columu,uint Num,uint Length);//显示数字
void LCD_SetCursor(uchar Line,uchar Columu);
int LCD_Pow(uchar x,uchar y);
void LCD_ShowChar(unsigned char Line , unsigned char Columu , unsigned char Char);//写一个字符
#endif
ds1302.c
#include <reg52.h>
#include <intrins.h>
sbit SCK = P3^1;
sbit SDA = P3^2;
sbit RST = P3^0; // DS1302复位
#define uchar unsigned char
#define uint unsigned int
//uchar code Write_addr [] ={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写地址
//uchar code Read_addr [] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读地址
//uchar Time [7] = {0x50,0x59,0x23,0x00,0x00,0x00,0x00};//初始值设置
秒 分 时 日 月 星期 年
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
ds1302.h
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif
仿真图