📄 arm lpc2148 ds18b20 rtc.c
字号:
#include "lcd.h"
#include "config.h"
#define DS18B20 0x01 << 24 //P1.24
Uchar8 DS18B20_finger;
Uint32 DS18B20_num;
/******************************************************************************************************************
* 函数名称:LCM12864_Delay()
* 功 能:软件延时函数。用于LCM12864显示输出时序控制。
* 入口参数:无
* 出口参数:无
*******************************************************************************************************************/
void DS18B20_delay_us(Uint32 time)
{
Uint32 i,j;
for(i=0;i<8;i++)
{
for(j=1;j<time;j++)
{
;
}
}
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
void RTC_Setup(Uchar8 *rtc) //更改系统时间
{
Str_Date *p;
p = (Str_Date *)rtc;
RTC_Time.SYear = p->SYear;
RTC_Time.SMonth = p->SMonth;
RTC_Time.SDay = p->SDay;
RTC_Time.SHour = p->SHour;
RTC_Time.SMin = p->SMin;
RTC_Time.SSec = p->SSec;
CCR = 0x00; //禁止时间计数器
YEAR = p->SYear;
MONTH = p->SMonth;
DOM = p->SDay;
// DOW = p->SDay;
HOUR = p->SHour;
MIN = p->SMin;
SEC = p->SSec;
CCR = 0x11; //使用独立振荡器,并启动RTC
CIIR = 0x01; //设置秒值的增量产生一次中断
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
void RTC_Init(void)
{
// PREINT = Fpclk / 32768 - 1; //设置基准时钟分频器
// PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
CCR = 0x00; //禁止时间计数器
YEAR = 2008;
MONTH = 1;
DOM = 1;
DOW = 4;
HOUR = 0;
MIN = 0;
SEC = 59;
CCR = 0x12; //使用独立振荡器,并启动RTC
CIIR = 0x01; //设置秒值的增量产生一次中断
ILR = 0x03; //清除中断标志位
CCR = 0x11; //使用独立振荡器,并启动RTC
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
void RTC_Read(void)
{
Uint32 times, datas;
times = CTIME0; //读取完整的时钟寄存器
datas = CTIME1;
RTC_Time.SYear = (datas >> 16) & 0xfff; //获取年
RTC_Time.SMonth = (datas >> 8) & 0x0f; //获取月
RTC_Time.SDay = datas & 0x1f; //获取月
RTC_Time.SHour = (times >> 16) & 0x1f; //获取时
RTC_Time.SMin = (times >> 8) & 0x3f; //获取分
RTC_Time.SSec = times & 0x3f; //获取秒
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
void Timer0_Init(void)
{
T0TC = 0; //定时器设置0。
T0PR = 0; //时钟不分频
T0MCR = 0x03; //设置T0MR0匹配后复位T0TC,并产生中断标志
T0MR0 = (Fpclk / 1000000) * 10; //定时0.5S
T0TCR = 0x01; //启动定时器
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
void __irq Timer0_IRQ(void)
{
T0IR = 0x01; //清除中断标志位
// if(IO0PIN & TX0) IO0CLR |= TX0;
// else IO0SET |= TX0;
if(DS18B20_finger)
{
DS18B20_num--;
if(DS18B20_num == 0)
{
DS18B20_finger = 0;
}
}
VICVectAddr = 0x00; // 中断处理结束
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
//初始化函数
Uchar8 DS18B20_Reset(void)
{
Uint32 Temp_DS18B20; //设置LCD控制引脚为输出
Uchar8 x=0;
Temp_DS18B20 = DS18B20;
IO1DIR |= DS18B20; //设置引脚为输出
IO1SET |= DS18B20; //Temperature_RW 拉高总线
DS18B20_delay_us(2);
IO1CLR |= DS18B20; //将Temperature_RW拉低
DS18B20_delay_us(650); //精确延时 大于 480us
IO1SET |= DS18B20; //Temperature_RW 拉高总线
DS18B20_delay_us(60);
IO1DIR &= (~Temp_DS18B20); //转为输入
x=(IO1PIN & DS18B20) >> 24; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
DS18B20_delay_us(480); //精确延时 大于 480us
return(x);
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
//读一个字节
unsigned char DS18B20_ReadOneChar(void)
{
unsigned char i,dat;
Uint32 Temp_DS18B20; //设置LCD控制引脚为输出
dat = 0;
Temp_DS18B20 = DS18B20;
IO1DIR |= DS18B20; //设置引脚为输出
for (i=1;i<=8;i++)
{
dat>>=1;
IO1DIR |= DS18B20; //设置引脚为输出
IO1SET |= DS18B20; // 给脉冲信号
DS18B20_delay_us(2);
IO1CLR |= DS18B20; //将Temperature_RW拉低
DS18B20_delay_us(10);
IO1SET |= DS18B20; // 给脉冲信号
DS18B20_delay_us(15);
IO1DIR &= (~Temp_DS18B20); //转为输入
if(IO1PIN & DS18B20) //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
dat |= 0x80; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
DS18B20_delay_us(60); //延时60us左右
}
IO1DIR |= DS18B20; //设置引脚为输出
IO1SET |= DS18B20; // 给脉冲信号
return (dat);
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
//写一个字节
void DS18B20_WriteOneChar(unsigned char dat)
{
unsigned char j, testb;
IO1DIR |= DS18B20; //设置引脚为输出
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
if (testb)
{
IO1CLR |= DS18B20; // 给脉冲信号
DS18B20_delay_us(10); // 延时4us
IO1SET |= DS18B20; // 给脉冲信号
DS18B20_delay_us(75); //延时75us
}
else
{
IO1CLR |= DS18B20; // 给脉冲信号;
DS18B20_delay_us(75); // 延时4us
IO1SET |= DS18B20; // 给脉冲信号
DS18B20_delay_us(10); //延时75us
}
dat = dat >> 1;
}
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
//读取温度
Ushort16 DS18B20_ReadTemperature(void)
{
Uchar8 DS18B20_flag[2];
Uchar8 tempL = 0;
Uchar8 tempH = 0;
Ushort16 sdata; //测量到的温度的整数部分
Uchar8 TEMP_Flag, xiaoshu; //小数第一位
fp32 xiaoshu1;
DS18B20_flag[0] = DS18B20_Reset(); //初始化
DS18B20_WriteOneChar(0xcc); //跳过读序列号的操作
DS18B20_WriteOneChar(0x44); //启动温度转换
DS18B20_delay_us(1000); //转换需要一点时间,延时
DS18B20_flag[1] = DS18B20_Reset(); //初始化
DS18B20_WriteOneChar(0xcc); //跳过读序列号的操作
DS18B20_WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL = DS18B20_ReadOneChar(); //读出温度的低位LSB
tempH = DS18B20_ReadOneChar(); //读出温度的高位MSB
if((DS18B20_flag[1] == 0) && (DS18B20_flag[1] == 0))
{
if(tempH>0x7f) //最高位为1时温度是负
{
tempL=~tempL; //补码转换,取反加一
tempH=~tempH+1;
TEMP_Flag =1; //为负数时,将TEMP_Flag =1
}
else
{
TEMP_Flag =0; //为正数时,将TEMP_Flag =0
}
sdata = (tempL /16) | ((tempH & 0x07) *16); //整数部分
xiaoshu1 = ((tempL&0x0f) * 0.0625) * 10; //小数第一位
xiaoshu = (Uchar8)xiaoshu1;
sdata = sdata * 10 + xiaoshu; //一位小数点,所以要放大10 倍
if(TEMP_Flag) //最高位表示下负号
{
if(sdata > 9999)
{
sdata = 9999;
}
sdata = sdata | 0x8000;
}
}
else sdata = 0;
return(sdata);
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
void RTC_Update(void)
{
RTC_Read();
Temperature_num = DS18B20_ReadTemperature();
switch(Screen_num)
{
case 0: //显示数据界面
WR_Date(1, Time16_addr_x, Time16_addr_y, (Uchar8 *)&RTC_Time.SYear); //显示16*8的时间
WR_temperature(1, Temperature_num); //显示16*8的温度
break;
case 1: //显示启动界面
WR_Date(1, Time16_addr_x, Time16_addr_y, (Uchar8 *)&RTC_Time.SYear); //显示16*8的时间
WR_temperature(1, Temperature_num); //显示16*8的温度
break;
case 2: //显示启动系统设置界面
WR_Date(1, Time16_addr_x, Time16_addr_y, (Uchar8 *)&RTC_Time.SYear); //显示16*8的时间
WR_temperature(1, Temperature_num); //显示16*8的温度
break;
case 3: //显示数据界面
WR_Date(0, Time8_addr_x, Time8_addr_y, (Uchar8 *)&RTC_Time.SYear); //显示8*8的时间
WR_temperature(0, Temperature_num); //显示8*8的温度
break;
case 4: //显示测试界面
WR_Date(1, Time16_addr_x, Time16_addr_y, (Uchar8 *)&RTC_Time.SYear); //显示8*8的时间
WR_temperature(1, Temperature_num); //显示8*8的温度
break;
case 5: //显示提界面,是否保存当前数据
break;
case 6: //显示历史数据界面
WR_Date(0, Time8_addr_x, Time8_addr_y, (Uchar8 *)&RTC_Time.SYear); //显示8*8的时间
WR_temperature(0, Temperature_num); //显示8*8的温度
break;
case 7: //册除历史数据界面
break;
case 8: //密码提示界面
break;
}
}
/*********************************************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
T_Type显示类型 0表示8*8的字体,1表示16*8的字体
Date_time显示的温度.
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
void __irq RTC_IRQ(void)
{
ILR = 0x03; //清除中断标志位
VICVectAddr = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -