AT89C51單片機數字電子鐘的設計

2021-02-24 自動化部落
一、 設計目的與要求

設計目的:通過設計,培養運用已學知識解決實際問題的能力、查閱資料的能力、自學能力和獨立分析問題、解決問題的能力和能通過獨立思考。

設計要求:設計一個時、分可調的數字電子鐘、斷電後將數據保存,開啟後時間將從斷電後時間繼續行走。

二、 設計內容與方案制定

具有校時功能,按鍵控制電路其中時鍵、分鍵六個鍵分別控制時、分時間的調整。按下小時數實現對小時數加減,按下分鐘數實現對分鐘數進行加減,並設置有復位鍵,啟始鍵。

以AT89C51單片機進行實現秒、分、時上的正常顯示和進位,其中顯示功能由單片機控制共陰極數碼管來實現,數碼管進行動態顯示。

通過AT24C02分別寫入時、分、秒數據在斷電後實現保存,在下次通電後將數據讀出保持為斷電前數據。

三、 晶片簡介1、 AT89C52

AT89C52是一個低電壓,高性能CMOS8位單片機,片內含8k bytes的可反覆擦寫的Flash只讀程序存儲器和256 bytes的隨機存取數據存儲器(RAM),器件採用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置通用8位中央處理器和Flash存儲單元,AT89C52單片機在電子行業中有著廣泛的應用。

AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)埠,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2 個讀寫口線,AT89C52可以按照常規方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結合在一起,特別是可反覆擦寫的 Flash存儲器可有效地降低開發成本。

AT89C52為8 位通用微處理器,採用工業標準的C51內核,在內部功能及管腳排布上與通用的8xc52 相同,其主要用於會聚調整時的功能控制。功能包括對會聚主IC 內部寄存器、數據RAM及外部接口等功能部件的初始化,會聚調整控制,會聚測試圖控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19 腳)和XTAL2(18 腳)為振蕩器輸入輸出埠,外接12MHz 晶振。RST/Vpd(9 腳)為復位輸入埠,外接電阻電容組成的復位電路。VCC(40 腳)和VSS(20 腳)為供電埠,分別接+5V電源的正負端。P0~P3 為可編程通用I/O 腳,其功能用途由軟體定義,在本設計中,P0 埠(32~39 腳)被定義為N1功能控制埠,分別與N1的相應功能管腳相連接,13 腳定義為IR輸入端,10 腳和11腳定義為I2C總線控制埠,分別連接N1的SDAS(18腳)和SCLS(19腳)埠,12 腳、27 腳及28 腳定義為握手信號功能埠,連接主板CPU的相應功能端,用於當前制式的檢測及會聚調整狀態進入的控制功能。

2、 AT24C02

AT24C02支持I2C,總線數據傳送協議I2C,總線協議規定任何將數據傳送到總線的器件作為發送器。任何從總線接收數據的器件為接收器。數據傳送是由產生串行時鐘和所有起始停止信號的主器件控制的。主器件和從器件都可以作為發送器或接收器,但由主器件控制傳送數據(發送或接收)的模式,由於A0、A1和A2可以組成000~111八種情況,即通過器件地址輸入端A0、A1和A2可以實現將最多8個AT24C02器件連接到總線上,通過進行不同的配置進行選擇器件。

AT24C02的存儲容量為2K bit,內容分成32頁,每頁8Byte,共256Byte,操作時有兩種尋址方式:晶片尋址和片內子地址尋址。

(1)晶片尋址:AT24C02的晶片地址為1010,其地址控制字格式為1010A2A1A0R/W。其中A2,A1,A0可編程地址選擇位。A2,A1,A0引腳接高、低電平後得到確定的三位編碼,與1010形成7位編碼,即為該器件的地址碼。R/W為晶片讀寫控制位,該位為0,表示晶片進行寫操作。

(2)片內子地址尋址:晶片尋址可對內部256B中的任一個進行讀/寫操作,其尋址範圍為00~FF,共256個尋址單位。


四、 設計步驟
1.2.各單元電路及工作原理

(1)按鍵控制電路   

鍵盤可實現對時間的校對,用四個按鍵來實現。按下小時數加實現對小時數進行加一,按下小時數減實現對小時數減一,按下分鐘數加一實現對分鐘數加一,按下分鐘數減一實現對分鐘數減一。當按下復位鍵時時間回到初始時間,按下啟停鍵時時鐘開始工作在次按下停止工作。

其電路連接圖如下:




LED顯示器是現在最常用的顯示器之一發光二極體(LED)分段式顯示器由7條線段圍成8字型,每一段包含一個發光二極體。外加正向電壓時二極體導通,發出清晰的光。只要按規律控制各發光段亮、滅,就可以顯示各種字形或符號。顯示電路顯示模塊需要實時顯示當前的時間,即時、分、秒,因此需要6個數碼管,採用動態顯示方式顯示時間,其硬體連接方式如下圖所示。

(3)AT24C02連接電路


AT24C02支持I2C,總線數據傳送協議I2C,總線協議規定任何將數據傳送到總線的器件作為發送器。任何從總線接收數據的器件為接收器。數據傳送是由產生串行時鐘和所有起始停止信號的主器件控制的。通過AT24C02分別寫入時、分、秒數據在斷電後實現保存,在下次通電後將數據讀出保持為斷電前數據。

1.3.繪製原理圖

   其計時周期為24小時,顯示滿刻度為23時59分59秒。整個設計圖由復位電路、AT89C51單片機、鍵盤控制電路組成。  顯示電路將「時」、「分」、「秒」通過七段顯示器顯示出來,6個數碼管的段選接到單片機的P0口,位選接到單片機的P2口。數碼管按照數碼管動態顯示的工作原理工作。  把定時器定時時間設為50ms,則計數溢出20次即得時鐘計時最小單位秒,而20次計數可用軟體方法實現,每累計60秒進1分,每累計60分鐘,進1小時。時採用24進位計時器,可實現對一天24小時的累計。校時電路時用來對「時」、「分」顯示數字進行校對調整,時分秒三個控制鍵分別接單片機的p3.2、p3.3、P3.4、P3.5進行控制。按一下分鍵秒單元就加1 ,按一下時鍵分就加1。將AT24C02接入P3.1和P3.2對斷電後數據保存,通電後數據從斷電前恢復運行。


1.4.元件清單列表  

單片機

  

AT89C51

*1

數碼管

7SEG-MPX8-CA-BLUE

*1

三極體

NPN

*8

按鈕

BUTTON

*6

上位排阻

RESPACK-8

*1

EEPROM

AT24C02

*1



2、程序設計2.1程序流程

   數字電子鐘採用內部硬體定時器來進行定時。sec等於60,應將sec清零,同時min加1。如果min等於60,應將min清零,同時h加1。如果h大於23時,應將h清零,當h小於10時十位不顯示。通過分析可知,程序中可分別由

{


num2=0;


       sec++;

         if(sec==60)

       {

          sec=0;

           min++;

              if(min==60)

       {

         min=0;

          h++;

          if(h==24)

           h=0;

        }

       }

    }

這段程序負責秒、分、時的計時。

   按鈕K1、K2和K3、K4為調時、調分控制按鍵。這兩個按鈕信號的輸入採用外部中斷方式來實現。若產生外部中斷時,通過調用H或_min來實現調時或調分操作。通過displays()顯示時分秒中間用「-」隔開每隔一秒實現閃爍。

       斷電後數據保存,通過AT24C02晶片採用IIC串口通信解決掉電保護,具體將時、分、秒,數據每隔一秒時間將數據寫入AT24C02中,在斷電後數據停留在斷電前,通電後數據恢復。

2.2主程序:

void main()

{

    init();

    sec=read_add(0);

    if(sec>60)

        sec=0;

    min=read_add(1);

    if(min>60)

        min=0;

    h=read_add(2);

    if(h>24)

        h=0;

      if(write==1)

      {

        write=0;

       write_add(0,sec);

       write_add(1,min);

       write_add(2,h);

       }   

      }     


}

  在主程序中先將讀出保存數據分別賦給h、min、sec然後判斷計時器是否到了一秒,如果到了就在24C02的地址0中寫入sec在地址1中寫入min在地址2中寫入h。最終實現數據斷電的保存。


2.2.源程序:

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

Ucharcode tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

bit write=0;

sbit key1=P3^2;

sbit key2=P3^3;

sbit key3=P3^4;

sbit key4=P3^5;

sbit key5=P3^6;

sbit key6=P3^7;

sbit sda=P3^1;

sbit scl=P3^0;

void delayms(uint);

void display();

sbit key=P3^2;

ucharnum2,secshi,secge,minshi,minge,hshi,hge;

uchar mun=0,sec=0,min=20,h=5;

void displays();

void keyscan();

void delay()

{;;}

void start()

{

    sda=1;

    delay();

    scl=1;

    delay();

    sda=0;

    delay();

}


void stop()

{

    sda=0;

    delay();

    scl=1;

    delay();

    sda=1;

    delay();

}


void respons()

{

    uchari;

    scl=1;

    delay();

    while((sda==1)&&(i<250))

    i++;

    scl=0;

    delay();

}

void init()

{

    sda=1;

    delay();

    scl=1;

    delay();

}


void write_byte(uchar date)

{

    uchari,temp;

    temp=date;

    for(i=0;i<8;i++)

    {

       temp=temp<<1;

       scl=0;

       delay();

       sda=CY;

       delay();

       scl=1;

       delay();

    }

    scl=0;

    delay();

    sda=1;

    delay();

}


uchar read_byte()

{

    uchari,k;

    scl=0;

    delay();

    sda=1;

    delay();

    for(i=0;i<8;i++)

    {

       scl=1;

       delay();

       k=(k<<1)|sda;

       scl=0;

       delay();

    }

    returnk;

}


void write_add(ucharaddress,uchar date)

{

    start();

    write_byte(0xa0);

    respons();

    write_byte(address);

    respons();

    write_byte(date);

    respons();

    stop();


    start();

    write_byte(0xa1);

    respons();

    write_byte(address);

    respons();

    write_byte(date);

    respons();

    stop();


    start();

    write_byte(0xa2);

    respons();

    write_byte(address);

    respons();

    write_byte(date);

    respons();

    stop();

}


uchar read_add(uchar address)

{

    uchardate;

    start();

    write_byte(0xa0);

    respons();

    write_byte(address);

    respons();

    start();

    write_byte(0xa1);

    respons();

    date=read_byte();

    stop();

    start();

    write_byte(0xa2);

    respons();

    write_byte(address);

    respons();

    start();

    write_byte(0xa3);

    respons();

    write_byte(address);

    respons();

    returndate;

}


void main()

{

    init();

    sec=read_add(0);

    if(sec>60)

        sec=0;

    min=read_add(1);

    if(min>60)

        min=0;

    h=read_add(2);

    if(h>24)

        h=0;


TMOD=0x01;

EA=1;

ET0=1;

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

TR0=1;

while(1)

{


      displays();

      display();

      if(write==1)

      {

        write=0;

       write_add(0,sec);

       write_add(1,min);

       write_add(2,h);


       }


        keyscan();   

      }     


  }


void displays()

{  

if(num2==0)

{

    P2=0xdb;

    P0=0x40;

    delayms(2);

   }

}


void display( )

{

      secshi=sec/10;

      secge=sec%10;

      minshi=min/10;

      minge=min%10;

      hshi=h/10;

      hge=h%10;


      P2=0xbf;

      P0=tab[secshi];

      delayms(2);

      P2=0x7f;

      P0=tab[secge];

      delayms(2);


      P2=0xf7;

      P0=tab[minshi];

      delayms(2);

      P2=0xef;

      P0=tab[minge];


      delayms(2);

      P2=0xfe;

      P0=tab[hshi];

      delayms(2);

      P2=0xfd;

      P0=tab[hge];

      delayms(2);

}


void delayms(uint xms)

{

    uintx,y;

   for(x=xms;x>0;x--)

    for(y=110;y>0;y--);

    }


void keyscan()

{

    if(key1==0)

    {

       delayms(10);

       if(key1==0)

       {

           h++;

           if(h==24)

           {

              h=0;

           }

           while(!key1);

       }

    }


    if(key2==0)

    {

       delayms(10);

       if(key2==0)

       {

           h--;

           if(h==0)

           {

              h=24;

           }

           while(!key2);


       }

    }

    if(key3==0)

    {

       delayms(10);

       if(key3==0)

       {

           min++;

           if(min==60)

           min=0;

           while(!key3);

       }

    }


    if(key4==0)

    {

       delayms(10);

       if(key4==0)

       {

           if(min==0)

           min=60;

           min--;

           while(!key4);

       }

    }

    if(key5==0)

    {

        delayms(10);

       if(key5==0)

       {

           min=20;

           h=5;

           sec=0;

           while(!key5);

       }

    }

    if(key6==0)

    {

       delayms(10);

       if(key6==0)

       {

           while(!key6);

           TR0=~TR0;

       }

    }

}

void T0_time()interrupt 1

{

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

num2++;

if(num2==20)

{

       num2=0;

       sec++;

       write=1;

      if(sec==60)

       {

          sec=0;

           min++;

             if(min==60)

           {

             min=0;

              h++;

                 if(h==24)

                 {

                     h=0;

                  }

            }

       }


    }

}



相關焦點

  • 用8031單片機控制的數字鐘
    數字電子鐘的設計方法有多種,例如,可用中小規模集成電路組成電子鐘;也可以利用專用的電子鐘晶片配以顯示電路及其所需要的外圍電路組成電子鐘;還可以利用單片機來實現電子鐘等等。這些方法都各有特點,其中,利用單片機實現的電子鐘具有編程靈活,便於電子鐘功能的擴充,即可用該電子鐘發出各種控制信號,精確度高等特點。本文引用地址:http://www.eepw.com.cn/article/172074.htm所設計的電子鐘有以下功能:1. 24小時制時間顯示。2. 可隨時進行時間校對。 3. 整點報時。
  • 基於計數器的數字電子鐘的設計
    摘要:本設計是一個基於計數器的數字電子鐘裝置。這種用數字電路實現的電子鐘與機械式時鐘相比具有更高的準確性和直觀性。關鍵詞:555定時器;分頻器;計數器;解碼器;顯示器0 引言 數字式電子鐘集成電路大都是由振蕩器、分頻器、計數器、解碼器、LED顯示器組成。
  • 基於Multisim數字電子鐘設計
    數字電子鐘是用數字集成電路構成並有數字顯示特點的一種現代計數器,與傳統的機械計時器相比,它具有走時準、顯示直觀、無機械磨損等,因而廣泛應用於車站、碼頭、商店等公共場所。
  • 基於單片機的多功能數字鐘系統設計與分析
    關鍵詞:單片機;I/O口;多功能;數字鐘;模塊0 引言隨著科技的發展,電子技術也在不斷地向前飛速發展。本設計是製作一款多功能數字鐘,其具有顯示年、月、日,時、分、秒、星期及鬧鐘功能,而且秒、分、時、日、月、年可自動關聯進位。
  • 基於89C51單片機的步進電動機控制系統設計
    隨著數位化技術的快速發展,數字控制技術在工業控制方面得到了極其廣泛的應用。步進電動機是數字控制電動機,能將脈衝信號轉換成角位移,電動機的轉速、停止的位置取決於脈衝信號的頻率和脈衝數,而不受負載變化的影響,在非超載狀態下,根據上述線性關係,再加上步進電動機只有周期性誤差而無累積誤差,因此步進電機適用於單片機控制。
  • 以89C51單片機為核心控制器件的液體點滴速度監控系統設計
    目前市場上點滴控制系統不少,本文的設計點在於低成本,僅使用最廉價89C51單片機以及普通的元件實現整套系統。 2. 系統設計要求 2.1. 從站設計要求 A.在滴鬥處檢測點滴速度,並使用數顯裝置動態顯示點滴速度(滴/分)。
  • STC89C52單片機對數字溫度計顯示系統的設計
    3.碼管顯示模塊:主要對單片機送來的時間、日期、溫度信息進行顯示。 4 。度採集模塊:採用D S 1 8 B 2 0溫度傳感器,向單片機提供實時溫度信息。 5.子鐘模塊:採用時鐘晶片DS1302,該晶片可以進行時、分、秒的計數,DS1302通過串行方式與單片機進行數據傳送,向單片機提供包括秒、分、時、日、月、年等在內的實時時間信息。
  • 基於C51單片機的遙控小車設計與製版
    手動布局、布線;二、設計思路此次試驗採用基於C51單片機的遙控小車的設計。硬體方案確定如下:在現有電動車模型的基礎上,加裝無線控制模塊,電機驅動模塊,實現對電動車的無線遙控,並將數據傳送至單片機進行處理,然後由單片機根據所接收到檢測的數據實現對電動車的控制。三、單片機簡介1、89c51硬體結構
  • 單片機數字鐘設計
    圖4.20.13.系統板上硬體連線 (1.把「單片機系統」區域中的P1.0-P1.7埠用8芯排線連接到「動態數碼顯示」區域中的A-H埠上;(2.把「單片機系統:區域中的P3.0-P3.7埠用8芯排線連接到「動態數碼顯示」區域中的S1-S8埠上; (3.把「單片機系統」區域中的P0.0/AD0、P0.1/AD1、P0.2/AD2埠分別用導線連接到「獨立式鍵盤」區域中的SP3、SP2、SP1埠上; 4.相關基本知識 (1.動態數碼顯示的方法
  • 6位LED顯示單片機控制電子鐘/計數器
    這是我們設計的單片機電子鐘/計時器學習板,它採用6位LED數碼管顯示時、分、秒,以24小時計時方式。可以通過按鍵實現時分調整、秒表/時鐘功能轉換、省電(關閉顯示)等功能。我們能提供的完整的彙編語言源程序清單及電路原理設計圖有助於學習者進行分析和進行實驗驗證產品1:6位LED顯示單片機控制電子鐘/計數器成品板成品每套84元本文引用地址:http://www.eepw.com.cn/article/201611/317464
  • 基於VHDL和QuartusⅡ的數字電子鐘設計與實現
    摘要:採用FPGA進行的數字電路設計具有更大的靈活性和通用性,已成為目前數字電路設計的主流方法之一。本文給出一種基於FPGA的數字鐘設計方案。
  • 單片機畢設(課設)題目匯總
    基於單片機的交流調功器設計16. 基於單片機的數字電壓表的設計17. 單片機的數字鐘設計18. 智能散熱器控制器的設計19. 單片機打鈴系統設計20. 基於單片機的交通信號燈控制電路設計21. 基於單片機的電話遠程控制家用電器系統設計22. 基於單片機的安全報警器23.
  • 51單片機數碼管顯示的數字鐘
    這是一個基於51單片機的數字鐘程序用數碼管來顯示數據.本文引用地址:http://www.eepw.com.cn/article/201611/323805.htm
  • 數字鐘設計與製作
    引言本文引用地址:http://www.eepw.com.cn/article/235666.htm  本文採用CMOS數字集成電路實現了一種數字鐘電路
  • 基於單片機的ADC0809數字電壓表設計報告(彙編語言)
    第一章 課設題目分析1.1 數字電壓表簡介在電量的測量中,電壓、電流和頻率是最基本的三個被測量,其中電壓量的測量最為經常。而且隨著電子技術的發展,更是經常需要測量高精度的電壓,所以數字電壓表就成為一種必不可少的測量儀器。
  • 電子類-單片機類畢業設計論文創新選題
    的自動泡茶機設計基於STM32的智能快遞空箱基於單片機的刷卡小車設計智能電錶系統中IC卡電費預存模塊的設計與實現基於STC89C52的指紋解鎖系統設計基於STC15單片機的射頻門禁系統的設計>基於89C51與MK60控制器的智能交通系統基於OpenCV的非接觸式測距系統基於單片機的紅外遙控電子密碼鎖設計基於MATLAB的車牌識別系統設計基於STC89C52的智能無線小車
  • 《電子發燒友網51單片機設計方案TOP10》
    壓力傳感器信號經過與處理成為A/D變換器所需要的點模擬信號,依賴於模擬轉換器(MD)的模擬典雅的數位化將輸入信號變換為數位訊號,這些變化通過採樣、量化和編碼獲得。   (2)數據處理。A/D轉換器轉換壓力傳感器的數據輸出信號,要根據需要加工處理所獲得的數位訊號,如標度變換、非線性補償、溫度補償和數字濾波等這些軟體處理,否則是不能直接輸入微處理機供應用程式使用。
  • 基於EDA技術的數字鐘設計與實現
    摘要:為使數字鐘從電路設計、性能分析到設計出PCB版(即印製電路版)圖的整個過程能夠在計算機上自動處理完成,從而縮短設計周期、提高設計效率、戰小設計風險。
  • 基於51單片機的電子音樂盒的課程設計
    1.設計目的和要求1.1 設計目的(1) 通過設計,查閱相關資料,掌握如何利用單片機設計產品,同時了解與單片機有關的軟體模擬器的使用及取字模塊軟體的使用方法。(2) 通過本課程設計鞏固並擴展單片機課程的基本概念、基本理論、分析方法和實現方法。
  • 數字鐘實驗電路的設計與仿真
    摘要:基於Multisim 10軟體對數字鐘電路進行設計和仿真。採用555定時器產生秒時鐘信號,用時鐘信號驅動計數電路進行計數,將計數結果進行解碼,最終在LED數碼管上以數字的形式顯示時、分、秒時間。