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

📄 f-test.c

📁 单片机测温度c程序,温度传感器为DS1624
💻 C
字号:
/* ---------------------------------------------------------------------------------------- */
/*																							*/
/* 																			*/
/* 																			*/
/* 说明:DS1624测温程序,包含MAX7219控制数码管显示模块																*/
/*													*/
/*			I2C通信协议																				*/
/* -----------------------------------------------------------------------------------------*/

#include <absacc.h>
#include <reg51.h>
#include <stdio.h>
#include <math.h>
#include <intrins.h>
sbit CLK = P1^5;
sbit _CS = P1^6;
sbit DIN = P1^7;
sbit DQ=P1^4;
unsigned int prf;
float f;
int flag;    //标志位
unsigned int led3,led2,led1,led0,f100;


#define DECODE_MODE 0x09  //译码控制寄存器
#define INTENSITY 0x0A  //亮度控制寄存器
#define SCAN_LIMIT 0x0B  //扫描界限寄存器
#define SHUT_DOWN 0x0C   //关断模式寄存器
#define DISPLAY_TEST 0x0F  //测试控制寄存器

 /*

void resetTS ()								 // 发送复位和初始化
{
	unsigned int i;
	DQ = 0;
	i = 103;
	while (i>0) i--;         						// 延时
	DQ = 1;
	i = 4;
	while (i>0) i--;
}

bit tmpread ()								// 读取数据的一位
{
	unsigned int i;
	bit dat;
	DQ = 0; i++;
	DQ = 1; i++; i++;							//延时
	dat = DQ;
	i = 8; while (i>0) i--;							// 延时
	return (dat);
}

unsigned char readBTS () 			 			//读一个字节
{
	unsigned char i,j,dat;
	dat = 0;
	for (i=1;i<=8;i++)
	{
		j = tmpread ();
		dat = (j << 7) | (dat >> 1);
	}
	return (dat);
}

void writeBTS (unsigned char dat)					//写一个字节
{
	unsigned int i;
	unsigned char j;
	bit testb;
	for (j=1;j<=8;j++)
	{
		testb = dat & 0x01;
		dat = dat >> 1;
		if (testb)
		{
			DQ = 0; 						// 写0
			i++; i++;
			DQ = 1;
			i = 8; while (i>0) i--;
		}
		else
		{
			DQ = 0; 						// 写0
			i = 8; while (i>0) i--;
			DQ = 1;
			i++; i++;
		}
	}
}

 */





void delay15()               //延时15us
{
  unsigned char i;
    for(i=0;i<4;i++);
}

void delay60()              //延时60us
{
  unsigned char i;
    for(i=0;i<15;i++);
}

void delay(unsigned int k)             //
{
   unsigned int i,j;
     for(i=0;i<k;i++)
       for(j=0;j<60;j++);
}

void  write0TS()            //写入DS1821数据位0
{
      DQ=1;
      DQ=0;
      delay15();delay15();delay15();delay15();
      DQ=1;
      _nop_();
      _nop_();
}

void  write1TS()            //写入DS1821数据位1
{
      DQ=1;
      DQ=0;
      _nop_();_nop_();_nop_();_nop_();
      _nop_();_nop_();_nop_();
      DQ=1;
      _nop_();_nop_();_nop_();_nop_();
      _nop_();_nop_();_nop_();
      delay15();delay15();delay15();
}

bit  readTS()            //读取数据位
{
      bit b;
      DQ=1;
      DQ=0;
      _nop_();_nop_();_nop_();_nop_();
      DQ=1;
      _nop_();_nop_();_nop_();_nop_();_nop_();
      b=DQ;
      delay15();delay15();delay15();
      _nop_();_nop_();
      return b;
}

void  resetTS()            //复位
{
    unsigned char i;
      DQ=1;
      DQ=0;
      for(i=0;i<8;i++)
      delay60();
      DQ=1;
      while(DQ);
      for(i=0;i<8;i++)
      delay60();
}

void writeBTS(unsigned char byte)  //写1字节
{
       unsigned char i;
        for(i=0;i<8;i++)
        {
           if(byte&0x01)
              write1TS();
           else
              write0TS();
           byte=byte>>1;
        }
}

unsigned char readBTS()      //读1字节
{
       unsigned char i,j;
        bit b;
        j=0;
        for(i=0;i<8;i++)
        {
            b=readTS();
            if(b)  j+=1;
            j=_cror_(j,1);
        }
        return j;
}

unsigned char gettempTS()     //读取温度数据
{
   unsigned char temp1;
    resetTS();
    writeBTS(0xEE);  //发送温度转换命令
    delay(200);   //预留温度转换时间
    resetTS();
    writeBTS(0xaa);   //发送温度读取命令
    temp1=readBTS();
    return temp1;
}




  // 函数声明
void Write7219(unsigned char address,unsigned char dat);

 //MAX7219初始化。设置MAX7219内部的控制寄存器
 /*
void Initial()
{
   Write7219(SHUT_DOWN,0x01);  //开启正常工作模式
   Write7219(DISPLAY_TEST,0x00);  //选择工作模式
   Write7219(DECODE_MODE,0x0f);   //选用0~3译码模式
   Write7219(SCAN_LIMIT,0x03);   //4只LED全用
   Write7219(INTENSITY,0x04);  //设置初始亮度9/32
}
 */
// 地址、数据发送子程序
void Write7219(unsigned char address,unsigned char dat)
{
  unsigned char i;
   _CS=0; // 拉低片选线.选中器件
     //发送地址
    for(i=0;i<8;i++)    //移位循环8次
      {

      CLK=0;     //清零时钟总线
      DIN=(bit)(address&0x80);    //每次取高字节
      address<<=1;     //左移一位
      CLK=1;         //时钟上升沿.发送地址
      }

     //发送数据
        for(i=0;i<8;i++)
        {
         CLK=0;
         DIN=(bit)(dat&0x80);
         dat<<=1;
         CLK=1;
         }
       //时钟上升沿.发送数据
   _CS=1;      //发送结束。上升沿锁存数据
 }

 /*
//测试程序

void  main()
{
     unsigned char  i;
     Initial();  //MAX7219初始化
     while(1)
     {
           for(i=1;i<5;i++)
           {
            Write7219(i,i);//数码管依次显示1—4
            }
      }
}
 */



 //void sendata(uint a,uint b,uint point);

 /*
unsigned int  count(void)
{
      TMOD = 0x15;	// T0 计数器方式1(C/T = 1, M1 = 0, M0 = 1) ,T1 定时器方式1(C/T = 0, M1 = 0, M0 = 1)
      TH0 = 0X00;	//计数器赋初值
      TL0 = 0X00;
      /* -----------------------------------------------------------------------	*/
	/* CLK = 12MHz, 			*/
	/* 产生50ms定时, T1初值 = 65536-50000*12/12=15536=0x3CB0									*/
	/* -----------------------------------------------------------------------	*/
 /*     TH1 = 0x3C;
      TL1 = 0xB0;
      TR0 = 1;   //启动计数器T0
      TR1 = 1;   //启动定时器T1

      ET1 = 1;   //开定时器T1中断,即定时器加计数到溢出时进入定时器T1的中断部分
      ET0 = 0;   //关计数器T0中断
      while(tf!=1);   //等待500ms定时到
      TR1 = 0;   //关定时器T1
      TR0 = 0;   //关计数器T0
      return(TH0*256+TL0);         //返回记数值
}

void timer1(void) interrupt 3
{
     TH1 = 0x3C;
     TL1 = 0xB0;
     msn--;
     if(msn==0)
     {
        msn=A;
        tf=1;
     }
}
     */
 /*
 void ResetT()
{
	TR0 = 0;
	TR1 = 0;

	TMOD = 0x15;	// T0 计数器方式1(C/T = 1, M1 = 0, M0 = 1) ,T1 定时器方式1(C/T = 0, M1 = 0, M0 = 1)
	TH0 = 0;	//计数器赋初值
	TL0 = 0;

	/* -----------------------------------------------------------------------	*/
	/* CLK = 12MHz, 			*/
	/* 产生60ms定时, T1初值 = 65536-60000*12/12=5536=0x15A0									*/
	/* -----------------------------------------------------------------------	*/
 /*       TH1 = 0x15;
	TL1 = 0xA0;

	TR0 = 1;   //启动计数器T0
	TR1 = 1;   //启动定时器T1

	ET1 = 1;   //开定时器T1中断,即定时器加计数到溢出时进入定时器T1的中断部分
	ET0 = 0;   //关计数器T0中断
}
 */


void Init()
{
        _CS=1;
        CLK=1;
        DIN=1;
  //      flag=0;
        Write7219(SHUT_DOWN,0x01);  //开启正常工作模式
        Write7219(DISPLAY_TEST,0x00);  //选择工作模式
        Write7219(DECODE_MODE,0x0f);   //选用0~3译码模式
        Write7219(SCAN_LIMIT,0x03);   //4只LED全用
        Write7219(INTENSITY,0x04);  //设置初始亮度9/32



        resetTS();
        writeBTS(0x01);   //写温度上限命令
        writeBTS(0x78);   //写温度TH为120度
        resetTS();
        writeBTS(0x02);   //写温度下限命令
        writeBTS(0xCE);   //写温度TL为-50度
        resetTS();
        writeBTS(0x0C);   //写状态寄存器
        writeBTS(0x42);   //设置1线工作方式

//	ResetT();
//	EA = 1;    //开总中断

}

void LED_Display()
{
      unsigned char temp2;
        temp2=gettempTS();
        if(temp2>128)
             {
                if(temp2>246)
                     {
                       led1=0x0f;
                       led2=0x0a;
                       led3=256-temp2;
                     }
                  else
                     {
                       led1=0x0a;
                       led2=(256-temp2)/10;
                       led3=(256-temp2)%10;
                     }
             }
         else
             {
                if(temp2>99)
                    {
                      led1=0x01;
                      led2=(temp2-100)/10;
                      led3=(temp2-100)%10;
                    }
                  else
                    {
                      if(temp2>9)
                         {
                          led1=0x0f;
                          led2=temp2/10;
                          led3=temp2%10;
                         }
                       else
                         {
                          led1=0x0f;
                          led2=0x0f;
                          led3=temp2;
                         }
                    }
             }
   //    f100=(int)f*100;
   //    led0=f100/1000;      //数据最高位,
   //    led1=(f100/100)%10;  //数据次高位
   //    led2=(f100/10)%10;   //数据次低位
   //    led3=f100%10;        //数据低位
   //    Write7219(1,led0);
   //    Write7219(2,led1+128);
         led0=0x0f;
        Write7219(1,led0);
        Write7219(2,led1);
        Write7219(3,led2);
        Write7219(4,led3);
}

void main()
{

	Init ();
 /*       if(flag==1)
        {
        LED_Display();    //送数码管显示频率信息
        flag=0;
        }               */
	while (1)
	{
         LED_Display();
	}
}


/*
void T1Routing() interrupt 3        //定时器T1中断函数
{
        EA=0;     //关外部中断
        ET1 = 0;   //关定时器T1中断
        TR1 = 0;   //关定时器T1
	TR0 = 0;   //关计数器T0

	TF1 = 0;
	prf = TH0 * 256 + TL0;
        f=1/(60/prf);  //计算得到脉冲频率,单位为KHz
        LED_Display();    //送数码管显示频率信息
 //       flag=1;        //设置标志位,表示为1时在主程序中送数码管显示
	TH1 = 0x15;   //定时器T1重初始化
	TL1 = 0xA0;

	TH0 = 0;      //计数器T0重初始化
	TL0 = 0;

        EA=1;     //开外部中断
        ET1 = 1;   //开定时器T1中断
	TR1 = 1;      //启动定时器
	TR0 = 1;      //启动计数器
}           */

⌨️ 快捷键说明

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