⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 temperature.c

📁 本人最近编写的stc单片机测温程序 采用ds18b20
💻 C
字号:
#include <reg52.h>
#include <INTRINS.H>
#include<absacc.h>
#define tempint DBYTE[0x30]
#define tempdf DBYTE[0x32]
#define uchar unsigned char
#define uint unsigned int

/**************************
数组定义
*************************/
uchar bdata m100[6];
uchar idata tempvalue[2];
uchar bdata dacbuf[3]; //dac发送缓冲区
/*************************************************************************
8255端口地址定义
*************************************************************************/
uchar xdata pa8255 _at_ 0xf8ff;
uchar xdata pb8255 _at_ 0xf9ff;
uchar xdata pc8255 _at_ 0xfaff;
uchar xdata cmd8255 _at_ 0xfbff;
/******************************
输入端口内存地址定义
******************************/
sbit time0=P3^4;
sbit sw2=P3^5;
/******************************
输出端口内存地址定义
******************************/
sbit y0=m100[2]^0;sbit y1=m100[2]^1;sbit y2=m100[2]^2;sbit y3=m100[2]^3;
sbit y4=m100[2]^4;sbit y5=m100[2]^5;sbit y6=m100[2]^6;sbit y7=m100[2]^7;
/******************************
中间继电器内存地址定义
******************************/
bit s0=0,s1=0,s2=0;
uint ini=0;
/******************************
dac芯片max512芯片
******************************/
sbit dac_cs=P1^4; //max512片选
sbit dac_din=P1^6; //max512输入
sbit dac_sclk=P1^7; //max512时钟
/********子程序目录*********/

void ioinit();
void set_ds18b20();
void get_temperature();
void read_ds18b20(); 
void write_ds18b20(uchar);
void delay(uchar);
void writemax512(uint);
/***************************************************
  名称:main
  功能:主执行程序
***************************************************/
void main()
{
  EA=0;	   /*********禁止中断*************/
  ioinit();/*********IO口初始化***********/

	while(1)
	{
	   set_ds18b20();//初始化ds18b20
	   write_ds18b20(0xcc);//发送 跳过rom匹配命令
	   write_ds18b20(0x44);//发送 温度转换命令
	   delay(60);  //延时等待转换结束600us
	   set_ds18b20(); //初始化ds18b20
	   write_ds18b20(0xcc); //发跳过ROM匹配命令
	   write_ds18b20(0xbe); //发出读温度命令
	   read_ds18b20();   //读温度转换值 
	   dacbuf[0]= tempint<<3;
	   dacbuf[1]= tempdf;
	   writemax512(0); 
	   writemax512(1);
	}
}

/***************************************************
  名称:ioioit
  功能:IO输入输出刷新
***************************************************/
void ioinit(void)
{
cmd8255=0x92;
pc8255=0x00;
}


/**************************************
  名称:delay
  功能:延时模块
  输入参数:n要延时的周期数
  输出参数:无
*************************************/
void delay(uchar n)
{
 uchar i;
 for(i=0;i<n;i++)
  {
   _nop_();
  }
}
/**************************************
  名称:set_ds18b20
  功能:初始化ds18b20
  输入参数:无
  输出参数:无
*************************************/
void set_ds18b20()
{
    while(1)
    {
        uchar  flag;
        flag=0;
        time0=0;    //数据线置低电平
        delay(50);	//低电平保持550us
               
        time0=1;    //数据线置高电平
        delay(3);  //低电平保持60us
                   
        while(time0==0)             //判断DS18B20是否发出低电平信号
        {
            delay(24);            //DS18B20响应,延时240us
            if(time0)               //DS18B20发出高电平初始化成功,返回
            {
                flag=1;           //DS18B20初始化成功标志
                break;
            }
        }
        if(flag)                  //初始化成功,再延时480us
        {
         delay(48);
         break;
        }
    }
}
void read_ds18b20()
{
    uchar i,j,temp,temph,templ;
    j=2;                          //读2位字节数据
    do
    {
    for(i=8;i>0;i--)              //一个字节分8位读取
    {
        temp>>=1;                 //读取1位右移1位
        time0=0;                    //数据线置低电平
        _nop_();
        _nop_();
        time0=4;                    //数据线置高电平
         _nop_();         //延时4us
		 _nop_();
		 _nop_();
		 _nop_();
        if(time0)                   //读取1位数据
            temp|=0x80;
        delay(2);                //读取以为数据后延时20us
        
    }
    if(j==2)                      //读取的第一字节存templ
        templ=temp;
    else
        temph=temp;               //读取的第二字节存temph
    }while(--j);
    tempdf=templ&0x0f;            //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf
    templ>>=4;
    temph<<=4;
    tempint=temph|templ;
}
void write_ds18b20(uchar command)
{
    uchar delay1,i;
    for(i=8;i>0;i--)              //将一字节数据一位一位写入
    {
        time0=0;                    //数据线置低电平
        delay1=8;                  //延时16us
        while(--delay1);
        time0=command&0x01;         //将数据放置在数据线上
        delay(3);                 //延时40us
        command=command>>1;       //准备发送下一位数据
        time0=1;                    //发送完一位数据,数据线置高电平
        _nop_();                  //延时1us
    }
}
/**************************************
  名称:writemax512
  功能:max512驱动模块
  输入参数:通道号dacport
  输出参数:da转换值
*************************************/
void writemax512(uint dacport)
{ uint dac_val,i;
  uint daccon=0x0100<<dacport; //选定通道
  uint dac;
  dac_val=(uint)dacbuf[dacport]; //低8位为数据	
  dac=(daccon|(dac_val&0x00ff)); //组成完整的发送数据 控制字+数据	 

  dac_cs=0; 
  dac_sclk=0; 
  for(i=0;i<16;i++)
   { 
    dac_din=(bit)(dac&0x8000); //从高位开始发送
    dac_sclk=1; 
    delay(3);
    dac_sclk=0;
    delay(3);
    dac<<=1;
   }
    dac_cs=1; //禁止片选 
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -