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

📄 dzsz.txt

📁 利用51单片机做的一个电子时钟
💻 TXT
字号:
#include <reg51.h> //头文件,定义寄存器
#include <intrins.h> 
#include <absacc.h>
#include <math.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P3^7;//数据指令选择信号
sbit RW=P3^6;//读写选择信号
sbit E=P3^5;//使能信号
uchar table1[13]={'C','L','O','C','K',' ','G','O','O','D','B','Y','E'}; 
uchar table2[13]={'C','L','O','C','K',' ','W','E','L','C','O','M','E'};
uchar dizhi[2]={0x80,0xc0};
void chushihua();
void busy();
void writecode (uint daima);
void writeshuju (uchar shuju);
void delay(uint m);
void display(uchar dizhi,uint shuju);
void select(uchar dizhi,uchar shu);
void key_scan(void);      
void display2(uchar *shuju);
void clr_timer(void);
void display3(void);
void xiugai(void);
void jia(void);
void xiugaifen(void);
void fenjia(void);
void jianshi(void);
void jianfen(void);
void display4(uchar *s);
void close(void);
uchar temp=0;
uchar t1=0,t2=0;
char f1=0,f2=0;
char s1=0,s2=0;
uchar shi[2]={0,0};
uchar fen[2]={0,0};
uchar miao[2]={0,0};
void time0(void) interrupt 1 using 1
 {
 TMOD=0X01;
 TH0=0X3C;    //定时50ms
 TL0=0X0B0;
 temp++;
 if(temp==20)
  {
   P0=!P0;
   temp=0;
   t1++;     //定时1秒到,就是秒加1
   if(t1<10)  //秒低位处理程序
   {
    miao[1]=t1;
    }
   else
  {
   t2++;
   t1=0;
   miao[0]=t2;
   miao[1]=t1;
   }
   if(t2>5)   //秒高位处理程序
   {
     f1++;
     t2=0;
     t1=0;
     miao[0]=t2;
     fen[1]=f1;
   }
   if(f1>9)  //分低位处理程序
   {
     f1=0;
     f2++;
     fen[0]=f2;
     fen[1]=f1;
   }
   if(f2>5) //分高位处理程序
   {
     s1++;
     f2=0;
     f1=0;
     fen[0]=f2;
     shi[1]=s1;
   }
   if(s1>9)  //时低位处理程序
   {
     s2++;
     s1=0;
     shi[0]=s2;
     shi[1]=s1;
   }
   if(s2>1)  //时高位处理程序
   {
     if(s1>3)
     {
     t1=t2=0;
     s1=s2=0;
     f1=f2=0;
     miao[0]=0;
     miao[1]=0;
     fen[0]=0;
     fen[1]=0;
     shi[0]=0;
     shi[1]=0;
     }
   }
   writecode(0x86); //显示秒钟
   display2(miao);
   writecode(0x83); //显示分钟
   display2(fen);
   writecode(0x80); //显示小时
   display2(shi);
   }
 }
main()
{
  chushihua();
  display4(table2);
  delay(3000);
  chushihua();
  writecode(0x80);
  display2(shi);
  display(0x82,':');
  writecode(0x83);
  display2(fen);
  display(0x85,':');
  writecode(0x86);
  display2(miao);
  TMOD=0X01;
  P0=0x00;
  TH0=0X3C;
  TL0=0X0B0;
  TR0=1;
  ET0=1;
  while(1)
  {
    key_scan();
  }
}
void display3(void)
{
   display(0x85,':');
   display(0x82,':');
   writecode(0x80); //显示小时
   display2(shi);
   writecode(0x83); //显示分钟
   display2(fen);
   writecode(0x86); //显示秒钟
   display2(miao);  
}
void clr_timer(void)
{
    t1=t2=0;
     s1=s2=0;
     f1=f2=0;
     miao[0]=0;
     miao[1]=0;
     fen[0]=0;
     fen[1]=0;
     shi[0]=0;
     shi[1]=0;
}
void display2(uchar *shuju)  //显示数据
{
  uchar i;
  uchar m;
  for (i=0;i<2;i++)
  {
   m=shuju[i];
   writeshuju(m+0x30);
   }
}
void key_scan(void)
{
 uchar temp;
 delay(10);
 P1=0xff;
 while(P1==0xff)
 {;}
 temp=P1;
 switch (temp) //定义按键代表的含义
 {
   case 0xfe:chushihua();clr_timer();EA=0;display3();break;
   case 0xfd:EA=1;display3();break;
   case 0xfb:EA=0;display3();break;
   case 0xf7:jia();break;
   case 0xef:jianshi();break;
   case 0xdf:fenjia();break;
   case 0xbf:jianfen();break;
   case 0x7f:close();break;
   default:;break;
 }
 while(P1!=0xff) // 等待按键释放,若有按键在按下,就等待,直到释放才跳出程序
 {;}
}
 void close(void)
 {
  display4(table1);     
 }
void display4(uchar *s)
 {
   uchar i,m;
   writecode(0x80);
   for(i=0;i<13;i++)
   {
     m=s[i];      
     writeshuju(m);
    }  
 } 
void jianshi(void)  //s1表示小时的低位,s2表示小时的高位
{
  if(s2>0)
  {
    if(s1>=0)
     {
       s1--;
       if(s1<0)
        {
          s2--;
          s1=9;
        }
     }
  }
  else if(s2==0)
     {
       if(s1>=0)
       {
         s1--;
       }
        if(s1<0)
        {
         s1=3;
         s2=2;
        }
     }
    shi[1]=s1;
    shi[0]=s2;
    writecode(0x81);
    display3();
    writecode(0x81);
}
void jianfen(void)
{
     if(f2>0)
  {
    if(f1>=0)
     {
       f1--;
       if(f1<0)
        {
          f2--;
          f1=9;
        }
     }
  }
  else if(f2==0)
     {
       if(f1>=0)
       {
         f1--;
       }
        if(f1<0)
        {
         f1=9;
         f2=5;
        }
     }
    fen[1]=f1;
    fen[0]=f2;
    writecode(0x84);
    display3();
    writecode(0x84);
}
void xiugai(void)  //修改小时的光标位置
{
 uchar i=0;
 writecode(0x81);
}
 void xiugaifen(void) //修改分钟的光标位置
 {
   writecode(0x84);
 }
void jia(void)     //设置小时的加1程序
{
 s1++;
 shi[1]=s1;
 writecode(0x81);
 display3();
 writecode(0x81);
 if(s1>9)
 {
  s2++;
  shi[0]=s2;
  s1=0;
  shi[1]=s1;
  display3();
  writecode(0x81);
 }
 if(s2>1)
 {
  if(s1>3)
  {
  s1=s2=0;
  shi[0]=shi[1]=0;
  display3();
  writecode(0x81);
  }
 }
}
void fenjia(void)   //设置分钟的加1程序
{
 f1++;
 fen[1]=f1;
 writecode(0x84);
 display3();
 writecode(0x84);
 if(f1>9)
 {
  f2++;
  fen[0]=f2;
  f1=0;
  fen[1]=f1;
  display3();
  writecode(0x84);
 }
 if(f2>5)
 {
  f1=f2=0;
  fen[0]=fen[1]=0;
  display3();
  writecode(0x84);
 }
}
void select(uchar dizhi,uchar shu)//数据送液晶显示
{
 switch(shu)
{
  case(0):display(dizhi,'0');break;
  case(1):display(dizhi,'1');break;
  case(2):display(dizhi,'2');break;
  case(3):display(dizhi,'3');break;
  case(4):display(dizhi,'4');break;
  case(5):display(dizhi,'5');break;
  case(6):display(dizhi,'6');break;
  case(7):display(dizhi,'7');break;
  case(8):display(dizhi,'8');break;
  case(9):display(dizhi,'9');break;
  default:display(dizhi,' ');break;
}
}
void chushihua()//液晶初始化
{
 delay(15);
 writecode (0x38);
 delay(5);
 writecode (0x38);
 delay(5);
 writecode (0x38);
 delay(5);
 writecode (0x08);
 writecode (0x01);
 writecode (0x06);
 writecode (0x0f);
}
void busy()//检测液晶是否忙,RS为0,RW为1,E为高
{
 RS=0;
 RW=1;
 E=1;
 P2=0xff;
 while(P2&0x80)
 {
 ;
 }
 E=0;
}
void writecode (uint daima)//给液晶写代码,RS为0,RW为0,E为高脉冲
{
 busy();
 RS=0;
 RW=0;
 P2=0xff;
 P2=daima;
 E=1;
 E=0;
}
void writeshuju (uchar shuju)//向液晶写数据,RS为1,RW为0,E为高脉冲
{
 busy();
 RS=1;
 RW=0;
 P2=0xff;
 P2=shuju;
 E=1;
 E=0;
}
void display(uchar dizhi,uint shuju)  //显示数据
{
  writecode (dizhi);
  writeshuju(shuju);
}

 void delay(uint m)
{
 while (m--)
 {uchar j;
 for (j=0;j<125;j++)
 {;}
  }
}

⌨️ 快捷键说明

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