|
楼主 |
发表于 2014-6-13 17:23:19
|
显示全部楼层
不好意思我把原理图上传一下,因为AQY210EH跟光耦的封装一样所以原理图中用光耦代替,DS18B20夹在锁紧座上。
DS18B20主要程序
/************************************************
*函数名称: void DS1820_Init(void)
*入口参数: 无
*出口参数: 无
*函数功能: ds18b20初始化
*创建时间: 2012-02-03
*修改说明:
/************************************************/
void DS1820_Init(void)
{
DDRD|=BIT(5); //设置端口为输出方式
PORTD|=BIT(5); //释放总线
delayus(88); //稍作延时
PORTD&=(~BIT(5)); //拉低总线
delayus(1000); //延时480~960us
PORTD|=BIT(5); //释放总线
DDRD&=(~BIT(5)); //设置端口为输入方式
delayus(25); //延时15~60us
while(!(PIND&BIT(5))); //等待复位成功
DDRD|=BIT(5); //恢复端口为输出方式
PORTD|=BIT(5); //释放总线
delayus(450); //延时60~240us
}
/************************************************
*函数名称: void DS1820_w_char(uchar dat)
*入口参数: 一个字节
*出口参数: 无
*函数功能: 写一个字符
*创建时间: 2012-02-03
*修改说明:
/************************************************/
void DS1820_w_char(uchar dat)
{
uchar i;
for(i=0;i<8;i++) //8位数据计数
{
DDRD|= BIT(5); //设置端口为输出方式
PORTD&=(~BIT(5)); //拉低总线
delayus(25); //延时
if(dat&0x01) //当前位是否是1
{
PORTD|=BIT(5); //是1,拉高总线
}
else
{
PORTD&=(~BIT(5)); //不是1而是0,拉低总线
}
delayus(88); //延时
PORTD|=BIT(5); //释放总线
dat>>=1; //数据右移1位,为送出新数据位做准备
}
PORTD|=BIT(5); //释放总线
}
/************************************************
*函数名称: unsigned char DS1820_r_char(void)
*入口参数: 无
*出口参数: 一个字节
*函数功能: 读一个字符
*创建时间: 2012-02-03
*修改说明:
/************************************************/
unsigned char DS1820_r_char(void)
{
uchar i,dat=0; //定义一下,供后续程序使用
for(i=0;i<8;i++)
{
DDRD|= BIT(5); //设置端口为为输出方式
dat>>=1; //保存读入的数据位
PORTD|= BIT(5); //给脉冲
delayus(8); //调整脉宽
PORTD&=(~BIT(5)); //结束脉冲
delayus(25); //延时
PORTD|=BIT(5); //释放总线
DDRD&=(~BIT(5)); //设置端口为输入方式,准备读数据
if(PIND&BIT(5))
{
dat|=BIT(7); //读入高电平信号
}
else
{
dat&=(~BIT(7)); //读入低电平信号
}
delayus(88); //延时
}
DDRD|=BIT(5); //恢复总线端口为输出方式
return dat;
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|