微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于51单片机的ds18B20温度程序

基于51单片机的ds18B20温度程序

时间:10-24 来源:互联网 点击:
在学习板上正常运行,目前只能简单的检测温度。 温度变化速度有点慢,需要再调试。数码管显示还有点鬼影,暂时没想出来怎么去消鬼影。 没有添加温度上下限报警程序,没有添加按键可调温度程序,暂时不能显示小数部分。 以后还得继续努力把功能添加进去。
测得室温为31度

#include reg51.h> /************共阳LED段码表*****************/ unsigned char code tab[ ]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6}; /************端口定义*************/ sbit DQ=P3^6; //数据传输线接单片机的相应的引脚 sbit wx1=P1^0;sbit wx2=P1^1;sbit wx3=P1^2;sbit wx4=P1^3;/****************定义全局变量*******************/ unsigned char tempL=0; //临时变量低位 unsigned char tempH=0; //临时变量高位 float temperature; //温度值 /****************************************函数功能:延时子程序 入口参数:k 出口参数: *************************************************/ void delay(unsigned int k) { unsigned int n; n=0; while(n  k) {n++;} return; } /**********************************************函数功能:数码管扫描延时子程序 入口参数: 出口参数: **************************************************/ /*void delay1(void) { int k; for(k=0;k400;k++); } */void delay1(unsigned int m){unsigned int i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}/*******************************************函数功能:数码管显示子程序 入口参数:k 出口参数: ***********************************************/ void display(int k) { wx1=1; P2=tab[k/100]; delay1(3); P1=0x00;wx2=1; P2=tab[k%100/10]; delay1(3); P1=0x00;wx3=1; P2=tab[k%10]; delay1(3); P1=0x00;wx4=1; P2=tab[12]; delay1(3); P1=0x00;} /************************************************** 函数功能:DS18B20初始化子程序 入口参数: 出口参数: ***************************************************/ Init_DS18B20(void) { unsigned char x=0; DQ=1; //DQ先置高 delay(8); //延时 DQ=0; //发送复位脉冲 delay(85); //延时(>480ms) DQ=1; //拉高数据线 delay(14); //等待(15~60ms) } /*********************************************函数功能:向DS18B20读一字节数据 入口参数: 出口参数:dat ***********************************************/ ReadOneChar(void) { unsigned char i=0; unsigned char dat=0; for (i=8;i>0;i--) { DQ=1; delay(1); DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; delay(4); } return(dat); } /*********************************************函数功能:向DS18B20写一字节数据 入口参数:dat 出口参数: ***********************************************/ WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat0x01; delay(5); DQ=1; dat>>=1; } delay(4); } /**********************************************函数功能:向DS18B20读温度值 入口参数: 出口参数:temperature ************************************************/ ReadTemperature(void) { Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳过读序列号的操作 WriteOneChar(0x44); //启动温度转换 delay(125); //转换需要一点时间,延时 Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳过读序列号的操作 WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar(); //读出温度的低位LSB tempH=ReadOneChar(); //读出温度的高位MSB //温度转换,把高低位做相应的运算转化为实际温度 temperature=((tempH*256)+tempL)*0.0625; delay(200); return(temperature); } /*************************************************函数功能:主程序 入口参数: 出口参数: ***************************************************/ void main() { float i; while(1) { i=ReadTemperature(); display(i); } } 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top