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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9425|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

AT89C51單片機(jī)數(shù)字電子鐘的設(shè)計

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:732702 發(fā)表于 2020-4-19 14:48 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
一、 設(shè)計目的與要求
設(shè)計目的:通過設(shè)計,培養(yǎng)運用已學(xué)知識解決實際問題的能力、查閱資料的能力、自學(xué)能力和獨立分析問題、解決問題的能力和能通過獨立思考。
設(shè)計要求:設(shè)計一個時、分可調(diào)的數(shù)字電子鐘、斷電后將數(shù)據(jù)保存,開啟后時間將從斷電后時間繼續(xù)行走。
二、 設(shè)計內(nèi)容與方案制定
具有校時功能,按鍵控制電路其中時鍵、分鍵六個鍵分別控制時、分時間的調(diào)整。按下小時數(shù)實現(xiàn)對小時數(shù)加減,按下分鐘數(shù)實現(xiàn)對分鐘數(shù)進(jìn)行加減,并設(shè)置有復(fù)位鍵,啟始鍵。
以AT89C51單片機(jī)進(jìn)行實現(xiàn)秒、分、時上的正常顯示和進(jìn)位,其中顯示功能由單片機(jī)控制共陰極數(shù)碼管來實現(xiàn),數(shù)碼管進(jìn)行動態(tài)顯示。
通過AT24C02分別寫入時、分、秒數(shù)據(jù)在斷電后實現(xiàn)保存,在下次通電后將數(shù)據(jù)讀出保持為斷電前數(shù)據(jù)。
三、 芯片簡介1、 AT89C52
AT89C52是一個低電壓,高性能CMOS8位單片機(jī),片內(nèi)含8k bytes的可反復(fù)擦寫的Flash只讀程序存儲器和256 bytes的隨機(jī)存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲單元,AT89C52單片機(jī)在電子行業(yè)中有著廣泛的應(yīng)用。
AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,2 個讀寫口線,AT89C52可以按照常規(guī)方法進(jìn)行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的 Flash存儲器可有效地降低開發(fā)成本。
AT89C52為8 位通用微處理器,采用工業(yè)標(biāo)準(zhǔn)的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc52 相同,其主要用于會聚調(diào)整時的功能控制。功能包括對會聚主IC 內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會聚調(diào)整控制,會聚測試圖控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19 腳)和XTAL2(18 腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9 腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。VCC(40 腳)和VSS(20 腳)為供電端口,分別接+5V電源的正負(fù)端。P0~P3 為可編程通用I/O 腳,其功能用途由軟件定義,在本設(shè)計中,P0 端口(32~39 腳)被定義為N1功能控制端口,分別與N1的相應(yīng)功能管腳相連接,13 腳定義為IR輸入端,10 腳和11腳定義為I2C總線控制端口,分別連接N1的SDAS(18腳)和SCLS(19腳)端口,12 腳、27 腳及28 腳定義為握手信號功能端口,連接主板CPU的相應(yīng)功能端,用于當(dāng)前制式的檢測及會聚調(diào)整狀態(tài)進(jìn)入的控制功能。
2、 AT24C02
AT24C02支持I2C,總線數(shù)據(jù)傳送協(xié)議I2C,總線協(xié)議規(guī)定任何將數(shù)據(jù)傳送到總線的器件作為發(fā)送器。任何從總線接收數(shù)據(jù)的器件為接收器。數(shù)據(jù)傳送是由產(chǎn)生串行時鐘和所有起始停止信號的主器件控制的。主器件和從器件都可以作為發(fā)送器或接收器,但由主器件控制傳送數(shù)據(jù)(發(fā)送或接收)的模式,由于A0、A1和A2可以組成000~111八種情況,即通過器件地址輸入端A0、A1和A2可以實現(xiàn)將最多8個AT24C02器件連接到總線上,通過進(jìn)行不同的配置進(jìn)行選擇器件。
AT24C02的存儲容量為2K bit,內(nèi)容分成32頁,每頁8Byte,共256Byte,操作時有兩種尋址方式:芯片尋址和片內(nèi)子地址尋址。
(1)芯片尋址:AT24C02的芯片地址為1010,其地址控制字格式為1010A2A1A0R/W。其中A2,A1,A0可編程地址選擇位。A2,A1,A0引腳接高、低電平后得到確定的三位編碼,與1010形成7位編碼,即為該器件的地址碼。R/W為芯片讀寫控制位,該位為0,表示芯片進(jìn)行寫操作。
(2)片內(nèi)子地址尋址:芯片尋址可對內(nèi)部256B中的任一個進(jìn)行讀/寫操作,其尋址范圍為00~FF,共256個尋址單位。

四、 設(shè)計步驟

1.2.各單元電路及工作原理
(1)按鍵控制電路   
鍵盤可實現(xiàn)對時間的校對,用四個按鍵來實現(xiàn)。按下小時數(shù)加實現(xiàn)對小時數(shù)進(jìn)行加一,按下小時數(shù)減實現(xiàn)對小時數(shù)減一,按下分鐘數(shù)加一實現(xiàn)對分鐘數(shù)加一,按下分鐘數(shù)減一實現(xiàn)對分鐘數(shù)減一。當(dāng)按下復(fù)位鍵時時間回到初始時間,按下啟停鍵時時鐘開始工作在次按下停止工作。
其電路連接圖如下:



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

AT24C02支持I2C,總線數(shù)據(jù)傳送協(xié)議I2C,總線協(xié)議規(guī)定任何將數(shù)據(jù)傳送到總線的器件作為發(fā)送器。任何從總線接收數(shù)據(jù)的器件為接收器。數(shù)據(jù)傳送是由產(chǎn)生串行時鐘和所有起始停止信號的主器件控制的。通過AT24C02分別寫入時、分、秒數(shù)據(jù)在斷電后實現(xiàn)保存,在下次通電后將數(shù)據(jù)讀出保持為斷電前數(shù)據(jù)。
1.3.繪制原理圖
   其計時周期為24小時,顯示滿刻度為23時59分59秒。整個設(shè)計圖由復(fù)位電路、AT89C51單片機(jī)、鍵盤控制電路組成。  顯示電路將“時”、“分”、“秒”通過七段顯示器顯示出來,6個數(shù)碼管的段選接到單片機(jī)的P0口,位選接到單片機(jī)的P2口。數(shù)碼管按照數(shù)碼管動態(tài)顯示的工作原理工作。  把定時器定時時間設(shè)為50ms,則計數(shù)溢出20次即得時鐘計時最小單位秒,而20次計數(shù)可用軟件方法實現(xiàn),每累計60秒進(jìn)1分,每累計60分鐘,進(jìn)1小時。時采用24進(jìn)制計時器,可實現(xiàn)對一天24小時的累計。 校時電路時用來對“時”、“分”顯示數(shù)字進(jìn)行校對調(diào)整,時分秒三個控制鍵分別接單片機(jī)的p3.2、p3.3、P3.4、P3.5進(jìn)行控制。按一下分鍵秒單元就加1 ,按一下時鍵分就加1。將AT24C02接入P3.1和P3.2對斷電后數(shù)據(jù)保存,通電后數(shù)據(jù)從斷電前恢復(fù)運行。

1.4.元件清單列表
  
單片機(jī)
  
AT89C51
*1
數(shù)碼管
7SEG-MPX8-CA-BLUE
*1
三極管
NPN
*8
按鈕
BUTTON
*6
上位排阻
RESPACK-8
*1
EEPROM
AT24C02
*1


2、程序設(shè)計2.1程序流程
   數(shù)字電子鐘采用內(nèi)部硬件定時器來進(jìn)行定時。sec等于60,應(yīng)將sec清零,同時min加1。如果min等于60,應(yīng)將min清零,同時h加1。如果h大于23時,應(yīng)將h清零,當(dāng)h小于10時十位不顯示。通過分析可知,程序中可分別由
{

num2=0;

       sec++;
         if(sec==60)
       {
          sec=0;
           min++;
              if(min==60)
       {
         min=0;
          h++;
          if(h==24)
           h=0;
        }
       }
    }
這段程序負(fù)責(zé)秒、分、時的計時。
   按鈕K1、K2和K3、K4為調(diào)時、調(diào)分控制按鍵。這兩個按鈕信號的輸入采用外部中斷方式來實現(xiàn)。若產(chǎn)生外部中斷時,通過調(diào)用H或_min來實現(xiàn)調(diào)時或調(diào)分操作。通過displays()顯示時分秒中間用“-”隔開每隔一秒實現(xiàn)閃爍。
       斷電后數(shù)據(jù)保存,通過AT24C02芯片采用IIC串口通信解決掉電保護(hù),具體將時、分、秒,數(shù)據(jù)每隔一秒時間將數(shù)據(jù)寫入AT24C02中,在斷電后數(shù)據(jù)停留在斷電前,通電后數(shù)據(jù)恢復(fù)。
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);
       }   
      }     

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

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;
                  }
            }
       }

    }
}



實物圖:

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:760481 發(fā)表于 2020-6-1 10:51 | 只看該作者
代碼有問題
回復(fù)

使用道具 舉報

板凳
ID:777643 發(fā)表于 2020-6-14 20:55 來自觸屏版 | 只看該作者
這個是51的還是52的呀
回復(fù)

使用道具 舉報

地板
ID:785626 發(fā)表于 2020-6-21 14:08 | 只看該作者
代碼錯了
回復(fù)

使用道具 舉報

5#
ID:732702 發(fā)表于 2020-10-8 19:03 | 只看該作者

請問那一部分代碼有問題?
回復(fù)

使用道具 舉報

6#
ID:732702 發(fā)表于 2020-10-8 19:04 | 只看該作者
1114019472 發(fā)表于 2020-6-14 20:55
這個是51的還是52的呀

AT89C52
回復(fù)

使用道具 舉報

7#
ID:732702 發(fā)表于 2020-10-8 19:05 | 只看該作者

請問,那一部分代碼錯了?
我運行時沒有錯誤
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黄色免费在线观看网站 | 日韩精品一区二区三区视频播放 | 国产色片在线 | 中文字幕在线视频网站 | www.天天操| 在线观看国产视频 | 国内精品在线视频 | 国产欧美在线 | 中文在线视频观看 | 久久久国产精品 | 天天草天天干天天 | 偷拍自拍网 | 久久精品中文字幕 | 视频一区二区国产 | 中文字幕在线第一页 | 日韩一区二区三区视频 | 91在线视频精品 | 国产精品综合 | 欧美一级久久精品 | 久久欧美精品 | 欧美精品久久久久久久久久 | 韩国精品在线观看 | 欧洲一区二区三区 | 91传媒在线观看 | 欧美在线观看一区二区 | 99福利视频 | 男女午夜免费视频 | 精品一区av| 色综合色综合色综合 | 亚洲欧美在线视频 | 国产福利资源在线 | aa级毛片毛片免费观看久 | 久久国产99| 成人依人 | www.99热这里只有精品 | 欧美xxxx色视频在线观看免费 | 国产在线观看一区二区 | 亚洲 中文 欧美 日韩 在线观看 | 天天爱av | 久久久久久久久91 | 亚洲一区二区三区在线播放 |