您的当前位置:首页正文

51+HD7279+ADS1110+PT100的测温系统(程序)

2024-02-08 来源:星星旅游


#include

#include

typedef unsigned int uint;

typedef unsigned char uchar;

typedef unsigned short WORD;

float code RTD_TAB_PT100[151] = // 表格是以1度为一步,即-20, -19, -18.....

{

88.22, 88.62 ,88.62, 89.40, 89.80, 90.19, 90.59, 90.98, 91.37, 91.77, // -30 ~ -21

92.16, 92.55, 92.95, 93.34, 93.73, 94.12, 94.52, 94.91, 95.30, 95.69, // -20 ~ -11

96.09, 96.48, 96.87, 97.26, 97.65, 98.04, 98.44, 98.83, 99.22, 99.61, // -10 ~ -1

100.00,100.39,100.78,101.17,101.56,101.95,102.34,102.73,103.13,103.51, // 0 9

103.90,104.29,104.68,105.07,105.46,105.85,106.24,106.63,107.02,107.49, // 10 19

~ ~

107.79,108.18,108.57,108.96,109.35,109.73,110.12,110.51,110.90,111.28, // 20 ~ 29

111.67,112.06,112.45,112.83,113.22,113.61,113.99,114.38,114.77,115.15, // 30 ~ 39

115.54,115.93,116.31,116.70,117.08,117.47,117.86,118.24,118.62,119.01, 49

119.40,119.78,120.16,120.55,120.93,121.32,121.70,122.09,122.47,122.86, 59

123.24,123.62,124.01,124.39,124.77,125.16,125.54,125.92,126.31,126.69, 69

127.07,127.45,127.84,128.22,128.60,128.98,129.37,129.75,130.13,130.51, 79

130.89,131.27,131.66,132.04,132.42,132.80,133.18,133.56,133.94,134.32, 89

134.70,135.08,135.46,135.84,136.22,136.60,136.98,137.36,137.74,138.12, 99

138.50,138.88,139.26,139.64,140.02,140.39,140.77,141.15,141.53,141.91, 109

// 40 // 50 // 60 // 70 // 80 // 90 // 100 ~ ~ ~ ~ ~ ~ ~

142.29,142.66,143.04,143.42,143.80,144.17,144.55,144.93,145.31,145.68, // 110 ~ 119

146.06 // 120

};

//float code RTD_TAB_PT100[41] = // 表格是以5度为一步,即-50, -45, - 40.....

//{

// 80.31, 82.29, 84.27 ,86.25, 88.22, 90.19, 92.16, 94.12, 96.09, 98.04, // -50 ~ -5

// 100.00,101.95,103.90,105.85,107.79,109.73,111.67,113.61,115.54,117.47, // 0 ~ 45

// 119.40,121.32,123.24,125.16,127.08,128.99,130.90,132.80,134.71,136.61, // 50 ~ 95

// 138.51,140.40,142.29,144.18,146.07,147.95,149.83,151.71,153.58,155.46, // 100 ~ 145

// 157.33 // 50

//};

sbit beep = P3^5;

//----------------ADS1110地址、配置字-----------------//

#define ADS1110_WR_ADDRESS 0x92 // 1001 001 0 写

#define ADS1110_RD_ADDRESS 0x93 // 1001 001 1 读

#define ADS1110_CONFIG_REG 0x8C // 连续转换模式,16bit精度,PGA=1

sbit ADS1110_SDA = P1^5; // 模拟I2C数据传输位

sbit ADS1110_CLK = P1^6; // 模拟I2C时钟控制位

//uchar TMR_H, TMR_L; // AD转换高8位,和低8位

uint AD_Result[25];

unsigned long nTmp;

//*** HD7279 函数定义 ***

void long_delay(void); // 长延时

void short_delay(void); // 短暂延时

void delay10ms(unsigned char); // 延时10MS

void write7279(uchar, uchar); // 写入到HD7279

uchar read7279(uchar); // 从HD7279读出

void send_byte(uchar); // 发送一个字节

uchar receive_byte(void); // 接收一个字节

sbit cs =P0^7; // cs at P1.4

sbit clk=P0^6; // clk 连接于 P1.5

sbit dat=P0^5; // dat 连接于 P1.2

sbit key=P0^4; // key 连接于 P1.3

sbit Hight_LED = P4^6;

sbit Low_LED = P4^1;

//****** HD7279A 指令 ******

#define CMD_RESET 0xa4

#define CMD_TEST 0xbf

#define DECODE0 0x80

#define DECODE1 0xc8

#define CMD_READ 0x15

#define UNDECODE 0x90

#define RTL_CYCLE 0xa3

#define RTR_CYCLE 0xa2

#define RTL_UNCYL 0xa1

#define RTR_UNCYL 0xa0

#define ACTCTL 0x98

#define SEGON 0xe0

#define SEGOFF 0xc0

#define BLINKCTL 0x88

//-------- AT24C04 变量声明 ---------

sbit _24C02_SCL = P2^6;

//AT24C04的时钟

sbit _24C02_SDA = P2^5; //AT24C04的数据

uchar BUF[16]; //数据缓存区

uint code nDefaultDATA[] =

{// nLowTMP nHightTMP nTMPAdj

480, 650, 0 // 默认设置

};

uint nSettingDATA[3] = {0, 0, 0}; // 当前设置

void Delay5us();

void AT24C04_Start();

void AT24C04_Stop();

void AT24C04_SendACK(bit ack);

bit AT24C04_RecvACK();

void AT24C04_SendByte(uchar dat);

uchar AT24C04_RecvByte();

void AT24C04_ReadPage();

void AT24C04_WritePage();

//****** 红外接收 ******

sbit IRIN = P3^3; //红外接收器数据线

uchar IRCOM[7];

uchar nFlag = 0;

uchar nMode = 1; // nMode 0 1 // mean NULL nLowTMP nHightTMP uint nLowTMP = 480; // 最低温度设定

uint nHightTMP = 650; // 最高温度设定

char nTMPAdj = 0; // 温度修正

void send_ad_result(uchar temp);

2 3 nTMPAdj

/***********************************************************************************

************************************************************************************

////////////////////////////////HD 7279 函数////////////////////////////////////////

************************************************************************************

************************************************************************************/

void write7279(uchar cmd, uchar dta)

{

cs = 0;

send_byte (cmd);

send_byte (dta);

cs = 1;

}

uchar read7279(uchar command)

{

cs = 0;

send_byte(command);

return(receive_byte());

cs = 1;

}

void send_byte( uchar out_byte)

{

uchar i;

cs=0;

long_delay();

for (i=0;i<8;i++)

{

if (out_byte&0x80)

{

dat=1;

}

else

{

dat=0;

}

clk=1;

short_delay();

clk=0;

short_delay();

out_byte=out_byte*2;

}

dat=0;

}

uchar receive_byte(void)

{

uchar i, in_byte;

dat=1; // set to input mode

long_delay();

for (i=0;i<8;i++)

{

clk=1;

short_delay();

in_byte=in_byte*2;

if (dat)

{

in_byte=in_byte|0x01;

}

clk=0;

short_delay();

}

dat=0;

return (in_byte);

}

void delay10ms(uint time) {

uchar a,b,c;

//误差 -0.000000000001us

uint i;

for (i=0;i{

for(c=7;c>0;c--)

for(b=168;b>0;b--)

for(a=24;a>0;a--);

}

}

void long_delay(void)

{

unsigned char i;

for (i=0;i<0x30;i++);

}

void short_delay(void)

{

unsigned char i;

for (i=0;i<8;i++);

}

/***********************************************************************************

************************************************************************************

////////////////////////////////HD 7279 函数 END////////////////////////////////////////

************************************************************************************

************************************************************************************/

//--------------------- 模块延时程序_1ms -------------------------

void delay1ms(uint delay1ms) //STC11F60XE,延时1ms

{

uchar a,b;

// 12M

// for(;delay1ms>0;delay1ms--)

// for(b=222;b>0;b--)

// for(a=12;a>0;a--);

// 11.0592M

for( ; delay1ms > 0; delay1ms--)

for(b = 21; b > 0; b--)

for(a = 130; a > 0; a--);

}

void Delay5us() // 晶振11.0592M 误差 -0.026765046296us

{

uchar a;

for(a=12;a>0;a--);

_nop_();

}

void delay(uint delay) //STC11F60XE,12M,延时170us

{

uchar a,b;

// 12M

// for(;delay>0;delay--)

// for(b=78;b>0;b--)

// for(a=5;a>0;a--);

// 11.0592M

for( ; delay > 0; delay--)

for( b = 2; b > 0; b--)

for( a = 232; a > 0; a--);

}

//--------------------- 数码管显示函数 -------------------------

void Display_TMP(uint nTmp1)

{

//send_byte(CMD_RESET);

write7279(DECODE0,nTmp1/100%100);

delay1ms(2);

write7279(DECODE0+1,nTmp1/10%10);

delay1ms(2);

write7279(SEGON,15);

delay1ms(2);

write7279(DECODE0+2,nTmp1%10);

delay1ms(2);

write7279(SEGON,63);

delay1ms(2);

write7279(SEGON,62);

delay1ms(2);

write7279(SEGON,61);

delay1ms(2);

write7279(SEGON,60);

delay1ms(2);

write7279(SEGON,59);

delay1ms(2);

// write7279(DECODE0+4,nTmp2/100%100);

// delay1ms(2);

// write7279(DECODE0+5,nTmp2/10%10);

// delay1ms(2);

// write7279(SEGON,47);

// delay1ms(2);

// write7279(DECODE0+6,nTmp2%10);

// delay1ms(2);

// write7279(SEGON,31);

// delay1ms(2);

// write7279(SEGON,30);

// delay1ms(2);

// write7279(SEGON,29);

// delay1ms(2);

// write7279(SEGON,28);

// delay1ms(2);

// write7279(SEGON,27);

// delay1ms(2);

//delay10ms(1000);

//send_byte(CMD_RESET);

}

void Display_SETTMP(uint nTmp2)

{

//send_byte(CMD_RESET);

write7279(DECODE0+4,nTmp2/100%100);

delay1ms(2);

write7279(DECODE0+5,nTmp2/10%10);

delay1ms(2);

write7279(SEGON,47);

delay1ms(2);

write7279(DECODE0+6,nTmp2%10);

delay1ms(2);

write7279(SEGON,31);

delay1ms(2);

write7279(SEGON,30);

delay1ms(2);

write7279(SEGON,29);

delay1ms(2);

write7279(SEGON,28);

delay1ms(2);

write7279(SEGON,27);

delay1ms(2);

//delay10ms(1000);

//send_byte(CMD_RESET);

}

void Display_SET()

{

send_byte(CMD_RESET);

if (nMode == 1) // set nLowTMP

{

write7279(SEGON,1);

delay1ms(2);

write7279(SEGON,2);

delay1ms(2);

write7279(SEGON,3);

delay1ms(2);

write7279(DECODE0+4,nLowTMP/100%100);

delay1ms(2);

write7279(DECODE0+5,nLowTMP/10%10);

delay1ms(2);

write7279(SEGON,47);

delay1ms(2);

write7279(DECODE0+6,nLowTMP%10);

}

if (nMode == 2) // set nHightTMP

{

write7279(SEGON,0);

delay1ms(2);

write7279(SEGON,1);

delay1ms(2);

write7279(SEGON,2);

delay1ms(2);

write7279(SEGON,4);

delay1ms(2);

write7279(SEGON,5);

delay1ms(2);

write7279(DECODE0+4,nHightTMP/100%100);

delay1ms(2);

write7279(DECODE0+5,nHightTMP/10%10);

delay1ms(2);

write7279(SEGON,47);

delay1ms(2);

write7279(DECODE0+6,nHightTMP%10);

}

if (nMode == 2) // set nTMPAdj

{

write7279(SEGON,0);

delay1ms(2);

write7279(SEGON,1);

delay1ms(2);

write7279(SEGON,2);

delay1ms(2);

write7279(SEGON,4);

delay1ms(2);

write7279(SEGON,5);

delay1ms(2);

write7279(SEGON,6);

delay1ms(2);

if (nTMPAdj < 0)

{

write7279(SEGON,32);

delay1ms(2);

write7279(DECODE0+5,(0-nTMPAdj)/10%10);

delay1ms(2);

write7279(DECODE0+6,(0-nTMPAdj)%10);

}

if (nTMPAdj > 0)

{

write7279(DECODE0+5,nTMPAdj/10%10);

delay1ms(2);

write7279(DECODE0+6,nTMPAdj%10);

}

}

}

/***********************************************************************************

************************************************************************************

////////////////////////////////红外解码 函数-BEGIN/////////////////////////////////

************************************************************************************

************************************************************************************/

void IR_IN() interrupt 2 using 0

{

// unsigned char j,k,N=0;

// EX1 = 0; // delay(15);

// if (IRIN==1) // {

// EX1 =1;

// return;

// }

// // while (!IRIN) // {

//确认IR信号出现

//等IR变为高电平,跳过9ms的前导低电平信号。

// delay(1);

// }

//

// for (j=0;j<4;j++) // {

// for (k=0;k<8;k++) // {

// while (IRIN) // {

// delay(1);

// }

// while (!IRIN) // {

// 收集四组数据

// 每组数据有8位

// 等 IR 变为低电平,跳过4.5ms的前导高电平信号。 // 等 IR 变为高电平

// delay(1);

// }

// while (IRIN) // 计算IR高电平时长

// {

// delay(1);

// N++;

// if (N>=30)

// {

// EX1=1;

// return;

// } // 0.14ms计数过长自动离开。

// } // 高电平计数完毕

// IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”

// if (N>=8)

// {

// IRCOM[j] = IRCOM[j] | 0x80;

// } // 数据最高位补“1”

// N=0;

// }//end for k

// }//end for j

//

// if (IRCOM[2]!=~IRCOM[3])

// {

// EX1=1;

// return;

// }

//

// send_ad_result(IRCOM[2]);

//

// switch(IRCOM[2])

// {

// case 0x45:

// if (nFlag == 0)

// nFlag = 1;

// nFlag = 0;

// //goto OVER;

// break;

//

// case 0x47:

// if((nFlag==1) && (nMode<=3))

// nMode = 0;

// nMode++;

// //goto OVER;

// break;

//

// case 0x16:

// if ((nFlag==1) && (nMode==2))

// nHightTMP--;

// if ((nFlag==1) && (nMode==1))

// nLowTMP--;

// if ((nFlag==1) && (nMode==3))

// nTMPAdj--;

// //goto OVER;

// break;

//

// case 0x19:

// if ((nFlag==1) && (nMode==2))

// nHightTMP++;

// if ((nFlag==1) && (nMode==1))

// nLowTMP++;

// if ((nFlag==1) && (nMode==3))

// nTMPAdj++;

// //goto OVER;

// break;

// }

// //send_ad_result(IRCOM[5]);

// //OVER:

// EX1 = 1;

return ;

}

/***********************************************************************************

////////////////////////////////红外解码 函数 END////////////////////////////////////

************************************************************************************/

/***********************************************************************************

************************************************************************************

////////////////////////////////AD1110 转换 -BEGIN/////////////////////////////////

************************************************************************************

************************************************************************************/

/*******************************************************************************

名称:ads1110Start(void)

功能:ADS1110 I2C Start

********************************************************************************/

void ads1110Start(void)

{

ADS1110_SDA = 1;

_nop_(); _nop_(); _nop_();_nop_(); _nop_();

ADS1110_CLK = 1;

_nop_(); _nop_();

_nop_(); _nop_(); _nop_(); _nop_();

ADS1110_SDA = 0;

_nop_(); _nop_();

_nop_(); _nop_(); _nop_(); _nop_();

}

/*******************************************************************************

名称:ads1110Stop(void)

功能:ADS1110 I2C Stop

********************************************************************************/

void ads1110Stop(void)

{

ADS1110_SDA = 0;

_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();

ADS1110_CLK = 1; // -----------结束I2C总线.

_nop_(); _nop_();

_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_();

ADS1110_SDA = 1;

_nop_(); _nop_(); _nop_();

}

/*******************************************************************************

名称:waitAck(void)

功能:ADS1110 I2C 等待ack

********************************************************************************/

uchar waitAck(void)

{

uint i = 0;

ADS1110_CLK = 1;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_();

while((ADS1110_SDA==1)&&(i<500))

i++;

ADS1110_CLK = 0;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_();

return 0x00;

}

/*******************************************************************************

名称:void sendAck(void)

功能:向ADS1110 I2C 发送 ack

********************************************************************************/

void sendAck(void)

{

ADS1110_SDA=0;

_nop_();

_nop_();

_nop_();

_nop_();

ADS1110_CLK=1;

_nop_();

_nop_();

_nop_();

_nop_();

ADS1110_CLK=0;

}

/*******************************************************************************

名称:void sendNotAck(void)

功能:向ADS1110 I2C 不发送 ack

********************************************************************************/

void sendNotAck(void)

{

ADS1110_SDA=1;

_nop_();

_nop_();

_nop_();

_nop_();

ADS1110_CLK=1;

_nop_();

_nop_();

_nop_();

_nop_();

ADS1110_CLK=0;

}

/*******************************************************************************

名称:void ads1110SendByte(uchar sendData)

功能:向ADS1110 I2C 发送1个字节

********************************************************************************/

void ads1110SendByte(uchar sendData)

{

uchar i,temp;

temp = sendData;

for(i=0;i<8;i++)

{

temp = temp << 1;

ADS1110_CLK = 0;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_();

ADS1110_SDA = CY;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

ADS1110_CLK = 1;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

}

ADS1110_CLK = 0;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

ADS1110_SDA = 1;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

}

/*******************************************************************************

名称:uchar ads1110ReceiveByte(void)

功能:ADS1110 I2C 接收1个字节

********************************************************************************/

uchar ads1110ReceiveByte(void)

{

uchar i,k;

ADS1110_CLK = 0;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_();

ADS1110_SDA = 1;

_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();

for(i=0;i<8;i++)

{

ADS1110_CLK = 1;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

k= (k << 1)| ADS1110_SDA;

ADS1110_CLK = 0;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

}

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

return k;

}

/*******************************************************************************

名称:ads1110Config(void)

功能:对ADS1110进行配置

********************************************************************************/

void ads1110Config(void)

{

ads1110Start();

ads1110SendByte(ADS1110_WR_ADDRESS);

waitAck();

ads1110SendByte(ADS1110_CONFIG_REG);

waitAck();

ads1110Stop();

}

/*******************************************************************************

名称:读取ADS1100数据子程序

功能:

********************************************************************************/

uint RD_ADS()

{

uchar temp;

uint W_B1byte_high, W_B1byte_low, W_B1_word;

ads1110Start();

ads1110SendByte(ADS1110_RD_ADDRESS);

temp = waitAck();

if(!temp)

{

W_B1byte_high /*= TMR_H*/ = ads1110ReceiveByte();

sendAck();

W_B1byte_low /*= TMR_L*/ = ads1110ReceiveByte();

sendAck();

temp = ads1110ReceiveByte();

ads1110Stop();

W_B1_word = (W_B1byte_high << 8)+ W_B1byte_low;

if (W_B1_word > 0x7fff)

W_B1_word = 0;

return W_B1_word;

}

else

return 0x0000;

}

/*******************************************************************************

名称: 取AD结果函数

功能: 它是16位AD转换,连续去制25次,去掉3最大值和3个最小值,剩下19个取平均值

返回: 平均取值

********************************************************************************/

uint get_ad_result()

{

uchar i,j;

uint temp;

nTmp = 0;

for(i = 0; i < 25; i++) // 连续取值25次

{

AD_Result[i] = RD_ADS();

delay1ms(10);

}

for(i = 1; i< 25; i++) // 插入法对取的25个值进行排序

{

temp = AD_Result[i]; //store the original sorted array in temp

for(j=i ; j>0 && temp < AD_Result[j-1] ; j--) //compare the new array with temp

{

AD_Result[j] = AD_Result[j-1]; //all larger elements are moved one pot to the right

}

AD_Result[j] = temp;

}

// for(i = 3; i < 22; i++) // 去掉3最大值和3个最小值,余下19个值求和

// {

// nTmp = nTmp + AD_Result[i];

// }

return AD_Result[12]; //nTmp / 19; // 取剩下19个数平均值

//ad_average_result=ad_average_result*4*5000/1024;

}

/*******************************************************************************

名称: 串口发送函数

功能: 取AD结果函数发送到串口,方便调试

返回: 无

********************************************************************************/

void send_ad_result(uchar temp)

{

SBUF = temp;

while(TI == 0) ;

TI = 0;

delay1ms(100);

//SBUF=R>>4;

}

/*******************************************************************************

名称: 初始化函数

功能: 设置串口相关寄存器值,波特率取9600, 12T模式

返回: 无

********************************************************************************/

void _initiate() //初始化函数

{

EA = 1;

ES = 0;

TMOD = 0x20; // 定时计数器方式控制寄存器,\"自动重装,16位计数器\".

SCON = 0x50; // 串行控制寄存器,方便在串口助手那观察

// 12M

// TH1 = 0xF3; // 定时器初值高8位设置

// TL1 = 0xF3; // 定时器初值低8位设置

// 11.0592M 波特率 9600

TH1 = 0xFD; // 定时器初值高8位设置

TL1 = TH1; // 定时器初值低8位设置

PCON = 0x00;

TR1 = 1;

// IE = 0x84; // 允许总中断中断,使能 INT1 外部中断

EX1 = 1;

// TCON = 0x10; // 触发方式为脉冲负边沿触发

}

/*******************************************************************************

名称: 蜂鸣器函数

功能: 设置蜂鸣器鸣响

返回: 无

********************************************************************************/

void Beep(uchar nSet)

{

}

/****************************************/

/****************************************/

//------------ AT24C04 驱动函数 --------------

/**************************************

向AT24C04写1页(16字节)数据

将TESTDATA开始的16个测试数据写如设备的00~0F地址中

**************************************/

void AT24C04_WritePage()

{

uchar i;

AT24C04_Start(); //起始信号

AT24C04_SendByte(0xa0); //发送设备地址+写信号

AT24C04_SendByte(0x00); //发送存储单元地址

for (i=0; i<3; i++)

{

AT24C04_SendByte(nSettingDATA[i]);

}

AT24C04_Stop(); //停止信号

}

/**************************************

从AT24C04读取1页(16字节)数据

将设备的00~0F地址中的数据读出存放在DATA区的BUF中

**************************************/

void AT24C04_ReadPage()

{

uchar i;

AT24C04_Start(); //起始信号

AT24C04_SendByte(0xa0); //发送设备地址+写信号

AT24C04_SendByte(0x00); //发送存储单元地址

AT24C04_Start(); //起始信号

AT24C04_SendByte(0xa1); //发送设备地址+读信号

for (i=0; i<16; i++)

{

BUF[i] = AT24C04_RecvByte();

if (i == 15)

{

AT24C04_SendACK(1); //最后一个数据需要会NAK

}

else

{

AT24C04_SendACK(0); //回应ACK

}

}

AT24C04_Stop(); //停止信号

}

/**************************************

起始信号

**************************************/

void AT24C04_Start()

{

_24C02_SDA = 1; //拉高数据线

_24C02_SCL = 1; //拉高时钟线

Delay5us(); //延时

_24C02_SDA = 0; //产生下降沿

Delay5us(); //延时

_24C02_SCL = 0; //拉低时钟线

}

/**************************************

停止信号

**************************************/

void AT24C04_Stop()

{

_24C02_SDA = 0; //拉低数据线

_24C02_SCL = 1; //拉高时钟线

Delay5us(); //延时

_24C02_SDA = 1; //产生上升沿

Delay5us(); //延时

}

/**************************************

发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/

void AT24C04_SendACK(bit ack)

{

_24C02_SDA = ack; //写应答信号

_24C02_SCL = 1; //拉高时钟线

Delay5us(); //延时

_24C02_SCL = 0; //拉低时钟线

Delay5us(); //延时

}

/**************************************

接收应答信号

**************************************/

bit AT24C04_RecvACK()

{

_24C02_SCL = 1; //拉高时钟线

Delay5us(); //延时

CY = _24C02_SDA; //读应答信号

_24C02_SCL = 0; //拉低时钟线

Delay5us(); //延时

return CY;

}

/**************************************

向IIC总线发送一个字节数据

**************************************/

void AT24C04_SendByte(uchar dat)

{

uchar i;

for (i=0; i<8; i++) //8位计数器

{

dat <<= 1; //移出数据的最高位

_24C02_SDA = CY; //送数据口

_24C02_SCL = 1; //拉高时钟线

Delay5us(); //延时

_24C02_SCL = 0; //拉低时钟线

Delay5us(); //延时

}

AT24C04_RecvACK();

}

/**************************************

从IIC总线接收一个字节数据

**************************************/

uchar AT24C04_RecvByte()

{

uchar i;

uchar dat = 0;

_24C02_SDA = 1; //使能内部上拉,准备读取数据

for (i=0; i<8; i++) //8位计数器

{

dat <<= 1;

_24C02_SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= _24C02_SDA; //读数据

_24C02_SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}

/***********************************************************************

*FunName: float CalculateTemperature(float fR)

*

*In: fR -> PT100的电阻值。

*

*Out: fTem -> 测得的温度值。

*

*Discription: 将电阻值查表算出温度值。

*

*Notes: 采用2分查找法。

*

************************************************************************/

float CalculateTemperature(float fR)

{

float fTem;

float fLowRValue;

float fHighRValue;

int iTem;

uchar i;

uchar cBottom, cTop;

if (fR < RTD_TAB_PT100[0]) // 电阻值小于表格最小值,低于量程下限。

{

return 210;

}

if (fR > RTD_TAB_PT100[150]) // 电阻值大于表格最大值,超出量程上限。

{

return 211;

}

cBottom = 0;

cTop = 150;

for (i=75; (cTop-cBottom)!=1; ) // 2分法查表。

{

if (fR < RTD_TAB_PT100[i])

{

cTop = i;

i = (cTop + cBottom) / 2;

}

else if (fR > RTD_TAB_PT100[i])

{

cBottom = i;

i = (cTop + cBottom) / 2;

}

else

{

iTem = (uint)i - 30;

fTem = (float)iTem;

return fTem;

}

}

iTem = (uint)i - 30;

send_ad_result(0x00);

fLowRValue = RTD_TAB_PT100[cBottom];

fHighRValue = RTD_TAB_PT100[cTop];

send_ad_result(cBottom);

send_ad_result(cTop);

fTem = ( (fR - fLowRValue) / (fHighRValue - fLowRValue) ) + iTem; // 表格是以5度为一步的。

// 两点内插进行运算。

return fTem;

}

/*******************************************************************************

名称: main

功能: 主函数

返回: 无

********************************************************************************/

void main()

{

uint result,tmr,nResult_TMP;

uchar TMR_H, TMR_L, nTemp_1,nTemp_2,nTemp_3;

float fTMP;

nTemp_1 = 2;

nTemp_2 = 3;

nTemp_3 = 0;

// 设置看门狗 EN_WDT = 1,CLR_WDT = 1,IDLE_WDT = 1, PS2 = 1,PS1 = 1,PS0 = 1

WDT_CONTR = 0x3f;

IRIN=1;

_initiate(); // 初始化

ads1110Config(); // 配置ADS1110,采用连续转换模式,16bit精度,PGA=1

// 则采样电压值为 V = (OutCode * 2.048) / 32768

P1M0 |= 0x00; // 设P1_7为高阻模式 如: P1_0= #00000000B

P1M1 |= 0x80;

//AT24C04_ReadPage();

delay(10);

for (tmr=0; tmr<0x2000; tmr++); // 上电延时

send_byte(CMD_RESET); // 复位HD7279A

delay1ms(5);

Display_TMP(230); // 设定初始值23.0℃

delay1ms(5);

Display_SETTMP(550); // 设定初始值55.0℃

while(1)

{

result = get_ad_result(); // ADC取样,25次,中值滤波法

TMR_H = (result >> 8) & 0xff; // 取高八位

TMR_L = result & 0xff; // 取低八位

//send_ad_result(TMR_H);

//send_ad_result(TMR_L);

//lTmp = result

fTMP = ((result*2.048)/32768 + 0.0029) / 11 / 0.001021; // 用ADC转换的电压值计算电阻

//send_ad_result(0x00);

delay1ms(10);

fTMP = CalculateTemperature(fTMP); // 查表法转换温度值

// 根据实际标定结果进行数据拟合,得到公式-----实际温度 = -0.0023*测量温度*测量温度 + 1.2692*测量温度 - 5.2778

nResult_TMP = (uint)(10*(-0.0023*fTMP*fTMP + 1.2692*fTMP - 5.2778)) + nTMPAdj;

if (nTemp_1 != (nResult_TMP/100%100))

{

write7279(DECODE0,nResult_TMP/100%100);

nTemp_1 = nResult_TMP/100%100;

}

if (nTemp_2 != (nResult_TMP/10%10))

{

write7279(DECODE0+1,(nResult_TMP/10%10)|0x80);

nTemp_2 = nResult_TMP/10%10;

}

if (nTemp_3 != (nResult_TMP%100))

{

write7279(DECODE0+2,nResult_TMP%10);

nTemp_3 = nResult_TMP%10;

}

TMR_H = (nResult_TMP >> 8) & 0xff; // 取高八位

TMR_L = nResult_TMP & 0xff; // 取低八位

send_ad_result(TMR_H);

send_ad_result(TMR_L);

//

// if (nFlag == 1)

// {

// send_ad_result(nFlag);

// while(1)

// {

// send_ad_result(0x11);

// Display_SET();

// delay1ms(500);

// if (nFlag == 0)

// break;

// Display_SET();

// WDT_CONTR = 0x3f;

// }

// nSettingDATA[0] = nLowTMP;

// nSettingDATA[1] = nHightTMP;

// nSettingDATA[2] = nTMPAdj;

// AT24C04_WritePage();

// }

WDT_CONTR = 0x3f; // 喂狗 间隔9.1022s

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容