您的位置: proteus仿真社区 >> 论坛 >> ARM仿真 >> 查看帖子
字体: 小 中 大 | 打印 发表于: 2008-8-11 12:03 作者: leshen750 来源: proteus仿真社区
最新回复
leshen750 (2008-8-11 12:08:59)
leshen750 (2008-8-11 14:56:44)
leotron (2008-8-11 22:27:12)
leshen750 (2008-8-13 08:26:02)
liuyimao4858 (2008-9-17 17:32:51)
carrick (2008-9-30 20:51:53)
machunshui (2008-10-04 20:36:25)
machunshui (2008-10-04 20:38:25)
http://www.proteus.com.cn/bbs/vi ... 2792&highlight=
qzc001617 (2008-10-11 16:13:49)
#define DS18B20 0x01 << 24 //P1.24
/**************************************************************
** 函数名称:void DS18B20_delay_us(Uint32 time)
** 输 入: time延进数量
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城 QQ:15716780
** 日 期: 2008_08_21
** 功能描述:延时1US 晶振: 12M
****************************************************************/
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)
** 输 入: 无
** 输 出: x 为0表示复位成功。1表示没有检测到DS18B20
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 初始化函数
******************************************************************/
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)
** 输 入:
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城 QQ:15716780
** 日 期: 2008_08_21
** 功能描述: 读一个字节
****************************************************************************/
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 DS18B20_WriteOneChar(unsigned char dat)
** 输 入: 无
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城 QQ:15716780
** 日 期: 2008_08_21
** 功能描述: 写一个字节
**********************************************************************************/
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); // 延时10us
IO1SET |= DS18B20; // 给脉冲信号
DS18B20_delay_us(75); //延时75us
}
else
{
IO1CLR |= DS18B20; // 给脉冲信号;
DS18B20_delay_us(75); // 延时75us
IO1SET |= DS18B20; // 给脉冲信号
DS18B20_delay_us(10); //延时10us
}
dat = dat >> 1;
}
}
/*********************************************************************************
** 函数名称:Ushort16 DS18B20_ReadTemperature(void)
** 输 入:
** 输 出: sdata 温度值
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城 QQ:15716780
** 日 期:
** 功能描述: 读取温度
*******************************************************************************/
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 = 0xffff;
return(sdata);
}
qzc001617 (2008-10-11 16:24:39)
/***************************************************************************
** 函数名称:void Dis_Lcd_Start(void)
** 输 入:
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城 QQ:15716780
** 日 期: 2008_08_21
** 功能描述: 读一个字节
****************************************************************************/
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(10); //此时间不能太大,大了就会不稳定
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);
}