**************************************************************************************************
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);
}
}
**************************************************************************************************
仿真结果:
**************************************************************************************************
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』