用单片机加DS1302做一个时间。要求带闹钟。用LCD1602显示、、、求大神。个人因为没时间写了。又有点赶。

2024-11-16 17:48:46
推荐回答(2个)
回答(1):

==================主程序=================
#include
#include "ds1302.h"
#include "LCD1602.h"
void change();
uchar times[9];
uchar date[9];
main()
{LCD_init();//LCD初始化
init_1302(time_1302);
gotoxy(1,1);
LCD_display("Time:");
gotoxy(1,2);
LCD_display("Date:");
times[8]='\0';//
date[8]='\0';
while(1)
{get_1302(time_1302);
change();
gotoxy(7,1);
LCD_display(times);
gotoxy(7,2);
LCD_display(date);
}
}
/*===========================
转 换 子 程 序
===========================*/
void change()
{
// 时 间 的 转 换
times[0]=time_1302[2]/10+'0';
times[1]=time_1302[2]%10+'0';
times[2]=':';
times[3]=time_1302[1]/10+'0';
times[4]=time_1302[1]%10+'0';
times[5]=':';
times[6]=time_1302[0]/10+'0';
times[7]=time_1302[0]%10+'0';
// 日 期 的 转 换
date[0]=time_1302[6]/10+'0';
date[1]=time_1302[6]%10+'0';
date[2]='-';
date[3]=time_1302[4]/10+'0';
date[4]=time_1302[4]%10+'0';
date[5]='-';
date[6]=time_1302[3]/10+'0';
date[7]=time_1302[3]%10+'0';
}

========================================
==============DS1302驱动程序=============
#define uchar unsigned char
uchar time_1302[7]={0x00,0x00,0x00,0x03,0x07,0x03,0x08};//设置时间初始值数组
// 秒 分 时 号 月份 星期 年

sbit T_IO=P1^0; //与硬件相关的连线 clk为DS1302的时钟信号线
sbit T_CLK=P1^1; //DAT为DS1302的I/O数据线
sbit T_RST=P1^2; //RST为DS1302的RST信号线
uchar bdata datbyte;
sbit datbyte0=datbyte^0;
sbit datbyte7=datbyte^7;
void get_1302(uchar time[]);
void write_ds1302(uchar dat);
uchar r_1302(uchar add);
void w_1302(uchar add,uchar dat);
uchar read_ds1302(void);
void init_1302(uchar *time);
/*==========================================
D S 1 3 0 2 初 始 化
===========================================*/
void init_1302(uchar *time)
{uchar i, add;
//uchar time_bcd[7];
add=0x80;//0写入,1读出
w_1302(0x8e,0x00);
for(i=0;i<7;i++)
{w_1302(add,*time);
add+=2;
time++;
}
w_1302(0x8e,0x80);
}
//===========================
// 读取当前时间
//===========================
void get_1302(uchar time[])
{uchar i;
uchar add=0x81;
w_1302(0x8e,0x00);
for(i=0;i<7;i++)
{
time[i]=r_1302(add);
add+=2;
}
w_1302(0x8e,0x80);
}
/*=================================
DS1302写入一个字节(上升沿有效)
=================================*/
void write_ds1302(uchar dat)
{uchar i;
datbyte=dat;
for(i=0;i<8;i++)
{T_IO=datbyte0;
T_CLK=1;
T_CLK=0;
datbyte=datbyte>>1;
}
}
/*=======================================
DS1302读取一个字节(下降沿有效)
=======================================*/
uchar read_ds1302(void)
{uchar i;

for(i=0;i<8;i++)
{datbyte=datbyte>>1;
datbyte7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(datbyte);
}
/*=========================================
指定位置读取数据
=========================================*/
uchar r_1302(uchar add)
{uchar temp,dat1,dat2;
T_RST=0;
T_CLK=0;
T_RST=1;
write_ds1302(add);
temp=read_ds1302();
T_CLK=1;
T_RST=0;
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return(temp);
}
/*==========================================
指定位置写入数据
==========================================*/
void w_1302(uchar add,uchar dat)
{
T_RST=0;
T_CLK=0;
T_RST=1;
write_ds1302(add);
write_ds1302(dat/10<<4|dat%10);
T_CLK=1;
T_RST=0;
}
===========================================
=============LCD1602驱动程序================
#define LCD_DB P0//定义LCD的数据端口
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_E=P2^2;
#define uchar unsigned char
#define uint unsigned int
//===========延时子函数========================
void delay_lcd(uint x)
{uint i,j;
for(i=x;i>0;i--)
for(j=0;j<2;j++);
}
//==================写指令函数=================
void LCD_write_command(uchar command)
{LCD_DB=command;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;
LCD_E=0;
delay_lcd(1);//等待执行完毕 。。。
}
//===================写数据函数=================
void LCD_write_data(uchar dat)
{LCD_DB=dat;
LCD_RS=1;//数据寄存器
LCD_RW=0;//写入数据
LCD_E=1;
LCD_E=0;
delay_lcd(1);//等待程序执行完毕 。。。
}
/*============显示一个字符子函数===============
void LCD_disp_char(uchar x,uchar y, uchar dat)
{ uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
===================================*/
//==========延时1====================
void delay1(uint x)
{uint i,j;
for(j=0;j for(i=0;i<100;i++);
}
//===========初始化函数=============
void LCD_init(void)
{LCD_write_command(0x38);//设置8位格式,2行,5*7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清屏显示
delay_lcd(200);
}
//==========光标定位=======================
void gotoxy(uchar x,uchar y)
{uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
}
//=========显示一个字符串==================
void LCD_display(uchar *dat)
{ while(*dat!='\0')
{LCD_write_data(*dat);
dat++;
}
}

回答(2):

到百度文库找找,有现成的。