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

標題: 一款51單片機電子鐘制作(C語言) [打印本頁]

作者: yinqing452    時間: 2019-8-24 11:31
標題: 一款51單片機電子鐘制作(C語言)
本帖最后由 yinqing452 于 2019-8-27 12:18 編輯

/*一款電子鐘程序,此電子鐘是四位電子鐘數(shù)碼管組成的,功能分別有走時、響鬧、走時間調(diào)整、鬧鐘時間調(diào)整等功能!調(diào)整部分分別由三個按鍵實現(xiàn),一個功能鍵,一個+(加)鍵,另一個為-(減)鍵,其它功能鍵是復用功能!*/
硬鍵介紹:數(shù)碼管個位.十位.百位.千位.小數(shù)點分別接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;//數(shù)碼管個位
sbit shi4=P0^1;//數(shù)碼管十位
sbit bai=P0^2;//數(shù)碼管百位
sbit qian=P0^3;//數(shù)碼管千位
sbit dian=P0^4;//兩小數(shù)點位
sbit bbt=P3^5;//鬧鐘輸出口
sbit key=P3^2;//功能按鍵定義
sbit key1=P3^3;//++按鍵定義
sbit key2=P3^4;//--按鍵定義
bit  a=0;//調(diào)時間功能時位定義
bit  b=0;//調(diào)小時位定義
bit  c=0;//調(diào)分鐘位定義
bit  d=0;//調(diào)鬧鐘小位定義
bit  e=0;//調(diào)鬧鐘分鐘定義
bit  g=0;//主程序位定義,它控制主程序中的顯示子程序
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e};//數(shù)組,即列表
void key11();//聲時調(diào)時子程序
void delay(uint);//聲明延時子程序
void disy(uchar,uchar);//聲明時間顯示子程序
void ndisy(uchar,uchar);//聲明調(diào)時顯示子程序1
void disy1(uchar);//聲明調(diào)時時顯示小時子程序
void disy2(uchar);//聲明調(diào)時時顯示分子程序
void chushi();//初始化程序
void bbbt();//鬧鐘子程序
//////////////主程序/////////////////
void main()//主程序開始
{
chushi();//初始化
while(1)//大循環(huán)
{
  if(g!=1)//如果g不等于1,就執(zhí)行下一句,否則跳過下一句
  disy(fen,shi);//調(diào)用走時顯示子程序
  key11();//調(diào)用按鍵子程序
  bbbt();//調(diào)用鬧鐘子程序
}
}
/////////////按鍵執(zhí)行的子程序/////////////
void key11()//按鍵子函數(shù)
{

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

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

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

/////////////初始化子程序/////////////
void chushi()//初始化子函數(shù)
{
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;//關(guān)個位位選
P1=table[shi/10];//小時十位賦值
shi4=0;//開小時位選端
delay(5);//延時
shi4=1;//關(guān)小時位選端
P1=table[fen%10];//分鐘個位賦值
bai=0;//將百位打開
delay(5);//延時
bai=1; //將百位關(guān)閉
P1=table[fen/10];//分鐘十位賦值
qian=0;//打開千位位選
delay(5);//延時
qian=1; //關(guān)閉千位
}
/////////////調(diào)時顯示子程序/////////////
void ndisy(uchar nshi,uchar nfen)//調(diào)時顯示子程序
{
P1=table[nshi%10&0x7f];//賦值給小時個位
bai=0;//開位選
delay(30);//延時
bai=1;//關(guān)位選
P1=table[nshi/10];//賦值給小時十位
qian=0;//開位選
delay(30);//延時
qian=1;//關(guān)位選
P1=table[nfen%10];//賦值分十位
ge=0;//開位選
delay(30);//延時
ge=1; //關(guān)位選
P1=table[nfen/10];//送分個位
shi4=0;//開位選
delay(30);//延時
shi4=1; //關(guān)位選
dian=0;//小數(shù)點打開
delay(10);//延時
dian=1;//關(guān)閉
}

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

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

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

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

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

}

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

d.png

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

51整機--原理圖--帶點陣的.jpg

作者: liuhiong    時間: 2019-8-26 23:31
樓主能否將電路圖傳上來學習學習。
作者: uvw    時間: 2019-8-27 08:38
這是我見到的注釋最全的程度!支持一下   加油!
作者: 紫色的云    時間: 2019-8-27 09:12
本帖最后由 紫色的云 于 2019-8-27 09:52 編輯

注釋的蠻詳細的,謝謝樓主
作者: yinqing452    時間: 2019-8-27 11:11
liuhiong 發(fā)表于 2019-8-26 23:31
樓主能否將電路圖傳上來學習學習。

可以的,我馬上上傳一下!
作者: yinqing452    時間: 2019-8-27 11:11
liuhiong 發(fā)表于 2019-8-26 23:31
樓主能否將電路圖傳上來學習學習。

已上傳!請查收!
作者: yinqing452    時間: 2019-8-27 11:15
uvw 發(fā)表于 2019-8-27 08:38
這是我見到的注釋最全的程度!支持一下   加油!

因為基礎(chǔ)不好,所以怕以后看不懂,也為了和大家分享!
作者: yinqing452    時間: 2019-8-27 11:15
紫色的云 發(fā)表于 2019-8-27 09:12
注釋的蠻詳細的,謝謝樓主

謝謝您的贊揚!
作者: aatcs    時間: 2019-9-1 07:47
這是見過注釋寫的最全的一貼,自己學習這時也樣
作者: zfy13487253563    時間: 2019-10-26 21:15
為樓主點贊!
作者: yxz061415    時間: 2019-11-5 00:17
感謝樓主的分享
作者: wmd2020    時間: 2020-4-7 15:36
想要請教一下,求聯(lián)系方式
作者: jnlaok    時間: 2020-6-28 13:59
樓主大愛!!!

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


愿您好運常在!
作者: 1187A    時間: 2020-12-17 10:03
樓主啊。。。有沒有可以在Proteus 的圖,和在上運行的程序

作者: dj3365191    時間: 2020-12-17 15:37
上傳的原理圖在哪里?沒有找到




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 天堂久 | 日韩成人免费视频 | aaaaa毛片 | 欧美 日本 国产 | 在线成人免费视频 | 妞干网av | 亚洲人精品午夜 | 国产片侵犯亲女视频播放 | 精品久久久久一区二区国产 | 亚洲人成在线观看 | 日韩在线日韩 | 99精品久久99久久久久 | 激情一区二区三区 | 亚洲国产高清高潮精品美女 | 99九九视频| 国产免费一级片 | 亚洲视频在线看 | 亚洲成人免费视频在线观看 | 自拍视频精品 | 欧美 视频 | 国产午夜精品福利 | 午夜电影网址 | 成人免费区一区二区三区 | 国产一区二区三区久久久久久久久 | 香蕉久久a毛片 | 国产精品乱码一区二三区小蝌蚪 | 国产精品欧美一区二区三区不卡 | 国产在线激情视频 | 日本三级电影在线观看视频 | 精品国产乱码久久久久久闺蜜 | 久久亚洲精品国产精品紫薇 | 欧美日韩成人影院 | 在线看av网址 | 日韩一区二区三区视频 | 日韩国产精品一区二区三区 | 极品销魂美女一区二区 | 久久久精品影院 | 四虎最新地址 | 激情欧美一区二区三区 | 亚洲精品电影 | 成年人黄色一级片 |