想做一溫度報警器,燒錄到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;
- }
復制代碼 仿真電路如下
1.png (98.04 KB, 下載次數: 47)
下載附件
2021-10-5 03:42 上傳
|