您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页多功能万年历

多功能万年历

来源:华佗小知识


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

/*工程项目:多功能万年历 */

/*研究地点:河南机电高等专科学校 */

/*系别专业:电子通信工程系 应用电子专业 */

/*研究人员:王文克 */

/*作业时间:2012年10月3日 */

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

#include

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit IO=P1^0; /*定义DS1302和LCD控制端口号*/

sbit SCLK=P1^1;

sbit RST=P1^2;

sbit RS=P2^0;

sbit EN=P2^2;

sbit RW=P2^1;

sbit DS1820_DQ=P2^3;

int temperature[2];

uint temp1,temp2,temp3;

uchar *WEEK[]={\"MON\星期数组*/

uchar LCD_DSY_BUFFER1[]={\"2000-00-00 \日期时间初始化*/

uchar LCD_DSY_BUFFER2[]={\"00:00:00 'C\

uchar DateTime[7];

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

函数功能:延时函数DelayMS()

入口参数:ms

出口参数:

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

void DelayMS(uint ms)

{

unsigned char i;

while(ms--)

{

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

}

}

bit DS1820_Reset()

{ uchar i;

bit flag;

DS1820_DQ= 0;

for(i=240;i>0;i--);

DS1820_DQ = 1;

for(i=40;i>0;i--);

flag=DS1820_DQ;

for(i=200;i>0;i--);

return(flag);

}

void DS1820_WriteData(uchar wData)

{ uchar i,j;

for(i=8;i>0;i--)

{

DS1820_DQ=0;

for(j=2;j>0;j--);

DS1820_DQ=wData&0x01;

for(j=30;j>0;j--);

DS1820_DQ=1;

wData>>=1;

}

}

uchar DS1820_ReadData()

{

uchar i,j,TmepData;

for(i=8;i>0;i--)

{

TmepData>>=1;

DS1820_DQ=0;

for(j=2;j>0;j--);

DS1820_DQ=1;

for(j=4;j>0;j--);

if(DS1820_DQ==1)

{TmepData|=0x80;}

for(j=30;j>0;j--);

DS1820_DQ=1;

}

return(TmepData);

}

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

函数功能:往时钟模块DS1302写数据

入口参数:x

出口参数:

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

void Write_A_Byte_TO_DS1302(uchar x)

{

uchar i;

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

{

IO=x&0x01;SCLK=1;SCLK=0;x>>=1;

}

}

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

函数功能:从时钟模块DS1302读取数据

入口参数:

出口参数:十进制数

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

uchar Get_A_Byte_FROM_DS1302()

{

uchar i,b=0x00;

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

{

b|=_crol_((uchar)IO,i);

SCLK=1;

SCLK=0;

}

return b/16*10+b%16;

}

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

函数功能:从时钟模块DS1302读取日期时间

入口参数:addr

出口参数:dat

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

uchar Read_Data(uchar addr)

{

uchar dat;

RST=0;

SCLK=0;

RST=1;

Write_A_Byte_TO_DS1302(addr);

dat=Get_A_Byte_FROM_DS1302();

SCLK=1;RST=0;

return dat;

}

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

函数功能:得到日期时间写入DateTime[7]数组

入口参数:

出口参数:

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

void GetTime()

{

uchar i,addr=0x81;

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

{

DateTime[i]=Read_Data(addr);

addr+=2;

}

}

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

函数功能:读LCD的状态

入口参数:

出口参数:

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

uchar Read_LCD_State()

{

uchar state;

RS=0;

RW=1;

EN=1;

DelayMS(1);

state=P0;

EN=0;

DelayMS(1);

return state;

}

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

函数功能:测试LCD忙碌状态

入口参数:

出口参数:result

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

void LCD_Busy_Wait()

{

while((Read_LCD_State()&0x08)==0x80);

DelayMS(5);

}

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

函数功能:写数据到LCD子程序

入口参数:cmd

出口参数:

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

void Write_LCD_Data(uchar dat)

{

LCD_Busy_Wait();

RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;

}

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

函数功能:写指令到LCD子程序

入口参数:

出口参数:

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

void Write_LCD_Command(uchar cmd)

{

LCD_Busy_Wait();

RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;

}

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

函数功能:设定显示位置子程序

入口参数:pos

出口参数:

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

void Set_LCD_POS(unsigned char p)

{

Write_LCD_Command(p|0x80);

}

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

函数功能:写入显示数据到LCD子程序

入口参数:dat

出口参数:

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

void Display_LCD_String(uchar p,uchar *s)

{

uchar i;

Set_LCD_POS(p);

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

{

Write_LCD_Data(s[i]);

DelayMS(1);

}

}

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

函数功能:LCD初始化子程序

入口参数:

出口参数:

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

void Init_LCD()

{

Write_LCD_Command(0x38);

DelayMS(1);

Write_LCD_Command(0x01);

DelayMS(1);

Write_LCD_Command(0x06);

DelayMS(1);

Write_LCD_Command(0x0c);

DelayMS(1);

}

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

函数功能:把日期时间写入 LCD_DSY_BUFFER数组

入口参数:d,a

出口参数:

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

void Format_DateTime(uchar d,uchar *a)

{

a[0]=d/10+'0';

a[1]=d%10+'0';

}

void main()

{

uchar temp_data, temp_data_2;

uchar i,flag;

Init_LCD();

while(1)

{

DS1820_Reset();

DS1820_WriteData(0xcc);

DS1820_WriteData(0x44);

DS1820_Reset();

DS1820_WriteData(0xcc);

DS1820_WriteData(0xbe);

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

{

temperature[i]=DS1820_ReadData();

}

DS1820_Reset();

if(temperature[1]&0xfc)

{

flag=1;

temp_data=((temperature[1]<<8)|temperature[0]);

temp_data=((~temp_data)+1);

temp_data*=0.0625;

}

else

{

flag=0;

temp_data=((temperature[1]<<8)|temperature[0])*0.0625;

}

if(flag==1)

{

LCD_DSY_BUFFER2[10]='-';

}

else

{

LCD_DSY_BUFFER2[10]=' ';

}

temp1=temp_data/100+0x30;

temp2=(temp_data%100)/10+0x30;

temp3=(temp_data%100)%10+0x30;

LCD_DSY_BUFFER2[11]=temp1;

LCD_DSY_BUFFER2[12]=temp2;

LCD_DSY_BUFFER2[13]=temp3;

GetTime();

Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+2);

Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+5);

Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+8);

strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[3]]);

Format_DateTime(DateTime[2],LCD_DSY_BUFFER2);

Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+3);

Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+6);

Display_LCD_String(0x00,LCD_DSY_BUFFER1);

Display_LCD_String(0x40,LCD_DSY_BUFFER2);

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务