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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

基于單片機定時器的可調時鐘程序

作者:ferjj856   來源:本站原創   點擊數:  更新時間:2011年01月09日   【字體:

此時間程序沒有用到ds1302等芯片,而是用單片機自帶的定時器制作的,并且可調整時間。請大家多多指教


#include"reg52.h"
#include "intrins.h"
#define uchar unsigned char 
#define uint  unsigned int
 
uint schedule[6];
uint count,b; //計數:以秒為單位
uint  number[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //對應數碼管的0-9
uint a[4]={0xfe,0xfd,0xfb,0xf7}; //對應的四個數碼管
uint minute[2],second[2] ;
sbit P30=P3^0; //P3口作為鍵盤控制端
sbit P31=P3^1;
sbit P36=P3^6;
sbit P35=P3^5;
sbit P34=P3^4;
sbit P33=P3^3;
sbit P32=P3^2;
sbit P37=P3^7;
void assign();
void show();
 
void delay(unsigned n);
void main()
{
  uint i ;
  EA=1;//總中斷打開
  IT0=1;//外部中斷打開
  EX0=1; //
  count=43200;
  TMOD=0x10;
  P30=0;
  P31=1;
  P32=1;
  P33=1;
  P34=0;
  P35=1;
  P36=1;
  P37=1;
  while(1)
  {  
      for(i=0;i<=19;i++)//每循環一次用時50ms.
   {
       TR1=1;//選擇計數器1
    TH1= 0x3c;
    TL1=0xb0;//賦初值
    show(); //顯示函數
    TF1=0;   //恢復標志

   }
   count++;
  
        
  } 

}
void assign() //給小時,分鐘,秒賦值
{
      
  if(count>=46800) //滿了13個小時轉化為1點鐘
    count=count-43200;
 if(count>=36000)  //計算小時 前一位 減少算法
      schedule[0]=minute[0]=1;
 else
   schedule[0]=minute[0]=0;
 schedule[1]=minute[1]=count/3600%10;//計算小時的后一位
 schedule[2]=second[0]=  count%3600/600;  //計算分鐘的前一位
 schedule[3]=second[1]=  count%3600/60%10;//計算分鐘的后一位
         
}
void show()   //顯示函數
{
     uint i;
   
    while(1)
 {
    
    assign();
    for(i=0;i<4;i++)
    {  
        P1=a[i]; //亮那個數碼管
       P2=number[schedule[i]]; //亮一個什么樣的數字
      if(i==1 )
       P2=P2-0x80;  //亮小數點便于好看
     delay(50);//延時函數,便于亮的清晰
    
   
   
    }
 if(TF1==1) //已經有50ms
    break;
 }
}
void delay(unsigned n) //延時程序
{
    uint i;
 for(i=1;i<=n;i++)
 { 

     if(TF1==1) //已經有50ms
    break;
if(P31==0)   //調表
{
           
        for(b=0;b<3000;b++) //放抖動:按的時間太短
             {
        
    }           
       if(P31==1)
    goto back5;
     
  
    
    if(P31==0)
  {
  while(1)
      {
      
      show();
   TF1=0;   //恢復標志
   if(P32==0) //加一分鐘
   {
        for(b=0;b<3000;b++)
             {}   
       if(P32==1)
    goto back1;
       count=count+60;
    if(P32==0)
     
         {
  while(1)
  {
  show();
  TF1=0;   //恢復標志  
  if(P32==1)
  break;
  }
  }
   
      }
   back1: show();  
  if(P33==0)   //減一分鐘
      {
        for(b=0;b<3000;b++)
             {}   
       if(P33==1)
    goto back2;
       count=count-60;

    if(P33==0)
    {
  while(1)
  {
  show();TF1=0;   //恢復標志
  if(P33==1)
  break;
  }
  }
   
      }
       
      back2:show();  
   if(P36==0)  //加一個小時
      {
        for(b=0;b<3000;b++)
             {}   
       if(P36==1)
    goto back3;
       count=count+3600;

    if(P36==0)
    {
  while(1)
  {
  show(); TF1=0;   //恢復標志
  if(P36==1)
  break;
  }
  }
   
      }
       
      back3:show(); 
   if(P37==0)   //減一個小時
      {
        for(b=0;b<3000;b++)
             {}   
       if(P37==1)
    goto back4;
    if(schedule[0]==0&&schedule[1]==1)  //處理1點鐘到12點
    count=count+39600;
    else
       count=count-3600;

    if(P37==0)
    {
  while(1)
  {
  show(); TF1=0;   //恢復標志
  if(P37==1)
  break;
  }
  }             
   
      }
       
      back4:show();  
   if(P35==0)//沒有必要防抖
    break;

  }
} 
   back5: show(); //按的時間太duan

  }    
   
      }
    
 
 }
 

此程序有幾個缺點:一,調時間的時候有點暗。二,算法比較差。三,代碼比較難看。四,當時我想從0到24小時計時,但count為int溢出了,后面我不用count計時,可是可以但是調時間的話有比較難寫,不想亂費時間了,改成長整型有不知道那個地方出問題。希望高手指點。

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲成人中文字幕 | 欧美一区二区三区在线观看 | 成人免费视频播放 | 在线看av的网址 | 久久91精品久久久久久9鸭 | 日本电影韩国电影免费观看 | jⅰzz亚洲| 欧美一区二区免费 | 国产欧美精品一区二区三区 | 九一视频在线播放 | 午夜资源 | 欧美日韩在线一区 | 亚洲福利视频一区二区 | 另类 综合 日韩 欧美 亚洲 | 黄视频免费 | 亚洲成人三级 | 91久久网站 | www.精品国产| 国产日韩精品一区 | 天啪 | 欧美久久久久久 | 嫩草91在线 | 国产精品视频一二三区 | 亚洲狠狠 | 国产91久久久久久 | 91成人在线视频 | 狠狠色综合欧美激情 | 国产成人免费视频 | 最近日韩中文字幕 | 亚洲一区二区三区免费观看 | 久久国产精品亚洲 | 免费黄色录像视频 | 国产精品美女一区二区三区 | 欧美亚洲综合久久 | 欧美视频免费 | 成人在线视频免费观看 | 日本成人中文字幕 | 91在线视频观看免费 | 天天干天天玩天天操 | 看片wwwwwwwwwww| 成人av在线播放 |