#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); //显示日

单片机时间控制器c语言程序,基于AT89C52单片机实时时钟程序编写相关推荐

  1. 单片机万年历c语言程序设计,基于AT89C51单片机的多功能电子万年历的设计(附程序)...

    基于AT89C51单片机的多功能电子万年历的设计(附程序)(12000字) AT89C51 SCM-BASED ELCTRONIC DESIGN CALENDAR 摘要 本文介绍了基于AT89C51单 ...

  2. 单片机万年历c语言程序设计,基于AT89C51单片机的多功能

    基于AT89C51单片机的多功能电子万年历的设计(附程序)(12000字) AT89C51 SCM-BASED ELCTRONIC DESIGN CALENDAR 摘要 本文介绍了基于AT89C51单 ...

  3. c51单片机音乐盒c语言,毕业论文-基于AT89C51单片机的音乐盒设计(C程序).doc

    精品论文 基于单片机的音乐盒设计 [摘要]本设计是一个基于AT89C51系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能多功能音乐盒.该音乐盒主要由按键电路. ...

  4. 单片机红外接收c语言代码,基于51单片机+0038红外发射与接收C程序

    #define uchar unsigned char #define uint unsigned int sbit key1=P3^3; sbit key2=P3^4; sbit key3=P3^5 ...

  5. 51单片机生成C语言矩形波,基于51单片机产生占空比和频率可调的方波信号发生器(附全部代码)...

    本帖最后由 suqianfu 于 2020-4-11 22:29 编辑 大佬,我添加了一点注释,不知道理解得对不对 #include                                  ...

  6. ws2812 c语言程序,WS2812实时时钟程序 - 源码下载|嵌入式/单片机编程|单片机(51,AVR,MSP430等)|源代码 - 源码中国...

    文件名大小更新时间 WS2812实时时钟程序\APP\24Cxx\24cxx.c54102019-04-05 WS2812实时时钟程序\APP\24Cxx\24cxx.h9822019-04-05 W ...

  7. WS2812自动生成花样c语言,WS2812实时时钟程序 STM32F103C8T6+WS2812串行总线控制60个全彩LED - 下载 - 搜珍网...

    压缩包 : abf533fe1eccb6c5afbb056f4619b12.rar 列表 WS2812实时时钟程序/APP/24Cxx/24cxx.c WS2812实时时钟程序/APP/24Cxx/2 ...

  8. c语言数字植物管理系统,基于AT89C52单片机的智能浇花系统(包含程序代码)

    内容简介: 基于AT89C52单片机的智能浇花系统,毕业论文,共50页,18022字,附程序代码.实物图等. 摘要 伴随着经济的快速发展,人们的物质生活水平得到了极大的提高,生活质量越来越为人们关注. ...

  9. 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc

    基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(十二)-ROS-编写更复杂的ROS节点(arm_mover节点 和 look_away 节点)
  2. void main()是错的!
  3. jQuery对html元素取值与赋值
  4. 花生问题——百练OJ:2950:摘花生与1928:The Peanuts
  5. Java - Collection
  6. C#基础之Equals和Dispose
  7. [vue] vue性能的优化的方法有哪些?
  8. 河北软件职业技术学院计算机专业分数线,河北软件职业技术学院录取分数线2021是多少分(附历年录取分数线)...
  9. 华为错误报告存储在哪里_守护你的数据,华为云数据安全中心正式公测
  10. ajax提示弹出dev,windows git pull或者push代码时弹出安全框解决办法
  11. deebot扫地机器人响四声_中国智能扫地机器人重点制造基地企业名录(2020年版)...
  12. python技巧——使用list comprehension生成素数(prime number)
  13. 关于OCR身份证识别
  14. oracle驱动包下载
  15. sql语句的编程手册(转)
  16. PySpark | SparkSQL入门 | DataFrame入门
  17. 73939133——“我穿越了无数条世界线,却看不到我要的未来”
  18. C语言中常用到的几个与系统时间相关的结构体及其说明
  19. Cannot resolve com.oracle:ojdbc6:11.2.0.3
  20. java模拟交通信号灯_java 多线程交通信号灯模拟过程详解

热门文章

  1. 微信小程序使用MQTT.JS中遇到的问题
  2. 【原创】简历中需要注意的 3 个问题
  3. 【Swtich大气层】xci文件转换成nsp文件的方式
  4. TI高速ADC基础 SLAA510(三)
  5. 大津算法的matlab实现
  6. 被pytest_namespace折腾的要死了
  7. Dockerfile、Docker-Compose
  8. 新版SP出现TDR值太低警告的解决办法
  9. 量子编程法:简介和导引
  10. v-for循环时,我只需要点击到的元素做出相应反应,其他的元素不变