找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1861|回复: 0
打印 上一主题 下一主题
收起左侧

数字温度计

[复制链接]
跳转到指定楼层
楼主
ID:149266 发表于 2016-11-21 17:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//程序:ex6_2_1.c
//功能:数字温度计
#include "reg51.h"
#include "intrins.h"  //包含内部函数头文件intrins.h
#define uchar unsigned char
#define uint unsigned int
#define out P2
sbit smg1=P3^1;               //温度个位位选端
sbit smg2=P3^0;                  //温度十位位选端
sbit DQ=P3^7;            //温度采集
void delay5us(uchar n);     //精确延时n*5us子程序
void delayms(uint j);
void init_ds18b20(void); //总线初始化复位
uchar readbyte(void);    // 读取一个字节
void writebyte(uchar);   //写一个字节
uchar readtemp(void);   //读取温度
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管显示"0-9"字型码
void main(void)
{uchar i;
uchar temp;
temp=readtemp();         //读取转换的温度
delayms(1000);
while(1)
        {
                  temp=readtemp();         //读取转换的温度
        for(i=0;i<10;i++)        //连续扫描数码管10次
         {
                 out=led[temp/10];         //显示温度十位
                 smg1=0;
                 smg2=1;
                 delay5us(200);        //延时1ms
                 out=0xff;
                 out=led[temp%10];        //显示温度个位
                 smg1=1;
                 smg2=0;
                 delay5us(200);        //延时1ms
                 out=0xff;

        }

}
}
//函数名:delay5us
//函数功能:精确延时5us子程序
//形式参数:延时时间参数n,unsigned char 类型
//返回值:无       
void delay5us(unsigned char n)
{         do
         {
         _nop_();
         _nop_();
         _nop_();
         n--;
         }
         while(n);
}

//函数名:init_ds18b20
//函数功能:         总线初始化复位
//形式参数:无
//返回值:无
void init_ds18b20(void)
{
         uchar x=0;
         DQ=1;
         delay5us(10);
         DQ =0;   
         delay5us(120);                 //低电平480-960s
         DQ =1;                   
         delay5us(16);           //等待50-100s
         x=DQ;   
         delay5us(80);
         DQ=1;

         }

//函数名:readbyte
//函数功能:         读取一个字节
//形式参数:无
//返回值:读取字节数据date, unsigned char 类型
uchar readbyte(void)
{
        uchar i=0;
        uchar date=0;
        for (i=8;i>0;i--)
         {
                  DQ =0;
                  delay5us(1);
                  DQ =1;            //15微秒内拉释放总线
                  date>>=1;
                  if(DQ)
                  date|=0x80;
                  delay5us(11);        //读完需要45us的等待
         }
        return(date);
}

//函数名:writebyte
//函数功能:         写一个字节
//形式参数:写字节数据dat, unsigned char 类型
//返回值:无
void writebyte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
         {
          DQ =0;
          DQ =dat&0x01;  //写"1" 在15微秒内拉低
          delay5us(12);           //写"0" 拉低60微秒等待写完
          DQ = 1;                   //恢复高电平,至少保持1us
          dat>>=1;                //下次写作准备,移位数据
          delay5us(5);        //延时25us
          }
}
//函数名: readtemp
//函数功能:读取温度
//形式参数:无
//返回值:单字节的温度值tt, unsigned char 类型

uchar readtemp(void)
{
        uchar templ,temph,tt;
        uint t;
        init_ds18b20();
        writebyte(0xCC);         
        writebyte(0x44);        //跳过ROM匹配,跳过读序列号的操作,可节省操作时间
        init_ds18b20();                //开始操作前需要复位                 
        writebyte(0xCC);
        writebyte(0xBE);   //读暂存器中的温度值
        templ=readbyte();         //分别读取温度的低、高字节
        temph=readbyte();
        t=temph;
        t<<=8;
        t=t|templ;
        tt=t*0.0625;         //温度转换
        return(tt);
}//函数名:delayms(uint ms)
//函数功能:延时ms毫秒子函数
//形式参数:ms
//返回值:无

void delayms(uint ms)//延时ms毫秒子函数
{
        uint i,j;
        for(i=0;i<ms;i++)
           {
           for(j=0;j<110;j++);//延时1毫秒
       }

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表