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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

一款51單片機電子鐘制作(C語言)

  [復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 yinqing452 于 2019-8-27 12:18 編輯

/*一款電子鐘程序,此電子鐘是四位電子鐘數碼管組成的,功能分別有走時、響鬧、走時間調整、鬧鐘時間調整等功能!調整部分分別由三個按鍵實現,一個功能鍵,一個+(加)鍵,另一個為-(減)鍵,其它功能鍵是復用功能!*/
硬鍵介紹:數碼管個位.十位.百位.千位.小數點分別接P0.0 P0.1 P0.2 P0.3 P0.4。蜂鳴器接P3.5腳,功能按鍵接P3.2 加按鍵接P3.3 減按鍵接P3.4
以下是兩張圖片!!!


#include <reg52.h>//頭文件
#define uchar unsigned char//宏定義
#define uint unsigned int//宏定義
uchar shi,fen,nshi,nfen,mao,ding,ding1,ding3,yin;//變量定義
sbit ge=P0^0;//數碼管個位
sbit shi4=P0^1;//數碼管十位
sbit bai=P0^2;//數碼管百位
sbit qian=P0^3;//數碼管千位
sbit dian=P0^4;//兩小數點位
sbit bbt=P3^5;//鬧鐘輸出口
sbit key=P3^2;//功能按鍵定義
sbit key1=P3^3;//++按鍵定義
sbit key2=P3^4;//--按鍵定義
bit  a=0;//調時間功能時位定義
bit  b=0;//調小時位定義
bit  c=0;//調分鐘位定義
bit  d=0;//調鬧鐘小位定義
bit  e=0;//調鬧鐘分鐘定義
bit  g=0;//主程序位定義,它控制主程序中的顯示子程序
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e};//數組,即列表
void key11();//聲時調時子程序
void delay(uint);//聲明延時子程序
void disy(uchar,uchar);//聲明時間顯示子程序
void ndisy(uchar,uchar);//聲明調時顯示子程序1
void disy1(uchar);//聲明調時時顯示小時子程序
void disy2(uchar);//聲明調時時顯示分子程序
void chushi();//初始化程序
void bbbt();//鬧鐘子程序
//////////////主程序/////////////////
void main()//主程序開始
{
chushi();//初始化
while(1)//大循環
{
  if(g!=1)//如果g不等于1,就執行下一句,否則跳過下一句
  disy(fen,shi);//調用走時顯示子程序
  key11();//調用按鍵子程序
  bbbt();//調用鬧鐘子程序
}
}
/////////////按鍵執行的子程序/////////////
void key11()//按鍵子函數
{

if(a!=0)//如果a不等于0,則執行大括號語句,否則跳過
{
  dian=0;//將中間兩個小數點打開
  delay(10);//延時一會兒
  dian=1;//將點關掉
  delay(10);//延時一會兒,以上即是動態顯示
  disy(fen,shi);//調用顯示子程序
  delay(4000);//延時,使它閃爍
  }
if(b!=0)//如果b不等于0,則執行大括號語句
{
  disy1(shi);//調用小時顯示子程序,此程序在前面聲明
  delay(2000);//延時,即使它閃爍
  if(key1==0)//如果+按鍵有按下,則執行大括號內容
  {
   delay(10);//去抖
   if(key1==0)//再次判斷
   {
    shi++;//確實按下了就將小時時間+1
    disy1(shi);//加1后調用小時顯示子程序
    delay(10);//延時一會兒
    if(shi==24)//如果小時加到了24就執行下一個語句,否則跳過
    shi=0;//到了24就清0
   }   
  }
  if(key2==0)//如果-按鍵有按下,則執行大括號內容
  {
   delay(10);//去抖動
   if(key2==0)//再次確認
   {
    shi--;//確實按下就將小時減1
    disy1(shi);//調用顯示程序
    delay(10);//延時
    if(shi==(0-1))//如果小時到了(0-1)時,就給23
    shi=23;//給23
   }   
  }
}
if(c!=0)//如果b不等于0,則執行大括號語句
{
  disy2(fen);//調用調分分顯示子程序
  delay(2000);//使它閃動
  if(key1==0)//判斷+按鍵是否有按下
  {
   delay(10);//延時
   if(key1==0)//再次確認按下情況
   {
    fen++;//將分加1
    disy2(fen);//調用顯示子程序
    delay(10);//延時一會兒
    if(fen==60)//如果分到了60,則執行下一語句
    fen=00;//清0
   }
  }
  if(key2==0)//如果減按鍵按下了執行下一語句
  {
   delay(10);//延時一會兒
   if(key2==0)//再次判斷
   {
    fen--;//將分減1
    disy2(fen);//調用顯示子程序
    delay(10);//延時
    if(fen==(0-1))//如果分等于(0-1),則給59
    fen=59;//給59
   }
  
  }

}
if(d!=0)//如果b不等于0,則執行大括號語句
{
  ndisy(nshi,nfen);//調用鬧鐘顯示程序
  delay(2000);//使它閃
  if(key1==0)//如果+按鍵按下了則執行括號內語句
  {
   delay(10);//去抖
   if(key1==0)//再次判斷
   {
    nshi++;//將鬧鐘時加1
    ndisy(nshi,nfen);//調用顯示子程序
    delay(10);//延時
    if(nshi==24)//如果等24就執行下一句話
    nshi=0;//到了24,清0
   }   
  }
  if(key2==0)//如果-按鍵按下了,則執行括號內容
  {
   delay(10);//去抖
   if(key2==0)//再次判斷
   {
    nshi--;//自減1
    ndisy(nshi,nfen);//調用顯示程序
    delay(10);//延時
    if(nshi==(0-1))//如果小時等于(0-1),就執行下一句
    nshi=23;//給23
   }   
  }
}
if(e!=0)//如果b不等于0,則執行大括號語句
{
  ndisy(nshi,nfen);//調用顯示子程序
  delay(2000);//閃爍
  if(key1==0)//+按鍵按下了沒?
  {
   delay(10);//去抖
   if(key1==0)//再次確認
   {
    nfen++;//將分加1
    ndisy(nshi,nfen);//調用顯示子程序
    delay(10);//延時
    if(nfen==60)//到了60?
    nfen=00;//清0
   }
  }
  if(key2==0)//-按鍵有按下嗎?
  {
   delay(10);//延時
   if(key2==0)//再次確認
   {
    nfen--;//分減1
    disy(nfen,nshi);//調用顯示
    delay(10);//延時
    if(nfen==(0-1))//如果分等于(0-1),則執行下一句
    nfen=59;//給59
   }
  
  }
}   
}

/////////////鬧鐘子子程序/////////////
void bbbt()//鬧鐘子程序
{
  if(ding1==2)//如果計數器ding1到了2次中斷?就執行括號內容
{
  ding1=0;//清0計數器
  if(shi==nshi)//走時小時時間與鬧鐘小時時間相等嗎?
  {
   if(fen==nfen)//走時分鐘時間與鬧鐘分鐘時間相等嗎?
   {
   bbt=~bbt;//將蜂嗚器取反,使它發聲
   }
  }
   
}
else
bbt=1;//否則將蜂嗚器關掉
}

/////////////初始化子程序/////////////
void chushi()//初始化子函數
{
TMOD=0x11;//兩個定時器工作在方式1方式下
EA=1;//開總中斷
ET0=1;//開定時器0中斷允許
ET1=1;//開定時器1中斷允許
TR0=1;//開定時器0
TR1=1;//開定時器0
TH0=(65536-50000)/256;//定時器0高位賦值
TL0=(65536-50000)%256;//定時器0低位賦值
TH1=(65536-10000)/256;//定時器1高位賦值
TL1=(65536-10000)%256;//定時器1低位賦值
shi=23;//開機小時顯示23
fen=59;//開機分鐘顯示59
nshi=12;//開機鬧鐘小時顯示12
nfen=00;//開機鬧鐘分鐘顯示00
}

/////////////走時顯示子程序/////////////
void disy(uchar shi,uchar fen)//走時顯示子程序
{
P1=table[shi%10];//小時個位賦值
ge=0;//開個位位選
delay(5);//延時
ge=1;//關個位位選
P1=table[shi/10];//小時十位賦值
shi4=0;//開小時位選端
delay(5);//延時
shi4=1;//關小時位選端
P1=table[fen%10];//分鐘個位賦值
bai=0;//將百位打開
delay(5);//延時
bai=1; //將百位關閉
P1=table[fen/10];//分鐘十位賦值
qian=0;//打開千位位選
delay(5);//延時
qian=1; //關閉千位
}
/////////////調時顯示子程序/////////////
void ndisy(uchar nshi,uchar nfen)//調時顯示子程序
{
P1=table[nshi%10&0x7f];//賦值給小時個位
bai=0;//開位選
delay(30);//延時
bai=1;//關位選
P1=table[nshi/10];//賦值給小時十位
qian=0;//開位選
delay(30);//延時
qian=1;//關位選
P1=table[nfen%10];//賦值分十位
ge=0;//開位選
delay(30);//延時
ge=1; //關位選
P1=table[nfen/10];//送分個位
shi4=0;//開位選
delay(30);//延時
shi4=1; //關位選
dian=0;//小數點打開
delay(10);//延時
dian=1;//關閉
}

/////////////調時小時顯示子函數/////////////
void disy1(uchar fen)//調時小時顯示子函數
{
P1=table[shi%10];//送小時個位
bai=0;//打開小時個位位選
delay(40);//延時
bai=1;//關閉位選
P1=table[shi/10];//關十位代碼
qian=0;//打開十位位選
delay(40);//延時
qian=1;//關閉千位
shi4=1; //關閉十位數碼管
ge=1; //關閉個位數碼管
}

/////////////調時分鐘顯示子函數/////////////
void disy2(uchar fen)//調時分鐘顯示子函數
{
P1=table[fen%10];//送分鐘個位
ge=0;//打開分個位位選
delay(30);//關閉位選
ge=1;//關十位代碼
P1=table[fen/10];//送個位代碼
shi4=0;//打開位選
delay(30);//延時
shi4=1;//關閉位選
bai=1;//關閉百位數碼管
qian=1; //關閉千位數碼管
}

/////////////延時程序/////////////
void delay(uint z)//延時子函數
{
uint x,y;//定義局部變量
for(x=10;x>0;x--)//第一循環
for(y=z;y>0;y--);//內循環
}

/////////////T0中斷服務程序/////////////
void zhong() interrupt 1//T0中斷服務程序
{
TH0=(65536-50000)/256;//賦值給高位
TL0=(65536-50000)%256;//賦值給低位
ding++; //將走時計數器加1
ding1++;//將響鬧計數器加1

/////////////走時程序/////////////
if(ding==10)//走時計數器到了10次中斷0.5秒嗎?
{
  ding=0;//清0
  dian=~dian;//將小數點取反一次
  mao++;//將秒變量加1
  if(mao==120)//如果秒變量mao到了120次中斷(即1分鐘),就執行下語句
  {
   mao=0;//將秒mao變量清0
   fen++;//將分變量加1
  }
  if(fen==60)//判斷分變量是否到了60
  {
   fen=0;//到了就清0   
   shi++;//將小時加1
   if(shi==24)//如果小到了24就清0
   shi=0;//清0
  }     
}
  
}
/////////////T1中斷服務程序/////////////
void zhong1() interrupt 3//T1中斷服務程序
{
TH1=(65536-10000)/256;//賦值給高位
TL1=(65536-10000)%256;//賦值給低位
ding3++;//將按鍵計數器加1
/////////////一鍵多功能控制程序/////////////
P1=0xff;//先置P1口為高位
switch(yin)//執行一鍵多功能程序
{
  case 0:if(key==0)//如果0與yin比較相等,則執行break前的所有內容
  {
   delay(10);//延時
   if(ding3==3)//定時器時間到了?作用是實現長按按鍵才有作用的功能
   {
    ding3=0;//清0
    if(key==0)//再次確認是否有按下
    {
     yin++;//將變量加1,此句很重要,作用是以使下次按下時好執行下一開關語句
     a=1;//將a變為1,即打開按鍵程序中的第一段程序
     g=1;//將g變1,關閉主程序中的顯示,只要按鍵按下的顯示
     bbt=0;//將蜂嗚開
     delay(100);//延時
      bbt=1;//關蜂嗚器
     TR0=0;//關時間定時器,讓時間停止運行,進入調整模式
     disy(fen,shi);//調用調時顯示子函數
     while(!key);//按鍵放開了嗎?
    }
   }
  }
  break;//退出開關語句
  case 1: if(key==0)//如果1與yin比較相等,則執行大括號內容
  {
   delay(10);//延時
   if(ding3==3)//定時器時間到了?作用是實現長按按鍵才有作用的功能
   {
    ding3=0;//清0
    if(key==0)//再次確認是否有按下
    {
     yin++;//將變量加1,此句很重要,作用是以使下次按下時好執行下一開關語句
     b=1;//將b變為1,即打開按鍵程序中的第二段程序
     a=0;//將a變為1,即關閉按鍵程序中的第一段程序
     TR0=0;//關時間定時器,讓時間停止運行
     bbt=0;//將蜂嗚開
     delay(100);//延時
      bbt=1;//關蜂嗚器
     while(!key);//按鍵放開了嗎?
    }
   }
  }
  break;//退出開關語句
  case 2: if(key==0)//如果2與yin比較相等,則執行大括號內容
  {
   delay(10);//延時
   if(ding3==3)//定時器時間到了?作用是實現長按按鍵才有作用
   {
    if(key==0)//再次確認是否有按下
    {
     yin++;//將變量加1,此句很重要,作用是以使下次按下時好執行下一開關語句
     b=0;//將b變為0,即關閉上一次功能
     a=0;//關閉上前面的功能
     c=1;//打開第三次功能
     TR0=0;//關閉定時器0
     bbt=0;//開蜂嗚器
     delay(100);//延時
      bbt=1;//關蜂嗚器
     while(!key);//按鍵放開了嗎?
    }
   }
  }
  break;//退出開關語句
  case 3: if(key==0)//如果3與yin比較相等,則執行大括號內容
  {
   delay(10);//延時
   if(ding3==3)//定時器時間到了?
   {
    if(key==0)//再次確認是否有按下
    {
     yin++;//將變量加1,以便執行第五次功能
     b=0;//關閉上次功能
     a=0;//關閉上次功能
     c=0;//關閉上次功能
     d=1;//打開第四次功能
     TR0=0;////關閉定時器
     bbt=0;//開響聲
     delay(100);//延時
      bbt=1;//關響
     while(!key);//按鍵放開了嗎?
    }
   }
  }
  break;//退出開關語句
  case 4: if(key==0)//如果4與yin比較相等,則執行大括號內容
  {
   delay(10);//延時
   if(ding3==3)//定時器時間到了?
   {
    if(key==0)//再次確認是否有按下
    {
     yin++;//將變量加1,以便執行第五次功能
     b=0;//關閉上次功能
     a=0;//關閉上次功能
     c=0;//關閉上次功能
     d=0;//關閉上次功能
     e=1;//打開第五次功能
     TR0=0;////關閉定時器
     bbt=0;//開響聲
     delay(100);//延時
      bbt=1;//關響
     while(!key);//按鍵放開了嗎?
    }
   }
  }
  break;//退出開關語句
  case 5: if(key==0)//如果5與yin比較相等,則執行大括號內容
  {
   delay(10);//延時
   if(key==0)//定時器時間到了?
   {
    yin=0;//將變量清0,以復位按鍵功能
    a=0;//關閉上次功能
    b=0;//關閉上次功能
    c=0;//關閉上次功能
    g=0;//關閉上次功能
    d=0;//關閉上次功能
    e=0;//關閉上次功能
    TR0=1;//開定時器0,使時間走
    bbt=0;//開響聲
    delay(100);//延時
     bbt=1;//關響
    while(!key);//按鍵放開了嗎?
   }
  }
  break;//退出開關語句
}

}

d.png (12.02 KB, 下載次數: 61)

d.png

51整機--原理圖--帶點陣的.jpg (1.28 MB, 下載次數: 112)

51整機--原理圖--帶點陣的.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:405102 發表于 2019-8-26 23:31 | 只看該作者
樓主能否將電路圖傳上來學習學習。
回復

使用道具 舉報

板凳
ID:471636 發表于 2019-8-27 08:38 | 只看該作者
這是我見到的注釋最全的程度!支持一下   加油!
回復

使用道具 舉報

地板
ID:156220 發表于 2019-8-27 09:12 | 只看該作者
本帖最后由 紫色的云 于 2019-8-27 09:52 編輯

注釋的蠻詳細的,謝謝樓主
回復

使用道具 舉報

5#
ID:370644 發表于 2019-8-27 11:11 | 只看該作者
liuhiong 發表于 2019-8-26 23:31
樓主能否將電路圖傳上來學習學習。

可以的,我馬上上傳一下!
回復

使用道具 舉報

6#
ID:370644 發表于 2019-8-27 11:11 | 只看該作者
liuhiong 發表于 2019-8-26 23:31
樓主能否將電路圖傳上來學習學習。

已上傳!請查收!
回復

使用道具 舉報

7#
ID:370644 發表于 2019-8-27 11:15 | 只看該作者
uvw 發表于 2019-8-27 08:38
這是我見到的注釋最全的程度!支持一下   加油!

因為基礎不好,所以怕以后看不懂,也為了和大家分享!
回復

使用道具 舉報

8#
ID:370644 發表于 2019-8-27 11:15 | 只看該作者
紫色的云 發表于 2019-8-27 09:12
注釋的蠻詳細的,謝謝樓主

謝謝您的贊揚!
回復

使用道具 舉報

9#
ID:61950 發表于 2019-9-1 07:47 來自觸屏版 | 只看該作者
這是見過注釋寫的最全的一貼,自己學習這時也樣
回復

使用道具 舉報

10#
ID:619901 發表于 2019-10-26 21:15 | 只看該作者
為樓主點贊!
回復

使用道具 舉報

11#
ID:619788 發表于 2019-11-5 00:17 | 只看該作者
感謝樓主的分享
回復

使用道具 舉報

12#
ID:724101 發表于 2020-4-7 15:36 | 只看該作者
想要請教一下,求聯系方式
回復

使用道具 舉報

13#
ID:515926 發表于 2020-6-28 13:59 | 只看該作者
樓主大愛!!!

資料全面詳細,為我們這樣的初學者提供了很好的幫助,也堅定了學習單片機的信心。


愿您好運常在!
回復

使用道具 舉報

14#
ID:853544 發表于 2020-12-17 10:03 | 只看該作者
樓主啊。。。有沒有可以在Proteus 的圖,和在上運行的程序
回復

使用道具 舉報

15#
ID:143767 發表于 2020-12-17 15:37 | 只看該作者
上傳的原理圖在哪里?沒有找到
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩高清中文字幕 | 亚洲国产精品久久 | 国产精品日韩欧美一区二区 | 国产一区久久 | 成人av网站在线观看 | 久久久久久国产精品久久 | 国产韩国精品一区二区三区 | 久久99久久99久久 | 国产网站在线免费观看 | 国产亚洲精品综合一区 | 欧美成人免费在线视频 | 日韩av在线不卡 | 国产成人免费视频网站视频社区 | 国产精品亚洲一区 | 中文字幕乱码视频32 | 成年免费大片黄在线观看岛国 | 在线精品一区二区三区 | 精品乱码一区二区 | 91精品国产91久久综合桃花 | 一级毛片免费看 | 欧美激情va永久在线播放 | 中文字幕第49页 | 亚洲日本中文字幕在线 | 盗摄精品av一区二区三区 | 色婷婷一区 | 国产精品久久久久久吹潮日韩动画 | 夜久久 | 亚洲视频在线播放 | 精品视频在线播放 | 亚洲在线一区二区 | 亚洲一区中文字幕 | 精品欧美在线观看 | 91观看| 91麻豆精品国产91久久久更新资源速度超快 | a级大毛片 | 日韩国产中文字幕 | 伊人网伊人网 | 中文字幕一区二区三区四区不卡 | 国产成人综合一区二区三区 | 日本三级在线 | 一级看片免费视频囗交动图 |