⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arm lpc2148 ds18b20 rtc.c

📁 1.ARM芯片LPC2148的RTC源码 2.ARM芯片LPC2148的DS18B20C驱动源码 3.ARM芯片LPC2148的TIMER0中断驱动源码
💻 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 + -