找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1655|回复: 0
打印 上一主题 下一主题
收起左侧

1寸数码管时钟(单片机程序)带温度计显示的想修改为不带时钟

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
本帖最后由 ll13536121668 于 2019-5-21 11:00 编辑

各位师博帮忙看看这个源码,修改成单独显示温度计可以吗?上传看看谢谢


能否可以修改成不带时钟  开机就是显示温度
#include <reg51.h>
#include <math.h>
#include "ADC.H"
#include "ds1302.h"


bit flag, Bell_Swh=1,Hourb,Minb,Kgb,flag_read,dot_Bell=1,Bell_Swh1=1;//闹钟调时闪烁标志位
bit sec=0,min=0,hour=0,year=0,mon=0,day=0,weekk=0,hour_Bell=0,min_Bell=0,hour_time=0,min_time=0;flag_bell=0,bell_bug = 0; //闪烁标志位
unsigned char id,id2,d,e,S_1302,S1_1302,H_1302,H_Bell,S_Bell,H_time,S_time; //
unsigned char disbuff[4]        ={0};
unsigned char time=0;
unsigned int temp[1];
unsigned int temp_num = 0;

unsigned char code LEDData1 [ ] = {  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff }; //正0-9LED数值
unsigned char code LEDData2 [ ] = {  0xc0,0xcf,0xA4,0x86,0x8B,0x92,0x90,0xc7,0x80,0x82,0xff }; //反0-9LED数值


void Delayms(unsigned int di) //延时
{
        unsigned int da,db;
         for(da=0;da<di;da++)
                   for(db=0;db<10;db++);
}
void Display(void)  //扫描方式led1~led4循环点亮
{
   time++;
   if(time==1)
   {  
           if(dot_Bell)
         {
       P2=LEDData1[disbuff[0]]&0x7f;// 0x7F点亮DP小数点
       LED1=0; LED4=1;
         }
           else
         {
       P2=LEDData1[disbuff[0]];
       LED1=0; LED4=1;
         }
   }

   if(time==2)
   {
      if(id>=3)
          {
           P2=(LEDData2[disbuff[1]])&0x7F;
       LED1=1; LED2=0;
          }
          else
      if(flag)
     {
       P2=(LEDData2[disbuff[1]])&0x7F;
       LED1=1; LED2=0;
     }
         else
         {
           P2=LEDData2[disbuff[1]];
       LED1=1; LED2=0;
         }
   }

   if(time==3)
   {
     if(id>=3)
          {
         P2=LEDData1[disbuff[2]]&0x7f;
         LED2=1; LED3=0;
      }

      else               
      if(flag)
          {
         P2=LEDData1[disbuff[2]]&0x7f;
         LED2=1; LED3=0;
      }
          else
          {
         P2=LEDData1[disbuff[2]];
         LED2=1; LED3=0;
      }
        }
         
   if(time==4)
   {
     time=0;
     if(disbuff[3]==0)
    {
      P2=LEDData1[10];
      LED3=1; LED4=0;
    }
     else
    {
                P2=LEDData1[disbuff[3]];
        LED3=1; LED4=0;
        }
   }
}



/******************************************************************************/
void Disp(void)//显示和闪烁函数
{
        unsigned int i=0;
        unsigned char a=0,b=0,c=0,f=0;

        if(hour==1)  //小时闪烁标志位
    {
            if(flag==1)
               {   
                        b=read_clock(0x85);//读小时
                 a=b;
                b=b>>4;
                a=a&0x0f;
                    disbuff[3]=b;
                    disbuff[2]=a;
               }
             else
               {
                   disbuff[2]=10;
                   disbuff[3]=10;
            }
    }
          else
           {
            if(flag_read==1)//250MS 读一次

                 {
                         H_1302=read_clock(0x85);//读小时
                b=read_clock(0x85);//读小时
                 a=b;
                b=b>>4;
                a=a&0x0f;
                    disbuff[3]=b;
                    disbuff[2]=a;
                 }
           }

               
        if(min==1)  //分钟闪烁标志位
    {
            if(flag==1)
               {   
                   d=read_clock(0x83);//读分钟
               e=d;
               d=d>>4;
               e=e&0x0f;
                   disbuff[1]=d;
                      disbuff[0]=e;
               }
             else
               {        
                 disbuff[1]=10;
                   disbuff[0]=10;
               }
    }
          else
    {
         
           if(flag_read==1)        //250MS读写一次
           {
                 S1_1302=read_clock(0x81);//读秒
             S_1302=read_clock(0x83);//读分钟
             d=read_clock(0x83);//读分钟
             e=d;
             d=d>>4;
              e=e&0x0f;
                 disbuff[1]=d;
                 disbuff[0]=e;
           }
    }
                        
}
/******************************************************************************/
void Disp2(void)//显示和闪烁函数
{
        unsigned int i=0;
        unsigned char a=0,b=0,c=0,f=0;


        if(hour_Bell==1)  //小时闪烁标志位
    {
            if(flag==1)
               {                    
                        b=read_clock(0xc3);//读小时
                 a=b;
                b=b>>4;
                a=a&0x0f;
                    disbuff[3]=b;
                    disbuff[2]=a;
        
               }
             else
               {
                   disbuff[2]=10;
                   disbuff[3]=10;
            }
    }
          else
           {
            if(flag_read==1)
                 {

                    H_Bell=read_clock(0xc3);//读取闹钟的时
                S_Bell=read_clock(0xc5);//读取闹钟的分

                b=read_clock(0xc3);//读小时
                 a=b;
                b=b>>4;
                a=a&0x0f;
                    disbuff[3]=b;
                    disbuff[2]=a;
                 }
           }

        
               
        if(min_Bell==1)  //分钟闪烁标志位
    {
            if(flag==1)
               {   
                   d=read_clock(0xc5);//读分钟
               e=d;
               d=d>>4;
               e=e&0x0f;
                   disbuff[1]=d;
                      disbuff[0]=e;
               }
             else
               {        
                 disbuff[1]=10;
                   disbuff[0]=10;
               }
    }
          else
    {
         
           if(flag_read==1)        //250MS读写一次
           {
             d=read_clock(0xc5);//读分钟
             e=d;
             d=d>>4;
              e=e&0x0f;
                 disbuff[1]=d;
                 disbuff[0]=e;
           }
    }
                        
}
/******************************************************************************/
void Disp3(void)//显示和闪烁函数
{
        unsigned int i=0;
        unsigned char a=0,b=0,c=0,f=0;


        if(hour_time==1)  //小时闪烁标志位
    {
            if(flag==1)
               {                    
                        b=read_clock(0xc7);//读小时
                 a=b;
                b=b>>4;
                a=a&0x0f;
                    disbuff[3]=b;
                    disbuff[2]=a;
        
               }
             else
               {
                   disbuff[2]=10;
                   disbuff[3]=10;
            }
    }
          else
           {
            if(flag_read==1)
                 {

                    H_time=read_clock(0xc7);//读取闹钟的时
                S_time=read_clock(0xc9);//读取闹钟的分
               
                        if(H_time>S_time)
                        {
                        unsigned char i;
                        i=H_time;
                        H_time=S_time;
                        S_time=i;
                        }

        
                b=read_clock(0xc7);//读小时
                 a=b;
                b=b>>4;
                a=a&0x0f;
                    disbuff[3]=b;
                    disbuff[2]=a;
                 }
           }

        
               
        if(min_time==1)  //分钟闪烁标志位
    {
            if(flag==1)
               {   
                   d=read_clock(0xc9);//读分钟
               e=d;
               d=d>>4;
               e=e&0x0f;
                   disbuff[1]=d;
                      disbuff[0]=e;
               }
             else
               {        
                 disbuff[1]=10;
                   disbuff[0]=10;
               }
    }
          else
    {
         
           if(flag_read==1)        //250MS读写一次
           {
             d=read_clock(0xc9);//读分钟
             e=d;
             d=d>>4;
              e=e&0x0f;
                 disbuff[1]=d;
                 disbuff[0]=e;
           }
    }
                        
}


/******************************************************************************/
        void id_case1_key(void)//id为1时的下一级选择
{
        if(Add_Key == 0) //增加
    {
            Delay(4000);
               if(Add_Key == 0) {while(Add_Key ==0); Set_time(id,0); }
         //调用Set_time函数
                        
    }

}

/******************************************************************************/
void id_case2_key(void)//id为1时的下一级选择
{
        if(Add_Key == 0) //增加
    {
            Delay(4000);
               if(Add_Key == 0) {while(Add_Key ==0); Set_Bell(id,0);}
                   //        Set_Bell(id,0);  //调用Set_Bell函数
                        //while(Add_Key ==0);
    }
}

void id_AD_scan_key(void)
{
        if(Add_Key == 0)
        {
                Delay(4000);
                if(Add_Key == 0)
                {
                        ET1 = 0;
                        id = 0;
                        ET0 = 1;
                //        return;
                }
        }
}
/******************************************************************************
void id_case3_key(void)//id为1时的下一级选择
{
        if(Add_Key == 0) //增加
    {
            Delay(300);
               if(Add_Key == 0)
                    {
                  dot_Bell=~dot_Bell;
              Bell_Swh=dot_Bell;
              write_clock(0x8e,0x00);//允许写操作
                  write_clock(0xc8,Bell_Swh);
          write_clock(0x8e,0x80);//写保护,禁止写操作
                  }
                  while(Add_Key ==0);
    }

}


/******************************************************************************/
void Set_Bell(unsigned char sel, bit sel_1)//根据选择调整相应项目
{
  signed char address,item;
  signed char max,mini;
  //if(sel==4)  {address=0xc6; max=59;mini=0;}    //秒
  if(sel==4)  {address=0xc2; max=23; mini=0;}   //时
  if(sel==5)  {address=0xc4; max=59;mini=0;}    //分

  if(sel==6)                                                                          //标志位
  {
//          address=0xc8;//for read
//        if(Add_Key ==0 || Dec_Key ==0)
//        Bell_Swh=~Bell_Swh;
//        write_clock(address,Bell_Swh);
          //address=0xc8;
          dot_Bell=~dot_Bell;
              Bell_Swh=dot_Bell;
              write_clock(0x8e,0x00);//允许写操作
                  write_clock(0xca,Bell_Swh);
          write_clock(0x8e,0x80);//写保护,禁止写操作
  }    //开关
  if(sel==7)  {address=0xc6; max=23;mini=0;}    //分
  if(sel==8)  {address=0xc8; max=23; mini=0;}   //时

    if(sel==9)                                                                          //标志位
  {
//          address=0xc8;//for read
//        if(Add_Key ==0 || Dec_Key ==0)
//        Bell_Swh=~Bell_Swh;
//        write_clock(address,Bell_Swh);
          //address=0xc8;
          dot_Bell=~dot_Bell;
              Bell_Swh1=dot_Bell;
              write_clock(0x8e,0x00);//允许写操作
                  write_clock(0xcc,Bell_Swh1);
          write_clock(0x8e,0x80);//写保护,禁止写操作
  }    //开关


  item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  if(sel_1==0)
          item++;  
  else
          item--;
  if(item>max) item=mini;   
  if(item<mini) item=max;

  write_clock(0x8e,0x00);//允许写操作
  write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  write_clock(0x8e,0x80);//写保护,禁止写操作
}

/******************************************************************************/
void Timer0_Init(void)//定时器0初始化
{
        /*
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        ET0=  1;*/
        
/*
//2毫秒@6.000MHz
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式        
        TL0 = 0x20;                //设置定时初值
        TH0 = 0xD1;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时        
        ET0 = 1; //enable timer0 interrupt*/

        
//2毫秒@12.000MHz
  AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;        //设置定时器模式        
        TL0 = 0x40;                //设置定时初值
        TH0 = 0xA2;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;        //定时器0开始计时        
        ET0 = 1; //enable timer0 interrupt

}

void Timer1Init(void)                //20毫秒@12.000MHz
{
        AUXR &= 0xBF;                //定时器时钟12T模式
        TMOD &= 0x0F;                //设置定时器模式        
        TL1 = 0xE0;                //设置定时初值
        TH1 = 0xB1;                //设置定时初值
        TF1 = 0;                //清除TF1标志
        TR1 = 1;                //定时器1开始计时        
}

/******************************************************************************/
void Timer0(void) interrupt 1 using 1//中断入口,冒号闪烁
{
        static unsigned char timecount = 0;//
          timecount++;

        if(timecount > 125)
        {
                 flag_read = ~flag_read;  
        
        }
  if(timecount > 250)//500MS
  {
            timecount = 0;   
            flag = ~flag;

  }
        Display();
}

void Timer1(void) interrupt 3 using 1
{
        temp_num++;
        if(temp_num > 40)
        {
                temp_num = 0;
        }
        
}


void ADC_convert(void)
{
        
        //EA = 0;//关中断
        
        ET0 = 0;
        
        if(temp_num == 0)
        {
                GetADCResult(6,&temp[0]);
        
          //temp[0] = (unsigned int) ( ( 3950.0 / ( 11.33657 + log( 6.04 * (float)temp[0] / ( 1024.0 - (float)temp[0] ) ) ) - 273.15 ) * 100 );
          temp[0]=(unsigned int) ((1/(log(((float)temp[0]*4700/(1024-(float)temp[0]))/10000)/3950+1/298.15)-273.15)*100);
               
                temp_num = 1;
        }
                        
        P2 = LEDData1[temp[0]/1000]; //千位
        LED4 = 0;
        Delayms(50);
        LED4 = 1;
        P2 = (LEDData1[temp[0]%1000/100])&0x7F;//百位
        LED3 = 0;
        Delayms(50);
        LED3 = 1;
        P2 = LEDData2[temp[0]%1000%100/10];//十位
        LED2 = 0;
        Delayms(50);
        LED2 = 1;
        
        P2 = 0xa7;//c
        LED1 = 0;
  Delayms(50);
        LED1 = 1;
        
//        id = 0;
        
        ET1 = 1;//启动定时器1
        

}


/******************************************************************************/
void main(void)//主函数
{

  P3M1=0x00;
        P3M0=0x08;

                                H_Bell=read_clock(0xc3);//读取闹钟的时   
        S_Bell=read_clock(0xc5);//读取闹钟的分   

        H_time=read_clock(0xc7);//读取闹钟的时   
        S_time=read_clock(0xc9);//读取闹钟的分   

                                dot_Bell= Bell_Swh;
        
        InitADC(); //初始化ADC
        Timer0_Init();//定时器T0初始化
        Timer1Init();
        EA=1;
        while(1)//主循环
         {        
                //设置时钟的初始值,显示14年4月5号11:59:55
          if(OK_Key == 0 && Add_Key == 0)
                {
                        Delay(1000);
                        if(OK_Key == 0 && Add_Key == 0)
                        {
                            while(OK_Key == 0);//等待键松开   
                                Init_1302();
                                H_Bell=read_clock(0xc3);//读取闹钟的时   
        S_Bell=read_clock(0xc5);//读取闹钟的分   

        H_time=read_clock(0xc7);//读取闹钟的时   
        S_time=read_clock(0xc9);//读取闹钟的分   

                                dot_Bell= Bell_Swh;

                        }
                }        
/*****************************************/
//                MF:   //返回主界面
/*****************************************/                        
                if (OK_Key == 0) // 设置和选择项目键
    {
                       Delay(1000);
               if(OK_Key == 0)
                          {
                                  id++;
                                        if(id == 2)
                                        {
                                                ET1 = 0;
                                                ET0 = 1;
                                        }
                                  if(id>9)id=0;        
                          }
               
                       while(OK_Key == 0);//等待键松开
                }  
/***************************************/
             switch( id )
              {
                       case 0:hour=0;min=0;Disp( );                         dot_Bell= Bell_Swh;break;//正常显示
                                        case 1:hour=0;min=0;ADC_convert();id_AD_scan_key();  dot_Bell= Bell_Swh;break;//显示温度
                 case 2:hour=1;id_case1_key();Disp();                 dot_Bell=0;break;  //小时
                            case 3:hour=0;min=1;id_case1_key();Disp();           dot_Bell=0;break; //分钟
          case 4:hour_Bell=1;id_case2_key();Disp2();           dot_Bell= Bell_Swh;break;
                 case 5:hour_Bell=0;min_Bell=1;id_case2_key();Disp2();dot_Bell= Bell_Swh;break;   
                 case 6:hour_Bell=0;min_Bell=0;id_case2_key();Disp2();dot_Bell= Bell_Swh;break;
                       case 7:hour_time=1;id_case2_key();Disp3();           dot_Bell= Bell_Swh1;break;
                       case 8:hour_time=0;min_time=1;id_case2_key();Disp3();dot_Bell= Bell_Swh1;break;
                            case 9:hour_time=0;min_time=0;id_case2_key();Disp3();dot_Bell= Bell_Swh1;break;
                 default:break;        
              }

                        if(Bell_Swh == 1)//闹钟为开
                {
                                
                        if(H_Bell == H_1302)
                         {
                                if(S_Bell == S_1302)        //分相等
                                {        
                                 
                                   if(S1_1302==0)        //秒等于0才开闹钟
                                   {
                                      flag_bell=1;
                                         }

                                   if(Add_Key ==0 )//按加退出
                                         {
                                            flag_bell=0;
                                         }
                                         
                          }        
                    else   
                    {
                        flag_bell=0;
                    }
                         }
                }//if
/******************************************************************/
/*                                if(Bell_Swh1 == 1)//整点报
                {               
                        if((H_1302 >=H_time )&&(H_1302<=S_time))
                         {
                                if( S_1302 == 0 )        //分相等
                                {        
                                                if(id != 2)
                                                {
                                     if(S1_1302==0x00)        //秒等于0才开闹钟
                                            {
                                            flag_bell=1;
                                                  bell_bug++;        //
                                                         if(bell_bug == 2)  //整点报时bug修正小函数
                                                         {                  //
                                                                        bell_bug = 0;   //
                                                                 flag_bell = 0;   //
                                                         }
                                                         
                                          }
                                          else           
                                            flag_bell=0;
                                    }
                            }
                        }         
                }//if  */
               
               
          if(Bell_Swh1 == 1)//整点报
                {               
                        if((H_1302 >=H_time )&&(H_1302<=S_time))
                         {
                                if( (S_1302 == 0) && ((S1_1302==0x00)) )        //分相等  //秒等于0才开闹钟
                                {        
                                                if(id != 2)
                                                {
                                                        if(id != 3)
                                                        {
                                            flag_bell=1;
                                                  bell_bug++;        //
                                                         if(bell_bug == 2)  //整点报时bug修正小函数
                                                         {                  //
                                                                        bell_bug = 0;   //
                                                                 flag_bell = 0;   //
                                                         }
                                                 }
                                                        else
                                                        {
                                                                        flag_bell=0;
                                                        }
                                                        
                                    }
                                                else
                                                {                                                        
                                             flag_bell=0;
                                                }
                            }
                                  else
                                        {
                                                flag_bell = 0;
                                        }
                        }
                        else
                        {
                                flag_bell = 0;
                        }
                }//if

                if(flag_bell)  //
                {
                 Bell();
                }
/******************************************************************/
        }//while
}//main


1寸大钟1_ok(程序).rar

90.58 KB, 下载次数: 30

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表