液晶显示AT89C52单片机DS1302实时时钟程序

发布者:游走人间最新更新时间:2017-09-02 来源: elecfans关键字:液晶显示  AT89C52  DS1302  实时时钟 手机看文章 扫描二维码
随时随地手机看文章

#include'reg52.h'        //包含单片机寄存器的头文件

#include'intrins.h'       //包含_nop_()的头文件

sbit RS=P2^0;            //LCD读写选择位

sbit RW=P2^1;    //LCD读写选择位

sbit E=P2^2;  //LCD使能端

sbit BF=P0^7;        //忙信号

sbit SCLK=P1^0;    //1302时钟输出端

sbit DATA=P1^1;    //1302数据端

sbit RST=P1^2;    //1302复位端

unsigned char code digit[]="0123456789";

void delay1ms(unsigned int n)      

{

unsigned char i;

while(n--)

  for(i=0;i<115;i++);

}

void Write1302(unsigned char dat)

{

unsigned char i;

SCLK=0;       //确保写数据前SCLK为低电平

_nop_();

_nop_(); //给硬件反应时间

for(i=0;i<8;i++){

  DATA=dat&0x01; //取数据的最低位  低位在前,高位在后

  _nop_();

  _nop_();  //给硬件反应时间

  SCLK=1;  //正跳变写数据

  _nop_();

  _nop_();  //给硬件反应时间

  SCLK=0;  //重新拉低SCLK,形成脉冲

  dat>>=1;   //dat右移,为写入下位数据做准备

}

}

void WriteSet1302(unsigned char cmd, unsigned char dat)

{

  RST=0;          //禁止数据传输   .!!!这条很重要

  SCLK=0;      //确保写数据前SCLK为低电平

  RST=1;  //开启数据传输        

  _nop_();

  _nop_();

  Write1302(cmd);

  Write1302(dat);

  SCLK=1;   // 将时钟电平置于高电平状态 ,处于已知状态

  RST=0;

}

unsigned char Read1302()

{

unsigned char i,dat=0;

for(i=0;i<8;i++){

  dat>>=1;

  if(DATA==1)  //如果读出的数据是1

   dat|=0x80;   //将1取出,写在dat的最高位

  SCLK=1;      //将SCLK置于高电平,为下降沿读出

  _nop_();

  _nop_();

  SCLK=0;   //拉低SCLK,形成脉冲下降沿

}

return dat;

}

unsigned char ReadSet1302(unsigned char cmd)

{

unsigned char dat;

    RST=0;    //这条很重要

SCLK=0;   //确保写数居前SCLK被拉低

RST=1;    //启动数据传输

_nop_();

_nop_();

Write1302(cmd);  //写入命令字

dat=Read1302();   //读出数据

SCLK=1;     //将时钟电平置于已知状态

RST=0;      //禁止数据传递

return dat;    //将读出的数据返回

}

void DS1302_Int()

{

WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令

    WriteSet1302(0x80,((55/10)<<4|(55)));   //根据写秒寄存器命令字,写入秒的初始值

WriteSet1302(0x82,((59/10)<<4|(59)));   //根据写分寄存器命令字,写入分的初始值

WriteSet1302(0x84,((23/10)<<4|(23))); //根据写小时寄存器命令字,写入小时的初始值

WriteSet1302(0x86,((18/10)<<4|(18))); //根据写日寄存器命令字,写入日的初始值

WriteSet1302(0x88,((6/10)<<4|(6))); //根据写月寄存器命令字,写入月的初始值

WriteSet1302(0x8c,((9/10)<<4|(9)));   //根据写年寄存器命令字,写入年的初始值

WriteSet1302(0x90,0xa5);                //打开充电功能 选择2K电阻充电方式

WriteSet1302(0x8E,0x80);              //根据写状态寄存器命令字,写入保护指令

}

bit BusyTest()

{

bit result;

RS=0;   //根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1;

_nop_();

_nop_();

result=BF;     //将忙碌标志电平赋给result

E=0;     //将E恢复低电平

_nop_();

_nop_();

return result;

void WriteInstruction(unsigned char dictate)

{

while(BusyTest()==1);     //如果忙就等待

RS=0;      //根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0;       //E置低电平(写指令时,E为高脉冲,

                           // 就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_();

P0=dictate;

_nop_();

_nop_();

_nop_();

_nop_();

E=1;     //E置高电平

_nop_();

_nop_();

_nop_();

_nop_();

E=0;       //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

void WriteAddress(unsigned char x)

{

     WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"

}

void WriteData(unsigned char dat)

{

while(BusyTest()==1);    //如果忙就等待

RS=1;        //RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0;        //E置低电平(写指令时,E为高脉冲,

                     // 就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_();

P0=dat;     //将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_();

E=1;       //E置高电平

_nop_();

_nop_();

_nop_();

_nop_();

E=0;   //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

void LCD_Int()

{

delay1ms(15);      //延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38);     //显示模式设置:16×2显示,5×7点阵,8位数据接口

delay1ms(5);

WriteInstruction(0x38);

delay1ms(5);

WriteInstruction(0x38);

delay1ms(5);     //连续三次,确保初始化成功

WriteInstruction(0x0c);  //显示模式设置:显示开,无光标,光标不闪烁

delay1ms(5);

WriteInstruction(0x06);    //显示模式设置:光标右移,字符不移

delay1ms(5);

WriteInstruction(0x01);     //清屏幕指令,将以前的显示内容清除

delay1ms(5);

}

void DisplaySecond(unsigned char x)

unsigned char i,j;   //i,j分别储存十位和个位

    i=x/10;

j=x;

WriteAddress(0x49);

WriteData(digit[i]);

WriteData(digit[j]);

delay1ms(15);

}

void DisplayMinute(unsigned char x)

unsigned char i,j;

    i=x/10;

j=x;

WriteAddress(0x46);

WriteData(digit[i]);

WriteData(digit[j]);

delay1ms(15);

}

void DisplayHour(unsigned char x)

unsigned char i,j;

    i=x/10;

j=x;

WriteAddress(0x43);

WriteData(digit[i]);

WriteData(digit[j]);

delay1ms(15);

}

void DisplayDay(unsigned char x)

unsigned char i,j;

    i=x/10;

j=x;

WriteAddress(0x0c);

WriteData(digit[i]);

WriteData(digit[j]);

delay1ms(15);

}

void DisplayMonth(unsigned char x)

unsigned char i,j;

    i=x/10;

j=x;

WriteAddress(0x09);

WriteData(digit[i]);

WriteData(digit[j]);

delay1ms(15);

}

void DisplayYear(unsigned char x)

unsigned char i,j;

    i=x/10;

j=x;

WriteAddress(0x06);

WriteData(digit[i]);

WriteData(digit[j]);

delay1ms(15);

}

void main()

{

unsigned char second,minute,hour,day,month,year;     //分别储存苗、分、小时,日,月,年

unsigned char ReadValue;        //储存从1302读取的数据

LCD_Int();     //将液晶初始化

WriteAddress(0x01);   //写Date的显示地址,将在第1行第2列开始显示

WriteData('D');

WriteData('a');

WriteData('t');

WriteData('e');

WriteData(':');

WriteAddress(0x08);

WriteData('-');

WriteAddress(0x0b);

WriteData('-');

WriteAddress(0x45);

WriteData(':');

WriteAddress(0x48);

WriteData(':'); 

DS1302_Int();            //将1302初始化

while(1){

  ReadValue = ReadSet1302(0x81);   //从秒寄存器读数据

        second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化

     DisplaySecond(second);          //显示秒

     ReadValue = ReadSet1302(0x83);  //从分寄存器读

        minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化

     DisplayMinute(minute);        //显示分

        ReadValue = ReadSet1302(0x85);  //从分寄存器读

        hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化

     DisplayHour(hour);              //显示小时

        ReadValue = ReadSet1302(0x87);  //从分寄存器读

        day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化

     DisplayDay(day);                //显示日

     ReadValue = ReadSet1302(0x89);  //从分寄存器读

        month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化

     DisplayMonth(month);            //显示月

     ReadValue = ReadSet1302(0x8d);  //从分寄存器读

        year=((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F); //将读出数据转化

     DisplayYear(year);              //显示年

}

}


关键字:液晶显示  AT89C52  DS1302  实时时钟 引用地址:液晶显示AT89C52单片机DS1302实时时钟程序

上一篇:AT89C51+DS1302+DS18B20六位数码管显示时钟程序
下一篇:步进电机仿真程序

推荐阅读最新更新时间:2024-03-16 15:35

时钟芯片DS1302可靠起振的方法
概述   DS1302是Dallas公司生产的一种实时时钟芯片。它通过串行方式与单片机进行数据传送,能够向单片机提供包括秒、分、时、日、月、年等在内的实时时间信息,并可对月末日期、闰年天数自动进行调整;它还拥有用于主电源和备份电源的双电源引脚,在主电源关闭的情况下,也能保持时钟的连续运行。另外,它还能提供31字节的用于高速数据暂存的RAM。鉴于上述特点,DS1302已在许多单片机系统中得到应用,为系统提供所需的实时时钟信息。 一、 DS1302的主要特性 1. 引脚排列 图1 DS1302引脚排列图   DS1302的引脚排列如图1所示,各引脚的功能如下:   X1,X2——32768Hz晶振引脚端;   RST——
[单片机]
时钟芯片<font color='red'>DS1302</font>可靠起振的方法
如何将液晶显示器改为电视机
有源矩阵液晶显示器 (AMLCD) 渐渐受到广大的消费者欢迎。以一般家庭来说,家中客厅的大屏幕电视机很多都已改用液晶显示的一种。电视机的画面素质要求极为严格,而且售价也要大众化,因此要满足消费者的要求并不容易。利用有源矩阵液晶显示器生产平面显示电视机的厂商必须设法提高画面清晰度及色彩的亮丽程度,并降低其售价,才可望进一步扩大市场占有率。 厂商若想改造液晶显示器的生产线,改为生产电视机,便要克服显示技术上的几个问题。首先,较大的屏幕及格式上的不同是必须解决的问题。大部分笔记本电脑都采用 14 英吋的 XGA 格式 (1024x768 像素),而大部分台式机液晶显示监视器都采用 17 英吋的 SXGA 格式 (1280x1024)。大
[嵌入式]
51单片机DS1302时钟芯片简单程序
#include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int data_7seg ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; uchar hour,min,sec; sbit shi=P1^0; sbit fen=P1^1; sbit miao=P1^2; sbit rst=P1^4; sbit sck=P1^5; sbit io=P1^6; sbit fm=P1^7; /*函数声明:*/ void write_ds1302_byte(ucha
[单片机]
MSP430单片机RTC操作-TimeA实现的实时时钟
//******************************************************************************* // D13x Demo - 利用Timer_A及中断实现RTC,观察LED灯的闪烁频率 // // 描述:利用Timer_A及中断实现RTC;通过 P1 异或 来取反 P1.5; // 系统处于休眠状态LPM3,中断时唤醒执行P1.5切换 // ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k // // MSP430F13x // ------------------- // /|| XIN|- // | | | 32kHz //
[单片机]
STM32学习笔记——实时时钟RTC
//通过该例程,学会RTC的配置和读取计数值,数值格式的转换的方法 ,要想控制好的话,要多看资料,多看程序 #include stm32f10x_lib.h vu32 TimeDisplay = 0; ErrorStatus HSEStartUpStatus; u32 THH = 0, TMM = 0, TSS = 0; unsigned int jj = 0; unsigned int LedNumVal = 0 ,LedNumVal1 = 0; //变量定义 //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char D
[单片机]
AT89C52的智能无线安防报警器
引言 现在安防报警系统越来越受到人们的重视,人们对报警器功能和性能方面的要求也越来越高。本文提出一种基于AT89C52的智能无线安防报警器: ?能与标准保安探头进行无线连接,实现大范围安防监控,并可随意扩展。 ?多防区功能。能够区分各种警情,并能够用语音播出警情类别。 ?自动电话报警,向远方用户提供警情语音和现场声响,并接收用户指令进行相应操作。 ?多功能自由切换,低误报率,高可靠性。 ?使用方便,有较高的性价比。 本报警器串接在外线和用户的普通电话机中间。报警号码的输入、报警语音的录制、无线传感器的录入及其他主机参数的设定都是通过电话机完成,平时不影响电话机的工作,用户用遥控器对主机进行布防或撤防。当主机接收到来自无线探头发过来的
[单片机]
<font color='red'>AT89C52</font>的智能无线安防报警器
STM32F10x _RTC秒中断
Ⅰ、概述 RTC(Real Time Clock)是实时时钟的意思,它其实和TIM有点类似,也是利用计数的原理,选择RTC时钟源,再进行分频,到达计数的目的。 该文主要讲述关于RTC的秒中断功能,这个功能类似SysTick系统滴答的功能。RTC秒中断功能其实是每计数一次就中断一次。注意,这里所说的秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。 本文章提供的实例工程,其实验效果是: 主函数间隔0.5秒LED变化一次; 秒中断一次打印数据 RTC Sec... ; 也就是LED变化一次,串口打印一次数据 RTC Sec... 扩展部分的功能RTC计数:可以实现RTC
[单片机]
STM32F10x _RTC秒中断
单片机与液晶显示器的接口应用介绍
引言   液晶显示器(LCD)具有工作电压低、微功耗、显示信息量大和接口方便等优点,现在已被广泛应用于计算机和数字式仪表等领域,成为测量结果显示和人机对话的重要工具。液晶显示器按其功能可分为三类:笔段式液晶显示器、字符点阵式液晶显示器和图形点阵式液晶显示器。前两种可显示数字、字符和符号等,而图形点阵式液晶显示器还可以显示汉字和任意图形,达到图文并茂的效果,其应用越来越广泛。   GTG240128液晶显示模块:   1 模块特点   GTG240128图形点阵式液晶显示器的点阵的大小为240×128,带背光功能。内置1片T6963C液晶显示控制器和5片KS0086驱动器。该液晶显示模块具有如下特点。   ● 8位并行总线
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

502 Bad Gateway

502 Bad Gateway


openresty
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
随便看看
    502 Bad Gateway

    502 Bad Gateway


    openresty
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved