Ds3231+12864液晶显示AT89C51带温度功能的时钟程序。

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit LCD_RS=P2^6;

sbit LCD_RW=P2^5;

sbit LCD_EN=P2^4;

sbit LCD_PSB=P2^3;

sbit DQ=P3^7; //18b20

sbit SDA=P1^4; //ds32321 //模拟I2C数据传送位SDA

sbit SCL=P1^3; //模拟I2C时钟控制位SCL

//

sbit K1=P3^2;

sbit K2=P3^3;

sbit K3=P3^4;

sbit K4=P3^5;

//定义变量

uchar numbr[10]="0123456789"; //字模

uchar dis4[]=" "; // 第四行显示 自己添加

uchar t[]=" . ℃" ; //18b20

uint sdata,xiaoshu1,xiaoshu2; //整数、小数1位、小数2位

bit fg=1; //温度正负标志

uchar tempL=0,tempH=0; // 变量

uchar year,month,date,hour,min,sec; // ds3231

uchar a[]="2011年22月33日";

uchar b[]="11时22分33秒";

///函数

/

void write_cmd(uchar cmd)

{

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

P0=cmd;

delay1ms(5);

LCD_EN=1;

delay1ms(5);

LCD_EN=0;

}

void lcd_pos(uchar X, uchar Y)

{

ucharpos;

if(X== 0)

{

X= 0x80;

}

elseif(X == 1)

{

X= 0x90;

}

elseif(X == 2)

{

X= 0x88;

}

elseif(X == 3)

{

X= 0x98;

}

pos= X + Y;

write_cmd(pos); //显示地址

}

void write_dat(uchar dat)

{

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P0=dat;

delay1ms(5);

LCD_EN=1;

delay1ms(5);

LCD_EN=0;

}

void lcd_init()

{ uinti;

LCD_PSB=1; //并口方式

write_cmd(0x30); //基本操作指令

delay1ms(5);

write_cmd(0x0c); //打开显示,光标关闭

delay1ms(5);

write_cmd(0x01); //清除LCD显示类容

delay1ms(5);

lcd_pos(3,0);

i=0;

while(dis4[ i]!='\0')

{

delay1ms(1);

write_dat(dis4);

delay1ms(1);

i++;

}

}

void Init_DS18B20(void) //初始化

{

uchar x=0;

DQ=1; //DQ先置高

delay(8); //稍延时

DQ=0; //发送复位脉冲

delay(80); //延时(>480us)

DQ=1; //拉高数据线

delay(5); //等待(15~60us)

x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1

delay(20);

}

//

ReadOneChar(void) //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号

{

unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期

unsigned char dat=0;

for (i=8;i>0;i--) //一个字节有8位

{

DQ=1;

delay(1);

DQ=0;

dat>>=1;

DQ=1;

if(DQ)

dat|=0x80;

delay(4);

}

return(dat);

}

//

void WriteOneChar(unsigned char dat)

{

unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,

for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。

{

DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。

DQ=dat&0x01;

delay(5);

DQ=1;

dat>>=1;

}

delay(4);

}

void ReadTemperature(void) //读温度值(低位放tempL;高位放tempH;)//

{

Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的操作

WriteOneChar(0x44); //启动温度转换

delay(125); //转换需要一点时间,延时

Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳过读序列号的操作

WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)

tempL=ReadOneChar(); //读出温度的低位LSB

tempH=ReadOneChar(); //读出温度的高位MSB

if(tempH>0x7f) //最高位为1时温度是负

{

tempL=~tempL; //补码转换,取反加一

tempH=~tempH+1;

fg=0; //读取温度为负时fg=0

}

sdata= tempL/16+tempH*16; //整数部分

xiaoshu1= (tempL&0x0f)*10/16; //小数第一位

xiaoshu2= (tempL&0x0f)*100/16;//小数第二位

t[0]=numbr[sdata/10];

t[1]=numbr[sdata];

t[3]=numbr[xiaoshu1];

t[4]=numbr[xiaoshu2];

}

#define ADDRTW 0xD0 //器件写地址

#define ADDRTD 0xD1 //器件读地址

#define DS3231_SEC 0x00 //秒

#define DS3231_MIN 0x01 //分

#define DS3231_HOUR 0x02 //时

#define DS3231_DAY 0x03 //星期

#define DS3231_DATE 0x04 //日

#define DS3231_MONTH 0x05 //月

#define DS3231_YEAR 0x06 //年

//闹铃1

#define DS3231_Al1SEC 0x07 //秒

#define DS3231_AL1MIN 0x08 //分

#define DS3231_AL1HOUR 0x09 //时

#define DS3231_AL1DAY 0x0A //星期/日

//闹铃2

#define DS3231_AL2MIN 0x0b //分

#define DS3231_AL2HOUR 0x0c //时

#define DS3231_AL2DAY 0x0d //星期/日

#define DS3231_CONTROL 0x0e //控制寄存器

#define DS3231_STATUS 0x0f //状态寄存器

bit ack;

uchar BCD2HEX(uchar val) //BCD转换为Byte

{ uchari;

i= val&0x0f;

val >>= 4;

val &= 0x0f;

val *= 10;

i+= val;

return i;

}

uchar HEX2BCD(uchar val)//B码转换为BCD码

{

uchari,j,k;

i=val/10;

j=val;

k=j+(i<<4);

return k;

}

void Start()

{

SDA=1; //发送起始条件的数据信号

delay(1);

SCL=1;

delay(5); //起始条件建立时间大于4.7us,延时

SDA=0; //发送起始信号

delay(5); // 起始条件锁定时间大于4μs

SCL=0; //钳住I2C总线,准备发送或接收数据

delay(2);

}

void Stop()

{

SDA=0; //发送结束条件的数据信号

delay(1); //发送结束条件的时钟信号

SCL=1; //结束条件建立时间大于4us

delay(5);

SDA=1; //发送I2C总线结束信号

delay(4);

}

void SendByte(uchar Dat)

{

uchar BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位

{

if((Dat<

SDA=1; //判断发送位

else

SDA=0;

delay(1);

SCL=1; //置时钟线为高,通知被控器开始接收数据位

delay(5); //保证时钟高电平周期大于4μs

SCL=0;

}

delay(2);

SDA=1; //8位发送完后释放数据线,准备接收应答位

delay(2);

SCL=1;

delay(3);

if(SDA==1)

ack=0;

else

ack=1; //判断是否接收到应答信号

SCL=0;

delay(2);

}

uchar RcvByte() //功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。

{

uchar retc;

uchar BitCnt;

retc=0;

SDA=1; //置数据线为输入方式

for(BitCnt=0;BitCnt<8;BitCnt++)

{

delay(1);

SCL=0; //置时钟线为低,准备接收数据位

delay(5); //时钟低电平周期大于4.7μs

SCL=1; //置时钟线为高使数据线上数据有效

delay(3);

retc=retc<<1;

if(SDA==1)

retc=retc+1; //读数据位,接收的数据位放入retc中

delay(2);

}

SCL=0;

delay(2);

return(retc);

}

void I2CACK(bit a) // 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)

{

if(a==0)

SDA=0; //在此发出应答或非应答信号

else

SDA=1;

delay(3);

SCL=1;

delay(5); //时钟低电平周期大于4μs

SCL=0; //清时钟线,钳住I2C总线以便继续接收

delay(2);

}

uchar I2CRead()

{

uchar read_data;

Start();

SendByte(ADDRTD);

if(ack==0)

{

return(0);

}

read_data = RcvByte();

I2CACK(1);

Stop();

return read_data;

}

uchar I2CReadAdd(uchar addr)

{

Start();

SendByte(ADDRTW);

if(ack==0)

{

return(0);

}

SendByte(addr);

if(ack==0)

{

return(0);

}

return(I2CRead());

}

void Readtime()

{

uchar temp;

temp=I2CReadAdd(DS3231_SEC);//秒

sec=BCD2HEX(temp);

temp=I2CReadAdd(DS3231_MIN);//分

min=BCD2HEX(temp);

temp=I2CReadAdd(DS3231_HOUR); //时

hour=BCD2HEX(temp);

temp=I2CReadAdd(DS3231_DATE); //日

date=BCD2HEX(temp);

temp=I2CReadAdd(DS3231_MONTH); //月

month=BCD2HEX(temp);

temp=I2CReadAdd(DS3231_YEAR); //年

year=BCD2HEX(temp);

}

void InitDS3231() //ds3231初始化

{SCL=1;

delay(5);

SDA=1;

delay(5);

}

void TimeDisplay(uchar Dhour,ucharDmin,uchar Dsec) //时分秒数组赋值

{ b[0]=numbr[Dhour / 10]; // 时十位

b[1]=numbr[Dhour % 10]; // 时个位

b[4]=numbr[Dmin / 10]; // 分十位

b[5]=numbr[Dmin % 10]; // 分个位

b[8]=numbr[Dsec / 10]; // 秒十位

b[9]=numbr[Dsec % 10]; // 秒个位

}

void DateDisplay(uchar Dyear,ucharDmonth,uchar Dday) //年月天数组赋值

{ a[2]=numbr[Dyear / 10]; // 年十位

a[3]=numbr[Dyear % 10]; // 年个位

a[6]=numbr[Dmonth / 10]; // 月十位

a[7]=numbr[Dmonth % 10]; // 月个位

a[10]=numbr[Dday / 10]; // 天十位

a[11]=numbr[Dday % 10]; // 天个位

}

void Start_I2C()

{

SDA=1; //发送起始条件的数据信号

delay(1);

SCL=1;

delay(5); //起始条件建立时间大于4.7us,延时

SDA=0; //发送起始信号

delay(5); // 起始条件锁定时间大于4μs

SCL=0; //钳住I2C总线,准备发送或接收数据

delay(2);

}

void Stop_I2C()

{

SDA=0; //发送结束条件的数据信号

delay(1); //发送结束条件的时钟信号

SCL=1; //结束条件建立时间大于4us

delay(5);

SDA=1; //发送I2C总线结束信号

delay(4);

}

uchar write_byte(uchar addr, ucharwrite_data)

{

Start_I2C();

SendByte(ADDRTW); ///

if (ack == 0)

return 0;

SendByte(addr);

if (ack == 0)

return 0;

SendByte(write_data);

if (ack == 0)

return 0;

Stop_I2C();

delay1ms(10);

return 1;

}

void ModifyTime(uchar yea,uchar mon,ucharda,uchar hou,uchar min,uchar sec)

{ uchar temp=0;

temp=HEX2BCD(yea);

write_byte(DS3231_YEAR,temp); //修改年

temp=HEX2BCD(mon);

write_byte(DS3231_MONTH,temp); //修改月

temp=HEX2BCD(da); /

write_byte(DS3231_DATE,temp); //修改日

temp=HEX2BCD(hou);

write_byte(DS3231_HOUR,temp); //修改时

temp=HEX2BCD(min);

write_byte(DS3231_MIN,temp); //修改分

temp=HEX2BCD(sec);

write_byte(DS3231_SEC,temp); //修改秒

}

void xianshi(void)

{

{uint i;

TimeDisplay(hour,min,sec);

lcd_pos(1,1); //时间

i=0;

while(b[ i]!='\0')

{

delay1ms(1);

write_dat(b);

delay1ms(1);

i++;

}

DateDisplay(year,month,date); //显示日期

delay1ms(1);

lcd_pos(0,0);

i=0;

while(a[ i]!='\0')

{

delay1ms(1);

write_dat(a);

delay1ms(1);

i++;

}

ReadTemperature(); //显示温度

delay1ms(1);

lcd_pos(2,1);

delay1ms(1);

i=0;

while(t[ i]!='\0')

{

delay1ms(1);

write_dat(t);

delay1ms(2);

i++;

}

}

}

void shuaxin(void)

{ uint i;

TimeDisplay(hour,min,sec);

lcd_pos(1,1); //时间

i=0;

while(b[ i]!='\0')

{

delay1ms(1);

write_dat(b);

delay1ms(1);

i++;

}

DateDisplay(year,month,date); //显示日期

delay1ms(1);

lcd_pos(0,0);

i=0;

while(a[ i]!='\0')

{

delay1ms(1);

write_dat(a);

delay1ms(1);

i++;

}

}

void sotp(void)

{

uinti;

while(1)

{

duan1: if(K1==0)

{

delay1ms(100);

if(K1==0)

{

Readtime();

shuaxin();

i=0;

gotoduan2;

}

}

else

{gotoduan5;}

duan2: if(K2==0)

{

delay1ms(100);

if(K2==0)

{

i++;

if(i>6){i=0;}

shuaxin();

}

}

switch(i)

{

case 0: if(K3==0){delay1ms(100);if(K3==0){year=year+1;} if(year>=100){year=0;} shuaxin();}break;

case 1: if(K3==0){delay1ms(100);if(K3==0){month=month+1;} if(month>=13){month=0;} shuaxin();}break;

case 2: if(K3==0){delay1ms(100);if(K3==0){date=date+1;} if(date>=32){date=0;} shuaxin();}break;

case 3: if(K3==0){delay1ms(100);if(K3==0){hour=hour+1;} if(hour>=25){hour=0;} shuaxin();}break;

case 4: if(K3==0){delay1ms(100);if(K3==0){min=min+1;} if(min>=61){min=0;} shuaxin();}break;

case 5: if(K3==0){delay1ms(100);if(K3==0){sec=sec+1;} if(sec>=61){sec=0;} shuaxin();} break;

}

duan4: if(K4==0)

{

delay1ms(100);

if(K4==0)

{

ModifyTime(year,month,date,hour,min,sec);

gotoduan5; ///

}

}

else

{gotoduan2;}

duan5: Readtime();

xianshi();

}

}

main()

{

lcd_init();

delay1ms(5);

InitDS3231();

delay1ms(5);

delay1ms(5);

sotp();

}

数字钟显示时间日期温度C语言程序,Ds3231+12864液晶显示AT89C51带温度功能的时钟程序...相关推荐

  1. 小米手机不亮屏显示时间日期?方法其实很简单,升级MIUI11有惊喜

    如今不少人在查看自己手机上的时间时,都不用拿起后按电源键亮屏看时间,之后再按电源键息屏,而是使用了"息屏显示"功能,让手机在息屏状态下也能看到时间日期. 其实这个功能还是非常方便的 ...

  2. 苹果手机怎么改时间和日期_手机照片显示时间日期怎么设置

    朋友圈里常常有人晒照片,可以发现有些人的照片上有拍摄的时间,而自己的手机拍摄照片却没有这一功能.没有这一功能的朋友们肯定都想要知道这一功能如何设置!那么手机照片显示时间日期怎么设置呢?下面就让我来为你 ...

  3. Android实时显示时间日期(极简)

    Android实时显示时间日期 示例图 示例图解析 TextClock时间控件 常用的xml属性及常用方法 示例源代码 .xml文件 .java 示例图 示例图解析 格式 说明 yyyy/MM/dd ...

  4. 有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。 读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字

    有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分.现在,你的程序要根据起始时间和流逝的时间计算出终止时间. 读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表 ...

  5. 51单片机DS18B20+DS1302+LCD12864实时显示时间日期温度

    文章目录 介绍 Proteus仿真运行效果 源程序 主函数 DS1302时钟函数 DS18B20函数 LCD12864(不带字库) sharing函数 mine头文件 介绍 DS18B20采集温度 D ...

  6. 单片机实例20——数字钟(硬件电路图+汇编程序+C语言程序)

    20. 数字钟﹝★﹞ 1. 实验任务 (1. 开机时,显示12:00:00的时间开始计时: (2. P0.0/AD0控制"秒"的调整,每按一次加1秒: (3. P0.1/AD1控制 ...

  7. 修改sqlplus中显示时间日期的格式

    在数据库里查询数据的时候,我们经常会遇到一些和日期时间格式的问题,比如显示语言,显示格式等.可能数据在数据库里面存放的格式是:YYYY-MM-DD HH24:MI:SS, 但我们查询出来的却是 22- ...

  8. 华为手机如何调时间显示_华为手机不亮屏也能显示时间日期?10秒就能设置,原来这么简单...

    不知道各位在想要查看时间的时候,是不是从口袋中拿出手机,然后按下锁屏键亮屏查看时间之后再按锁屏键熄屏的呢?但是还有一种更加简单的方法不需要亮屏就可以查看时间日期. 这个功能就是华为手机的"灭 ...

  9. 华为手机不亮屏也能显示时间日期?10秒就能设置,原来这么简单

    不知道各位在想要查看时间的时候,是不是从口袋中拿出手机,然后按下锁屏键亮屏查看时间之后再按锁屏键熄屏的呢?但是还有一种更加简单的方法不需要亮屏就可以查看时间日期. 这个功能就是华为手机的"灭 ...

最新文章

  1. DAY7-Python学习笔记
  2. hibernate mysql缓存机制_Hibernate的缓存机制
  3. P1031 均分纸牌(经典贪心)
  4. 中科院信工所经验_2020计算机保研经验贴!(北航、北邮、中科院)
  5. Perfect World
  6. ubuntu突然连不上-调试方式
  7. 根本不值得一提的乒乓球国手王浩
  8. IntelliJ IDEA安装后需要必须做的一件事
  9. 我想创业,但不懂技术怎么办
  10. Java:集合,Array、Collection(List/Set/Queue)、Map的遍历,比如:ArrayList,LinkedList,HashSet,HashMap...
  11. jquery第三章练习三(制作京东常见问题分类页面)
  12. js对加法计算、减法计算、乘法计算、除法计算的精度处理
  13. 极路由3(HC5861)刷Padavan固件教程
  14. 计算机怎么通电启动,电脑通电自动开机怎么设置
  15. mysql dump 1449_关于mysqldump的ERROR 1449 问题 | 学步园
  16. 【深度学习之美】一入侯门“深”似海,深度学习深几许(入门系列之一)
  17. 实验五:Telemetry静态订阅实验
  18. electron-vue起步
  19. Mapwingis添加图层,实现label
  20. Linux——开发工具

热门文章

  1. 访问System x3650 IMM2的几种方式
  2. JAVA山地车deca_JAVA 2020 款山地车盘点
  3. 那你知道deepmind的Flamingo吗
  4. APIO 2022 游记
  5. idea for mac 最全快捷键整理
  6. C语言字符串可以怎样输出
  7. 阿里巴巴技术团队博客
  8. java jasperException异常
  9. 操作系统实验—设备管理
  10. BEGAN-carpedm代码调试