51单片机的时钟模块和温度传感器模块不能同时使用,同时使用会导致温度显示都为0?

为什么同时使用会导致温度显示一直为0,时钟模块可以正常使用,应该不是引脚冲突的原因,代码或许有些问题,希望




```能够指点指点
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"
#include <INTRINS.H>
#include "DS18B20.h"
#include "DS1302.h"
#include "Key.h"
float T;
unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;
void TimeShow(void)//时间显示功能
{
    DS1302_ReadTime();//读取时间
    LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年
    LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月
    LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日
    LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时
    LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分
    LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒
}

void TimeSet(void)//时间设置功能
{
    if(KeyNum==2)//按键2按下
    {
        TimeSetSelect++;//设置选择位加1
        TimeSetSelect%=6;//越界清零
    }
    if(KeyNum==3)//按键3按下
    {
        DS1302_Time[TimeSetSelect]++;//时间设置位数值加1
        if(DS1302_Time[0]>99){DS1302_Time[0]=0;}//年越界判断
        if(DS1302_Time[1]>12){DS1302_Time[1]=1;}//月越界判断
        if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || 
            DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
        {
            if(DS1302_Time[2]>31){DS1302_Time[2]=1;}//大月
        }
        else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
        {
            if(DS1302_Time[2]>30){DS1302_Time[2]=1;}//小月
        }
        else if(DS1302_Time[1]==2)
        {
            if(DS1302_Time[0]%4==0)
            {
                if(DS1302_Time[2]>29){DS1302_Time[2]=1;}//闰年2月
            }
            else
            {
                if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月
            }
        }
        if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//时越界判断
        if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分越界判断
        if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒越界判断
    }
    if(KeyNum==4)//按键3按下
    {
        DS1302_Time[TimeSetSelect]--;//时间设置位数值减1
        if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//年越界判断
        if(DS1302_Time[1]<1){DS1302_Time[1]=12;}//月越界判断
        if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || 
            DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
        {
            if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月
            if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
        }
        else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
        {
            if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月
            if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
        }
        else if(DS1302_Time[1]==2)
        {
            if(DS1302_Time[0]%4==0)
            {
                if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//闰年2if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
            }
            else
            {
                if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
            }
        }
        if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//时越界判断
        if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判断
        if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判断
    }
    //更新显示,根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
    if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1,"  ");}
    else {LCD_ShowNum(1,1,DS1302_Time[0],2);}
    if(TimeSetSelect==1 && TimeSetFlashFlag==1){LCD_ShowString(1,4,"  ");}
    else {LCD_ShowNum(1,4,DS1302_Time[1],2);}
    if(TimeSetSelect==2 && TimeSetFlashFlag==1){LCD_ShowString(1,7,"  ");}
    else {LCD_ShowNum(1,7,DS1302_Time[2],2);}
    if(TimeSetSelect==3 && TimeSetFlashFlag==1){LCD_ShowString(2,1,"  ");}
    else {LCD_ShowNum(2,1,DS1302_Time[3],2);}
    if(TimeSetSelect==4 && TimeSetFlashFlag==1){LCD_ShowString(2,4,"  ");}
    else {LCD_ShowNum(2,4,DS1302_Time[4],2);}
    if(TimeSetSelect==5 && TimeSetFlashFlag==1){LCD_ShowString(2,7,"  ");}
    else {LCD_ShowNum(2,7,DS1302_Time[5],2);}
}
void Timer0_Routine() interrupt 1
{
    static unsigned int T0Count;
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    T0Count++;
    if(T0Count>=500)//500ms进入一次
    {
        T0Count=0;
        TimeSetFlashFlag=!TimeSetFlashFlag;//闪烁标志位取反
    }
}
void main()

{ 
    LCD_Init();
    DS1302_Init();
    Timer0Init();
    DS18B20_ConvertT();        
  Delay(500);            
    LCD_Init();
    LCD_ShowString(1,1,"  -  -  ");//静态字符初始化显示
    LCD_ShowString(2,1,"  :  :  ");
  LCD_ShowString(1,9,"T:");
    DS1302_SetTime();//设置时间
 
    while(1)
    { 
        DS18B20_ConvertT();    
        T=DS18B20_ReadT();    
        if(T<0)                
        {
            LCD_ShowChar(1,11,'-');    
            T=-T;            
        }
        else                
        {
            LCD_ShowChar(1,11,'+');    
        }
        LCD_ShowNum(1,12,T,2);        
        LCD_ShowChar(1,14,'.');        
        LCD_ShowNum(1,15,(unsigned long)(T*100)%100,1);
        KeyNum=Key();//读取键码
        if(KeyNum==1)//按键1按下
        {
            if(MODE==0){MODE=1;TimeSetSelect=0;}//功能切换
            else if(MODE==1){MODE=0;DS1302_SetTime();}
        }
        
        switch(MODE)//根据不同的功能执行不同的函数
        {
            
            case 0:TimeShow();;break;
            case 1:TimeSet();break;
        }
        
    }
    
}

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/170302452296140.jpg "#left")

【以下回答由 GPT 生成】

问题描述: 在使用51单片机的时钟模块和温度传感器模块时,发现它们不能同时使用,否则会导致温度显示一直为0。确认了引脚配置没有冲突,怀疑是代码问题。

解决方案: 1. 首先,检查温度传感器模块的代码实现。确保正确读取温度传感器的数值。可以考虑在其他单独的测试中,只使用温度传感器模块,确认温度传感器模块能够正常工作。 2. 然后,检查时钟模块的代码实现。确保正确读取时钟的时间数值。可以考虑在其他单独的测试中,只使用时钟模块,确认时钟模块能够正常工作。 3. 如果温度传感器和时钟模块的代码都没有问题,并且在单独的测试中都能正常工作,那么很有可能是两个模块在同时工作时引起了冲突。 4. 进一步检查代码,查找是否有可能的冲突点。比如,两个模块使用了相同的中断或者计时器资源,或者在两个模块的代码中有相互依赖的问题。 5. 如果找到了潜在的冲突点,可以尝试以下解决方案: - 修改中断优先级,确保时钟模块的中断优先级高于温度传感器模块的中断优先级。 - 调整中断服务函数的代码,避免对共享资源的同时访问。 - 增加适当的延时或者同步机制,以确保两个模块之间的调度不会冲突。

如果以上解决方案都不能解决问题,那么很有可能是硬件上的限制导致无法同时使用时钟模块和温度传感器模块。这种情况下,您可以考虑选择其他型号的单片机或者使用外部设备来实现相同的功能。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^