欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51單片機(jī)電子時(shí)鐘Proteus仿真代碼 [打印本頁(yè)]

作者: good1230    時(shí)間: 2022-5-24 10:51
標(biāo)題: 51單片機(jī)電子時(shí)鐘Proteus仿真代碼
基于51單片機(jī)4鍵電子時(shí)鐘




//必要說(shuō)明,定時(shí)器中斷函數(shù)是經(jīng)過(guò)計(jì)算的50ms,但在使用Proteus仿真時(shí)時(shí)間不準(zhǔn)確。
//比實(shí)際表要快。對(duì)此不進(jìn)行調(diào)整,因?yàn)橹袛嗪瘮?shù)是經(jīng)過(guò)硬件檢驗(yàn)通過(guò)的。

單片機(jī)源程序如下:
#include <reg51.h>   //包含必要頭文件
//定義按鍵
sbit HourAdjust = P1^0;   //時(shí)調(diào)整選擇鍵
sbit MinuteAdjust = P1^1;  //分調(diào)整選擇鍵
sbit SecondAdjust = P1^2;  //秒選擇選擇鍵
sbit Adjust = P1^3;    //調(diào)整鍵  
//定義標(biāo)志位
bit SecondFlag = 0;    //秒標(biāo)志   
bit FlashFlag = 0;    //秒閃標(biāo)志
bit Second10Flag = 0;   //10秒標(biāo)志
bit HourAdjustFlag = 0;   //時(shí)調(diào)整標(biāo)志,A鍵按下置1,10秒后清0
bit MinuteAdjustFlag = 0;   //分調(diào)整標(biāo)志,A鍵按下置1,10秒后清0  
bit SecondAdjustFlag = 0;   //秒調(diào)整標(biāo)志,A鍵按下置1,10秒后清0  

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

//*****************************定時(shí)器中斷服務(wù)程序******************************r
//程序功能:動(dòng)態(tài)驅(qū)動(dòng)數(shù)碼管,同時(shí)完成定時(shí)功能。
void timer() interrupt 3 using 2
{
TR1 = 0;
TL1 = 0x13; TH1 = 0x2C; //重新賦值
P0 = 0x00;    //顯示小時(shí)
P2 = 0xfe;
P0 = LedTab[Led1];
Delay100us(1);
P0 = 0x00;
P2 = 0xfd;
if(FlashFlag)   //秒顯(1秒顯,1秒隱)分前小數(shù)點(diǎn)
  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)   //秒顯秒前小數(shù)點(diǎn)
  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)  //秒計(jì)數(shù)器
  TimeCount++;
else
{
  TimeCount = 0x00;
  SecondFlag = 1;  //置位秒標(biāo)志
  if(Second10Flag) //10秒計(jì)數(shù)器
   if(Second10Count < 20)
    Second10Count++;
   else
   {
    Second10Count = 0x00;  //10秒計(jì)數(shù)器清0
    Second10Flag = 0;   //清除10s標(biāo)志
    HourAdjustFlag = 0;   //清除調(diào)整標(biāo)志位
    MinuteAdjustFlag = 0;
    SecondAdjustFlag = 0;
   }
}
}
//============================================================================
main(void)
{
//初始化
int Second = 30;  //初始化時(shí)間
int Minute = 12;
int Hour = 20;
Led1 = 0x00;   //清除顯存
Led2 = 0x00;
Led3 = 0x00;
Led4 = 0x00;
Led5 = 0x00;
Led6 = 0x00;
SecondFlag = 0;
TimeCount = 0x00;
//設(shè)置定時(shí)器中斷
TMOD = 0x10f;   //GATE=0             01010001
       //C/T=0--定時(shí)/計(jì)數(shù)器1工作于定時(shí)方式
       //M1=1;M0=0--選擇工作模式1,構(gòu)成最大定時(shí)器
       //T0:在此程序不使用
TL1 = 0x13; TH1 = 0x2C; //指定定時(shí)時(shí)間為50ms  65536-50/(11.0592/12)=11283=2C13h
EA = 1;     //開(kāi)總中斷
TF1 = 0;
ET1 = 1;    //開(kāi)定時(shí)器中斷
TR1 = 1;    //開(kāi)始計(jì)時(shí)
while(1)
{
//*****************************************************************************
//對(duì)時(shí)間進(jìn)行調(diào)整程序
  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;  
  }
//-----------------------------------------------------------------------------
//*****************************************************************************
//時(shí)間調(diào)整程序
  if(HourAdjustFlag)   //調(diào)整時(shí)程序
   if(Second10Flag)
    if(FlashFlag)  //時(shí)秒顯
    {
     Led1 = 0x0a; //時(shí)隱
     Led2 = 0x0a;
    }
    else
    {
     Led1 = Hour/10; //時(shí)顯
     Led2 = Hour%10;
    }
   else
   {
    Led1 = Hour/10;
    Led2 = Hour%10;
   }
  else
  {
   Led1 = Hour/10;
   Led2 = Hour%10;
  }
  if(MinuteAdjustFlag)  //調(diào)整分程序
   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)  //調(diào)整秒程序,控制秒顯
   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)    //時(shí)調(diào)整按鍵按下
  {
   while(!HourAdjust);  //等待松開(kāi)
   HourAdjustFlag = 1;  //置位時(shí)標(biāo)志位
   MinuteAdjustFlag = 0; //清除分標(biāo)志位
   SecondAdjustFlag = 0; //清除秒標(biāo)志位
   Second10Flag = 1;  //置位10秒標(biāo)志位
  }
  if(!MinuteAdjust)   //分調(diào)整鍵按下
  {
   while(!MinuteAdjust);
   MinuteAdjustFlag = 1;
   HourAdjustFlag = 0;
   SecondAdjustFlag = 0;
   Second10Flag = 1;
  }
  if(!SecondAdjust)   //秒調(diào)整鍵按下
  {
   while(!SecondAdjust);
   SecondAdjustFlag = 1;
   HourAdjustFlag = 0;
   MinuteAdjustFlag = 0;
   Second10Flag = 1;
  }
  if(!Adjust)     //調(diào)整鍵按下
  {
   while(!Adjust);
   if(HourAdjustFlag)  //調(diào)整時(shí),加1
    if(Hour < 23)
    {
     Hour++;
     Second10Count = 0;
    }
    else
     Hour = 0;
   if(MinuteAdjustFlag) //調(diào)整分,加1
    if(Minute < 59)
    {
     Minute++;
     Second10Count = 0;
    }
    else    //調(diào)整秒,清零
     Minute = 0;
   if(SecondAdjustFlag)
    Second = 0;
  }
}
}
//********************************延時(shí)程序************************************
void Delay100us(int Times)
{
Times = Times * 100;
while(Times--);
}


Keil代碼與Proteus8.8仿真下載:
sz4鍵時(shí)鐘.7z (67.49 KB, 下載次數(shù): 27)






歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1