首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于学习使用DS18b20的有关问题

2012-05-27 
关于学习使用DS18b20的问题最近刚刚学习AVR单片机,组了个小组要做点东西,第一个就是DS18B20的问题。买了器

关于学习使用DS18b20的问题
最近刚刚学习AVR单片机,组了个小组要做点东西,第一个就是DS18B20的问题。
买了器件发现不会安装,不会使用。
通过看了视频和手册明白 这个温度传感器 时间和顺序的问题。
可能是没接触过的原因,代码不知道该怎么写。

我是新手,这是我的入门第一个要做的东西,读出温度。
希望能通过了解这个温度传感器的使用,为以后使用其他东西打好基础。
希望各位多多指点哦~~

[解决办法]
AVR会用吗?
不会用现跑起来,比如跑一个LED.

DS18B20的资料看了吗,没看懂,请继续,5遍,10遍,不懂的地方查资料。

检查硬件正确不。

如果你写了程序,你怎么知道读到的温度是多少?数码管。液晶屏显示,还是串口PC显示?还是调试状态下读取?

在论坛里我刚刚发了DS18B20的代码,项目上用过,PIC单片机的。
你移植过去就可以了。
代码如下:
上代码:
#include <pic.h>
#include "wash.h"

#define i_o RA0 //定义DS1302的数据口
#define sclk RA1 //定义DS1302的时钟口
#define rst RA2 //定义DS1302的复位口

// unsigned char time_rx; 定义某个变量到指定的地址
unsigned char time_rx @ 0x30; //定义接收寄存器
static volatile bit time_rx7 @ (unsigned)&time_rx*8+7; //接收寄存器的最高位
//static volatile bit temp0 @ (unsigned)&temp*8+0;

static void port_init(); //申明引脚初始化函数
void ds1302_init(); //申明DS1302初始化函数
void set_time(); //申明设置时间函数
void get_time(); //申明读取时间函数
void display(); //申明显示函数
void time_write_1(unsigned char time_tx); //申明写一个字节函数
unsigned char time_read_1(); //申明读一个字节函数

//定义待设置的时间:秒、分、时、日、月、星期、年、控制字
const char table[]={0x00,0x58,0x12,0x05,0x3,0x03,0x12,0x00};
//定义读取时间和日期存放表格
char table1[7];

//---------------------------
//主函数
void main_trc(void)
{
port_init(); //调用引脚初始化函数
ds1302_init(); //调用DS1302初始化函数
set_time(); //调用设置时间函数
while(1)
{
get_time(); //调用取时间函数
display(); //调用显示函数
}
}

//---------------------------------------------
//DS1302初始化函数
void ds1302_init()
{
sclk=0; //拉低时钟信号
rst =0; //复位DS1302
rst=1; //使能DS1302
time_write_1(0x8e); //发控制命令
time_write_1(0); //允许写DS1302
rst=0; //复位
}

//---------------------------------------------
//设置时间函数
void set_time()
{
int i; //定义循环变量

rst=1; //使能DS1302
time_write_1(0xbe); //时钟多字节写命令
for(i=0;i<8;i++) //连续写8个字节数据
{
time_write_1(table[i]); //调用写一个字节函数
}
rst=0; //复位
}

//---------------------------------------------
//读取时间函数
void get_time()
{
int i; //设置循环变量
  
rst=1; //使能DS1302
time_write_1(0xbf); //发送多字节读取命令
for(i=0;i<7;i++) //连续读取7个字节数据
{
table1[i]=time_read_1(); //调用读取1个字节数据的函数
}
rst=0; //复位DS1302
}

//--------------------------------------------
//写一个字节数据函数
void time_write_1(unsigned char time_tx)
{
int j; //设置循环变量

for(j=0;j<8;j++) //连续写8bit
{
i_o=0; //先设置数据为0
sclk=0; //时钟信号拉低
if(time_tx&0x01) //判断待发送的数据位是0或1
{
i_o=1; //待发送数据位是1
}
time_tx=time_tx>>1; //待发送的数据右移1位
sclk=1; //拉高时钟信号
}
sclk=0; //写完一个字节,拉低时钟信号
}

//---------------------------------------------
//读一个字节函数
unsigned char time_read_1()
{
int j; //设置循环变量
 
for(j=0;j<8;j++) //连续读取8bit
{
sclk=0; //拉低时钟信号
time_rx=time_rx>>1; //接收寄存器右移1位
time_rx7=i_o; //把接收到的数据放到接收寄存器的最高位
sclk=1; //拉高时钟信号
}
sclk=0; //拉低时钟信号
return(time_rx); //返回读取到的数据
}

//--------------------------------------------
//引脚定义函数
static void port_init()
{
TRISA &= ~0XD0; //RA0-RA2方向输出
}
//-------------------------------------------
//显示函数
//-------------------------------------------
void display()
{
char location = 0;
int i; //定义查表变量
//if(RB1==0) //判断RB1是否按下,如果按下的话显示日期,不按下显示时间
{
// table1[0]=table1[3]; //年月日
// table1[1]=table1[4];
// table1[2]=table1[6];
}
i=table1[0]&0x0f; //求秒的个位
location = 5; 
Disp_Num(i,2,location * 8 ,PAGE_LEFT);


  
i=table1[0]&0xf0; //求秒的十位
location = 4; 
Disp_Num(i/16 ,2,location * 8 ,PAGE_LEFT);


i=table1[1]&0x0f; //求分的个位
location = 3; 
Disp_Num(i,2,location * 8 ,PAGE_LEFT);

i=table1[1]&0xf0; //求分的十位
location = 2; 
Disp_Num(i/16,2,location * 8 ,PAGE_LEFT); // i=i>>4;

i=table1[2]&0x0f; //求时的个位
location = 1; 
Disp_Num(i,2,location * 8 ,PAGE_LEFT);

i=table1[2]&0xf0; //求时的十位
location = 0; 
Disp_Num(i/16,2,location * 8 ,PAGE_LEFT);
}

好用,验证过的

热点排行