#include "STC15.h"
#include "intrins.h"
/*******************************************************************************/
#define uchar unsigned char
#define uint unsigned int
/*******************************************************************************/
#define CLK_H CLK = 1
#define CLK_L CLK = 0
#define DIO_H DIO = 1
#define DIO_L DIO = 0
sbit CLK = P1^1;
sbit DIO = P1^0;
/*******************************************************************************/
/*******************************************************************************/
sbit TMP_SCL=P1^2;
sbit TMP_SDA=P1^3;
/*******************************************************************************/
void display(uint x);
/*******************************************************************************/
/*******************************************************************************/
uchar CODE[10] = {0xF5,0x44,0x73,0x57,0xC6,0x97,0xB7,0x45,0xF7,0xD7}; //0~9显示代码
uint num;
/*******************************************************************************/
/*******************************************************************************/
/*********************************tmp驱动部分**********************************************/
void nop()
{
_nop_();
_nop_();
_nop_();
_nop_();
// _nop_();
// _nop_();
// _nop_();
// _nop_();
}
void init_temp_IIC() //TMP112初始化子程序
{
TMP_SCL=1;
nop();
TMP_SDA=1;
nop();
}
void start() //启动I2C总线
{
TMP_SDA=1;
nop();
TMP_SCL=1;
nop();
TMP_SDA=0;
nop();
TMP_SCL=0;
nop();
}
void stop() //停止I2C总线
{
TMP_SDA=0;
nop();
TMP_SCL=1;
nop();
TMP_SDA=1;
nop();
TMP_SCL=0;
TMP_SDA=0;
}
unsigned char writebyte(unsigned char j) //写一个字节
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
if((temp<<i)&0x80)
TMP_SDA=1;
else
TMP_SDA=0;
nop();
TMP_SCL=1; //待sda线上的数据稳定后,将scl拉高
nop();
TMP_SCL=0;
nop();
}
nop();
TMP_SDA=1;
nop();
TMP_SCL=1;
nop();
//check ack
i=TMP_SDA;
TMP_SCL=0;
return i;
}
unsigned char readbyte() //读一个字节
{
unsigned char i,j,k=0;
TMP_SCL=0; nop(); TMP_SDA=1;
for (i=0;i<8;i++)
{
nop(); TMP_SCL=1; nop();
if(TMP_SDA==1)
j=1;
else
j=0;
k=(k<<1)|j;
TMP_SCL=0;
}
nop();
return(k);
}
int readtmp112(void)
{
uint i ,j;
int temper;
start();
writebyte(0x90);
writebyte(0x00);
start();
writebyte(0x91);
i=readbyte();
j=readbyte();
stop();
temper |= i;
temper <<= 8;
temper |= j;
temper >>=4; // temper=temper*0.0625 ;
return temper;
}
//void writetmp112(void)//未使用
//{
// start();
// writebyte(0x90);
// writebyte(0x01);
// writebyte(0x60);
// writebyte(0xa0);
// stop();
//}
/*********************************驱动部分结束**********************************************/
/*******************************************************************************/
/***************1650显示部分*****************/
void Delay_us(uint i) //us延时
{
for(;i>0;i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void I2CStart(void)//开始信号
{
CLK_H;
DIO_H;
Delay_us(5);
DIO_L;
}
void I2Cask(void) //ACK信号
{
uchar timeout = 1;
CLK_H;
Delay_us(5);
CLK_L;
while((DIO)&&(timeout<=100))
{
timeout++;
}
Delay_us(5);
CLK_L;
}
void I2CStop(void) //停止信号
{
CLK_H;
DIO_L;
Delay_us(5);
DIO_H;
}
void I2CWrByte(uchar oneByte) //写一个字节高位在前,低位在后
{
uchar i;
CLK_L;
Delay_us(1);
for(i=0;i<8;i++)
{
oneByte = oneByte<<1;
DIO = CY;
CLK_L;
Delay_us(5);
CLK_H;
Delay_us(5);
CLK_L;
}
}
void TM1650_Set(uchar add,uchar dat) //数码管显示
{
//写显存必须从高地址开始写
I2CStart();
I2CWrByte(add); //第一个显存地址
I2Cask();
I2CWrByte(dat);
I2Cask();
I2CStop();
}
void display(uint x)
{
uint tmp=0;
uint ge,shi,bai,qian;
tmp=x ;
ge=tmp%10;
shi=tmp%100/10;
bai=tmp%1000/100;
qian=tmp%10000/1000;
if(tmp<10)
{ //零点几度
TM1650_Set(0x68,CODE[ge]);
TM1650_Set(0x6a,CODE[0]); //小数点第五位,依此管脚为FBED,dpCGA
TM1650_Set(0x6c,0);
TM1650_Set(0x6e,0);
}
else if((tmp>=10)&&(tmp<100)) //一点几度
{
TM1650_Set(0x68,CODE[ge]); //两位整数
TM1650_Set(0x6a,CODE[shi]);
TM1650_Set(0x6c,0);
TM1650_Set(0x6e,0);
}
else if((tmp>=100)&&(tmp<1000)) //几十几点几度
{
TM1650_Set(0x68,CODE[ge]);
TM1650_Set(0x6a,CODE[shi]);
TM1650_Set(0x6c,CODE[bai]);
TM1650_Set(0x6e,0);
}
else if((tmp>=1000)&&(tmp<10000)) //几百几十几点几度
{
TM1650_Set(0x68,CODE[ge]);
TM1650_Set(0x6a,CODE[shi]);
TM1650_Set(0x6c,CODE[bai]);
TM1650_Set(0x6e,CODE[qian]);
}
else
{
TM1650_Set(0x68,0);
TM1650_Set(0x6a,0);
TM1650_Set(0x6c,0);
TM1650_Set(0x6e,0);
}
}
/************************************/
/*******************************************************************************/
void main()
{ uint x=0;
init_temp_IIC();
TM1650_Set(0x48,0x51);
while(1)
{
x=readtmp112();
display(x);
}
}