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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機的六位數碼管時鐘表仿真及C程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:72519 發表于 2015-1-21 22:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 liuda 于 2015-1-21 22:38 編輯

Proteus仿真截圖




/*****************************************************************************
程序名稱:六位數碼管時鐘表
編譯器:Keil uVision 4
程序功能:上電后,程序按初始時間開始時鐘演示,時間顯示按24小時制。
    時間調整:按A鍵,顯示加1,按B鍵,顯示減1,按C鍵,清零
MCU:AT89C51
晶振:11.0592M
外圍部件:
鍵盤:4按鍵A、B、C、D分別接在P1.0、P1.1、P1.2和P1.3上,低電平有效
     A、B、C鍵分別控制時、分、秒的選擇,D鍵銨下進行時間調整。
顯示:4位共陰極LED,P0口送顯示數據,P1口低四位位選
內部資源:
使用定時計數器1中斷,用于定時及顯示
警告:
1. 按鍵未加防抖動程序
2. 此程序經過編譯并通過Proteus仿真,未通過實物檢驗。
作者:花落水流紅,空寂蕭然山——蕭然
完成日期:2012/6/11
============================================================================*/
#include <reg51.h>   //包含必要頭文件
//定義按鍵
sbit HourAdjust = P1^0;   //時調整選擇鍵
sbit MinuteAdjust = P1^1;  //分調整選擇鍵
sbit SecondAdjust = P1^2;  //秒選擇選擇鍵
sbit Adjust = P1^3;    //調整鍵  
//定義標志位
bit SecondFlag = 0;    //秒標志   
bit FlashFlag = 0;    //秒閃標志
bit Second10Flag = 0;   //10秒標志
bit HourAdjustFlag = 0;   //時調整標志,A鍵按下置1,10秒后清0
bit MinuteAdjustFlag = 0;   //分調整標志,A鍵按下置1,10秒后清0  
bit SecondAdjustFlag = 0;   //秒調整標志,A鍵按下置1,10秒后清0  

unsigned char Led1,Led2,Led3,Led4,Led5,Led6;  //定義緩存
int TimeCount,Second10Count;   //定義計數器
unsigned char code LedTab[]=  //定義共陰極數碼管表,0x00用于清除顯示
   {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
void Delay100us(int Times);    //定義延時函數

//*****************************定時器中斷服務程序******************************r
//程序功能:動態驅動數碼管,同時完成定時功能。
void timer() interrupt 3 using 2
{
TR1 = 0;
TL1 = 0x13; TH1 = 0x2C; //重新賦值
P0 = 0x00;    //顯示小時
P2 = 0xfe;
P0 = LedTab[Led1];
Delay100us(1);
P0 = 0x00;
P2 = 0xfd;
if(FlashFlag)   //秒顯(1秒顯,1秒隱)分前小數點
  P0 = LedTab[Led2] | 0x80;
else
  P0 = LedTab[Led2] & 0x7f;
Delay100us(1);   
P0 = 0x00;    //顯示分
P2 = 0xfb;
P0 = LedTab[Led3];
Delay100us(1);
P0 = 0x00;
P2 = 0xf7;
if(FlashFlag)   //秒顯秒前小數點
  P0 = LedTab[Led4] | 0x80;
else
  P0 = LedTab[Led4] & 0x7f;
Delay100us(1);
P0 = 0x00;    //顯示秒
P2 = 0xef;
P0 = LedTab[Led5];
Delay100us(1);
P0 = 0x00;
P2 = 0xdf;
P0 = LedTab[Led6];
Delay100us(1);
TR1 = 1;

if(TimeCount < 100)  //秒計數器
  TimeCount++;
else
{
  TimeCount = 0x00;
  SecondFlag = 1;  //置位秒標志
  if(Second10Flag) //10秒計數器
   if(Second10Count < 20)
    Second10Count++;
   else
   {
    Second10Count = 0x00;  //10秒計數器清0
    Second10Flag = 0;   //清除10s標志
    HourAdjustFlag = 0;   //清除調整標志位
    MinuteAdjustFlag = 0;
    SecondAdjustFlag = 0;
   }
}
}
//============================================================================
main(void)
{
//初始化
int Second = 30;  //初始化時間
int Minute = 12;
int Hour = 20;
Led1 = 0x00;   //清除顯存
Led2 = 0x00;
Led3 = 0x00;
Led4 = 0x00;
Led5 = 0x00;
Led6 = 0x00;
SecondFlag = 0;
TimeCount = 0x00;
//設置定時器中斷
TMOD = 0x10f;   //GATE=0             01010001
       //C/T=0--定時/計數器1工作于定時方式
       //M1=1;M0=0--選擇工作模式1,構成最大定時器
       //T0:在此程序不使用
TL1 = 0x13; TH1 = 0x2C; //指定定時時間為50ms  65536-50/(11.0592/12)=11283=2C13h
EA = 1;     //開總中斷
TF1 = 0;
ET1 = 1;    //開定時器中斷
TR1 = 1;    //開始計時
while(1)
{
//*****************************************************************************
//對時間進行調整程序
  if(SecondFlag)
  {
   if(Second%2 == 0)
    FlashFlag = 1;
   else
    FlashFlag = 0;
   if(Second < 59)
    Second++;
   else
   {
    if(Minute < 59)
     Minute++;
    else
    {
     if(Hour < 23)
      Hour++;
     else
      Hour = 0;
     Minute = 0;
    }
   Second = 0;
   }  
  SecondFlag = 0;  
  }
//-----------------------------------------------------------------------------
//*****************************************************************************
//時間調整程序
  if(HourAdjustFlag)   //調整時程序
   if(Second10Flag)
    if(FlashFlag)  //時秒顯
    {
     Led1 = 0x0a; //時隱
     Led2 = 0x0a;
    }
    else
    {
     Led1 = Hour/10; //時顯
     Led2 = Hour%10;
    }
   else
   {
    Led1 = Hour/10;
    Led2 = Hour%10;
   }
  else
  {
   Led1 = Hour/10;
   Led2 = Hour%10;
  }
  if(MinuteAdjustFlag)  //調整分程序
   if(Second10Flag)
    if(FlashFlag)  //分秒顯
    {
     Led3 = 0x0a;
     Led4 = 0x0a;
    }
    else
    {
     Led3 = Minute/10;
     Led4 = Minute%10;
    }
   else
   {
    Led3 = Minute/10;
    Led4 = Minute%10;
   }
  else
  {
   Led3 = Minute/10;
   Led4 = Minute%10;
  }
  if(SecondAdjustFlag)  //調整秒程序,控制秒顯
   if(Second10Flag)
    if(FlashFlag)
    {
     Led5 = 0x0a;
     Led6 = 0x0a;
    }
    else
    {
     Led5 = Second/10;
     Led6 = Second%10;
    }
   else
   {
    Led5 = Second/10;
    Led6 = Second%10;
   }
  else
  {
   Led5 = Second/10;
   Led6 = Second%10;
  }
  
  
  if(!HourAdjust)    //時調整按鍵按下
  {
   while(!HourAdjust);  //等待松開
   HourAdjustFlag = 1;  //置位時標志位
   MinuteAdjustFlag = 0; //清除分標志位
   SecondAdjustFlag = 0; //清除秒標志位
   Second10Flag = 1;  //置位10秒標志位
  }
  if(!MinuteAdjust)   //分調整鍵按下
  {
   while(!MinuteAdjust);
   MinuteAdjustFlag = 1;
   HourAdjustFlag = 0;
   SecondAdjustFlag = 0;
   Second10Flag = 1;
  }
  if(!SecondAdjust)   //秒調整鍵按下
  {
   while(!SecondAdjust);
   SecondAdjustFlag = 1;
   HourAdjustFlag = 0;
   MinuteAdjustFlag = 0;
   Second10Flag = 1;
  }
  if(!Adjust)     //調整鍵按下
  {
   while(!Adjust);
   if(HourAdjustFlag)  //調整時,加1
    if(Hour < 23)
    {
     Hour++;
     Second10Count = 0;
    }
    else
     Hour = 0;
   if(MinuteAdjustFlag) //調整分,加1
    if(Minute < 59)
    {
     Minute++;
     Second10Count = 0;
    }
    else    //調整秒,清零
     Minute = 0;
   if(SecondAdjustFlag)
    Second = 0;
  }
}
}
//********************************延時程序************************************
void Delay100us(int Times)
{
Times = Times * 100;
while(Times--);
}
//必要說明,定時器中斷函數是經過計算的50ms,但在使用Proteus仿真時時間不準確。
//比實際表要快。對此不進行調整,因為中斷函數是經過硬件檢驗通過的。

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

使用道具 舉報

沙發
ID:53825 發表于 2015-4-5 15:18 | 只看該作者
不錯看好你
回復

使用道具 舉報

板凳
ID:29438 發表于 2015-4-11 08:33 | 只看該作者
不錯,多謝!
回復

使用道具 舉報

地板
ID:76625 發表于 2015-4-11 23:08 | 只看該作者
樓主有沒有原理圖全圖?可以看看嗎
回復

使用道具 舉報

5#
ID:56948 發表于 2015-6-20 23:15 | 只看該作者

不錯,多謝!
回復

使用道具 舉報

6#
ID:113764 發表于 2016-4-15 21:30 | 只看該作者
樓主為什么我的數碼管不顯示
回復

使用道具 舉報

7#
ID:153199 發表于 2016-12-31 14:49 | 只看該作者
感謝分享
回復

使用道具 舉報

8#
ID:257970 發表于 2017-12-6 09:02 來自手機 | 只看該作者
請問倒計時的要怎么改?
回復

使用道具 舉報

9#
ID:441102 發表于 2018-12-23 13:26 | 只看該作者
為什么我的不行?
回復

使用道具 舉報

10#
ID:412814 發表于 2018-12-23 18:09 | 只看該作者
謝謝,先保存慢慢看吧。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久男人天堂 | 国产免费观看视频 | 国产在线一区二区 | 蜜桃五月天 | 一级看片免费视频囗交动图 | 欧美成视频| 久久精品一 | 一区视频 | 午夜男人视频 | 成人av一区 | 久久成人一区二区三区 | 精品视频一区二区三区在线观看 | 欧美四虎 | 天天综合永久入口 | 人人色视频| 日韩一级免费 | 国产午夜精品一区二区三区嫩草 | 999视频| 天天射网站 | 91精品在线观看入口 | 久久久久精 | 日本一区二区视频 | 亚洲视频精品在线 | 91色网站| 亚洲精品无 | 色呦呦在线| av在线免费观看网站 | 日本三级在线网站 | 亚洲+变态+欧美+另类+精品 | 91av视频在线播放 | 99国产精品一区二区三区 | 国产麻豆乱码精品一区二区三区 | 精品欧美一区二区精品久久 | 亚洲人在线观看视频 | 热re99久久精品国99热观看 | 欧美日韩精品久久久免费观看 | 欧美日韩精品一区 | 久久久久久国 | 欧美亚洲国产一区二区三区 | 国产精品乱码一区二三区小蝌蚪 | 久久精品国产久精国产 |