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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
原理圖如下所示:

源程序:
#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};             //數碼管位選
uchar code smg_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0x0C6,0x0A1,0x86,0x08E,0xff};    //數碼管段選
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)                    //延時函數
{
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()                              //數碼管顯示閃                                                   
{
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()                             //數碼管顯示不閃                                                   
{
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()                                       //調整分鐘
{
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()                                       //調整小時
{
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, 下載次數: 34, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

只有這一處錯誤嘛
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线91 | 亚洲精品久久久久久久久久久 | 亚洲精品电影在线观看 | 在线观看中文字幕一区二区 | 九色在线观看 | www..com18午夜观看 | 日韩精品成人免费观看视频 | 久久久久国产一区二区三区不卡 | 国产在线一区二区 | 成人av高清在线观看 | 乱码av午夜噜噜噜噜动漫 | 欧美精品video | 色橹橹欧美在线观看视频高清 | 99re视频精品 | 成人动慢 | 不卡在线视频 | 国产一区二区三区色淫影院 | 国产人成精品一区二区三 | 91色网站 | 黄免费观看视频 | www.干| 天堂中文在线观看 | 国产一区91精品张津瑜 | 草草影院ccyy | 久久九 | 午夜播放器在线观看 | 呦呦在线视频 | 雨宫琴音一区二区在线 | 99中文字幕 | 一区二区三区不卡视频 | 久综合| 国产亚洲www | 欧美成年黄网站色视频 | 中文字幕视频在线观看 | 欧美看片 | 日日干天天操 | 亚洲欧洲在线观看视频 | 国产美女黄色片 | 日韩av高清| aaaaaa大片免费看最大的 | av网址在线|