本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
#include <reg52.h> //单片机的头文件
#include <intrins.h>
typedef unsigned char uint8; //宏定义整形变量
typedef unsigned int uint16;
sbit LDDUA=P2^6;
sbit LDWlE=P2^7;
sbit LCDRS=P3^5; //LCD1602液晶数据/命令选择
sbit LCDEN=P3^4; //LCD1602液晶使能信号脚
sbit Key1 =P3^6;
sbit Key2 =P3^7;
sbit Beep =P2^3; //定义蜂鸣器
sbit DS18B20_DQ=P2^2;
sbit DS1302_SCLK = P1^0; //DS1302时钟芯片的时钟脚
sbit DS1302_SDIO = P1^1; //DS1302时钟芯片的数据脚
sbit DS1302_RSET = P1^2; //DS1302实在芯片的复位脚
uint16 temp;
uint8 wendbai,wendshi,wendge,nuto;
uint8 count1,count1h,count2,count2h,count3,count3h,count4,count4h;count5;
uint8 count5h,count6,count6h,count,set1,set1h,set2,set2h,set3,set4,set5,set6;
/*=========================================================================
带参数的延时子函数
==========================================================================*/
void Delay_ms(uint16 mao)
{
uint16 a,b;
for(a=mao;a>0;a--)
for(b=120;b>0;b--);
}
/*=========================================================================
程序的主函数
==========================================================================*/
void Keypadtone(void)
{
uint8 num;
for(num=0; num<100; num++)
{
Beep= 0;
}
Delay_ms(100);
Beep=1;
}
/*=========================================================================
LCD1602液晶写指令子函数
==========================================================================*/
void LCD1602_WRITE_com(uint8 com)
{
LCDRS=0;
P0=com;
Delay_ms(5);
LCDEN=1;
Delay_ms(5);
LCDEN=0;
}
/*=========================================================================
LCD1602液晶写数据子函数
==========================================================================*/
void LCD1602_WRITE_data(uint8 date)
{
LCDRS=1;
P0=date;
Delay_ms(5);
LCDEN=1;
Delay_ms(5);
LCDEN=0;
}
/*=========================================================================
LCD1602液晶初始化子函数
==========================================================================*/
void LCD_1602_Inte(void)
{
LCD1602_WRITE_com(0x38);
Delay_ms(1);
LCD1602_WRITE_com(0x0c);
Delay_ms(1);
LCD1602_WRITE_com(0x06);
Delay_ms(1);
LCD1602_WRITE_com(0x01);
Delay_ms(1);
}
/*=========================================================================
LCD1602液晶实现写指令和写数据子函数
==========================================================================*/
void LCD1602_DS1302_WRITE_com_data(uint8 addr,uint8 date)
{
LCD1602_WRITE_com(addr);
Delay_ms(1);
LCD1602_WRITE_data(date);
}
/*=========================================================================
LCD1602液晶实现写指令和写数据子函数
==========================================================================*/
void DS1302_WRITE_byte(uint8 addr,uint8 date)
{
uint8 i = 0;
DS1302_RSET = 0;
DS1302_SCLK = 0;
DS1302_RSET = 1;
for(i=0; i<8; i++)
{
DS1302_SCLK = 0;
_nop_();
DS1302_SDIO =addr&0x01;
addr >>=1;
DS1302_SCLK=1;
_nop_();
}
for(i=0; i<8; i++)
{
DS1302_SCLK = 0;
_nop_();
DS1302_SDIO=date&0x01;
date >>=1;
DS1302_SCLK=1;
_nop_();
}
}
/*=========================================================================
LCD1602液晶实现写指令和写数据子函数
==========================================================================*/
uint8 Read_DS1302_byte(uint8 addr)
{
uint8 i = 0;
uint8 temp=0x00;
DS1302_RSET = 0;
DS1302_SDIO = 1;
DS1302_SCLK = 0;
DS1302_RSET = 1;
for(i=0; i<8; i++)
{
DS1302_SCLK = 0;
DS1302_SDIO=addr&0x01;
addr >>=1;
DS1302_SCLK = 1;
}
Delay_ms(1);
if(DS1302_SDIO)
temp |=0x80;
DS1302_SCLK = 0;
temp >>=1;
for(i=0; i<7; i++)
{
DS1302_SCLK = 0;
if(DS1302_SDIO)
temp |=0x80;
DS1302_SCLK = 1;
temp >>=1;
}
DS1302_SCLK = 1;
DS1302_RSET = 0;
DS1302_SDIO = 0;
return temp;
}
/*=========================================================================
DS1302时钟写寄存器初始化子函数
==========================================================================*/
void LCD_1602_DS1302_Inte(void)
{
// if((((set1=Read_DS1302_byte(0x81))>>7)&0x01)==1)
// {
DS1302_WRITE_byte(0x8e,0x00);
DS1302_WRITE_byte(0x80,0x00);
DS1302_WRITE_byte(0x82,0x47);
DS1302_WRITE_byte(0x84,0x04);
DS1302_WRITE_byte(0x86,0x18);
DS1302_WRITE_byte(0x88,0x12);
DS1302_WRITE_byte(0x8a,0x07);
DS1302_WRITE_byte(0x8c,0x11);
// DS1302_WRITE_byte(0x8e,0x80);
DS1302_WRITE_byte(0x8e,0x80);
// }
}
/*=========================================================================
DS1302时钟读寄存器秒,分,时,日,月,年,子函数
==========================================================================*/
void Display_DS1302_Book(void)
{
set1=Read_DS1302_byte(0x81);
count1=set1&0x0f;
count1h=set1>>4;
set2=Read_DS1302_byte(0x83);
count2=set2&0x0f;
count2h=set2>>4;
set3=Read_DS1302_byte(0x85);
count3=set3&0x0f;
count3h=set3>>4;
set4=Read_DS1302_byte(0x87);
count4=set4&0x0f;
count4h=set4>>4;
set5=Read_DS1302_byte(0x89);
count5=set5&0x0f;
count5h=set5>>4;
count=Read_DS1302_byte(0x8b);
count=count&0x0f;
set6=Read_DS1302_byte(0x8d);
count6=set6&0x0f;
count6h=set6>>4;
}
/*=========================================================================
DS1302时钟秒,分,时,日,月,年:写位置地址子函数
==========================================================================*/
void Display_DS1302_Look(void)
{
LCD1602_DS1302_WRITE_com_data(0x80+0x40+7,0x30+count1);
LCD1602_DS1302_WRITE_com_data(0x80+0x40+6,0x30+count1h);
LCD1602_DS1302_WRITE_com_data(0x80+0x40+5,':');
LCD1602_DS1302_WRITE_com_data(0x80+0x40+4,0x30+count2);
LCD1602_DS1302_WRITE_com_data(0x80+0x40+3,0x30+count2h);
LCD1602_DS1302_WRITE_com_data(0x80+0x40+2,':');
LCD1602_DS1302_WRITE_com_data(0x80+0x40+1,0x30+count3);
LCD1602_DS1302_WRITE_com_data(0x80+0x40+0,0x30+count3h);
LCD1602_DS1302_WRITE_com_data(0x80+3,0x30+count6);
LCD1602_DS1302_WRITE_com_data(0x80+2,0x30+count6h);
LCD1602_DS1302_WRITE_com_data(0x80+4,'-');
LCD1602_DS1302_WRITE_com_data(0x80+6,0x30+count5);
LCD1602_DS1302_WRITE_com_data(0x80+5,0x30+count5h);
LCD1602_DS1302_WRITE_com_data(0x80+7,'-');
LCD1602_DS1302_WRITE_com_data(0x80+9,0x30+count4);
LCD1602_DS1302_WRITE_com_data(0x80+8,0x30+count4h);
LCD1602_DS1302_WRITE_com_data(0x80+11,'W');
LCD1602_DS1302_WRITE_com_data(0x80+12,'e');
LCD1602_DS1302_WRITE_com_data(0x80+13,'e');
LCD1602_DS1302_WRITE_com_data(0x80+14,'k');
LCD1602_DS1302_WRITE_com_data(0x80+15,0x30+count);
}
/*=========================================================================
DS18B20精确延时微妙子函数
==========================================================================*/
void Delay_us(uint8 m)
{
while(--m);
}
/*=========================================================================
DS18B20复位操作时序 子函数
==========================================================================*/
void LCD1602_DS18B20_Inte(void)
{
DS18B20_DQ=1;
_nop_();
DS18B20_DQ=0;
Delay_us(250);
DS18B20_DQ=1;
Delay_us(200);
}
/*=========================================================================
DS18B20温度写操作子函数
==========================================================================*/
void LCD1602_WRITE_DS18B20(uint8 Byte)
{
uint8 i;
for(i=0; i<8; i++)
{
DS18B20_DQ=1;
_nop_();
DS18B20_DQ=0;
DS18B20_DQ=Byte&0x01;
Delay_us(1);
Byte >>=1;
Delay_us(20);
DS18B20_DQ=1;
Delay_us(1);
}
}
/*=========================================================================
DS18B20温度读操作子函数
==========================================================================*/
uint8 Read_LCD1602_DS18B20()
{
uint8 Byte;
uint8 i;
for(i=0; i<8; i++)
{
DS18B20_DQ=1;
_nop_();
DS18B20_DQ=0;
_nop_();
_nop_();
DS18B20_DQ=1;
Byte >>=1;
Delay_us(1);
if(DS18B20_DQ)
{
Byte |=0x80;
}
Delay_us(20);
}
return Byte;
}
/*=========================================================================
DS18B20启动温度转换子函数
==========================================================================*/
void LCD1602_Convert_DS18B20(void)
{
LCD1602_DS18B20_Inte();
LCD1602_WRITE_DS18B20(0xcc);
LCD1602_WRITE_DS18B20(0x44);
} |