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

📄 tmp275.c

📁 高精度温度测量芯片TMP275的源代码,是用NXP的单片机控制的
💻 C
字号:
/***************************************************************** 
*文件名: IIC_Test.C 
*版权: 周立功单片机研究所 
*功能: LPC900 IIC总线互为主从演示程序 
*日期: 2004/5/20 
******************************************************************/ 
#include "reg932.h" 

#define uchar unsigned char
#define uint unsigned int


//uchar buff[2];
union
   {
     uchar buff[2];
	 uint  ttt;
   }kkk;

unsigned long temp; 
uint temp1;
uchar len;

uchar wendu[9];

void UART_Init(); 
void IIC_Init(); 
void SetSlave(); 
void SendAddr(uchar c); 
void SendData(uchar c); 
bit ReadData(uchar *c); 
void Delayms(unsigned int iii); 
//-------------------------------- 


void delay()
{
 uchar k;
 for(k=0;k<10;k++) 
 {
  _nop_();
 }
}

void Start()
{
  EA=0;
  SDA=1;
  delay();
  SCL=1;
  delay();//INI
  SDA=0;
  delay();//START
  SCL=0;
  delay();
}

void Stop()
{
  SDA=0;
  delay();
  SCL=1;
  delay();
  SDA=1;
  delay();
  EA=1;
}

void WaitAck(void)
{
 unsigned char time=0;//因故障接收方无ACK,超时值为255。
 SDA=1;
 delay();
 SCL=1;
 delay(); 
 SCL=0;
 /*while((SDA)&&(time<254))
 { 
  time++;
 }*/
 while(SDA);
 SCL=0; 
}

void Ack()
{
 SCL=0;
 delay();
 SDA=0;
 delay();
 SCL=1;
 delay();
 SCL=0;
}

void SendByte(unsigned char WriteData)
{
  unsigned char i;
  for (i=0; i<8; i++)
  {
    SCL=0;
    delay();
    if (((WriteData >> 7) & 0x01) == 0x01)
    {
      SDA=1;
    }
    else
    {
      SDA=0;
    }
    delay();
    SCL=1;
    WriteData = WriteData << 1;
    delay();
  }
  SCL=0;
  SDA=1;
  delay();
}

unsigned char ReceiveByte(void)
{
  unsigned char i;
  unsigned char TempBit  = 0;
  unsigned char TempData = 0;
  SCL=0;
  delay();
  SDA=1;
  for (i=0; i<8; i++)
  {
    delay();
    SCL=1;
    delay();
    if (SDA)
    {
      TempBit = 1;
    }
    else
    {
      TempBit = 0;
    }
    TempData = (TempData << 1) | TempBit;
   SCL=0;
  }
   delay();
  return(TempData);
}

void Read275(unsigned char address)
{
 Start();
 SendByte(0x91); //读
 WaitAck();
 kkk.buff[0]=ReceiveByte(); //读高8位
 Ack(); //CUP送低
 kkk.buff[1]=ReceiveByte(); //读低8位
 Ack();
 Stop(); 
 temp1=kkk.ttt;
 if(temp1&0x8000)
 {
  kkk.ttt = kkk.ttt>>4;
  kkk.ttt = kkk.ttt-0x01;
  kkk.ttt = ~kkk.ttt;
  kkk.ttt = kkk.ttt & 0x0fff;
  wendu[0]='-';
 }
 else
 {
  kkk.ttt= kkk.ttt>>4;
  wendu[0]='+';
 }
 temp = (unsigned long)kkk.ttt*625;
 temp1 = temp/100;
 wendu[1]=temp1/10000+0x30;
 temp1 = temp1%10000;
 wendu[2]=temp1/1000+0x30;
 temp1 = temp1%1000;
 wendu[3]=temp1/100+0x30;
 temp1 = temp1%100;
 wendu[4]=0x2e;
 wendu[5]=temp1/10+0x30;
 wendu[6]=0x0d;
 wendu[7]=0x0a;
}

void main() 
{ 
  Delayms(1); //延时1ms,等待从机完成IIC初始化
 Start();
 SendByte(0x90); //写
 WaitAck();
 SendByte(0x01); //指向温度寄存器
 WaitAck();
 SendByte(0x60); //指向温度寄存器
 WaitAck();
 Stop();
 Start();
 SendByte(0x90); //写
 WaitAck();
 SendByte(0x00); //指向温度寄存器
 WaitAck();
 Stop();
  while(1) 
   { 
		 Read275(0x90);
         for(len=0;len<9;len++)
          {
            TI=0;
            SBUF=wendu[len]; 
            while(!TI); 
          }
		 Delayms(1000);
    } 
 } 

void Delayms(unsigned int iii) 
{
  unsigned int j; 
  while(iii>0) 
  { 
    for(j=0;j<=669;j++); iii--; 
  } 
} 

⌨️ 快捷键说明

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