技术热线: 0755-86643915

单片机开发

单片机软件设计——时间与温度同运行问题

更新时间: 2023-10-08 16:09:30
阅读量:
1、程序运行时出现温度闪烁
2、温度十位秒点出现与时间显示秒点同时闪烁,但只是微亮。
是什么原因造成以上两点。
程序如何修改程序如下:
#include"reg51.h"
  #define uchar unsigned char
  #define uint unsigned int
  #define ON  0               //定义0为打开
  #define OFF 1               //定义1为关闭
  #define LEDBus P0            //定义p0口为数码管段码口

  //数码管正向安装数码表
uchar code LEDTab[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
                    //0     1    2   3     4    5    6    7    8   9  
//数码管反向安装数码表
uchar code LEDTab1[]={0x28,0x7d,0x32,0x34,0x65,0xa4,0xa0,0x3d,0x20,0x24,0x8a};
                    //  0    1    2   3     4   5    6    7    8    9    ℃
/******延时程序*******/
void delay1(unsigned int m)
    {
      unsigned int i,j;
      for(i=m;i>0;i--)
      for(j=80;j>0;j--);
    }
   
  /****************************************************************************
函数功能:延时子程序
入口参数:k
出口参数:
****************************************************************************/
void delay(unsigned int k)
{
unsigned int n;
n=0;
while(n < k)
{n++;}
return;
}




////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
/****时钟 端口定义******/
   ***it PS3=P2^7;            //时十位位选
   ***it PS2=P2^6;            //时个位位选
   ***it PS1=P2^5;            //分十位位选
   ***it PS0=P2^4;            //分个位位选
   ***it PS4=P0^5;     // 闪烁标志位
   ***it key=P3^5;      //时间调整配合
  ////////////////////////////////////////////
  /***************按键调时程序***************/
   ***it H_KEY=P3^6;          //时调整键
   ***it M_KEY=P3^7;          //分调整键
   bit   SHAN;                //闪烁标志位
   uchar second,minute,hour;        //定义秒、分、时寄存器
   void init();                //初始化函数
   void display();             //显示函数
   void min_tiao();            //分调整函数
   void hou_tiao();            //时调整函数
////////////////////////////////////////////////////////////////////////  
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/********定时器初始化*************/
  void init()
    {
      TMOD=1;     //定义定时器0,工作方式1
      TH0=0x3c;   //高8位
      TL0=0xb0;   //低8位
      EA=1;       //开全局中断
      ET0=1;   
      TR0=1;      //打开定时器
     }
/***************************************
函 数 名:display
功    能:显示函数
说    明:
入口参数:无
返 回 值:无
***************************************/
void display()
{
LEDBus=LEDTab[minute%10];      //分个位送数码管显示
PS0=ON;                        //打开分个位位选
delay1(3);                     //显示1毫秒
PS0=OFF;                       //关闭分个位位选
LEDBus=LEDTab[minute/10];      //分十位送数码管显示
PS1=ON;                        //打开分十位位选
delay1(3);                     //显示1毫秒
PS1=OFF;                       //关闭分十位位选
LEDBus=LEDTab[hour%10];        //时个位送数码管显示
PS4=SHAN;                      //秒点闪烁
PS2=ON;                        //打开时个位位选
delay1(3);                     //显示1毫秒
PS2=OFF;                       //关闭时个位位选
if(hour/10)                    //如果时十位为0,不显示十位数字
{
  LEDBus=LEDTab[hour/10];       //时十位送数码管显示
  PS3=ON;                       //打开时十位位选
  delay1(3);                    //显示1毫秒
  PS3=OFF;                      //关闭时十位位选
}
}
/***************************************
函 数 名:min_tiao
功    能:分调整
说    明:
入口参数:无
返 回 值:无
***************************************/
void min_tiao()
{
if(!key)
  {
while(!M_KEY) display();       //等待分调整键松开
second=0;minute++;             //秒清零、分加1
if(minute==60) minute=0;       //如果分等于60,分变0
}
}
/***************************************
函 数 名:hou_tiao
功    能:时调整
说    明:
入口参数:无
返 回 值:无
***************************************/
void hou_tiao()
{
if(!key)
  {
while(!H_KEY) display() ;       //等待时调整键松开
second=0;hour++;                //秒清零,时加1
if(hour==24) hour=0;            //如果时等于24,时变0
}
}
/***************************************
函 数 名:delay
功    能:延时函数
说    明:
入口参数:t:延时时间长短
返 回 值:无
***************************************/
//void delay(uchar t)
//{
   
//uchar i;                  //定义变量
// for(;t>0;t--)             //如果t大于0,t减1(外层循环)
//  for(i=124;i>0;i--);      //i等于124,如果i大于0,i减1
// }
/***************************************
函 数 名:timer0
功    能:定时器0中断函数
说    明:
入口参数:无
返 回 值:无
***************************************/
void timer0() interrupt 1        //定时器0(中断1)
{
uchar tim1,tim2;          //定义临时变量
TL0=TL0+0XB0;TH0=0X3C;    //重装定时器初值
tim1++;                   //每中断一次tim1加1
if(tim1==10)              //中断10(0.5秒)
  {                  
   SHAN=!SHAN;              //闪烁标志取反
   tim1=0;tim2++;           //tim1清零,tim2加1
   if(tim2==2)              //到了1秒
    {
    tim2=0;second++;        //tim2清零,秒加1
    if(second==60)          //如果秒到60
     {                 
       second=0;minute++;     //秒变0,分加1
       if(minute==60)         //如果分到60
        {
          minute=0;hour++;      //分变0,时加1
          if(hour==24) hour=0;  //如果时到24,时变0
        }
     }
    }
  }
}

/****温度 端口定义******/
  ***it wx5=P2^3;  //温度十位位选
  ***it wx6=P2^2;  //温度个位位选
  ***it wx7=P2^1;  //温度小数点位选
  ***it wx8=P2^0;  //断电关闭显示
  ***it  DQ=P3^3;  //DS18B20传感器入口
  uint temp, temp1,temp2, xs;
  //uchar code LEDTab[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
                     //  0   1     2   3     4    5    6    7    8   9  
         
/*********************************定义全局变量******************************/
unsigned char tempL=0; //临时变量低位
unsigned char tempH=0; //临时变量高位
float temperature; //温度值
float i;
/****************************************************************************
函数功能:数码管扫描延时子程序
入口参数:
出口参数:
****************************************************************************/
/*void delay1(void)
{
int k;
for(k=0;k<400;k++);
}




/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/
void display1(int k)
{
wx5=0;
P0=LEDTab1[k%100/10];
delay1(2);
wx5=1;
/*
P0=LEDTab1[k/1000];
delay1();
*/
wx6=0;
P0=LEDTab1[k%10];
delay1(2);
//P3=0xfb;
wx6=1;
wx7=0;
P0=0x8a;
delay1(2);
wx7=1;
//P3=0xff;
}


/****************************************************************************
函数功能:DS18B20初始化子程序
入口参数:
出口参数:
****************************************************************************/
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //延时
DQ=0; //发送复位脉冲
delay(90); //延时(>480ms)
DQ=1; //拉高数据线
delay(14); //等待(15~60ms)
}
/****************************************************************************
函数功能:向DS18B20读一字节数据
入口参数:
出口参数:dat
****************************************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/****************************************************************************
函数功能:向DS18B20写一字节数据
入口参数:dat
出口参数:
****************************************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}

/****************************************************************************
函数功能:向DS18B20读温度值
入口参数:
出口参数:temperature
****************************************************************************/
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(20); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
//温度转换,把高低位做相应的运算转化为实际温度
temperature=((tempH*256)+tempL)*0.0625;
delay(40);
return(temperature);
}


/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/*************************主函数****************************/
////////////////////////////////////////////////////////////
void main()
{
  hour=12;
  init();
  
  
     
        while(1)
           {        
           
             if(!H_KEY) hou_tiao();       //如果时调整键按下(为0),调用时调整函数
             if(!M_KEY) min_tiao();       //如果分调整键按下(为0),调用分调整函数
             display();                   //调用时间显示函数
     i=ReadTemperature();   //调取当前温度函数
             display1(i);    //调用温度显示函数
           }
  
  }
  /***************************************
program end               程序结束
***************************************/