老古开发网首页
导航:老古开发网首页文章索引文章分类单片机→[带温度测量的LCD显示的实时时钟]
| -文章搜索 - 最新文章 - |

带温度测量的LCD显示的实时时钟

发布时间:2006年7月23日 点击次数:1356
来源:   作者:
 

/***********************************************************

  SP0605-51/AVR单片机学习实验开发系统实验例程(30

  此实验属于综合实验类,LCD显示,温度测量,实时时钟等内容结合起来,构成一个复杂

  的实验系统,完成在LCD上显示日历和环境温度,可以用于家庭的信息提示和监测系统

  通过此实验可以掌握LCD显示的驱动程序的设计和编程方法

  通过此实验可以掌握DS18B20的温度测量的驱动程序设计和编程方法

  通过此实验可以掌握DS1302的实时时钟的驱动程序设计和编程方法

  supermcu@126.com

  www.supermcu.com

  作者(Author):孙安青(Sun An-Qing) 西谱电子(西谱单片机电子网)

  SP0605-51/AVR单片机学习实验开发系统

***************************************************************************/

#include <REGX51.H>

#include "16x2LCDDriver.h"  //LCD头文件

#include "DS18B20Driver.h"  //DS18B20头文件

#include "DS1302Driver.h"   //DS1302头文件

 

struct TimerStruct          //定义时钟的数据结构

{

  unsigned char Year;

  unsigned char Month;

  unsigned char Day;

  unsigned char Week;

  unsigned char Hour;

  unsigned char Minute;

  unsigned char Second;

};

unsigned char DateBuffer[]={"2005/01/01"};

unsigned char TimeBuffer[]= {"00:00:00"};

unsigned char LCDDisplayBuffer[]={"       "};

 

unsigned int SecondCounter;//秒计数器(无符号整型)

void timer0(void) interrupt 1//定时T0溢出中断,25mS产生一次中断

{

  unsigned int Temp;

  unsigned char TemperatureH;

  unsigned char TemperatureL;

  struct TimerStruct RealClock;

 

  TH0=(65536-46080)/256;//重新装入定时25mS的初值到TH0,TL0

  TL0=(65536-46080)%256;

 

  SecondCounter++;//秒计数器加1

  if(SecondCounter==40)//40,表示1S时间到

    {

      SecondCounter=0;

      while(DS18B20_Reset());//DS18B20发复位命令

      DS18B20_Write(0xCC);   //DS18B20发读数据命令

      DS18B20_Write(0xBE);

      TemperatureL=DS18B20_Read();//DS18B20的第1BYTE

      TemperatureH=DS18B20_Read();//DS18B20的第2Byte

      while(DS18B20_Reset());//DS18B20发复位命令

      DS18B20_Write(0xCC);//DS18B20发启动温度转换开始命令

      DS18B20_Write(0x44);

      //----以下是关于读取DS18B20的数据时行处理,并将结果显示出来   

      Temp=TemperatureH*256+TemperatureL;         

      if(Temp & 0xf800)

        {

      LCDDisplayBuffer[0]=''-'';

      Temp=(~Temp)+1;

      TemperatureL=Temp%256;

      TemperatureH=Temp/256;

    }

      Temp>>=4;

      LCDDisplayBuffer[1]=Temp/10+0x30;

      LCDDisplayBuffer[2]=Temp%10+0x30;

      Temp=TemperatureL;

      Temp&=0x000F;

      Temp*=625;

      Temp/=100;

      LCDDisplayBuffer[3]=''.'';

      LCDDisplayBuffer[4]=Temp/10+0x30;

      LCDDisplayBuffer[5]=Temp%10+0x30; 

      LCDDisplayBuffer[6]=''C'';

      //---以下是读取DS1302的时钟信息,并将结果存储到显示缓冲区中

      Temp=Read_DS1302_RTC(0x81);//读秒信息

      RealClock.Second=Temp;

      TimeBuffer[7]=Temp%16+0x30;

      TimeBuffer[6]=Temp/16+0x30;

      Temp=Read_DS1302_RTC(0x83);//读分信息

      RealClock.Minute=Temp;

      TimeBuffer[4]=Temp%16+0x30;

      TimeBuffer[3]=Temp/16+0x30;

      Temp=Read_DS1302_RTC(0x85);//读时信息

      RealClock.Hour=Temp;

      TimeBuffer[1]=Temp%16+0x30;

      TimeBuffer[0]=Temp/16+0x30;   

      Temp=Read_DS1302_RTC(0x87);//读日信息

      RealClock.Day=Temp;

      DateBuffer[9]=Temp%16+0x30;

      DateBuffer[8]=Temp/16+0x30;

      Temp=Read_DS1302_RTC(0x89);//读月信息

      RealClock.Month=Temp;

      DateBuffer[6]=Temp%16+0x30;

      DateBuffer[5]=Temp/16+0x30;

      Temp=Read_DS1302_RTC(0x8d);//读年信息

      RealClock.Year=Temp;

      DateBuffer[3]=Temp%16+0x30;

      DateBuffer[2]=Temp/16+0x30;

      //---送到LCD上显示出来

      lcd_displaystr_ram(0,3,DateBuffer);//刷新LCD上的日期信息

      lcd_displaystr_ram(1,1,TimeBuffer);//刷新LCD上的时间显示信息

      lcd_displaystr_ram(1,sizeof(TimeBuffer),LCDDisplayBuffer);

    }

}

 

void main(void)

{

  TMOD=0x01;//T0工作于16位定时功能

  TH0=(65536-46080)/256;//T0定时25mS的初值装入TH0,TL0

  TL0=(65536-46080)%256;

  TR0=1;//启动T0开始工作

  ET0=1;//允许T0溢出中断

  EA=1;//CPU开中断

  initize_lcd();//初始化LCD

  Init_DS1302_RTC();//初始化DS1302

  //clock initize

  Write_DS1302_RTC(0x8e,0x00);

  Write_DS1302_RTC(0x80,0x00);

  Write_DS1302_RTC(0x82,0x55);

  Write_DS1302_RTC(0x84,0x11);

  Write_DS1302_RTC(0x86,0x16);

  Write_DS1302_RTC(0x88,0x11);

  Write_DS1302_RTC(0x8a,0x05);

  Write_DS1302_RTC(0x8c,0x05);

  Write_DS1302_RTC(0x8e,0x80);

 

  while(1)

    {

       ;

    }

}


欢迎进入老古论坛进行讨论
[单片机] 相关文章:
单片机控制实时时钟X1226的应用设计
简介:
X1226具有时钟和日历的功能,时钟依赖时、分、秒寄存器来跟踪,日历依赖日期、星期、月和年寄存器来跟踪,日历可正确通过2099年,具有自动闰年修正。 拥有强大的双报警功能,能够被设置到任何时钟/日历值上,精确度可到ls。可用软件设置1 Hz,4096 Hz或32768Hz中任意一个频率输出。 该器件提供一个备份电源输入脚VBACK1允许器件用电池或大容量电容备份供电。许多电池类型能够用做Xicor公司实时时钟器件X1226的备份电池,3.O......

液晶显示模块TC1602A与单片机的接口技术
[转载]嵌入式系统设计方法的演化—— 从单片机到单片系统
[转载]嵌入式实时操作系统的现状和未来
GPS术语缩写
电磁炉精确测温技术现状与发展方向
SPMC65P2404A在电磁炉中的应用(凌阳)
HT46R22单片机在电磁炉功率控制中的应用
基于SN8P1706芯片的电磁炉(源程序)(sonix)
A51 4.1.3 堆栈段(Stack Segment)
 
下一个:[单片机]PIC单片机与触摸屏串行通信MODBUS协议
简介:
工控中经常需要观察系统的运行状态或者修改运行参数。 触摸屏 能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。 单片机 广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。触摸屏和单片机 通 ,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。Modbus协议是美国Modicon公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议。本文以PIC16F877单片机和人机电子有限公司的eView MT510T型触摸屏为例,介绍其通信程序的开发过程。   &nbsp......
 

上一个:[单片机]A51 4.1.6 段(SEGMENT)

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:10分钟 执行时间:16毫秒