哪个大哥能给我一个51单片机电子钟的程序,用DS1302和LCD1602,可以调整时间就可以了,不要温度,谢谢了

2024-11-08 14:15:21
推荐回答(1个)
回答1:

//1602通用型液晶受控51单片机头文件
//2011年8月25日,ly

#ifndef __1602LCD_H__
#define __1602LCD_H__
#define DAT P0 //定义数据端口
sbit LCD_E=P2^7; //信号使能位
sbit LCD_RW=P2^6; //读/写选择位
sbit LCD_RS=P2^5; //数据/命令选择位

void LCD_delay_() //短暂延时
{
int i;
for(i=0;i<300;i++);
}

void LCD_write_com(char com) //写命令
{
LCD_RS=0;
LCD_RW=0;
DAT=com;
LCD_delay_();
LCD_E=0;
LCD_delay_();
LCD_E=1;
}

char LCD_read_dat() //读数据
{
LCD_RS=1;
LCD_RW=1;
LCD_E=1;
DAT=0xff; //IO口置1,关闭输出,启动输入
LCD_delay_();
LCD_delay_();
LCD_delay_();
return DAT;
}

void LCD_write_dat(char dat) //写1字节
{
LCD_RS=1;
LCD_RW=0;
DAT=dat;
LCD_delay_();
LCD_E=0;
LCD_delay_();
LCD_E=1;
}

char LCD_read_char(bit r,char l)//读1字节
{
if(r)
{
LCD_write_com(0xc0+l-1);
return LCD_read_dat();
}
else
{
LCD_write_com(0x80+l-1);
return LCD_read_dat();
}
}

void LCD_write_char(bit r,char l,char dat)//指定位置写1字符
{
if(r)
{
LCD_write_com(0xc0+l-1);
LCD_write_dat(dat);
}
else
{
LCD_write_com(0x80+l-1);
LCD_write_dat(dat);
}
}

void LCD_write_str(bit r,char l,char *dat)//从指定位置写字符串
{
if(r)
{
LCD_write_com(0xc0+l-1);
LCD_write_dat(*dat);
while(*(++dat))
LCD_write_dat(*dat);
}
else
{
LCD_write_com(0x80+l-1);
LCD_write_dat(*dat);
while(*(++dat))
LCD_write_dat(*dat);
}
}

void LCD_init() //LCD初始化
{
LCD_delay_();
LCD_delay_();
LCD_delay_();
LCD_write_com(0x38); //设置16*2显示,5*7点阵,8位并行
LCD_write_com(0x01); //显示清零,地址指针清零
LCD_write_com(0x06); //读写1字符后地址指针加1,整屏显示不移动
LCD_write_com(0x0c); //设置开显示,不显示光标
}

#endif

//时钟芯片DS1302受控于51单片机头文件
//2011年9月11日,ly

#ifndef __DS1302_H__
#define __DS1302_H__
#define T_uint unsigned char
#define T_uchar unsigned char

T_uchar sec,min,hor,day,mon,year,week; //时间、日期变量定义
T_uchar code weekdays[][5]={"SUN.","MON.","TUE.","WED.","TUR.","FRI.","SAT."}; //星期缩写字符串

sbit T_CLK=P1^6; //信号时钟位
sbit T_IO=P3^5; //串行数据读写位
sbit T_RST=P1^7; //信号时钟复位位

void T_delay(T_uint i) //短暂延时
{
while(i--);
}

void T_write_byte(T_uchar dat) //写1字节
{
T_uchar i;
T_uchar temp=0x01;
T_RST=1;
T_delay(5);
for(i=0;i<8;i++)
{
if(dat&(temp< else T_IO=0;
T_delay(3);
T_CLK=0; //止升沿有效
T_CLK=1;
}
}

T_uchar T_read_byte(void) //读1字节
{
T_uchar i,temp=0x01,dat=0x00;
T_RST=1;
T_CLK=1;
for(i=0;i<8;i++)
{
T_CLK=1; //下降沿有效
T_CLK=0;
T_IO=1; //IO口置1,关闭输出,启动输入
T_delay(3);
if(T_IO)
dat|=(temp< }
return dat;
}

void T_write_char(T_uchar add,T_uchar dat) //按命令写1字节
{
T_RST=0;
T_CLK=0;
T_RST=1;
T_write_byte(add);
T_delay(5);
T_write_byte(dat);
T_CLK=1;
T_RST=0;
}

T_uchar T_read_char(T_uchar add) //按命令读1字节
{
T_uchar dat=0x00;
T_RST=0;
T_CLK=0;
T_RST=1;
T_write_byte(add);
T_delay(3);
dat=T_read_byte();
T_CLK=1;
T_RST=0;
return dat;
}

void T_clock_burst_write(T_uchar *clock_array)//突发模式写时钟,参数为时钟数据数组,数据格式为:秒、分、时、日、月、星期、年、控制字节(BCD码)
{
T_uchar i;
T_RST=0;
T_CLK=0;
T_RST=1;
T_write_byte(0xbe); //发送突发模式写时钟命令
for(i=0;i<8;i++)
T_write_byte(clock_array[i]); //发送8字节数据
}

T_uchar *T_clock_burst_read() //突发模式读时钟
{
T_uchar i;
T_uchar clock_array[8]; //定义数组存放时钟数据,其格式为:秒、分、时、日、月、星期、年、控制字节(BCD码)
T_RST=0;
T_CLK=0;
T_RST=1;
T_write_byte(0xbf); //发送突发模式读时钟命令
for(i=0;i<8;i++)
clock_array[i]=T_read_byte(); //接收8字节数据
return clock_array;
}

void T_RAM_burst_write(T_uchar *dat) //突发模式写RAM ,参数为31字节数据
{
T_uchar i;
T_RST=0;
T_CLK=0;
T_RST=1;
T_write_byte(0xfe); //发送突发模式写时钟命令
for(i=0;i<31;i++)
T_write_byte(*(dat+i)); //发送31字节数据
}

T_uchar *T_RAM_burst_read() //突发模式读RAM
{
T_uchar i;
T_uchar xdata dat[31]; //定义数组存放RAM数据
T_RST=0;
T_CLK=0;
T_RST=1;
T_write_byte(0xff);
for(i=0;i<31;i++)
dat[i]=T_read_byte(); //接收31字节数据
return dat;
}

void T_charge_mode_select(T_uchar m)
{
T_RST=0;
T_CLK=0;
T_RST=1;
T_write_byte(0x90);
switch(m)
{
case 0:T_write_byte(0xff);break; //充电禁止
case 1:T_write_byte(0xa3);break; //低电流充电
case 2:T_write_byte(0xa2);break; //中电流充电
case 3:T_write_byte(0xa1);break; //高电流充电
}
}

T_uchar bcdtochar(bit s,T_uchar bcd) //BCD码转ASCII码
{
if(s)
return 48+(bcd&0x0f);
else
return 48+((bcd&0x70)>>4);
}

void T_DS1302_init() //芯片初始化,写时间、日期数据
{
T_write_char(0x8e,0);
T_write_char(0x80,0x00); //写入秒
T_write_char(0x8e,0);
T_write_char(0x82,0x42); //写入分
T_write_char(0x8e,0);
T_write_char(0x84,0x19); //写入小时
T_write_char(0x8e,0);
T_write_char(0x86,0x11); //写入日
T_write_char(0x8e,0);
T_write_char(0x88,0x09); //写入月
T_write_char(0x8e,0);
T_write_char(0x8a,0x01); //写入星期
T_write_char(0x8e,0);
T_write_char(0x8c,0x11); //写入年
}

#endif

//ds18b20温度传感器受控51单片机头文件
//2011年9月15日,ly
#ifndef __DS18b20_H__
#define __DS18b20_H__
#include

#define MATCH_ROM 0x55
#define CONVERT_T 0x44
#define SKIP_ROM 0xcc
#define READ_SCRATCHPAD 0xbe
#define COPY_SCRATCHPAD 0x48

sbit D_DQ=P2^3;

void D_delay_15us(int t)
{
for(;t>0;t--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
_nop_();
_nop_();
}

bit D_RESET()
{
unsigned char res;
D_DQ=1;
D_DQ=0;
D_delay_15us(40);
D_DQ=1;
D_delay_15us(2);
res=D_DQ;
D_delay_15us(20);
D_DQ=1;
return res;
}

void D_write_bit(bit b)
{
D_DQ=0;
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
D_DQ=b;
D_delay_15us(3);
D_DQ=1;
}

bit D_read_bit()
{
unsigned char dat;
D_DQ=0;
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
D_DQ=1;
_nop_();
dat=D_DQ;
D_delay_15us(3);
D_DQ=1;
return dat;
}

void D_write_com(unsigned char com)
{
unsigned char i;
for(i=0;i<8;i++)
{
D_write_bit(com&(0x01< _nop_();_nop_();
}
}

unsigned char D_read_char()
{
unsigned char i,dat=0x00;
for(i=0;i<8;i++)
{
if(D_read_bit())dat|=(0x01< _nop_();_nop_();
}
return dat;
}

#endif