基于51单片机的实时时间显示程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
case(6) :LcdWriteData('S');LcdWriteData('a');LcdWriteData('t');break;
_nop_();
}
RST = 0;
_nop_();//以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
/*******************************************************************************
for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],time[n]);
}
Ds1302Write(0x8E,0x80);//打开写保护功能
}
/*******************************************************************************
*输出: dat
*******************************************************************************/
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
_nop_();
}
RST = 0;//传送数据结束
_nop_();
}
/*******************************************************************************
*函数名: Ds1302Read
*函数功能:读取一个地址的数据
*输入: addr
sbit RST=P3^5;
sbit SCLK=P3^6;
sbit key0=P2^0;
sbit key1=P2^1;
sbit key2=P2^2;
sbit key3=P2^3;
sbit key4=P2^4;
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
LCD1602_E = 0;
}
void LcdInit()//LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
num1=0;
}
void main()
{
LcdInit();
Ds1302Init();
while(1)
{
keydown();
if(num1;
LcdDisplay();
}
}
}
/*******************************************************************************
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1);//等待数据稳定
LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);//保持时间
LCD1602_E = 0;
}
void LcdWriteData(uchar dat)//写入数据
#include<reg52.h>
#include<intrins.h>
#define LCD1602_4PINS
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
void Lcd1602_Delay1ms(uint c); //误差0us
LcdWriteData('0'+time[2]/16);//时
LcdWriteData('0'+(time[2]&0x0f));
LcdWriteData(':');
LcdWriteData('0'+time[1]/16);//分
LcdWriteData('0'+(time[1]&0x0f));
LcdWriteData(':');
void time_up();
void time_down();
//---加入全局变量--//
extern uchar time[7];//加入全局变量
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit DSIO=P3^4;
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/
void LcdWriteData(uchar dat);
/*LCD1602初始化子程序*/
void LcdInit();
void LcdDisplay();
void Ds1302Write(uchar addr, uchar dat);
void Lcd1602_Delay1ms(uint c) //误差0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
LcdWriteData('0'+time[0]/16);//秒
LcdWriteData('0'+(time[0]&0x0f));
LcdWriteCom(0x80);
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+time[6]/16);//年
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
uchar time[7] = {0, 0x30, 0x20, 0x18, 0x12, 0x04, 0x14},num,num1;
unsigned int adress;
case(3) :LcdWriteData('W');LcdWriteData('e');LcdWriteData('d');break;
case(4) :LcdWriteData('T');LcdWriteData('h');LcdWriteData('u');break;
case(5) :LcdWriteData('F');LcdWriteData('r');LcdWriteData('i');break;
LcdWriteData('0'+(time[6]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+time[4]/16);//月
LcdWriteData('0'+(time[4]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+time[3]/16);//日
for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
{
time[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}
void LcdWriteCom(uchar com)//写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0;//选择发送命令
{
LCD1602_E = 0;//使能清零
LCD1602_RS = 1;//选择输入数据
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
*函数名: LcdDisplay()
*函数功能:显示函数
*输入:无
*输出:无
*******************************************************************************/
void LcdDisplay()
{
LcdWriteCom(0x80+0X40);
/*******************************************************************************
*函数名: main
*函数功能:主函数
*输入:无
*输出:无
*******************************************************************************/
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1; //然后将RST(CE)置高电平。
_nop_();
for (n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
for (n=0; n<8; n++)//写入8位数据
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
LcdWriteData('0'+(time[3]&0x0f));
LcdWriteCom(0x8D);
switch(time[5]&0x0f)
{
case(1) :LcdWriteData('M');LcdWriteData('o');LcdWriteData('n');break;
case(2) :LcdWriteData('T');LcdWriteData('u');LcdWriteData('e');break;
*函数名: Ds1302Init
*函数功能:初始化DS1302.
*输入:无
*输出:无
*******************************************************************************/
void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00);//禁止写保护,就是关闭写保护功能
*函数名: Ds1302Readtime
*函数功能:读取时钟信息
*输入:无
*输出:无
*******************************************************************************/
void Ds1302Readtime()
{
uchar n;
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302Readtime();
void keydown();
void adress_up();
void adress_down();
void date_up();
void date_down();
相关文档
最新文档