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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8716|回復: 5
收起左側

數字電子時鐘設計報告-單片機原理與應用課程大作業

[復制鏈接]
ID:328014 發表于 2018-5-28 01:37 | 顯示全部樓層 |閱讀模式

《單片機原理與應用》課程大作業


數字電子時鐘

學院:信息與通信工程學院

專業:光電信息科學與工程            

班級:15050341               

學號:1505034138


一、系統功能介紹

電子時鐘是一種利用數字電路來顯示秒、分、時的計時裝置,與傳統的機械鐘相比,它具有走時準確、顯示直觀、無機械傳動裝置等優點,因而得到廣泛應用。隨著人們生活環境的不斷改善和美化,在許多場合可以看到數字電子鐘。

電子鐘亦稱數字顯示鐘,是一種用數字電路技術實現時、分、秒計時的裝置,與機械時鐘相比,直觀性為其主要顯著特點,且因非機械驅動,具有更長的使用壽命,相較石英鐘的石英機芯驅動,更具準確性。

利用單片機和數碼管顯示電路呈現出設計要求,4位數碼管前兩位顯示小時00-23,后兩位顯示分鐘00-69,一秒鐘閃爍一次,閃爍60次為一分鐘。K1是功能鍵調節時間并移位選擇,K2是加數鍵,K3是減數鍵。將程序下載到單片機內,給單片機上電,由于初始值設的是0x00,所以數碼管顯示0000,并且后兩位數碼管每一秒閃爍一下。按K1鍵暫停閃爍并開始選擇數碼管,按下K2、K3鍵校準時間。

二、原理介紹

(1)以STC15W4K32S4_PDIP40單片機為控制核心,用單片機內部定時器為時鐘源,設計電子時鐘,使用4位數碼管顯示時、分,后兩位數碼管(分)的閃爍顯示秒。

(2)顯示格式為:“XXXX”

(3)用3個功能鍵操作來進行對時,用K1--K3鍵定義描述功能即:

K1--功能鍵,默認0是執行時鐘程序,按一下調整秒,按第二次是調整分,按第三次是調整時,再按一下變成0執行默認時鐘程序;

K2--加一鍵,如果功能鍵按的是調整秒的,秒就加一;如果功能鍵按的是調整分的,分就加一;如果功能鍵按的是調整時的,時就加一;

K3--減一鍵,如果功能鍵按的是調整秒的,秒就減一;如果功能鍵按的是調整分的,分就減一;如果功能鍵按的是調整時的,時就減一;

三、模塊設計(核心器件介紹、電路設計、程序設計)
1、核心器件介紹

STC15W4K32S4_PDIP40單片機:

(1)STC15W4K32S4系列單片機中包含中央處理器(CPU)、程序存儲器(Flash)、數據存儲器(SRAM)、定時器/計數器、內部掉電喚醒專用定時器、I/O口、比較器、看門狗、高速異步串行通信端口UART,高速同步串行端口SPI,片內高精度R/C時鐘及高可靠復位等模塊。STC15W4K32S4系列的單片機集成了一組(各自獨立6路)增強型的PWM波形發生器。PWM波形發生器內部有一個15位的PWM計數器供6路PWM使用,用戶可以設置每路PWM的初始電平。另外,PWM波形發生器為每路PWM又設計了兩個用于控制波形翻轉的計數器T1/T2,可以非常靈活的每路PWM的高低電平寬度,從而達到對PWM的占空比以及PWM的輸出延遲進行控制的目的。由于6路PWM是各自獨立的,且每路PWM的初始狀態可以進行設定,所以用戶可以將其中的任意兩路配合起來使用,即可實現互補對稱輸出以及死區控制等特殊應用。

(2)STC15W4K32S4系列增強型PWM輸出端口定義如下:

[PWM2:P3.7, PWM3:P2.1, PWM4:P2.2, PWM5:P2.3, PWM6:P1.6, PWM7:P1.7]

每路PWM的輸出端口都可使用特殊功能寄存器位CnPINSEL分別獨立的切換到第二組

[PWM2_2:P2.7, PWM3_2:P4.5, PWM4_2:P4.4, PWM5_2:P4.2, PWM6_2:P0.7, PWM7_2:P0.6]

(3)優點:

①增強型 8051 CPU,1T,單時鐘/機器周期,速度比普通8051快8-12倍。

②大容量4096(4K)字節片內RAM數據存儲器

③內部高可靠復位,ISP編程時8級復位門檻電壓可選,可徹底省掉外部復位電路。

④工作頻率范圍:0MHz ~ 28MHz,相當于普通8051的0MHz~336MHz。

圖一  電路圖

2、電路設計



圖二 按鍵部分                      圖三 復位電路

(1)按鍵部分(圖二):

    K1--功能鍵:默認0是執行時鐘程序,按一下調整秒,按第二次是調整分,按第三次是調整時,再按一下變成0執行默認時鐘程序;

    K2--加一鍵:如果功能鍵按的是調整秒的,秒就加一;如果功能鍵按的是調整分的,分就加一;如果功能鍵按的是調整時的,時就加一;

K3--減一鍵:如果功能鍵按的是調整秒的,秒就減一;如果功能鍵按的是調整分的,分就減一;如果功能鍵按的是調整時的,時就減一;

(2)復位電路(圖三):

包括上電自動復位和按鍵復位兩種方式。上電瞬間,RC電路充電,RST引線端出現正脈沖,只要RST端保持10ms以上的高電平,就能使單片機有效地復位。其中R1選擇10KΩ的電阻,電容器一般選擇10μF。 按下K4鍵時鐘設置歸零。

圖四 1602液晶部分

此電路中1602LCD采用標準的14腳(無背光)接口,各引腳接口說明如下表所示:

編號

符號

引腳說明

編號

符號

引腳說明

1

VSS

電源地

9

D2

數據

2

VDD

電源正極

10

D3

數據

3

VL

液晶顯示偏壓

11

D4

數據

4

RS

數據/命令選擇

12

D5

數據

5

R/W

讀/寫選擇

13

D6

數據

6

E

使能信號

14

D7

數據

7

D0

數據




8

D1

數據




引腳接口說明:

第1腳:VSS為地電源;

第2腳:VDD接5V正電源;

第3腳:VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會 產生“鬼影”,使用時可以通過一個10K的電位器調整對比度。

第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。

第5腳:R/W為讀寫信號線,高電平 時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RA為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。

第6腳:E端為使能端,當E端由高電平跳變成低電平時讀取信息,液晶模塊執行命令。

第7~14腳:D0~D7為8位雙向數據線。

圖五 晶振電路

單片機內部的振蕩電路是一個高增益反向放大器,引線X1和X2分別是放大器的輸入端和輸出端。單片機內部雖然有振蕩電路,但要形成時鐘,外部還需附加電路。他的時鐘產生方式有兩種:內部時鐘電方式和外部時鐘方式。由于外部時鐘方式用于多片單片機組成的系統中,所以此處選用內部時鐘方式。即利用其內部的振蕩電路在X1和X2引線上外接定時元件,內部振蕩電路產生自激振蕩。


四、總結

經過此次單片機作業的設計,通過完成一個電子時鐘設計的過程,我學到了很多東西!

這樣實戰的設計過程是培養學生綜合運用所學知識、發現、提出、分析、和解決實際問題。鍛煉實踐能力的重要環節,是對學生實際工作能力的具體訓練和考察。此次設計的過程中發現了很多自己知識方面的欠缺,通過查找資料等方式去彌補。隨著科學技術發展的日新月異,單片已經成為當今計算機應用中空前活躍的領域,在生活中可以說是無處不在,因此作為二十一世紀的大學生來說掌握單片機的開發技術是十分重要的。以前課程設計是一個組設計一個課題,當自己通過查資料詢問等方式完成一個自己的課題時感覺真的很充實。


單片機源碼:

  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #define uchar unsigned  char
  4. #define uint unsigned int
  5. sbit RS=P2^0;
  6. sbit RW=P2^1;
  7. sbit E=P2^2;
  8. sbit k1=P1^0;
  9. sbit k2=P1^1;
  10. sbit k3=P1^2;
  11. uchar shuzhu[]={"beijing time"};//定義字符串
  12. uchar shuzhu3[]={"2017"};//定義字符串
  13. uchar shuzhu2[]={"xx:xx:xx"};//時鐘數組一共8個字符,程序的重點
  14. uchar q,fla,num,x;
  15. signed char m,f,s;
  16. void delay(uchar x)//延時函數   
  17. {
  18.    uchar a,b;
  19.    for(a=0;a<x;a++)
  20.       for(b=0;b<120;b++);
  21. }
  22. void key(void)//按鍵掃描        
  23. {
  24.    if(k1==0)//模式
  25.    {
  26.       delay(5);
  27.       if(k1==0)
  28.       {
  29.               num++;//num是功能鍵的變量,默認是0執行時鐘程序,按一下調整秒,按第二次是調整分,按第三次調整時,再按一下變成0執行默認時鐘程序
  30.               if(num>3)
  31.                   num=0;
  32.               while(k1==0);
  33.               }
  34.       }
  35.    if(k2==0)//判斷加一的按鍵有無按下
  36.    {
  37.       delay(5);
  38.       if(k2==0)
  39.       {
  40.               if(num==1)//如果功能鍵按的是調整秒的,秒就加一
  41.               {
  42.                   m++;
  43.                   if(m==60)
  44.                   {
  45.                     m=0;
  46.                   }
  47.                   }
  48.               if(num==2)//如果功能鍵按的是調整分的,分就加一
  49.               {
  50.                   f++;
  51.                   if(f==60)
  52.                   {
  53.                     f=0;
  54.                   }
  55.                   }
  56.               if(num==3)//如果功能鍵按的是調整時的,時就加一
  57.               { s++;
  58.                   if(s==24)  
  59.                      s=0;
  60.               }
  61.               while(k2==0);
  62.               }
  63.       }
  64.    if(k3==0)//判斷減一的按鍵有無按下
  65.    {
  66.       delay(5);
  67.       if(k3==0)
  68.       {
  69.               if(num==1)//同上
  70.               {
  71.                      m--;
  72.                   if(m<0)
  73.                      m=59;
  74.               }
  75.               if(num==2)
  76.               {
  77.                   f--;
  78.                   if(f<0)
  79.                      f=59;
  80.               }
  81.               if(num==3)
  82.               {
  83.                   s--;
  84.                   if(s<0)
  85.                      s=23;
  86.               }
  87.                 while(k3==0);
  88.               }
  89.       }
  90. }
  91. void write_command(uchar x)//寫指令函數
  92. {
  93.    RS=0;
  94.    RW=0;
  95.    P0=x;
  96.    E=1;
  97.    delay(5);
  98.    E=0;
  99. }
  100. void write_data(uchar x)//寫數據函數
  101. {
  102.    RS=1;
  103.    RW=0;
  104.    P0=x;
  105.    E=1;
  106.    delay(5);
  107.    E=0;
  108. }
  109. void init()//初始化1602函數
  110. {
  111.    write_command(0x38);
  112.    write_command(0x08);
  113.    write_command(0x01);
  114.    write_command(0x06);
  115.    write_command(0x0c);
  116. }
  117. void pos(uchar x,uchar y)//要寫入的位置函數
  118. {
  119.    x&=0x0f;
  120.    if(y==1)
  121.    write_command(0x80+x);
  122.    if(y==2)
  123.    write_command(0x80+0x40+x);
  124. }
  125. void xssz(void)//把時間賦給顯示數組
  126. {
  127.     shuzhu2[0]=s/10+'0';//加‘0’是為了把時間的數變成ASCII碼
  128.     shuzhu2[1]=s%10+'0';
  129.     shuzhu2[3]=f/10+'0';
  130.     shuzhu2[4]=f%10+'0';
  131.     shuzhu2[6]=m/10+'0';
  132.     shuzhu2[7]=m%10+'0';
  133. }
  134. void main(void)//主函數
  135. {
  136.     uchar k,a,b;
  137.     EA=1;
  138.     ET0=1;
  139.     ET1=1;
  140.     TMOD=0X11;
  141.     TH0=(65535-50000)/256;
  142.     TL0=(65535-50000)%256;
  143.     TH1=(65535-50000)/256;
  144.     TL1=(65535-50000)%256;
  145.     TR0=1;
  146.     fla=1;//閃爍標志位
  147.    init();//初始化1602
  148.     pos(2,1);//設置顯示位置
  149.      for(k=0;k<12;k++)
  150.      {
  151.               write_data(shuzhu[k]);//固定顯示16個字符beijing time
  152.       }
  153.       pos(0,2);//設置顯示位置
  154.      for(a=0;a<4;a++)
  155.      {
  156.               write_data(shuzhu3[a]);//固定顯示4個字符2016
  157.      }
  158.       while(1)//無限循環
  159.     {
  160.        key();//判斷有誤按鍵按下
  161.        pos(7,2);//設置顯示位置
  162.        for(b=0;b<8;b++)
  163.               {
  164.                  write_data(shuzhu2[b]); //讓1602顯示時鐘數組里的內容
  165.               }   
  166.        switch(num)//判斷功能鍵按下所對應的功能
  167.        {
  168.                 case 0 : TR0=1;TR1=0;//默認無按下狀態num值是0,正常的時鐘功能。
  169.                          xssz();
  170.                                if(fla==0)
  171.                                   shuzhu2[5]=' ';//修改時鐘數組的內容讓分號:的閃爍
  172.                                if(fla==1)
  173.                                   shuzhu2[5]=':';  //修改時鐘數組的內容讓分號:的閃爍
  174.                                                             break;  
  175.                 case 1 : TR0=0;TR1=1;  //當功能鍵按的第一下,把定時器0關掉,開啟定時器1,讓秒閃爍
  176.                          shuzhu2[5]=':';   //恒定顯示分號:
  177.                                if(fla==1)
  178.                                {
  179.                                   shuzhu2[6]=' '; //在時鐘數組秒的位置寫入空格,讓秒的位置閃爍
  180.                                   shuzhu2[7]=' ';//
  181.                                }
  182.                                   if(fla==0)
  183.                                   xssz();
  184.                                                             break;
  185.                 case 2 : TR0=0; TR1=1; //當功能鍵按的第二下,把定時器0關掉,開啟定時器1,讓分閃爍
  186.                          shuzhu2[5]=':';  
  187.                                if(fla==1)
  188.                                {
  189.                                   shuzhu2[3]=' '; //在時鐘數組分的位置寫入空格,讓分的位置閃爍
  190.                                   shuzhu2[4]=' ';
  191.                                }
  192.                                if(fla==0)
  193.                          xssz();
  194.                                                       break;                    
  195.                 case 3 : TR0=0; TR1=1; //當功能鍵按的第三下,把定時器0關掉,開啟定時器1,讓時閃爍
  196.                          shuzhu2[5]=':';
  197.                                if(fla==1)
  198.                                {
  199.                                   shuzhu2[0]=' '; //在時鐘數組時的位置寫入空格,讓時的位置閃爍
  200.                                   shuzhu2[1]=' ';
  201.                                }
  202.                                if(fla==0)
  203.                                   xssz();
  204.                                                             break;
  205.        }  //switch的括號
  206.     }//while的括號
  207. }//main函數的括號
  208. void ds0() interrupt 1//秒自增
  209. {
  210.    TH0=(65535-50000)/256;
  211.    TL0=(65535-50000)%256;
  212.     q++;
  213.     if(q==10)//閃爍標志位
  214.        fla=!fla;
  215.     if(q==20)
  216.     {
  217.        q=0;
  218.        m++;
  219. ……………………

  220. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
11.png

全部資料51hei下載地址:
http://www.zg4o1577.cn/bbs/dpj-120295-1.html


回復

使用道具 舉報

ID:339635 發表于 2018-5-28 11:45 | 顯示全部樓層
老哥,你是不是四川某高校的啊?
回復

使用道具 舉報

ID:339635 發表于 2018-5-28 12:04 | 顯示全部樓層
我正好也做這個作業,1號就要交了,奈何下載不了
回復

使用道具 舉報

ID:1020093 發表于 2023-2-11 13:43 | 顯示全部樓層
你好,想問一下,如果需要實現開始、暫停和清零功能需要怎么修改代碼
回復

使用道具 舉報

ID:405044 發表于 2023-2-11 18:32 | 顯示全部樓層
這個芯片是可以在proteus中仿真的
回復

使用道具 舉報

ID:579397 發表于 2023-2-12 01:57 | 顯示全部樓層
在系統功能介紹和原理介紹都是寫使用數碼管顯示,但在模塊設計就寫1602。這樣的設計報告是認真的嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 香蕉超碰 | 色天堂影院 | 日韩视频在线免费观看 | 亚洲精品白浆高清久久久久久 | 中文字幕久久精品 | 欧美一级小视频 | 国产精品99久久久久久动医院 | h片在线免费观看 | 欧美中文字幕 | av一级久久 | 中文字幕一区二区三区不卡在线 | 欧美在线视频一区二区 | 日本一区二区高清视频 | 青青久草 | 妞干网视频 | 激情五月婷婷综合 | 久久精品亚洲精品国产欧美 | 久久久久久亚洲精品不卡 | 久久久久久免费免费 | 免费av在线网站 | 免费久久精品视频 | 久久国产高清 | 香蕉视频久久久 | 亚洲综合第一页 | 日韩a| 一区二区视频在线 | 天天操天天操 | 免费精品| 欧美二级| 欧美xxxx做受欧美 | 一区二区免费 | 婷婷毛片| 欧美人妖网站 | 亚洲视频一区二区三区 | 一区二区免费高清视频 | 九九导航 | 美女福利视频网站 | 久久精品一区二区 | 国产精品视频免费 | 91亚洲视频在线 | 国产视频一区二区 |