PIC入门6,DS18B20测温度

发布者:Leishan最新更新时间:2016-10-31 来源: eefocus关键字:PIC入门  DS18B20  测温度 手机看文章 扫描二维码
随时随地手机看文章
程序如下:

//PIC C DS18B20测温,LCD显示.c 时间:2008-8-20 
//适合3ePIC实验板
//C语言写的温度计,DS18B20测温,LCD显示,显示到0.1度
//USING 16F877 READ MAXIM DS18b20 AND DISPLAY ON LCD1602 */


#include

//连线说明
#define LCDRS RB1
#define LCDRW RB2
#define LCDE RB3
#define LCDDATA PORTD

#define DSDQ RB0      /* 连接ds18b20 */
#define TRISDQ TRISB0


//函数定义
void lcdinit();       //双线模式 
void wcmd (char cmd);
void wdata (char data);
void poscursor(char line, char col);
void print(char *s);

void lcdbusy();
void delay ( int t);

void itoa10(unsigned char *buf, int i);
int strlen (const char *s);
void dsinit();
void wdscmd(char cmd);
float dsread ();

//实数定义
char bank1 title[]= "Temperature is";

char dsfound[]="DS1820 FOUND";
char dsnotfound[]="DS1820 NOT FOUND";
char bank1 blank[]= " ";


// LCD 命令定义
#define CLRLCD 0X01
#define LCDMOD 0X38 /* 8 BIT, TWO LINE, 5X7 DOT MATRIX */
#define TURNON 0X0F /* turn on LCD, CURSOR, BLINKING */
#define CURMODE 0X06 /* character don't move, cursor move right automaticall */

// DS1820 命令定义 
#define SKIPROM 0XCC
#define READSCRACHPAD 0XBE
#define TCONVERT 0X44

/* ORIGINAL CURSOR POSITION */
#define ORG1 0X80
#define ORG2 0XC0


//TMR0 中断
static int count;
#define PRETMR0 210 // 50us时间间隔 
float temperature;

#define DSRESET 10
#define DSRECOVER 1

char bank1 atemperature[10];  // 数子温度
//主函数
void main()
{
int len;
ADCON1=0X07;    //设置端口A为I/O

lcdinit();

print(title);
LCDE=0; /* 当 LCDE=0,LCD不起作用,操纵DS1820 */

/* 中断TIMER0 */
OPTION=0B11001111; // bit5=0,利用内部循环时钟 
TMR0IE=1; //timer0 使能端
PEIE=0; //关闭所有外设中断
GIE=1; //开总中断
poscursor(1,0);
while (1) { 
dsinit();
wdscmd(SKIPROM);
wdscmd(TCONVERT);

TRISDQ=0;
DSDQ=0;
TRISDQ=1;
while(1) 
{      //转换是否完成
if (DSDQ) 
break; 
else 
continue;
}
dsinit();
wdscmd(SKIPROM);
wdscmd(READSCRACHPAD);
temperature=dsread(); // 读温度

itoa10(atemperature, (int) (temperature * 10)); //itoa10只有是正数时起作用
// 所以乘以10,扩大10倍,然后增加小数点 
// 再最后一个数前增加小数点
len=strlen(atemperature);
atemperature[len]=atemperature[len-1];
atemperature[len-1]='.';
atemperature[len+1]=0;

poscursor(0,0);
print (title);
poscursor(1,0);
print (blank);
poscursor(1,2);
print (atemperature);
print (blank);
delay(10000); //再得到新的温度前延时10000*50 us=0.5 s 
}

 

}
//延时函数
void delay (int t){
count=0; // 重设置中断 timer 0 */
TMR0=PRETMR0;
while (count }

static void interrupt isr(void) // 中断函数
{
if(TMR0IF) // 中断是否溢出
count++; // Add 1 to count - insert idle comment
TMR0IF = 0; // 清除中断标志位
TMR0=PRETMR0;
}

int strlen(const char * s)
{
const char *cp;

cp = s;
while(*cp++)
continue;
return cp-s-1;
}

void print(char *s){
int len;
int atmp;
len=strlen(s);
for (atmp=0; atmp wdata(s[atmp]);
}


// 检查总线是否忙
void lcdbusy(){
// char tmpbusy;
TRISB &= 0xF1;
TRISD=0XFF;
LCDRS=0;
LCDRW=1; 
LCDE=1; /* SET the LCD read/writing operation IN TO IDLE */
while(LCDDATA & 0X80);
}

/* 光标, line= 0 for first line, or 1 for second line,col=0 - 15 ;*/
void poscursor(char line, char col){
char pos;
lcdbusy();
pos = line * 0X40 + 0X80 + col;
wcmd(pos);
}
//写数据
void wdata(char data) {

lcdbusy();
TRISB & =0XF1;
TRISD=0;
LCDDATA=data;
LCDRS=1;
LCDRW=0;
LCDE=0;
asm("NOP");
asm("NOP");
LCDE=1;
}
//写命令
void wcmd(char cmd){

lcdbusy();
TRISB & =0XF1;
TRISD=0;
LCDDATA=cmd;
LCDRS=0;
LCDRW=0;
LCDE=0;
asm("NOP");
asm("NOP");
LCDE=1;
}
//LCD初始化
void lcdinit() {
lcdbusy();
TRISB &= 0XF1;
TRISD=0;

wcmd(CLRLCD); 
wcmd(LCDMOD);
wcmd(TURNON);
wcmd(CURMODE); 
poscursor(0,0); // 设置光标的起点
}

//DS18B20初始化设置,RB0连接DQ
void dsinit(){
TRISDQ=0;
DSDQ=0;
delay(20); //保持DSDQ低为10*50 us,重启DS1820 */
TRISDQ=1; 
delay(1); //延时,跳出采样窗口


 if (!DSDQ) /* sample window between min end:15+60, max begin,60 */
/* garrente sample window is between 60 to 75 us */
print(dsfound);
else 
print(dsnotfound);
delay(10); //延时480us
}

/* write command to DS1820*/

void wdscmd(char cmd)
{
char tmp;
char i;
TRISDQ=0;
for(tmp=8;tmp>0;tmp--) 
{
TRISDQ=0;
DSDQ= 0;
asm ("NOP");
asm ("NOP");
asm ("NOP");
asm ("NOP");
asm ("NOP");
if (cmd & 0x01) 
{
TRISDQ=1; //释放总线
delay(1); //延时60 us  
for (i=5;i>0;i--);
}
else {
DSDQ=0 ;
delay(1);
for (i=5;i>0;i--); 
TRISDQ=1;
}
cmd=cmd/2;
}
}

//读温度
float dsread () {
char tmp=0x01;
float t;
union{
char c[2];
int x;
}temp;
temp.x=0;

while (tmp){ //读8字节
TRISDQ=0;
DSDQ=0;
asm("NOP");
TRISDQ=1; // 释放总线

if (DSDQ) // "1" presented
temp.c[0] |= tmp;
tmp=tmp<<1;
delay(2);
}
tmp=1;
while (tmp){ // 读八字节
TRISDQ=0;
DSDQ=0;
asm("NOP");

TRISDQ=1; // 释放总线 
asm("NOP");


if (DSDQ) // "1" presented
temp.c[1] |= tmp;
tmp=tmp<<1;
delay(2);
}
t=((float) temp.x)/16.0 ;
return t;
}

 

/* Convert integer 'i', radix 10 to a string */
void itoa10(unsigned char *buf, int i) {
unsigned int rem;
unsigned char *s,length=0;

s = buf;
if (i == 0) 
*s++ = '0'; 
else { 
if (i < 0) {
*buf++ = '-';
s = buf;
i = -i;
}
while (i) 
{
++length;
rem = i % 10;
*s++ = rem + '0';
i /= 10;
}
for(rem=0; ((unsigned char)rem) {
*(buf+length) = *(buf+((unsigned char)rem));
*(buf+((unsigned char)rem)) = *(buf+(length-((unsigned char)rem)-1));
*(buf+(length-((unsigned char)rem)-1)) = *(buf+length);
}
}
*s=0;
}

关键字:PIC入门  DS18B20  测温度 引用地址:PIC入门6,DS18B20测温度

上一篇:PIC入门7,MAX518的IIC通信实验
下一篇:PIC入门汇编程序集锦

推荐阅读最新更新时间:2024-03-16 15:18

stm32 ds18b20 温度传感器
举例 void DS18B20_in() { GPIO_InitTypeDef gpio = { GPIO_Pin_11, GPIO_Speed_50MHz, GPIO_Mode_IPD }; GPIO_Init(GPIOG, &gpio); } void DS18B20_out() { GPIO_InitTypeDef gpio = { GPIO_Pin_11, GPIO_Speed_50MHz, GPIO_Mode_Out_PP }; GPIO_Init(GPIOG, &gpio); } u8 DS18B20_c
[单片机]
stm32 <font color='red'>ds18b20</font> <font color='red'>温度</font>传感器
基于51单片机及DS18B20温度传感器数码管显示程序
#include reg52.h #include intrins.h sbit DQ=P1^4;//温度采集 sbit latch1=P2^2;//段锁存 sbit latch2=P2^3;//位锁存 unsigned char code dofly_DuanMa ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码0~9 unsigned char code dofly_WeiMa ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//点亮数码管 unsigned char TempData ;//存储显示的度数 bit Re
[单片机]
单片机练习 - 使用1602LCD显示DS18B20温度
关于DS18B20电子温度器件可查看单片机练习 - DS18B20温度转换与显示 . 本文主要讲述如何使用LCD. 具体过程解释可查看代码注释. 程序代码: 1602LCD 1 //1602液晶显示程序, TX-1B实验板上的1602LCD的R/W读写端接地, 即始终只写, 不读数据 2 //使用1602LCD显示DS18B20转换的温度值 3 #include reg52.H 4 #include intrins.H 5 #include math.H 6 7 #define uchar unsigned char 8 #define uint unsigned int 9 sbit dula = P2^6;
[单片机]
单片机练习 - 使用1602LCD显示<font color='red'>DS18B20</font>的<font color='red'>温度</font>值
基于ARM和DS18B20的数字测温系统
0 前言   热误差是数控机床的最大误差源,数控机床的温度测试为机床热误差的补偿提供依据。传统的测温方案是将模拟信号通过电缆远距离传输至数据采集卡进行A/D转换并处理,实用中必须解决长线传输和模拟量传感器布线等问题。本文介绍了一种新型的设计方案,控制器采用SAMSUNG公司的32位ARM微控制器S3C44BOX,温度传感器采用单总线数字温度传感器DS18B20。采用数字温度传感器即在测试点完成了信号的数字化,提高了传输的可靠性,同时简化了外围电路,也便于传感器在机床上的布置安装。ARM处理器控制数字温度信号的采集,并与上位PC机通讯,同时其他硬件资源提供热补偿系统其他功能。本文在介绍数字温度传感器DS18B20的基础上,
[单片机]
基于ARM和<font color='red'>DS18B20</font>的数字测温系统
Microchip推出PIC32蓝牙®入门工具包
轻松开发恒温器、无线游戏控制器、条形码扫描仪及诊断工具等蓝牙功能产品。 全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商——Microchip Technology Inc.(美国微芯科技公司)宣布推出全新的PIC32 蓝牙®入门工具包。这一全功能工具包提供一颗PIC32 单片机(MCU)、基于HCI的蓝牙无线通信、Cree高输出多色LED、3个标准单色LED、模拟三轴加速计、模拟温度传感器和5个供用户自定义输入的按钮。此外,有了PICkit™ On Board(PKOB),就无需外部调试器/编程器。通过PKOB、USB连接和GPIO可实现蓝牙SPP、USB及其他通用应用的快速开发。该入门工具包还
[网络通信]
单片机DS18B20数字温度报警器Proteus仿真+代码详细注释
现呈上一份关于c51数字温度报警器的压缩包,我的设计报告,望各位大佬指点。 单片机源程序如下: #include reg52.h //包含reg52.h库文件 #include math.h //包含绝对值函数 #define uint unsigned int //宏定义uint #define uchar unsigned char //宏定义uchar sbit lcden=P2^0; //液晶使能端 sbit lcdr
[单片机]
单片机<font color='red'>DS18B20</font>数字<font color='red'>温度</font>报警器Proteus仿真+代码详细注释
基于DS18B20的智能温度测量装置
作者Email: jsmo739@yeah.net 一、前言 温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:①传统的分立式温度传感器,②模拟集成温度传感器,③智能集成温度传感器。目前,国际上新型温度传感器正从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展。文章将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89C2051单片机为控制器构成的温度测量装置的工作原理及程序设计作了详细的介绍。该装置适用于
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved