微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 1602液晶显示DS1302+S51时钟+温度显示

1602液晶显示DS1302+S51时钟+温度显示

时间:11-10 来源:互联网 点击:

/*******************************************************
函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
********************************************************/
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
//================================= 温度显示控制部分 ===============================================

/*****************************************************
函 数 名:void delay()
功 能:DS18B20延时
说 明:DS18B20时序延时
入口参数:useconds
返 回 值:无
*****************************************************/
//*********** 18B20驱动 **************************
//延时
void delay(word useconds)
{
for(;useconds>0;useconds--);
}
/*****************************************************
函 数 名:byte ow_reset()
功 能:DS18B20复位
说 明:DS18B20使用时先要复位
入口参数:无
返 回 值:presence
*****************************************************/
//复位
byte ow_reset(void)
{
byte presence;
DQ = 0; //拉低总线
delay(29); // 保持 480us
DQ = 1; // 释放总线
delay(3); // 等待回复
presence = DQ; // 读取信号
delay(25); // 等待结束信号
return(presence); // 返回 0:正常 1:不存在
}
/*****************************************************
函 数 名:byte read_byte()
功 能:从 1-wire 总线上读取一个字节
说 明:读总线上的数据有严格的时序
入口参数:
返 回 值:value
*****************************************************/
byte read_byte(void)
{
byte i;
byte value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0;
DQ = 1;
delay(1);
if(DQ)value|=0x80;
delay(6);
}
return(value);
}
/*****************************************************
函 数 名:void write_byte()
功 能:向 1-WIRE 总线上写一个字节
说 明:写总线上的数据有严格的时序
入口参数:val
返 回 值:无
*****************************************************/
void write_byte(char val)
{
byte i;
for (i=8; i>0; i--) // 一次写一位
{
DQ = 0; //
DQ = val&0x01;
delay(5); //
DQ = 1;
val=val/2;
}
delay(5);
}
/*****************************************************
函 数 名:Read_Temperature()
功 能:读取和显示温度
说 明:
入口参数:xx,yy
返 回 值:无
*****************************************************/
Read_Temperature(char xx,char yy)
{
uchar i,tl_temp;
uint x;
uchar ct[8];
union //共用体
{
byte c[2];
int x;
}temp;

ow_reset(); // DS18B20复位
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 转换温度
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xbe); // 读取寄存器
temp.c[1]=read_byte(); // 读出温度低8位
temp.c[0]=read_byte(); // 读出温度高8位

// 零下温度判断
sflag=0; //温度零下标志 0:零上,1:零下
if((temp.c[0]&0xf8)!=0x00)
{
sflag=1; // 零下标志位置1
temp.c[1]=~temp.c[1]; // 低8位取反
temp.c[0]=~temp.c[0]; // 高8位取反
tl_temp=temp.c[1]+1; // 低8位加1
temp.c[1]=tl_temp; // 计算后重新存入数组
if(tl_temp>255) temp.c[0]++; // 如果低8位大于255,向高8位进1
}

x=((temp.c[0]&0x07)*256+temp.c[1])*.625;
for(i=0;i<8;i++)
{
ct[i]=0;
}
i=0;
while(x/10)
{
ct[i]=x%10;
x=x/10;
i++;
}
ct[i]=x;

if(sflag==1) DisplayOneChar(xx-1,yy,0x2d);
else DisplayOneChar(xx-1,yy,0x20);
DisplayOneChar(xx, yy,ct[2]+0x30); // 显示温度十位数
DisplayOneChar(xx+1,yy,ct[1]+0x30); // 显示温度个位数
DisplayOneChar(xx+2,yy,0x2e); // 显示小数点
DisplayOneChar(xx+3,yy,ct[0]+0x30); // 显示温度小数位
DisplayOneChar(xx+4,yy,0x01); // 显示自定义字符
DisplayOneChar(xx+5,yy,0x43); // 显示字符"C"
}
/*****************************************************
函 数 名:void adjust_res()
功 能:温度分辨率调整
说 明:此函数可以对温度的显示进行精度调节.
入口参数:res
返 回 值:无
*****************************************************/
void adjust_res(char res) // res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
// 0.5, 0.25, 0.125
{
ow_reset(); // 复位
write_byte(0xcc); // 跳过Rom
write_byte(0x4e); // 写暂存器
write_byte(0x02); // 写TH
write_byte(0x01); // 写TL
write_byte(res); // 温度转换分辨率设置
ow_reset(); // 复位
write_byte(0xcc); // 跳过Rom
write_byte(0x48); // 把暂存器内容写到EPRam中
}
//==========================程序结束======================================================

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top