想做一温度报警器,烧录到51单片机开发板上可以正常显示,但是到Proteus里其他正常,但温度却无法正常显示,所以想问一下大家
单片机程序代码如下- #include <REGX52.H>
- #include "LCD1602.h"
- #include "AT24C02.h"
- #include "Key.h"
- #include "DS18B20.h"
- #include "Delay.h"
- float T,TShow;
- char TLow,THigh;
- unsigned char KeyNum;
- void main()
- {
- DS18B20_ConvertT();
- Delay(1000);
- THigh=AT24C02_ReadByte(0);
- TLow=AT24C02_ReadByte(1);
- LCD_Init();
- LCD_ShowString(1,1,"T:");
- LCD_ShowString(2,1,"TH:");
- LCD_ShowString(2,9,"TL:");
- LCD_ShowSignedNum(2,4,THigh,3);
- LCD_ShowSignedNum(2,12,TLow,3);
- while(1)
- {
- KeyNum=Key();
-
- /*温度读取及显示*/
- DS18B20_ConvertT();
- T=DS18B20_ReadT();
- if(T<0)
- {
- LCD_ShowChar(1,3,'-');
- TShow=-T;
- }
- else
- {
- LCD_ShowChar(1,3,'+');
- TShow=T;
- }
- LCD_ShowNum(1,4,TShow,3);
- LCD_ShowChar(1,7,'.');
- LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);
-
- /*阈值判断及显示*/
- if(KeyNum)
- {
- if(KeyNum==1)
- {
- THigh++;
- if(THigh>125){THigh=125;}
- }
- if(KeyNum==2)
- {
- THigh--;
- if(THigh<TLow){THigh++;}
- }
- if(KeyNum==3)
- {
- TLow++;
- if(TLow>THigh){TLow--;}
- }
- if(KeyNum==4)
- {
- TLow--;
- if(TLow<-55){TLow=-55;}
- }
- LCD_ShowSignedNum(2,4,THigh,3);
- LCD_ShowSignedNum(2,12,TLow,3);
- AT24C02_WriteByte(0,THigh);
- Delay(5);
- AT24C02_WriteByte(1,TLow);
- Delay(5);
- }
- if(T>THigh)
- {
- LCD_ShowString(1,13,"OV:H");
- }
- else if(T<TLow)
- {
- LCD_ShowString(1,13,"OV:L");
- }
- else
- {
- LCD_ShowString(1,13," ");
- }
- }
- }
- #define AT24C02_ADDRESS 0xA0
- void AT24C02_WriteByte(unsigned char WordAddress,Data)
- {
- I2C_Start();
- I2C_SendByte(AT24C02_ADDRESS);
- I2C_ReceiveAck();
- I2C_SendByte(WordAddress);
- I2C_ReceiveAck();
- I2C_SendByte(Data);
- I2C_ReceiveAck();
- I2C_Stop();
- }
- unsigned char AT24C02_ReadByte(unsigned char WordAddress)
- {
- unsigned char Data;
- I2C_Start();
- I2C_SendByte(AT24C02_ADDRESS);
- I2C_ReceiveAck();
- I2C_SendByte(WordAddress);
- I2C_ReceiveAck();
- I2C_Start();
- I2C_SendByte(AT24C02_ADDRESS|0x01);
- I2C_ReceiveAck();
- Data=I2C_ReceiveByte();
- I2C_SendAck(1);
- I2C_Stop();
- return Data;
- }
- void Delay(unsigned int xms)
- {
- unsigned char i, j;
- while(xms)
- {
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- xms--;
- }
- }
- #define DS18B20_SKIP_ROM 0xCC
- #define DS18B20_CONVERT_T 0x44
- #define DS18B20_READ_SCRATCHPAD 0xBE
- /**
- * @brief DS18B20开始温度变换
- * @param 无
- * @retval 无
- */
- void DS18B20_ConvertT()
- {
- OneWire_Init();
- OneWire_SendByte(DS18B20_SKIP_ROM);
- OneWire_SendByte(DS18B20_CONVERT_T);
- }
- /**
- * @brief DS18B20读取温度
- * @param 无
- * @retval 温度数值
- */
- float DS18B20_ReadT()
- {
- unsigned char TLSB,TMSB;
- int Temp;
- float T;
- OneWire_Init();
- OneWire_SendByte(DS18B20_SKIP_ROM);
- OneWire_SendByte(DS18B20_READ_SCRATCHPAD);
- TLSB=OneWire_ReceiveByte();
- TMSB=OneWire_ReceiveByte();
- Temp=(TMSB<<8)|TLSB;
- T=Temp/16.0;
- return T;
- }
- sbit I2C_SCL=P2^1;
- sbit I2C_SDA=P2^0;
- void I2C_Start(void)
- {
- I2C_SDA=1;
- I2C_SCL=1;
- I2C_SDA=0;
- I2C_SCL=0;
- }
- void I2C_Stop(void)
- {
- I2C_SDA=0;
- I2C_SCL=1;
- I2C_SDA=1;
- }
- void I2C_SendByte(unsigned char Byte)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- I2C_SDA=Byte&(0x80>>i);
- I2C_SCL=1;
- I2C_SCL=0;
- }
- }
- unsigned char I2C_ReceiveByte(void)
- {
- unsigned char i,Byte=0x00;
- I2C_SDA=1;
- for(i=0;i<8;i++)
- {
- I2C_SCL=1;
- if(I2C_SDA){Byte|=(0x80>>i);}
- I2C_SCL=0;
- }
- return Byte;
- }
- void I2C_SendAck(unsigned char AckBit)
- {
- I2C_SDA=AckBit;
- I2C_SCL=1;
- I2C_SCL=0;
- }
- unsigned char I2C_ReceiveAck(void)
- {
- unsigned char AckBit;
- I2C_SDA=1;
- I2C_SCL=1;
- AckBit=I2C_SDA;
- I2C_SCL=0;
- return AckBit;
- }
复制代码 仿真电路如下
|