找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2989|回復: 2
打印 上一主題 下一主題
收起左側(cè)

基于c51單片機的電子鐘設計

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:464047 發(fā)表于 2019-1-7 19:42 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
原理圖如下所示:

源程序:
#include <reg52.h>                                          
#define uint unsigned int                                            
#define uchar unsigned char                                               
sbit led=P1^5;      //定義led燈,每秒閃爍一次,當秒表使用。
sbit led1=P1^4;       //定義led燈,每秒閃爍一次,當秒表使用。
sbit speaker= P1^6;     //定義蜂鳴器                                          
uchar smg_buf[]={0,0,0,0};
uchar code keycode_tab[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};                               //鍵盤
uchar code smg_sel[]={0xf7,0xfb,0xfd,0xfe};             //數(shù)碼管位選
uchar code smg_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0x0C6,0x0A1,0x86,0x08E,0xff};    //數(shù)碼管段選
uchar n=0,keycode;
uchar count=0;                                                            
uint hour=0,min=0,second=0;
uint T50ms=20;
uint t_set=0;
bit key_flag=0;
void delay500us(unsigned char X)                    //延時函數(shù)
{
unsigned char i,j;
    for(i=X;i>0;i--)
    for(j=248;j>0;j--);
}
void timechange()                  //時間變量改變
{
    second++;
    if(second>59)               
    {
     second=0;
     min++;
     if(min>59)
     {
        min=0;
        hour++;
        if(hour>23)
        hour=0;      
      }
    }
}
void init_timer1()                       //設置T1工作方式1 定時器 50ms
{
    TMOD=0x10;                              
    TH1=(65536-46083)/256;                              
    TL1=(65536-46083)%256;                              
    TR1=1;
}
void display()                              //數(shù)碼管顯示閃                                                   
{
smg_buf[0]=hour/10;
smg_buf[1]=hour%10;
smg_buf[2]=min/10;
smg_buf[3]=min%10;
                                                            
if(count==1)                      //LED閃爍,每秒閃爍一次,當秒表使用。
  {
    P0|=0xfe;
    P2=smg_sel[count];
    P0=smg_code[smg_buf[count]];
    if(T50ms==1)
    led=0,led1=0;
  }
  If (count!=1)
  {
    P0=0xff;
    P2=smg_sel[count];
    P0=smg_code[smg_buf[count]];
if(T50ms==11)
    led=1,led1=1;
  }
    count++;
if(count==4) count=0;   
}
void display1()                             //數(shù)碼管顯示不閃                                                   
{
smg_buf[0]=hour/10;     //小時十位
smg_buf[1]=hour%10;     //小時各位
smg_buf[2]=min/10;      //分鐘十位
smg_buf[3]=min%10;      //分鐘各位                                                         
    P0|=0xfe;
    P2=smg_sel[count];
    P0=smg_code[smg_buf[count]];
    led=1,led1=1;
    count++;
if(count==4) count=0;   
}
void keyscan()                                  //識別鍵盤
{
  ucharkeycode_L,keycode_H,i;
P3=0xf0;
keycode_H=P3&0xf0;
if(keycode_H!=0xf0)
  {
   delay500us(20);
    if(keycode_H!=0xf0)
    {
      //while(P3!=0xf0);
      keycode_H=P3&0xf0;
    }
  }
P3=0x0f;
keycode_L=P3&0x0f;
if(keycode_L!=0x0f)
  {
   delay500us(20);
    if(keycode_L!=0x0f)
    {                     // while(P3!=0x0f);
       key_flag=1;      //按下標志
      keycode_L=P3&0x0f;
    }
  }
keycode=keycode_H|keycode_L;
P3=0xf0;
while((P3&0XF0)!=0XF0);     //判彈起
for(i=0;i<16;i++)
  {
    if(keycode==keycode_tab)
       n=i;
  }                                                               
}
        
                                                        
void timer1_int() interrupt 3                           //中斷計時
{                                                                                                   
TH1=(65536-46083)/256;        //46083為50000的修正值
TL1=(65536-46083)%256;
t_set++;
T50ms--;                                            
  if(T50ms==0)
  {        timechange();                                                      
    T50ms=20;
  }
}
void modmin()                                       //調(diào)整分鐘
{
while(t_set<100)
{
    display1();
    keyscan();
    if(key_flag==1)
    {
        key_flag=0;
        t_set=0;
        if(n==14)
        {
            min++;
            if(min>59)
            {
                min=0;
            }
        }
        if(n==15)
        {
            if(min==0)
            {
                min=59;
            }
            else
                min--;
        }
        if(n==0|n==1|n==2|n==3|n==1|n==4|n==5|n==6|n==7|n==8|n==9)
        {
            smg_buf[2]=smg_buf[3];
            smg_buf[3]=n;
            min=smg_buf[2]*10+n;
            if(min>59)
            min=0;
        }
    }
            
}  
}
void modhour()                                       //調(diào)整小時
{
while(t_set<100)
{
    display1();
    keyscan();
    if(key_flag==1)
    {
        key_flag=0;
        t_set=0;
        if(n==14)
        {
            hour++;                                             
            if(hour>23)
            {
                hour=0;
            }
        }
        if(n==15)
        {
            if(hour==0)
            {
                hour=23;
            }
            else
                hour--;
        }
        if(n==0|n==1|n==2|n==3|n==1|n==4|n==5|n==6|n==7|n==8|n==9)
        {
            smg_buf[0]=smg_buf[1];
            smg_buf[1]=n;
            hour=smg_buf[0]*10+n;
            if(hour>23)
            {
                hour=0;
            }
        }
    }
            
}  
}
                                                                                 
void main()
{
    init_timer1();                                                                                   
    T50ms=20;                                       
    ET1=1;
    EA=1;                                                                                 
    while(1)                                                   
    {
      if(min==0&&second<2)
{speaker=0; delay500us(1850);speaker=1;delay500us(1);  }    //整點提示,蜂鳴器響2秒
      if(min==30&&second<0.5)
{speaker=0;delay500us(1850); speaker=1;delay500us(1); }   //半點提示,蜂鳴器響0.5秒
        display();      
        keyscan();                                                                  
        t_set=0;                                                
        if(key_flag==1)
        {
            t_set=0;
            key_flag=0;                        
            if(n==11)                                                                                                      
            {               
                modmin();
            }
            if(n==10)
            {
                modhour();
            }
        }
    }      
}  壓縮包所含文件如下所示;




電子鐘設計.zip

28.2 KB, 下載次數(shù): 34, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:659524 發(fā)表于 2019-12-11 22:19 來自觸屏版 | 只看該作者
a到DP好像沒有接吧
回復

使用道具 舉報

板凳
ID:940278 發(fā)表于 2021-6-24 10:07 來自觸屏版 | 只看該作者
李總不 發(fā)表于 2019-12-11 22:19
a到DP好像沒有接吧

只有這一處錯誤嘛
回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表