📄 万年历.c
字号:
/***************************************************************
系统名称:电子万年历
创建人:w418781840 日期:2008,7,18
功能描述:LCD12864串行模式显示,DS1302读取时间年月份,
18B20 读取温度
****************************************************************/
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/*------------LCD12864相关声明-----------------------------*/
#define com 0
#define dat 1
sbit cs =P1^5;
sbit sid=P1^6;
sbit sck=P1^7;
uchar code TAB1[]={"欢迎使用系统"};//第一行初始化.
uchar code TAB2[]={"20 年 月 日"}; //第二行
uchar code TAB3[]={"星期 : : "}; //第三行
uchar code TAB4[]={"室温: ℃"}; //第四行
/*----------------------DS1302相关声明-------------------------*/
char TAB_1302[]={ 0x00,0x29,0x02, //秒:分:时.
0x18,0x06,0x06,0x08}; //日:月:星期:年.
uchar code TAB_XQ[]={"一二三四五六日"};//把DS1302数字日期转换为中文字符.
sbit T_CLK=P3^1; /* 实时时钟的时钟线引脚*/
sbit T_IO=P3^3; /* 实时时钟的数据线*/
sbit T_RST=P3^6; /* 实时时钟的复位线引脚*/
uchar bdata datbyte;
sbit datbyte0=datbyte^0;
sbit datbyte7=datbyte^7;
/*--------------18B20相关声明-------------------------------*/
uchar dis1[16];
sbit DQ=P1^4; /*DS18B20温度检测*/
/*----------键盘相关声明-------------------------------------*/
sbit key=P2^1; //功能键
sbit key1=P2^0; //只有加1键
uchar sum,keyflag=0; //调用时,分,秒,标志,调用键盘处理标志.
/*--------------以下为LCD12864相关函数--------------------------*/
/**************************************************************
函数名称:void delay1ms(uint x)
函数功能: 延时1MS
***************************************************************/
void delay1ms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
/**************************************************************
函数名称:void w_12864byte(uchar byte)
函数功能: 写字节
**************************************************************/
void w_12864byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
byte<<=1;
sid=CY;
sck=1;
}
}
/**************************************************************
函数名称:uchar r_12864byte(void)
函数功能: 读字节
***************************************************************/
uchar r_12864byte(void)
{
uchar i,temp1,temp2;
temp1 = 0;
temp2 = 0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
sck = 0;
sck = 1;
sck = 0;
if(sid) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
sck = 0;
sck = 1;
sck = 0;
if(sid) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2));
}
/**************************************************************
函数名称:void c_12864busy( void )
函数功能: 检测忙函数
**************************************************************/
void c_12864busy( void )
{
do
w_12864byte(0xfc); //11111,RW(1),RS(0),0
while(0x80&r_12864byte());
}
/**************************************************************
函数名称:void w_12864(bit dat_com,uchar byt)
函数功能: 写入函数
***************************************************************/
void w_12864(bit dat_com,uchar byt)
{
uchar temp;
if(dat_com==0) //为零,写入指令
temp=0xf8; //11111,RS(0),RW(0),0
else //否则,写入数据
temp=0xfa; //11111,RS(1),RW(0),0
cs=1;
c_12864busy();
w_12864byte(temp);
w_12864byte(byt&0xf0); //写入高四位
w_12864byte(byt<<4); //写入低四位
cs=0;
}
/**************************************************************
函数名称:void init_12864(void)
函数功能:初始化12864
***************************************************************/
void init_12864(void)
{
w_12864(com,0x30); //基本指令功能.
w_12864(com,0x0c); //显示打开,关光标,反白关.
w_12864(com,0x01); //清屏指令.
w_12864(com,0x06); //AC自动加一
}
/*----------------以下为DS1302相关函数-------------------------*/
/**************************************************************
函数名称:void w_1302byte(uchar date)
函数功能:写一个字节(上升沿)
***************************************************************/
void w_1302byte(uchar date)
{ uchar i;
datbyte=date;
for(i=0;i<8;i++)
{ T_IO=datbyte0; //写最低位
T_CLK=0;
T_CLK=1;
datbyte>>=1;
}
}
/**************************************************************
函数名称:uchar r_1302byte(void)
函数功能:读一个字节(下降沿)
***************************************************************/
uchar r_1302byte(void)
{ uchar i;
datbyte=0;
for(i=0;i<8;i++)
{ datbyte7=T_IO; //读最低位
T_CLK=1;
T_CLK=0;
datbyte>>=1;
}
return(datbyte);
}
/***************************************************************
函数名称:void write_1302(uchar addr,uchar date)
函数功能: 指定位置写数据
****************************************************************/
void write_1302(uchar addr,uchar date)
{ T_RST=0;
T_CLK=0;
T_RST=1;
w_1302byte(addr);
w_1302byte(date);
T_CLK=0;
T_RST=0;
}
/**************************************************************
函数名称:uchar read_1302(uchar addr)
函数功能: 指定位置读数据
****************************************************************/
uchar read_1302(uchar addr)
{ uchar dat1,dat2,temp;
T_RST=0;
T_CLK=0;
T_RST=1;
w_1302byte(addr);
temp=r_1302byte();
T_RST=0;
T_CLK=0;
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return(temp);
}
/***************************************************************
函数名称:void init_1302(void)
函数功能: 初始化
*****************************************************************/
void init_1302(void)
{ uchar i;
uchar addr=0x80;
write_1302(0x8e,0x00);
for(i=0;i<7;i++)
{
write_1302(addr,TAB_1302[i]);
addr+=2;
}
write_1302(0x8e,0x80);
}
/****************************************************************
函数名称:void get_1302(void)
功能说明:读取DS1302时钟信息.
*****************************************************************/
void get_1302(void)
{ uchar i,addr=0x81;
for(i=0;i<7;i++)
{ TAB_1302[i]=read_1302(addr);
addr+=2;
}
}
/*---------------以下为18B20相关函数-----------------------------*/
/******************************************************************
函数名称:void delay (uint x)
功能说明:若机器周期为1us,则本延时程序为延时 4*x(us)
******************************************************************/
void delay (uint x) //本板延时8us
{
while (--x);
}
/*****************************************************************
函数名称:uchar bus_rest(void)
功能说明:产生单总线系统信号的总线复位信号,并返回
总线上是否存在单总线器件信息
******************************************************************/
uchar bus_rest(void)
{
uchar presence;
DQ=0; //将DQ信号线拉低
delay(29); //持续48US
DQ=1; //释放总线
delay(3); //等待从设备将总线拉低
presence=DQ; //保存当前总线状态
delay(25); //等待总线初始化过程结束
return presence;//返回是否有从设备将总线拉低
}
/****************************************************************
函数名称:uchar r_1820BYTE(void)
功能说明:向单总线读取一个数据字节
*****************************************************************/
uchar r_1820BYTE(void)
{
uchar i=0;
uchar date = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 将DQ信号线拉低启动读时隙
DQ=1;// 释放总线,等待从机动车辆返回数据位
delay(1); //越接近15us越好; 准备采样总线上的信号
date>>=1 ;
if (DQ)
date=date|0x80;
delay(6);
}
return(date);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -