网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月29日
漏签
0
天
单片机吧
关注:
211,868
贴子:
1,046,751
看贴
图片
吧主推荐
视频
游戏
25
回复贴,共
1
页
<<返回单片机吧
>0< 加载中...
经过几天的努力终于把ds1302的万年历写出来了
只看楼主
收藏
回复
改什么昵称好
中尉
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
视频来自:
百度贴吧
改什么昵称好
中尉
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
现在存在的问题是有备用电池的话,单片机复位时间会重新初始化,设置时间时时钟还在走。
2025-06-29 05:06:43
广告
改什么昵称好
中尉
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
大家有没有发现有点小问题?
改什么昵称好
中尉
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
走时还是蛮准的,这是我按这个手机设置时间的,单片机的设置时间快了一秒,运行5个小时了还是一样的。
咱俩玩一会儿呀
中校
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
挺好的,设置时间还在走的话,
你可以这样,再做一个设置的寄存器,确认后,从设置 写入1302就行了。
批羊皮的
列兵
2
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
楼主能给我们看下程序吗?
改什么昵称好
中尉
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
#include <intrins.h>
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint temp;
sbit DSPORT=P2^2; //ds18b20接口
sbit RS=P1^0;//串口时为CS
sbit RW=P1^1; //串口为SID
sbit E=P2^5;//串口为时钟SCLK
sbit RET=P1^4;//复位
sbit CE=P2^4;//ds1302接口
sbit SCLK=P2^1;
sbit PORT=P2^0;
sbit K1=P3^4; //按键定义
sbit K2=P3^5;
sbit K3=P3^6;
sbit K4=P3^7;
sbit PSB=P1^2;//串并选择
uchar num, K1num;
unsigned char code line_0[] = {" 北京时间 "};
//unsigned char code line_1[] = {"2018- 02- 11 Sun"};
unsigned char code line_2[] = {" 00: 00: 00 AM "};
unsigned char code line_3[] = {"当前温度: 30℃"};
/***********************************忙检测*******************************/
void RDBF(void)
{
uchar temp0;
RS=0;
RW=1;
while(1)
{
P0=0xFF;
E=1;
temp0=P0;
E=0;
if ((temp0&0x80)==0) break;
}
}
/*********************************写指令*********************************/
void Write_Command(uchar comm)
{
RDBF();
RS=0;
RW=0;
P0=comm;
E=1;
E=0;
}
/***************************写数据到数据寄存器****************************/
void Write_Data(uchar TEMP)
{
RDBF();
RS=1;
RW=0;
P0=TEMP;
E=1;
E=0;
}
/*************************初始化LCD-12864R*********************************/
void LCDInit(void)
{
// PSB=0; //串口
PSB=1; //并口
RET=1;
RET=0;
RET=1;
Write_Command(0x30);//基本指令集,8位并行,RE=1,可执行扩展功能
Write_Command(0x06);//启始点设定:光标右移
Write_Command(0x01);//清除显示DDRAM
Write_Command(0x0f);//D=1,整体显示ON C=1,游标ON B=1,游标闪烁ON
Write_Command(0x02);//地址归零
Write_Command(0x0c);//光标关闭
}
/*******************显示数组字符串(显示半宽字型16*8点阵)*********************/
void Display_String(uchar addr,uchar *string,uchar count)
{
uchar i;
Write_Command(addr); //设定DDRAM地址
for(i=0;i<count;)
{
Write_Data(string[i*2]); //前半角字符
Write_Data(string[i*2+1]);//后半角字符
i++;
}
}
/********写一字节 ******************/ //数据写入从最低位开始
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
if((temp&0x01)==1)
PORT=1;
else
PORT=0;
SCLK=1;
SCLK=0;
temp>>=1;
}
}
/********读一字节 ******************/ //读取从最低位开始,最先读取得先放在高位,向右移动
uchar read_byte()
{
uchar i,temp;
for(i=0;i<8;i++)
{
temp>>=1;
if(PORT==1)
temp|=0x80;
SCLK=1;
SCLK=0;
}
return temp;
}
void write(uchar addr,uchar dat)
{
CE=0;
SCLK=0;
CE=1;
write_byte(addr);
write_byte(dat);
SCLK=0;
CE=0;
}
uchar read( uchar addr)
{
uchar dat;
CE=0;
SCLK=0;
CE=1;
write_byte(addr);
dat=read_byte();
SCLK=1;
CE=0;
return dat;
}
uchar hex_change_bcd(uchar dat) //16进制数转BCD码 BCD码是10进制的
{
uchar i,j;
i=dat/10;j=dat%10;
dat=i*16+j;
return dat;
}
uchar bcd_change_hex(uchar dat) //BCD码转16进制
{
uchar i,j;
i=dat/16;j=dat%16;
dat=i*10+j;
return dat;
}
void Delay1ms(unsigned int y)
{
unsigned int x;
for(y;y>0;y--)
for(x=110;x>0;x--);
}
/*******************************************************************************
* 函数名 : Ds18b20Init
* 函数功能 : 初始化
* 输入 : 无
* 输出 : 初始化成功返回1,失败返回0
*******************************************************************************/
unsigned char Ds18b20Init()
{
unsigned int i;
DSPORT=0; //将总线拉低480us~960us
i=70;
while(i--);//延时642us
DSPORT=1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
i=0;
while(DSPORT) //等待DS18B20拉低总线
{
i++;
if(i>5000)//等待>5MS
return 0;//初始化失败
}
return 1;//初始化成功
}
/*******************************************************************************
* 函数名 : Ds18b20WriteByte
* 函数功能 : 向18B20写入一个字节
* 输入 : com
* 输出 : 无
*******************************************************************************/
void Ds18b20WriteByte(unsigned char dat)
{
unsigned int i,j;
for(j=0;j<8;j++)
{
DSPORT=0; //每写入一位数据之前先把总线拉低1us
i++;
DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
i=6;
while(i--); //延时68us,持续时间最少60us
DSPORT=1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
dat>>=1;
}
}
/*******************************************************************************
* 函数名 : Ds18b20ReadByte
* 函数功能 : 读取一个字节
* 输入 : com
* 输出 : 无
*******************************************************************************/
unsigned char Ds18b20ReadByte()
{
unsigned char byte,bi;
unsigned int i,j;
for(j=8;j>0;j--)
{
DSPORT=0;//先将总线拉低1us
i++;
DSPORT=1;//然后释放总线
i++;
i++;//延时6us等待数据稳定
bi=DSPORT; //读取数据,从最低位开始读取
//byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*
byte=(byte>>1)|(bi<<7);
i=4; //读取完之后等待48us再接着读取下一个数
while(i--);
}
return byte;
}
/*******************************************************************************
* 函数名 : Ds18b20ChangTemp
* 函数功能 : 让18b20开始转换温度
* 输入 : com
* 输出 : 无
*******************************************************************************/
void Ds18b20ChangTemp()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc); //跳过ROM操作命令
Ds18b20WriteByte(0x44); //温度转换命令
// Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
}
改什么昵称好
中尉
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
/*******************************************************************************
* 函数名 : Ds18b20ReadTempCom
* 函数功能 : 发送读取温度命令
* 输入 : com
* 输出 : 无
******************************************************************************/
void Ds18b20ReadTempCom()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc); //跳过ROM操作命令
Ds18b20WriteByte(0xbe); //发送读取温度命令
}
/*******************************************************************************
* 函数名 : Ds18b20ReadTemp
* 函数功能 : 读取温度
* 输入 : com
* 输出 : 无
*******************************************************************************/
int Ds18b20ReadTemp()
{
unsigned char tmh,tml;
Ds18b20ChangTemp(); //先写入转换命令
Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令
tml=Ds18b20ReadByte(); //读取温度值共16位,先读低字节
tmh=Ds18b20ReadByte(); //再读高字节
temp=tmh;
temp<<=8;
temp|=tml;
return temp;
}
void LcdDisplay(temp) //lcd显示
{
unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp;
if(temp< 0) //当温度值为负数
{
Write_Command(0x98+5); //第4行,第6列
Write_Data(0x2d); //显示负
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算由0.5,还是在小数点后面。
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
//写地址 80表示初始地址
Write_Data(0x30+datas[2]); //个位
Write_Data(0x2e); //显示 ‘.’
Write_Data(0x30+datas[3]); //显示小数点
}
else
{
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
Write_Command(0x98+5); //第4行,第6列 //写地址
Write_Data(0x30+datas[1]); //十位
Write_Data(0x30+datas[2]); //个位
Write_Data(0x2e); //显示 ‘.’
Write_Data(0x30+datas[3]); //显示小数点
}
}
void write_sfm(uchar add,uchar date) // 时分秒函数设置
{
uchar shi ,ge;
shi=date/10; // 取商
ge=date%10; //取余
Write_Command(0x88+add); //设置add位地址
Write_Data(0x30+shi); //设置十位地址
Write_Data(0x30+ge); //设置个位地址
}
void write_nyr(uchar add,uchar date)
{
uchar shi ,ge;
shi=date/10; // 取商
ge=date%10; //取余
Write_Command(0x90+add); //设置add位地址
Write_Data(0x30+shi); //设置十位地址
Write_Data(0x30+ge); //设置个位地址
}
void cssj()
{
write(0x8e,0x00);
write(0x80,0x00); //秒 hex_change_bcd(0x00)
write(0x82,0x00); //分hex_change_bcd(0x00)
write(0x84,0x00);//时hex_change_bcd(0x00)
write(0x86,0x01);//日
write(0x88,0x01);//月
write(0x8a,0x01); //星期
write(0x8c,0x18); //年hex_change_bcd(0x18)
write(0x8e,0x80);
}
/***********************************主函数**************************************/
void main(void)
{
uchar s,f,m,n,y,r,xq,sec,min, hour,year,month,date,day,a=0;
cssj();
LCDInit(); //lcd初始化
Display_String(0x80,line_0,8);
// Display_String(0x90,line_1,8);
Display_String(0x88,line_2,8);
Display_String(0x98,line_3,8);
while(1)
{
if(K1num==0)
{
Ds18b20ReadTemp();
LcdDisplay(temp);
}
if(K1num==0)
{
if((hour>=0)&&(hour<12)) // AM/PM显示
{
Write_Command(0x88+6);
Write_Data(0x20);
Write_Data(0x41);
Write_Data(0x4d);
}
else
{
Write_Command(0x88+6);
Write_Data(0x20);
Write_Data(0x50);
Write_Data(0x4d);
}
}
if(K1==0)
{
Delay1ms(5);
if(K1==0)
{ K1num++;
while(!K1); //判断按键是否按下
write(0x8e,0x00);
if(a==0)
{
sec=bcd_change_hex(read(0x81));
m=sec;
min=bcd_change_hex(read(0x83));
f=min;
hour= bcd_change_hex(read(0x85));
s=hour;
year=bcd_change_hex(read(0x8d));
n=year;
month=bcd_change_hex(read(0x89));
y=month;
date=bcd_change_hex(read(0x87));
r=date;
date= bcd_change_hex(read(0x87));
xq=day;
Write_Command(0x90);
Write_Data(0x30+2);
Write_Data(0x30);
Write_Command(0x90+2);
Write_Data(0x2d);
Write_Data(0x20);
Write_Command(0x90+4);
Write_Data(0x2d);
Write_Data(0x20);
year=bcd_change_hex(read(0x8d));
write_nyr(1,year);
month=bcd_change_hex(read(0x89));
write_nyr(3,month);
date=bcd_change_hex(read(0x87));
write_nyr(5,date);
Write_Command(0x90+6);
Write_Data(0x4d);
Write_Data(0x4f);
Write_Data(0x4e);
}
// write(0x80,0x80);
}
}
if(K1num==1) //按一下调节秒
{
a=1;
if(K2==0) //K2开关控制时分秒加
{
Delay1ms(5);//消抖
if(K2==0)
{
m++;
if(m==60)
m=0;
}
}
2025-06-29 05:00:43
广告
绿城诚成园
少校
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
材料哪里来的,自己买的吗?
啾啾啾咪唔
中士
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
LCD用的是串行还是并行啊?
啾啾啾咪唔
中士
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
群主能不能给我发一个工程文件呢
改什么昵称好
中尉
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
改什么昵称好
中尉
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示