程序(参考1)#include "reg52.h"#i" />
欢迎来到站长资源网!

站长资源网

当前位置: 主页 > wordpress >

单片机中使用DS18B20温度传感器C语言程序7ds18b20的

时间:2011-04-11 07:03来源:网友供稿 作者:programmer 点击:
单片机中施用DS18B20温度传感器C语言dedecms.com&kwtype=0&q=%25e7%25a8%258b%25e5%25ba%258f" target="_blank">程序(参考1)#include "reg52.h"#i
单片机中施用DS18B20温度传感器C语言dedecms.com&kwtype=0&q=%25e7%25a8%258b%25e5%25ba%258f" target="_blank">程序(参考1)#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp肯定是要声明为 int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码void TempDelay (uchar us){while(us--);}void delay(uint count) //延时子函数{uint i;while(count){i=200;while(i0)i--;count--;}}void init_dedecms.com&kwtype=0&q=com" target="_blank">com(){TMOD=0x20; //配备布置按时器1为标准样式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //开始工作按时器SM0=0; //串口通信标准样式配备布置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}void display(uint temp){uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上涨沿,排除锁存,显示响应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);}void ds_reset(void){ds=1;_nop_(); //1usds=0;TempDelay(80); //当总线停留在低电平超过480us,总线上所以器件都将被复位,这里//延时约530us总 线停留在低电平超过480μs,总线上的所有器件都//将被复位。_nop_();ds=1; //孕育发生复位电子脉冲后,微处理器释放总线,让总线处于空闲状况,原因查//18b20中文资料TempDelay(5); //释放总线后,以便从机18b20经由过程拉低总线来指示其是否在线,//存在检测高电日常平凡间:15~60us, 所以延时44us,进行 1-wire presence //detect(单线存在检测)_nop_();_nop_();_nop_();if(ds==0)flag=1; //detect 18b20 successelseflag=0; //detect 18b20 failTempDelay(20); //存在检测低电日常平凡间:60~240us,所以延时约140us_nop_();_nop_();ds=1; //再次拉高总线,让总线处于空闲状况}bit ds_read_bit(void) //读一名{bit dat;ds=0; //单片机(微处理器)将总线拉低_nop_(); //读时隙起始于微处理器将总线拉低至少1usds=1; //拉低总线后接着释放总线,让从机18b20能够接管总线,输出有效数据_nop_();_nop_(); //小延时一下,读取18b20上的数据 ,因为从ds18b20上输出的数据//在读"时间隙"降落沿出现15us内有效dat=ds; //dedecms.com&kwtype=0&q=com" target="_blank">com&kwtype=0&q=cms" target="_blank">cms.com&kwtype=0&q=dedecms" target="_blank">dedecms.com&kwtype=0&q=%25e4%25b8%25bb%25e6%259c%25ba" target="_blank">主机读从机18b20输出的数据,这些数据在读时隙的降落沿出现//15us内有效TempDelay(10); //所有读"时间隙"必须60~120us,这里77usreturn(dat); //归回有效数据}uchar ds_read_byte(void ) //读一字节{uchar value,i,j;value=0; //肯定是别忘了给初值for(i=0;i1); //这一步的申明在一个word文档里面}return(value); //归回一个字节的数据}void ds_write_byte(uchar dat) //写一个字节{uchar i;bit onebit; //肯定是不要忘了,onebit是一名for(i=1;i1;if(onebit) //写 1{ds=0;_nop_();_nop_(); //看时序图,至少延时1us,才孕育发生写"时间隙"ds=1; //写时间隙起头后的15μs内允许数据线拉到高电平TempDelay(5); //所有写时间隙必须最少持续60us}else //写 0{ds=0;TempDelay(8); //dedecms.com&kwtype=0&q=%25e4%25b8%25bb%25e6%259c%25ba" target="_blank">主机要天生一个写0 时间隙,必须把数据线拉到低电平并保持至少60μs,这里64usds=1;_nop_();_nop_();}}}void tem_change(){ds_reset();delay(1); //约2msds_write_byte(0xcc);ds_write_byte(0x44);}uint get_temperature(){float wendu;uchar a,b;ds_reset();delay(1); //约2msds_write_byte(0xcc);ds_write_byte(0xbe);a=ds_read_byte();b=ds_read_byte();temp=b;tempDS18B20//可以准确到0.0625度,所以读回数据的最低位代表的是 //0.0625度temp=wendu*10+0.5; //放大十倍,这样做的目的将小数点后第一名//也转换为可显示数字,同时进行一个四舍五入操作。return temp;}void main(){uint a;init_com();while(1){tem_change(); //12位转换时间最大为750msfor(a=10;a0;a--){display( get_temperature());}}} (责任编辑:站长资源网)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
栏目列表
推荐内容