**************************************************************************************************
ds18b20.h
*******************
dq 接
p2.2
*******************
#ifndef __ds18b20_h__
#define __ds18b20_h__
#include"msp430f2232.h"
*********************************
** 引脚定义 **
*********************************
#define dq_1 p2out |= bit2
#define
dq_0 p2out &= ~bit2
#define dq_in p2dir &=
~bit2
#define dq_out p2dir |= bit2
#define dq_val (p2in &
bit2)
**********************************
**** 命令字符定义 *****
**********************************
#define read_rom 0x33 //读rom
#define match_rom 0x55 //匹配rom
#define skip_rom
0xcc //跳过rom
#define search_rom 0xf0 //搜索rom
#define alarm_search 0xec //告警搜索
#define convert_temperature 0x44 //温度转换
#define read_scratchpad 0xbe //读暂存存储器9字节内容
#define write_scratchpad 0x4e //写暂存存储器,写的是th and tl
,接着发送两位数据就可以
*********************************
** 定义变量 **
*********************************
//extern unsigned int check_val;//初始化检测变量
//extern unsigned int
temp;//存放温度
//extern unsigned int temp_l;//存放温度低四位
//extern unsigned int
temp_h;//存放温度高四位
************************************
**** 函数定义 ****
************************************
extern void
ds18b20_port_init(void);
extern unsigned int ds18b20_init(void);
extern void ds18b20_write_byte(unsigned int
dat);
extern unsigned int ds18b20_read_byte(void);
extern unsigned int
get_one_temperature(void);
# endif
**************************************************************************************************
ds18b20.c
***********************
**** dq 接 p2.4 ***
***********************
#include"ds18b20.h"
void ds18b20_port_init(void)
{
p2dir =
bit2;
}
*******************************************************************************
ds18b20
操作时序:
1.ds18b20
初始化
2.对64位rom进行操作
读rom
搜索rom
跳过rom
告警搜索
3.对寄存器进行操作
包括读取温度……
4.精度默认的为0.0625
,无法重新设定,没找到相应的指令
相对应的转换时间为750ms
*******************************************************************************
*******************************************************************************
ds18b20
初始化方法:
1 主机发送 480 - 960 us 的低电平,释放总线
2 等待 15 - 60
us
3 检测dq上是否有低电平出现
有:复位成功 ,通常时间为
60-240 us
无:复位失败 , 继续等待
4
dq上出现低电平后,低电平持续15us,然后ds18b20开始对单片机发送的数据进行采样
*******************************************************************************
unsigned int ds18b20_init(void)
{
unsigned
check_val;
dq_out;
dq_0;
__delay_cycles(600);
dq_1;
__delay_cycles(60);
dq_in;
_nop();
if(dq_val==1)
{
check_val =
0; //初始化失败
}
if(dq_val==0)
{
check_val =
1; //初始化成功
}
__delay_cycles(10);
dq_out;
dq_1;
__delay_cycles(100);
return
check_val;
}
*******************************************************************************
ds18b20
写数据方法:
1 ds18b20 是“一位一位”的写‘0’和‘1’
2 每写一次‘1’或‘0’为一个周期,每个周期约为 45
- 60 us
3 dq拉低 1 us ,表示写周期开始,释放总线,让dq随写入的值变化
4 若写1:
dq拉高至少60us,保证在采样周期内采到的值均为高
5 若写0: dq拉低至少60us,保证在采样周期内采到的值均为低
6
释放总线
*******************************************************************************
*
单片机发送数据时,是从写的数据的最高位开始发送*
void ds18b20_write_byte(unsigned int dat)
{
unsigned
int i;
for(i = 0; i < 8;i )
{
dq_0;
__delay_cycles(2);
if(dat &
0x01)
dq_1;
else
dq_0;
__delay_cycles(60);
dat >>=
1;;
dq_1;
__delay_cycles(10);
}
}
**************************************************************************************************
ds18b20
读数据方法:
1 ds18b20 是“一位一位”的读‘0’和‘1’
2 每读一次‘1’或‘0’为一个周期,每个周期约为 45
- 60 us
3 dq拉低 1 us ,表示读周期开始,释放总线,让dq随ds18b20传送的值变化
4
若传1:则检测到高电平,持续时间为60us左右,所以检测一次后要延时60us,再检测下一位传送的数据
5
若传0:则检测到低电平,持续时间为60us左右
**************************************************************************************************
*ds18b20
传送数据也是从最高位开始传*
*所以单片机在接受数据时,存储变量一共移动8次,将所有数据都接收并回到最高位*
unsigned int ds18b20_read_byte(void)
{
unsigned
i;
unsigned int byte = 0;
for(i =
0;i < 8;i )
{
byte >>=
1;
dq_0;
__delay_cycles(2);
dq_1;
__delay_cycles(2);
dq_in;
_nop();
if(dq_val)
byte |= 0x80;
__delay_cycles(60);
dq_out;
dq_1;
__delay_cycles(10);
}
return byte;
}
*******************************************************************************
当用一个ds18b20进行温度测量时步骤
1.初始化
2.跳过rom
3.控制寄存器: 温度转换 ,读取rom , 读取温度低8位 , 温度高8位
注意的是,一定要初始化两次
*******************************************************************************
unsigned int get_one_temperature(void) //只读取了整数,没读取小数的部分
{
unsigned int temp_l,temp_h,temp;
ds18b20_init();
ds18b20_write_byte(skip_rom);
ds18b20_write_byte(convert_temperature);
__delay_cycles(500000);
ds18b20_init();
ds18b20_write_byte(skip_rom);
ds18b20_write_byte(read_scratchpad);
temp_l=ds18b20_read_byte();
temp_h=ds18b20_read_byte();
temp_l>>=4;
temp_h<<=4;
temp=temp_h temp_l;
return temp;
}
**************************************************************************************************
lcd1602.h
************************
p1 口为数据端口
rs 接 p2.0
rw 外接地
en 接
p2.1
*************************
#ifndef __lcd1602_h__
#define __lcd1602_h__
//#include"msp430g2553.h"
#include"msp430f2232.h"
******************************
引脚定义
******************************
#define rs_0 p2out &= ~bit1
#define rs_1 p2out |= bit1
#define en_0
p2out &= ~bit0
#define en_1 p2out |= bit0
***********************************************************
函数定义
***********************************************************
extern void lcd1602_port_init(void);
extern void
lcd1602_write_command(unsigned int com);
extern void
lcd1602_write_data(unsigned int dat);
extern void lcd1602_init(void);
extern void lcd1602_set_position(unsigned int x,unsigned int y);
extern
void lcd1602_write_string(unsigned int x,unsigned int y,unsigned char
*str);
extern void lcd1602_display_temperature(unsigned int x,unsigned int
y,unsigned int temp,unsigned int lit);
extern void
lcd1602_write_varia(unsigned int x,unsigned int y,unsigned int varia,unsigned
int n);
#endif
**************************************************************************************************
lcd1602.c
#include"lcd1602.h"
**********************************
数字变量显示定义
***********************************
char digital[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
void lcd1602_port_init(void)
{
p1dir = 0xff;
p2dir |=
bit0 bit1 ;
}
void lcd1602_write_command(unsigned int
com)
{
rs_0;
p1out=com;
__delay_cycles(500);
en_1;
__delay_cycles(500);
en_0;
}
void lcd1602_write_data(unsigned int dat)
{
rs_1;
p1out=dat;
__delay_cycles(500);
en_1;
__delay_cycles(500);
en_0;
}
void lcd1602_init(void)
{
lcd1602_write_command(0x38); //5*7点阵,双行显示
lcd1602_write_command(0x0c); //0x0f 有光标,
lcd1602_write_command(0x01); //清屏
lcd1602_write_command(0x06); //写入数据后,光标右移,显示屏不动
}
void lcd1602_set_position(unsigned int x,unsigned int y)
{
if(x==1)
lcd1602_write_command(0x80 y);
if(x==2)
lcd1602_write_command(0x80 0x40 y);
}
void lcd1602_write_string(unsigned int x,unsigned int y,unsigned char
*str)
{
__delay_cycles(1000);
lcd1602_set_position(x,y);
while(*str!='\0')
{
lcd1602_write_data(*str);
str ;
}
}
void lcd1602_display_temperature(unsigned int x,unsigned int y,unsigned int
temp,unsigned int lit)
{
lcd1602_set_position(x,y);
lcd1602_write_data(digital[temp/10]);
lcd1602_write_data(digital[temp]);
lcd1602_write_data('.');
lcd1602_write_data(digital[lit/10]);
lcd1602_write_data(digital[lit]);
lcd1602_write_data('c');
}
void lcd1602_write_varia(unsigned int x,unsigned int y,unsigned int
varia,unsigned int n)
{
__delay_cycles(1000);
lcd1602_set_position(x,y);
switch(n)
{
case 1 : lcd1602_write_data(digital[varia]); break;
case 2
:
lcd1602_write_data(digital[varia/10]);
lcd1602_write_data(digital[varia]);break;
case 3 :
lcd1602_write_data(digital[varia/100]);
lcd1602_write_data(digital[varia0/10]);
lcd1602_write_data(digital[varia]); break;
case 4 :
lcd1602_write_data(digital[varia/1000]);
lcd1602_write_data(digital[varia00/100]);
lcd1602_write_data(digital[varia00/10]);
lcd1602_write_data(digital[varia]);break;
}
}
**************************************************************************************************
main.c
#include "lcd1602.h"
#include "ds18b20.h"
int main( void )
{
// stop watchdog timer to prevent time out
reset
wdtctl = wdtpw wdthold;
p1dir =0xff;
p2dir
= bit0 bit1 bit2;
unsigned int t;
lcd1602_init();
ds18b20_init();
while(1)
{
t=get_one_temperature();
lcd1602_write_string(1,1,"the temprature
");
lcd1602_write_string(2,0,"is");
lcd1602_display_temperature(2,3,t,t);
}
}
**************************************************************************************************
仿真结果:
**************************************************************************************************
『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』