⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 good.txt

📁 利用51单片机做的一个闹钟程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define byte unsigned char
#define bint uchar data
sbit SCL = P3^0;
sbit SDA = P3^1;
sbit DS1820 = P3^7;
unsigned char code dx516[3] _at_ 0x003b; 
#define   nop _nop_();
bit change_alarm=0;
bit key1_down=0;
bit key3_down;
bit state=0;
int s;
//////////////////////////////////////////////////////////////////////
sbit TMDAT = P3^7;	//根据实实际情况设定
bit enb=0;
bit enc=0;
void keyb(void);
void keyc(void);
uchar dat,result,hd,ld;
uchar bdata bit_bytes;  //ic总线数据的暂存地址
sbit b7 = bit_bytes^7;  //数据的最高位
sbit b0 = bit_bytes^0;   //数据的最低位
uchar idata dis_buf[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uchar idata dis_buf2[13]={11,11,11,11,0,0,0,0,0,0,11,11,0};
uchar idata temp[2]= {0,0};
uchar idata temp2[2]={0,0};
uchar code select[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  
uchar code table[12] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; 
uchar code belowzero[16] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//DS18b20小数部分
uchar data save[9];     //保存修改的时间数据,save[0]到save[8]依次存储秒、分、时、日、星期、月、年、温度整数部分、温度小数部分
uchar data save2[7]={0,0,0,0,0,0,0};   //保存修改的时间数据,save[0]到save[8]依次存储秒、分、时、日、星期、月、年
bit bdata tem_flag=0;  
uchar data m,b,bcount,i = 0,j = 0,type,key2_time=0,k;
char BE=0;


/***********************延时子程序****************/
void delay(void);
void Tdelay(uchar i);
void DelayMs(unsigned int n); 

/***********************数码管显示****************/
void display(uchar idata *p);

/**********************按键及中断操作*************/
void key1(void);
void key2(void);
void key3(void);
void bee(void);
/**********************IC PROCESING***************/
void ic_start(void);
void ic_end(void);
void ic_SendByte(byte ic_data);
byte ic_ReceiveByte(void);
bit WaitAck(void);
void SendAck(void);
void SendNotAck(void);

/*********************PCF8563**********************/
void GetPCF8563(uchar firsttype,uchar count,uchar * buff);
void SetPCF8563(uchar timetype,uchar value);

/*********************DS18B20**********************/
void Readtemperature(void);
void init_1820(void);
void write_1820(uchar dat);
void read_1820(void);

/***********************刷新数码管*****************/
void ReadTime(type);
void ReadTime2(type);
void readtem(void);

///////////////////////////////////////
void dmsec (unsigned int count);
void tmreset (void);
void tmpre (void);
bit tmrbit (void);
unsigned char tmrbyte (void);
void tmwbyte (unsigned char dat);
void tmstart (void);
void tmrtemp (void);

/***********************主函数*********************/
void main()
{
    IE =0x8f;
    WR =0; 
    TMOD=0x66; 
	TH1=0xff;
	TL1=0xff;
	TR1=1;
	
    //SetPCF8563(0x09,0);
	/*SetPCF8563(0x0a,save2[2]);
    SetPCF8563(0x0b,save2[3]);
    SetPCF8563(0x0c,save2[4]);*/
    //SetPCF8563(0x01,0x12);
    while(1)
    {   
	   if(save[1]&0x7f==save2[1]&0x7f)
		{SetPCF8563(0x01,0x12);
		WR=1;
		}
       // if(BE)
		//{
		//BE=0;
        //SetPCF8563(0x01,0x12);//使af为0
        //}
		if(!key1_down)
		 {
		    if(save[1]&0x7f==save2[1]&0x7f)
		     {
		    SetPCF8563(0x01,0x12);
		     WR=1;
		     }
            tmstart();					
		    tmrtemp();
            Readtemperature();
            GetPCF8563(0x02,7,save);
            save[0] = save[0]&0x7f;
            save[1] = save[1]&0x7f;
            save[2] = save[2]&0x3f;
            save[3] = save[3]&0x3f;
            save[4] = save[4]&0x07;
            save[5] = save[5]&0x1f;
            for(k = 0; k<7; k++)
                 ReadTime(k);
        }
         
          if(enc)
          keyc();
          if(enb)
          keyb();
           

       
        display(dis_buf);
    }
}

/*************************延时子程序*****************/
void delay(void)
{
    uchar k;
    for(k = 0; k<120; k++);
}

void Tdelay(uchar i)
{
    while(i)i--;
}

void DelayMs(unsigned int n)
{
    unsigned int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<250;j++);
} 

/***********************数码管显示******************/
//void bee()interrupt 3
//{        
 //        BE=1; 
  //       WR=1;
//}


void display(uchar idata *p)
{ 
 
 if(key1_down==0)//时钟正常工作,同时温度工作
 {  
    P1 = 0xff;
    for(j = 0; j<8; j++)
    {
        P2 = select[j];
        P0 = table[*p];
		Tdelay(25); 
        if(T0 == 0)
        DelayMs(10);
		if(T0 == 0)
        key1();
		if(key1_down==1)break;//立刻退出正常状态。
        p++; 
        P0=0x00;
    }
    P2 = 0xff;
    for(j = 0; j<8; j++)
    {   
	    if(key1_down==1)break;
        P1 = select[j];
        if(!tem_flag)
             if(j == 5)
                 P0 = table[*p]|0x40;
             if(j == 6)
                 P0 = table[*p]|0x80;
        else 
             P0=table[*p];
        Tdelay(25);          
        p++;
        P0=0x00;
    }
  }
else//进入调整状态
{
  
    P1 = 0xff;
    for(j = 0; j<8; j++)
    {   
	    if(key3_down==1)
		break;
        P2 = select[j];
        P0 = table[*p];
		Tdelay(25); 
        p++; 
        P0=0x00;
    }
  P2 = 0xff;
    for(j = 0; j<8; j++)
    {
	    if(key3_down==1)
		break;
        P1=select[j];
        P0=table[*p];
        Tdelay(25);          
        p++;
        P0=0x00;
    }
      if(state==1)//实现闪烁
      {  
	    if(change_alarm==1)
		{
            switch(key2_time)
             {
              case 0: temp[0]=dis_buf[10];temp[1]=dis_buf[11];dis_buf[10]=11;dis_buf[11]=11;break;
              case 1: temp[0]=dis_buf[8];temp[1]=dis_buf[9];dis_buf[8]=11;dis_buf[9]=11;break;
              case 2: temp[0]=dis_buf[6];temp[1]=dis_buf[7];dis_buf[6]=11;dis_buf[7]=11 ;break;
              case 3: temp[0]=dis_buf[4];temp[1]=dis_buf[5];dis_buf[4]=11;dis_buf[5]=11;break;
              case 4: temp[0]=dis_buf[12];dis_buf[12]=11;break;
              case 5: temp[0]=dis_buf[2];temp[1]=dis_buf[3];dis_buf[2]=11;dis_buf[3]=11;break;
              case 6: temp[0]=dis_buf[0];temp[1]=dis_buf[1];dis_buf[0]=11;dis_buf[1]=11;break;     
            } 							 
            s=20;//闪烁显示时的循环变量
			while(s--)
			{
	    	  p=dis_buf;
              P1 = 0xff;
              for(j = 0; j<8; j++)
               {
			           if(key1_down==0)
			              break;
                       P2 = select[j];
                       P0 = table[*p];
                       Tdelay(25);            //提高亮度

			       	  if(T0 == 0)
                       DelayMs(10);
		               if(T0 == 0)
                       key1();//退出调整状态。
                 p++; 
                 P0 = 0x00;
               }
                  P2 = 0xff;
              for(j = 0; j<8; j++)
                 { 
				    if(key1_down==0)
			        break;
                    P1 = select[j];
                    P0=table[*p];
                    Tdelay(25);             
                    p++;
                    P0=0x00;
                 }
		          
             }
                             switch(key2_time)
                                 {
                                          case 0:dis_buf[10]=temp[0];dis_buf[11]=temp[1];break;
                                          case 1:dis_buf[8]=temp[0];dis_buf[9]=temp[1];break;
                                          case 2:dis_buf[6]=temp[0];dis_buf[7]=temp[1];break;
                                          case 3: dis_buf[4]=temp[0];dis_buf[5]=temp[1];break;
                                          case 4:dis_buf[12]=temp[0];break;
                                          case 5:dis_buf[2]=temp[0];dis_buf[3]=temp[1];break;
                                          case 6:dis_buf[0]=temp[0];dis_buf[1]=temp[1];break;
                                } 		
			 s=20;//闪烁显示时的循环变量
			while(s--)
			{

		                p=dis_buf;
              P1 = 0xff;
              for(j = 0; j<8; j++)
               {
			           if(key1_down==0)
			              break;
                       P2 = select[j];
                       P0 = table[*p];
                       Tdelay(25);            //提高亮度

			       	  if(T0 == 0)
                       DelayMs(10);
		               if(T0 == 0)
                       key1();//退出调整状态。
                 p++; 
                 P0 = 0x00;
               }
                  P2 = 0xff;
              for(j = 0; j<8; j++)
                 { 
				    if(key1_down==0)
			        break;
                    P1 = select[j];
                    P0=table[*p];
                    Tdelay(25);             
                    p++;
                    P0=0x00;
                 }
                                
	 	    
			         
           }
       
       }//时间调整
 	   else//报时调整
	   {
             switch(key2_time)
             {
              case 0: break;
              case 1: temp2[0]=dis_buf2[8];temp2[1]=dis_buf2[9];dis_buf2[8]=11;dis_buf2[9]=11;break;
              case 2: temp2[0]=dis_buf2[6];temp2[1]=dis_buf2[7];dis_buf2[6]=11;dis_buf2[7]=11 ;break;
              case 3: temp2[0]=dis_buf2[4];temp2[1]=dis_buf2[5];dis_buf2[4]=11;dis_buf2[5]=11;break;
              case 4: temp2[0]=dis_buf2[12];dis_buf2[12]=11;break;
              case 5: break;
              case 6: break;     
            } 							 
            s=20;
			while(s--)
			{
	    	         p=dis_buf2;
                     P1 = 0xff;
                     for(j = 0; j<8; j++)
                        {
			                 if(key1_down==0)
			                     break;
                             P2 = select[j];
                             P0 = table[*p];
                             Tdelay(25);             //低电平600us
				             if(T0 == 0)
                             DelayMs(10);
		                     if(T0 == 0)
                             key1();
                             p++; 
                             P0 = 0x00;
                        }
                      P2 = 0xff;
                     for(j = 0; j<8; j++)
                       {  
		                  if(key1_down==0)
			                 break;
                          P1 = select[j];
                          P0=table[*p];
                          Tdelay(25);             
                          p++;
                         P0=0x00;
                      }
		              
                 }

		             
                                switch(key2_time)
                              {
                                   case 0:break;
                                   case 1:dis_buf2[8]=temp2[0];dis_buf2[9]=temp2[1];break;
                                   case 2:dis_buf2[6]=temp2[0];dis_buf2[7]=temp2[1];break;
                                   case 3:dis_buf2[4]=temp2[0];dis_buf2[5]=temp2[1];break;
                                   case 4:dis_buf2[12]=temp2[0];break;
                                   case 5:break;
                                   case 6:break;
                              } 		
	 	    
			        s=20;
			while(s--)
			{
	    	         p=dis_buf2;
                     P1 = 0xff;
                     for(j = 0; j<8; j++)
                        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -