久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2755|回復: 1
打印 上一主題 下一主題
收起左側

AT89C2051單片機制作數字時鐘

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 xz318569872 于 2019-7-3 10:27 編輯

單個按鍵實現時鐘的24時轉到12時制,年月日顯示,星期顯示,可調整時間,年月日,星期,有仿真。

#include "reg52.h"
typedef unsigned char uchar;//給數據類型重命名
typedef unsigned int  uint;
unsigned char code sh[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陰數碼管數碼0~9
uchar Year1,Year2,Mon,Day,Hour,Min,Sec,Week,Week1;// 年月日時分秒星期
uint  Year;
uchar num;         //計數值
uchar flag=0;        //功能切換標志位
void Delay(unsigned char x)      //延時函數
{
       unsigned int i;
    for(i=0;i<2;i++)
    {
       while(x--);  
    }
}
void Delay_1(unsigned char x)
{
    unsigned char i;
for(i=0;i<30;i++)
{
   while(x--);
}  
}
void Display_Hour(unsigned char x)//時顯示函數
{
P3=0x05;       //選中第一位數碼管
P1=sh[x/10];        //分離十位
    Delay(1);  
P3=0x06;        //選中第二位
P1=sh[x%10];        //分離個位
Delay(1);
}
void Display_Min(unsigned char x)//分顯示函數
{
P3=0x0c;  
P1=sh[x/10];   
    Delay(1);  
P3=0x14;   
P1=sh[x%10];   
Delay(1);
}
void Display_Sec(unsigned char x)//秒顯示函數
{
P3=0x24;  
P1=sh[x/10];   
    Delay(1);  
P3=0x84;   
P1=sh[x%10];   
Delay(1);
}
void Exchange_Init()//12小時/24小時轉換
{
unsigned char h;
if(Hour<=12)   //判斷為1-12
{
   h=Hour;//12小時制和24小時  時間一樣
   Display_Hour(h);
}
else
{
   h=Hour-12;//減去12轉換成12小時制
   Display_Hour(h);
}
}
void Display_Year(unsigned char x)//年顯示函數
{
      P3=0x05;
   P1=sh[x/10];
   Delay(1);
   P3=0x06;
   P1=sh[x%10];
   Delay(1);
}
void Display_Mon(unsigned char x)//月顯示函數
{
      P3=0x0C;
   P1=sh[x/10];
   Delay(1);
   P3=0x14;
   P1=sh[x%10];
   Delay(1);
}
void Display_Day(unsigned char x)//日顯示函數
{
      P3=0x24;
   P1=sh[x/10];
   Delay(1);
   P3=0x84;
   P1=sh[x%10];
   Delay(1);
}
void Display_Week1(unsigned char x)//日顯示函數
{
   P3=0x24;
  P1=sh[x/10];
  Delay(1);
  P3=0x84;
  P1=sh[x%10];
  Delay(1);
}
void  Display_Week(unsigned char x)//星期顯示函數
{
      P3=0x84;
   P1=sh[x%10];
   Delay(1);
}
void Charge_init()//自動追蹤
{
  if(((Year%4==0)&&(Year%100!=0))||(Year%400==0))//滿足閏年條件
{
   if(Mon==2)
   { if(Hour>=24){Hour=0;Day++;}if(Day>29){ Day=0;Mon++;}}
   else if(Mon<7)
   {if(Mon%2==1){if(Hour>=24){Hour=0;Day++;}if(Day>31)
   {Day=0;Mon++;}}
    else{if(Hour>=24){Hour=0;Day++;}if(Day>30){Day=0;Mon++;}}
   }
   else if(Mon==7)
   {if(Hour>=24){Hour=0;Day++;}if(Day>31){Day=0;Mon++;}}
   else if(Mon<=12)
   {if(Mon%2==1){if(Hour>=24){Hour=0;Day++;}if(Day>30){Day=0;Mon++;}}
   else{if(Hour>=24){Hour=0;Day++;}if(Day>31){Day=0;Mon++;}}}
   else  { Mon=0;}
}
else
{
   if(Mon==2)
   { if(Hour>=24){Hour=0;Day++;}if(Day>28){ Day=0;Mon++;}}
   else if(Mon<7)
   {if(Mon%2==1){if(Hour>=24){Hour=0;Day++;}if(Day>31)
   {Day=0;Mon++;}}
   else{if(Hour>=24){Hour=0;Day++;}if(Day>30){Day=0;Mon++;}}
   }
   else if(Mon==7)
   {if(Hour>=24){Hour=0;Day++;}if(Day>31){Day=0;Mon++;}}
   else if(Mon<=12)
   {if(Mon%2==1){if(Hour>=24){Hour=0;Day++;}if(Day>30){Day=0;Mon++;}}
   else{if(Hour>=24){Hour=0;Day++;}if(Day>31){Day=0;Mon++;}}}
   else  {Mon=0;Year++;}   
}}
void Exchenang_Hour() //時調整函數
{
for(;Hour<=24;Hour++)
   {
   P3=0x05;
   P1=sh[Hour/10];
   Delay_1(10);
   P3=0x06;
   P1=sh[Hour%10];
   Delay_1(10);
   if(flag==7)break; //如果flag=5,退出對時的調整
   }
   if(Hour==24)
  {Hour=0;}               
}
void Exchenang_Min()//分調整程序
{
   for(;Min<=60;Min++)
   {  
   P3=0x0C;   
   P1=sh[Min/10];  
   Delay_1(10);
   P3=0x14;     
   P1=sh[Min%10];
   Delay_1(10);
   if(flag==9)break; //如果flag=7,退出對分鐘的調整
   }
   if(Min==60)   //如果分鐘計時到60分,賦初值0,
  {Min=0;}      
}
void Exchenang_Year()//年調整程序
{  
      unsigned char y;
   for(;Year<=3000;Year++)
   {
   y=Year%100;   
   P3=0x05;   
   P1=sh[y/10];  
   Delay_1(10);
   P3=0x06;  
   P1=sh[y%10];   
   Delay_1(10);
      if(flag==11)break;  //如果flag=9,退出對分鐘的調整
   }
   if(Year==3000) //如果年達到3015年,自動賦初值0
   {Year=0;}         
}
void Exchenang_Week()//日調整程序
{  
  for(;Week<=6;Week++)
  {
  P3=0x24;  
  P1=sh[Week/10];
  Delay_1(10);
  P3=0x84;   
  P1=sh[Week%10];
  Delay_1(10);
  if(flag==5)break; //如果flag=13時,退出調整日
  }
  if(Week==7)
{Week=0;} //如果天加到31,重新賦初值0      
}
void Exchenang_Mon()//月調整程序
{   
   for(;Mon<=12;Mon++)
   {
   P3=0x0C;   
   P1=sh[Mon/10];  
   Delay_1(10);
   P3=0x14;   
   P1=sh[Mon%10];
   Delay_1(10);
   if(flag==13)break; //如果flag=11,退出調整月
   }
   if(Mon==12)    //如果月到達12時,重新計數為0;
   {Mon=0;}         
}
void Exchenang_Day()//日調整程序
{  
   for(;Day<=31;Day++)
   {
   P3=0x24;  
   P1=sh[Day/10];
   Delay_1(10);
   P3=0x84;   
   P1=sh[Day%10];
   Delay_1(10);
   if(flag==15)break; //如果flag=13時,退出調整日
   }
   if(Day==31)
{Day=0;} //如果天加到31,重新賦初值0      
}
void Timer0_Init()//常規初始化
{
    TMOD=0x01;   
TH0=(65535-10000)/256; //20ms
TL0=(65535-10000)%256;
ET0=1;  
EX0=1;   
IT0=1;   
TR0=1;  
EA=1;     
}
void main()
{
  Timer0_Init();
  Year=2019;
  Year1=Year/100;
  Year2=Year%100;
  Mon=7;
  Day=3;
  Hour=20;
  Min=20;
  Sec=50;
  Week=3;
  while(1)
  {
  if(flag==0)
  {
   Display_Hour(Hour);    //顯示時分秒
   Display_Min(Min);
   Display_Sec(Sec);
  }
  else if(flag==1)     //顯示切換
  {
   Exchange_Init();
   Display_Min(Min);
   Display_Sec(Sec);
  }
  else if(flag==2)     //顯示年月日
  {
    Display_Year(Year2);
    Display_Mon(Mon);
    Display_Day(Day);
  }
  else if(flag==3)     //顯示星期
  {
   Display_Week(Week);
  }
  else if(flag==4)     //調整周
  {
   Exchenang_Week();
  }
  else if(flag==5)     //顯示周
  {
   Display_Week1(Week);
  }
  else if(flag==6)     //調整時
  {
   Exchenang_Hour();
  }
  else if(flag==7)     //顯示時
  {
   Display_Hour(Hour);
  }
  else if(flag==8)     //調整分
  {
    Exchenang_Min();
  }
  else if(flag==9)     //顯示分
  {
    Display_Min(Min);
  }
  else if(flag==10)     //調整年
  {
    Exchenang_Year();
    Year2=Year%100;    //取后兩位
  }
  else if(flag==11)     //顯示年
  {
    Display_Year(Year2);
  }
  else if(flag==12)     //調整月
  {
    Exchenang_Mon();
  }
  else if(flag==13)     //顯示月
  {
    Display_Mon(Mon);
  }
  else if(flag==14)      //調整日
  {
   Exchenang_Day();
  }         
  else if(flag==15)      //顯示日
  {
   Display_Day(Day);
  }
  }
}
void timer0() interrupt 1  using 1
{
     TH0=(65535-21535)/256;
  TL0=(65535-21535)%256; //重新賦初值,定時20ms
  num++;
  if(num>=60)
  {
     num=0;
  Sec++;   //如果定時到一秒,秒加1
  }   
  if(Sec>=60)
  {
     Sec=0;
  Min++;   //如果秒計時到60s,則分加1
  }
  if(Min>=60)
  {
    Min=0;
    Hour++;   //如果分計時到60m,則時加1
  }  
Charge_init();
}
void Int0_init() interrupt 0
{
flag++;
if(flag==16)
{
  flag=0;
}
}
[img]file:///D:/QQ/QQ消息記錄/318569872/Image/C2C/H2[]ISYL6RXK]FC__7IYI2J.png[/img]


LPY7SX6}USMEZHOZD11_{8T.png (7.03 KB, 下載次數: 49)

顯示年月日

顯示年月日
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:468878 發表于 2019-7-3 22:23 | 只看該作者
可以焊個實物出來玩玩,我還真沒焊過數字鐘
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久中文字幕一区 | 亚洲欧美日韩一区二区 | 99只有精品 | sese视频在线观看 | 毛色毛片免费看 | 在线观看av免费 | 男女羞羞视频免费 | 一道本视频 | 91av国产在线视频 | 日本一区视频在线观看 | 亚洲电影一区二区三区 | 亚洲欧美在线观看 | 日韩成人免费视频 | 亚洲美女一区 | 隔壁老王国产在线精品 | 91精品国产麻豆 | 久久久久黄 | 一区二区三区四区国产 | 国产精品国产精品国产专区不卡 | 久久一区精品 | 中文字幕国产精品 | 国产亚洲网站 | 97国产在线视频 | 欧美在线观看一区二区 | 亚洲美女天堂网 | 亚洲a在线观看 | h视频在线免费观看 | 成人高清在线视频 | 国产免费一区二区 | 中文字幕欧美一区二区 | 亚洲一区二区三区在线播放 | 国产精品一区网站 | 91精品国产一区二区三区 | 日韩精品免费 | 国产伦一区二区三区视频 | 国产免费一级片 | 成人影视网 | 国产成人av在线播放 | 亚洲一卡二卡 | 国产精品一级在线观看 | 久久精品久久久 |