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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12277|回復(fù): 4
收起左側(cè)

基于單片機的籃球計分器設(shè)計 課程設(shè)計(論文)任務(wù)書下載

  [復(fù)制鏈接]
ID:129350 發(fā)表于 2017-4-22 14:29 | 顯示全部樓層 |閱讀模式
課程設(shè)計文檔,含原理圖,程序。

課程設(shè)計(論文)任務(wù)書目錄
摘要
第1章 緒論
1.1籃球計分器簡介
1.2設(shè)計主要內(nèi)容
1.2.1設(shè)計方案
1.2.2設(shè)計的主要步驟
1.2.3主要功能
第2章 系統(tǒng)硬件設(shè)計
2.1硬件組成
2.2顯示模塊
2.3時鐘電路、復(fù)位電路模塊
2.4按鍵模塊
第3章 系統(tǒng)軟件設(shè)計
3.1 主程序框圖
3.2程序分析
3.2.1延時子程序
3.2.2比分顯示程序
3.2.3時間顯示程序
3.2.4鍵盤掃描程序
3.2.5定義的74ls595寫入程序
第4章 實驗與分析
4.1 籃球計分器的比分測試
4.1.1相關(guān)功能鍵的測試
4.1.2出現(xiàn)的問題與分析
4.2籃球計分器時間測試
4.2.1相關(guān)功能鍵的測試
4.2.2出現(xiàn)的問題與分析
參考文獻(xiàn)
心得體會
附錄 硬件電路圖
附錄 程序清單


摘要
隨著人們生活水平的提高和生活節(jié)奏的加快,對時間的要求越來越高,精準(zhǔn)數(shù)字計時的消費需求也是越來越多。
我國生產(chǎn)的電子萬年歷有很多種,總體上來說以研究多功能電子萬年歷為主,使萬年歷除了原有的顯示時間,日期等基本功能外,還具有鬧鈴,報警等功能。商家生產(chǎn)的電子萬年歷更從質(zhì)量,價格,實用上考慮,不斷的改進(jìn)電子萬年歷的設(shè)計,使其更加的具有市場。
本設(shè)計為軟件,硬件相結(jié)合的一組設(shè)計。在軟件設(shè)計過程中,應(yīng)對硬件部分有相關(guān)了解,這樣有助于對設(shè)計題目的更深了解,有助于軟件設(shè)計。基本的要了解一些主要器件的基本功能和作用。
此次課程設(shè)計使用專門的時鐘芯片DS1302在液晶顯示器LCD12864上顯示時鐘,并能通過按鍵對其進(jìn)行調(diào)試和校準(zhǔn)以及實現(xiàn)年月日。DS1302是一種高性能、低功耗、帶RAM的實時時鐘芯片,它能夠?qū)r分秒進(jìn)行精確計時。將RST、SCLK、I/O引腳分別與STC12C5A60S2單片機P2^0、P2^1、P2^2相連,使單片機對其進(jìn)行讀寫操作,把讀出的數(shù)據(jù)送到LCD12864上顯示,通過4個按鍵實現(xiàn)對時間的調(diào)整和鬧鈴的設(shè)定和調(diào)整,具有顯示直觀、電路簡潔、使用方便簡單等優(yōu)點。




              第1章 緒論1.萬年歷簡介
電子萬年歷是一種非常廣泛的日常計時工具,它可以對年、月、日、周、時、分、秒進(jìn)行精確計時在日常生活中極為實用,DS1302是常用的時鐘芯片,價格低廉,精度高且對與數(shù)字電子萬年歷采用直觀的數(shù)字顯示,還具有時間校準(zhǔn)等功能。
1.2設(shè)計主要內(nèi)容1.2.1設(shè)計方案
  • 顯示部分:通過12864液晶顯示模塊顯示年、月、日、時、分、秒,并可以切換顯示時間設(shè)置、鬧鐘設(shè)置和波形圖
  • 按鍵部分:本次設(shè)計將采用 1.003.jpg 矩陣鍵盤作為功能按鍵,需要的功能按鍵有:日期/時間切換鍵,控制鍵,加鍵,減鍵,鬧鐘關(guān)閉鍵,貪睡鍵,方波輸出鍵,正弦波輸出鍵。
    (3)時鐘模塊:采用時鐘芯片DS1302。美國DALLAS公司推出的具有涓細(xì)電流充電能的低功耗實時時鐘電路DS1302。它可以對年、月、日、周日、時、分、秒進(jìn)行計時,還具有閏年補償?shù)榷喾N功能,而且DS1302的使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、周日、時、分、秒,還具有時間校準(zhǔn)等功能。利用單片機對其進(jìn)行讀寫操作,然后將讀出的時間數(shù)據(jù)送到LCD12864上顯示。
  • 1.2.2設(shè)計的主要步驟
  • 查閱相關(guān)資料,了解老師所給的資料里面開發(fā)板的線路連接和各個模塊資料
  • protel實現(xiàn)硬件的仿真,畫出原理圖以及PCB圖;
  • 參照老師所給示例程序和網(wǎng)上資料用keil 軟件進(jìn)行單片機的編程設(shè)計,運行調(diào)試;
  • keil生成的hex文件燒錄進(jìn)入開發(fā)板,進(jìn)行測試。

1.2.3主要功能

(1)使用掃描式鍵盤,通過按鍵實現(xiàn)設(shè)定、修改日期和時間,省電(關(guān)閉顯示)等功能,鍵盤功能自行定義;

(2)實現(xiàn)倒計時功能,倒計時時間由鍵盤輸入設(shè)定,定時時間到LED閃爍;

(3)實現(xiàn)4路可調(diào)鬧鐘功能,當(dāng)4路鬧鈴中的任一路時間到時,通過不同的鈴聲顯示鬧鈴時間到,且鈴聲持續(xù)時間不超過1分鐘。1分鐘以內(nèi)若按下停止鍵,鈴聲停止;若按下貪睡鍵,鈴聲停止,3分鐘以后再次響鈴;1分鐘以內(nèi)若不按任何鍵,鈴聲自動停止,3分鐘后再次響鈴。

(4)通過2個按鍵,分別實現(xiàn)輸出10Hz的正弦波及方波。


                  

            第2章 系統(tǒng)硬件設(shè)計

2.1硬件組成

硬件以STC12C5A60S2單片機為核心,外部擴展LCD12864液晶顯示模塊、按鍵控制鍵盤模塊、DS1302時鐘芯片,蜂鳴器模塊實現(xiàn)動態(tài)顯示時間日期,鬧鈴設(shè)置,倒計時,波形圖顯示等功能。

基本硬件結(jié)構(gòu)圖如圖2.1所示。

1.004.jpg

圖2.1  萬年歷基本硬件結(jié)構(gòu)圖
2.2顯示模塊
1.005.jpg
                      圖2.2   數(shù)碼管
  顯示模塊用的是兩個4位7段數(shù)碼管,切換顯示比分和時間,例如比分顯示為111--111,時間顯示為01-12-00:1為第一節(jié),12-00為倒計時。
2.3時鐘電路、復(fù)位電路模塊

1.006.jpg 圖2.3  時鐘電路、復(fù)位電路

時鐘電路在單片機系統(tǒng)中有著非常重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。在一個單片機應(yīng)用系統(tǒng)中,時鐘是保證系統(tǒng)正常工作的基準(zhǔn)震蕩定時信號,主要由晶振和外圍電路組成,晶振頻率的大小決定了系統(tǒng)工作的快慢。圖中采用12MHZ的晶振,另外有兩個30P的電容,兩晶振引腳分別連到XTAL1和XTAL2振蕩脈沖輸入引腳。復(fù)位電路是單片機的初始化操作,圖中RST引腳是復(fù)位信號的輸入端。具體連接如圖2.3所示。

2.4按鍵模塊

S2控制甲隊加分,S5控制甲隊減分;S3控制乙隊加分,S6控制乙隊減分;S8控制比分互換;S13控制比分切換到時間,S11控制時間切換到比分;S9為比分清零;S12為增加節(jié)數(shù),S21為減少節(jié)數(shù)。具體連接分布如圖2.4所示。


1.007.jpg

圖2.4 矩陣鍵盤電路

             第3章 系統(tǒng)軟件設(shè)計3.1 主程序框圖

當(dāng)程序啟動時,先進(jìn)入各個模塊初始化,初始化完成后,進(jìn)入鬧鐘判斷,若是鬧鐘設(shè)置的時間到了,則進(jìn)入鬧鐘中斷子程序中,處理鬧鐘中斷;若是沒有,則是在數(shù)碼管上顯示初始化程序里的時間。接著是調(diào)用鍵盤掃描程序,判斷控制鍵是否按下,若按下,則i的值加1,同時進(jìn)入相應(yīng)的功能程序。其中主要的功能程序有:4個鬧鐘時間的設(shè)置,波形輸出,時間的設(shè)置,以及倒計時功能。當(dāng)它們執(zhí)行完相應(yīng)的子程序后,則返回時間顯示界面。

1.008.jpg

                                 圖3.1 主程序框圖
3.2控制鍵程序

     控制鍵按下時,程序的變量i會相應(yīng)地加1,而且同時進(jìn)入相應(yīng)的功能程序,例如i=1、2、3時,會進(jìn)入相應(yīng)地鬧鐘時間設(shè)置,分別設(shè)置鬧鐘1的時/分/秒。同理,i=4~12分別設(shè)置鬧鐘2、3、4的時間。然后i=13、14、15、16、17、18接下來是正常的時間設(shè)置,分別設(shè)置年/月/日/小時/分鐘/秒鐘。I=19時,進(jìn)入波形輸出,i=20時,進(jìn)入倒計時功能。最后程序返回時間顯示,同時i的值清零。

1.009.jpg

圖3.2.控制鍵程序流程圖

1.010.jpg



東北大學(xué)課程設(shè)計報告                            參考文獻(xiàn)
3.3日期/時間設(shè)置流程圖

控制鍵按下時,i=13、14、15,分別進(jìn)入年/月/日的設(shè)置,然后通過加/減鍵來使當(dāng)前鍵值加1或者減1;當(dāng)i=1、4、7、10、16時,進(jìn)入小時設(shè)置;當(dāng)i=2、5、8、11、17進(jìn)入分鐘設(shè)置;i=3、6、9、12、18,進(jìn)入秒鐘設(shè)置。

1.011.jpg
                   圖3.3時間/日期設(shè)置程序流程圖

3.4 DS1302程序
1.012.jpg

                   圖3.4DS1302時控流程圖

3.4.1 DS1302讀寫程序
void SendByte(uchar Command,SendDat)  
{                                                                                       //字節(jié)發(fā)送子程序。入口參數(shù):命令字,數(shù)據(jù)
              uchar i;
              RST=0;CLK=0;RST=1;                                                                        
              for(i=0;i<8;i++)                 //發(fā)送命令字
                            {
                            DP=Command&0x01;   //取一位送數(shù)據(jù)口
                            CLK=0;CLK=1;                 //產(chǎn)生一個上升沿
                            Command>>=1;
                            }
              for(i=0;i<8;i++)                 //發(fā)送數(shù)值
                            {
                            DP=SendDat&0x01;
                            CLK=0;CLK=1;
                            SendDat>>=1;
                            }
              RST=0;
}

uchar ReadByte(uchar Command)                //讀字節(jié)子程序。入口參數(shù):命令字
{                                                                                                                   //出口參數(shù):數(shù)值
              uchar i,RecDat=0;
              RST=0;CLK=0;RST=1;
                 for(i=0;i<8;i++)                                          //發(fā)送命令字
                            {
                            DP=Command&0x01;
                            CLK=0;CLK=1;
                            Command>>=1;
                            }
              for(i=0;i<8;i++)                                          //讀入數(shù)值
                            {
                            CLK=1;CLK=0;                                          //產(chǎn)生一個下降沿
                            if(DP) RecDat|=0x01<<i; 讀入數(shù)據(jù)[="" align]" }[="" rst="0;" return(recdat);="" 返回數(shù)值[="" null,="" left][size="12pt]當(dāng)鬧鐘設(shè)置的時間到了時,這時程序就會進(jìn)入鬧鐘中斷程序。例如鬧鐘1設(shè)置的時間到了,就會使蜂鳴器響起鬧鈴,鍵盤掃描停止鍵是否按下,若在一分鐘內(nèi)按下,則鬧鐘停止,同時鍵盤掃描判斷貪睡鍵是否按下,若按下,則三分鐘后再次響鈴,若一分鐘內(nèi)沒有鍵按下,自動停止,然后3分鐘后響鈴;
1.013.jpg

                        圖3.5鬧鐘中斷程序流程圖                                                                                                                       
              第4章 實驗與分析為了實現(xiàn)籃球計分器的功能,我們必須通過不斷地測試和分析,實現(xiàn)軟件與硬件融為一體。從內(nèi)容上,我們將它分為比分的測試和時間的測試。4.1 籃球計分器的比分測試4.1.1相關(guān)功能鍵的測試
  • 按下S2鍵控制A隊加1分(2)按下S5鍵控制A隊減1分(3)按下S3鍵控制B隊加1分(4)按下S6鍵控制B隊減1分(5)按下S8鍵控制比分互換(6)按下S9鍵為比分清零
    如圖4.1所示,當(dāng)前比分為24比17     圖4.1籃球計分器比分測試圖4.1.2出現(xiàn)的問題與分析
  • 按下S2鍵時給A隊加分時,發(fā)現(xiàn)兩邊都加了一分
分析:出現(xiàn)這種情況可能的原因:一、硬件方面,可能是矩陣鍵盤的S2和S3連線問題,使按下它們兩個鍵時,實現(xiàn)功能相同,二、軟件方面,可能是定義該功能時,重復(fù)使用了該鍵。沿著這兩個思路,我們首先將老師給的例程燒錄進(jìn)去,該例程實現(xiàn)的功能就是按下不同的鍵,數(shù)碼管將會顯示不同的數(shù)字,當(dāng)我們分別按下S2和S3時,出現(xiàn)的數(shù)字不同,那么證明硬件方面沒問題。然后查了一遍程序,果然是編寫程序時,重復(fù)使用了該鍵。
  • 按下S8比分交換鍵時,比分卻沒有交換
分析:可能原因一、S8鍵可能出現(xiàn)故障了,二,編寫程序時,比分交換的那段代碼邏輯結(jié)構(gòu)出錯。因為已經(jīng)檢測過矩陣鍵盤的所有按鍵,都是好的,那么只能時軟件方面出錯。最后發(fā)現(xiàn)果然是t=a1,a1=a2,a2==t這個邏輯關(guān)系順序?qū)戝e了。4.2籃球計分器時間測試4.2.1相關(guān)功能鍵的測試
  • 按下S13鍵控制比分切換到時間(2)按下S11鍵控制時間切換到比分(3)按下S12鍵為增加節(jié)數(shù)(4)按下S21鍵為減少節(jié)數(shù)。
     如圖4.2所示,當(dāng)前時間顯示為第一節(jié)還剩9分42秒。

圖4.2籃球計分器時間測試圖

4.2.2出現(xiàn)的問題與分析
  • 按下S13鍵比分切換到時間時,再次按時,卻無法將時間切換比分
分析:首先這種情況不可能是硬件問題,因為 S13鍵按下后能有反應(yīng),那么只能是程序問題。后面經(jīng)過多次分析程序,發(fā)現(xiàn)還是自己程序結(jié)構(gòu)問題,因為定義了兩種情況,f==0和f==1,從而實現(xiàn)比分和時間切換,用兩個鍵簡單快捷。當(dāng)按下某一鍵只能實現(xiàn)f==0或f==1,所以需要兩個鍵。
  • 一直不停按S2鍵節(jié)數(shù)減,當(dāng)它小于零時,沒有示數(shù)了
分析:因為按照算數(shù)邏輯,節(jié)數(shù)一直減總會減到小于零,而數(shù)碼管無法顯示小于零的數(shù),所以它只能是邏輯上存在而無法顯示,當(dāng)我們按下S12鍵使節(jié)數(shù)加時,一直加到大于零時,它又將重新顯示出來。
參考文獻(xiàn)
  • 張建勛編著.  C語言程序設(shè)計教程. 北京:清華大學(xué)出版社,2008.
  • 曾屹、劉輝編著. 單片機原理及應(yīng)用. 中南大學(xué)出版社,2009






心得體會

剛選這個題目,我以為很簡單到網(wǎng)上一搜就有,誰知道自己真正做起來才知道這個課題要實現(xiàn)的功能很多,在網(wǎng)上找了好多類似的但都用不了,不是編譯錯誤就是功能太復(fù)雜不會改。這個星期由于是考試周的原因,對于這個課題我一心就想早點把它搞好,以后的時間好復(fù)習(xí)。但是和伙伴早晚一直待在實驗室連續(xù)做了4天還是沒有很大的進(jìn)展,剛開始的時候用的是數(shù)碼管切換顯示時間和日期,但是考慮到還要加4個鬧鐘和倒計時、顯示波形等功能,我們改用了LCD12864來顯示這些東西,本來想把兩個結(jié)合起來,但一直搞不好,第三天的時候?qū)r間和日期顯示到了液晶屏上,接下來我們想辦法設(shè)計程序來調(diào)節(jié)從DS1302讀出來的時間,參考網(wǎng)上的程序嘗試了好幾次,卻一直沒有想要的結(jié)果,就這樣一直到了第四天驗收,雖然通過了,但離題目要求還差很遠(yuǎn),自己還有好多需要學(xué)習(xí)的東西,還有好多沒有理解的東西,真正在做的時候才發(fā)現(xiàn)自己差的并不只是一點。

    雖然這次課設(shè)過程很艱難,成果也很有限,但是還是學(xué)到了許多東西,以后在接觸到類似的東西就不會還是一頭霧水,遇到問題要一步一步來,不斷取得一些進(jìn)展,才能激發(fā)自己前進(jìn)的動力。


程序清單:
  1. #include
  2. #include
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. sbit DP=P1^6;
  6. sbit CLK=P1^5;
  7. sbit RST =P1^7;
  8. sbit    DAT_595_PIN = P1^0;   //串行數(shù)據(jù)輸入
  9. sbit    SCK_595_PIN = P1^2;   //移位時鐘脈沖
  10. sbit    RCK_595_PIN = P1^1;   //輸出鎖存器控制脈沖
  11. uint a1=0;
  12. uint a2=0;
  13. uint t=0;
  14. uint ft=0;
  15. uint jie=1;
  16. uchar Year,Month,Day,Week,Hour,Minute,Sec;
  17. uchar code num_buf[22]= {0xf5,0x05,0xb3,0x97,0x47,0xd6,0xf6,0x85,0xf7,0xd7,
  18.                                                                                     //0                 1              2              3                4    5              6     7                 8    9
  19.                                                                                     0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xef,0xef,0x02,0x00};
  20.                                                                                     //0.   1.              2.              3.                4.    5.              6.    7.  8.    9.
  21. Uchar code bit_buf[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//0xf7,0xef,0xdf,0xbf,0x7f};
  22. uchar data led_buf[8] = {0,0,0,20,20,0,0,0};
  23.      unsigned int num;
  24. // Function Declare              ********************************************************************
  25. void Delay(void);
  26. void Write_595(void);
  27. uchar Scan_Key(void);
  28. void delay(int ms)
  29. {
  30.     while(ms--)
  31.               {
  32.       uchar i;
  33.                 for(i=0;i<250;i++)
  34.                  {
  35.                   _nop_();                                            
  36.                             _nop_();
  37.                             _nop_();
  38.                             _nop_();
  39.                  }
  40.               }
  41. }            
  42. void mDelay(uchar DelayTime)              //延時子程序,入口參數(shù)每加1約加2us
  43. {               while(--DelayTime);            
  44. }
  45. void SendByte(uchar Command,SendDat)  
  46. {                                                                                         //字節(jié)發(fā)送子程序。入口參數(shù):命令字,數(shù)據(jù)
  47.               uchar i;
  48.               RST=0;CLK=0;RST=1;                                                                        
  49.               for(i=0;i<8;i++)                         //發(fā)送命令字
  50.                             {
  51.                             DP=Command&0x01;   //取一位送數(shù)據(jù)口
  52.                             CLK=0;CLK=1;                     //產(chǎn)生一個上升沿
  53.                             Command>>=1;
  54.                             }
  55.               for(i=0;i<8;i++)                        //發(fā)送數(shù)值
  56.                             {
  57.                             DP=SendDat&0x01;
  58.                             CLK=0;CLK=1;
  59.                             SendDat>>=1;
  60.                             }
  61.               RST=0;
  62. }

  63. uchar ReadByte(uchar Command)                //讀字節(jié)子程序。入口參數(shù):命令字
  64. {                                                                                                                    //出口參數(shù):數(shù)值
  65.               uchar i,RecDat=0;
  66.               RST=0;CLK=0;RST=1;
  67.                  for(i=0;i<8;i++)                                              //發(fā)送命令字
  68.                             {
  69.                             DP=Command&0x01;
  70.                             CLK=0;CLK=1;
  71.                             Command>>=1;
  72.                             }
  73.               for(i=0;i<8;i++)                                                 //讀入數(shù)值
  74.                             {
  75.                             CLK=1;CLK=0;                                             //產(chǎn)生一個下降沿
  76.                             if(DP) RecDat|=0x01<<i; 讀入數(shù)據(jù)
  77.                             }
  78.               RST=0;
  79.               return(RecDat);                                                            //返回數(shù)值
  80. }

  81. void OscCtrl(bit CtrlDat)              //振蕩起動和停止控制,入口參數(shù)1(起動)或0(停止)
  82. {
  83.               if (CtrlDat) SendByte(0x80,0x00);
  84.               else SendByte(0x80,0x80);
  85. }
  86. // Main Function
  87. void main(void)                                                     //主程序               
  88. {
  89.               uchar key_value,cnt;
  90.               uchar i;
  91.               OscCtrl(1);
  92.               SendByte(0x80,0x00);                                 //送字節(jié)
  93.               SendByte(0x82,0x20);
  94.               SendByte(0x84,0x13);
  95.               SendByte(0x86,2);
  96.               SendByte(0x88,1);
  97.               SendByte(0x8C,11);
  98. while(1){
  99.               while(ft==0)
  100.               {
  101.                             led_buf[0] = a1/100;           //左側(cè)比分的百位
  102.                             led_buf[1] = (a1%100)/10;                 //左側(cè)比分的十位
  103.                             led_buf[2] = a1%10;                                            //左側(cè)比分的個位
  104.                             led_buf[3] = 20;                            //短橫線
  105.                             led_buf[4] = 20;                                                           //短橫線
  106.                             led_buf[5] = a2/100;                                                        //右側(cè)比分百位
  107.                             led_buf[6] = (a2%100)/10;                 //右側(cè)比分十位
  108.                             led_buf[7] = a2%10;                                  //右側(cè)比分個位
  109.                             Write_595();
  110.                             key_value = Scan_Key();
  111.                             //keydown();
  112.                             //Delay();
  113.                             switch(key_value)                                            //鍵盤掃描函數(shù)
  114.                             {
  115.                                           case 0:
  116.                                                         break;
  117.                                           case 0x88:                                              //按第一列第一行鍵a1+1
  118.                                                                       a1++;
  119.                                                         break;
  120.                                           case 0x84:                                                          //按第一列第二行鍵a1-1
  121.                                                                       a1--;
  122.                                                         break;
  123.                                           case 0x82:                                                           //交換比分
  124.                                                                       t=a1;
  125.                                                                       a1=a2;
  126.                                                                       a2=t ;
  127.                                                         break;
  128.                                           case 0x81:                                                           // ft=1,切換比分/時間
  129.                                                         ft=1;                                                      
  130.                                                         break;
  131.                                           case 0x48:                                                                      //按第二列第一行鍵a2+1
  132.                                                                       a2++;                                                                     
  133.                                                         break;
  134.                                           case 0x44:                                                                      //按第二列第一行鍵a2-1
  135.                                                                       a2--;;
  136.                                                         break;
  137.                                           case 0x42:                                                                      //clear,比分置零
  138.                                                                       a1 = 0;
  139.                                                                       a2 = 0;
  140.                                                         break;
  141.                                           case 0x41:                                                 //ft=0,按第二列第四行鍵切換比分
  142.                                                                       ft=0;
  143.                                                         break;                           
  144.                                                         default:
  145.                                                         break;
  146.                             }
  147.               }            
  148.               while(ft==1)                            //當(dāng)ft=1時,即定義切換成時間顯示函數(shù)
  149.               {
  150.                                                         Year  =ReadByte(0x8D);  //讀小時
  151.                             Month =ReadByte(0x89);           //讀分鐘
  152.                             Day   =ReadByte(0x87);                    //讀秒
  153.                             Hour  =ReadByte(0x85);           //讀小時
  154.                             Minute=ReadByte(0x83);           //讀分鐘
  155.                             Sec   =ReadByte(0x81);                        //讀秒
  156.                             if((Minute/16*10+Minute%16)<=21)  {
  157.                             led_buf[0] = 0;                                                                                    //0
  158.                             led_buf[1] = jie;                                                                          //節(jié)
  159.                             led_buf[2] = 20;                                                                         //短橫線
  160.                             led_buf[3] = 1;
  161.                             led_buf[4] = 1-Minute%16;                               //11分
  162.                             led_buf[5] = 20;                                                                         //短橫線
  163.                             led_buf[6] = 5-Sec/16;
  164.                             led_buf[7] = 9-Sec%16;                                                        //59秒
  165.                             }
  166.                             else{
  167.                             led_buf[0] = 0;                                                                 //0
  168.                             led_buf[1] = jie;                                                               //jie
  169.                             led_buf[2] = 20;                                                                           //-
  170.                             led_buf[3] = 0;                                                                                      //0
  171.                             if(11-Minute%16<10){
  172.                             led_buf[4] = 11-Minute%16;
  173.                             }
  174.                             else{
  175.                             led_buf[4] = 1-Minute%16;                                          //1
  176.                             }
  177.                             led_buf[5] = 20;                                                                         //-
  178.                             led_buf[6] = 5-Sec/16;                                                        //5
  179.                             led_buf[7] = 9-Sec%16;                                                        //9
  180.                             }
  181.                             Write_595();
  182.                             key_value = Scan_Key();
  183.                             //keydown();
  184.                             //Delay();
  185.                             switch(key_value)                                            //鍵盤掃描函數(shù)
  186.                             {
  187.                                           case 0:
  188.                                                         break;
  189.                                           case 0x81:                                                          // 按第一列第四行鍵 ft=1; 比分和時間轉(zhuǎn)換
  190.                                                         ft=1;                                         
  191.                                                         break;                                                                                                                                          
  192.                                           case 0x41:                                                           // 按第二列第四行ft=0;時間/比分轉(zhuǎn)換
  193.                                                                       ft=0;
  194.                                                         break;
  195.                                           case 0x21:                                                                      //按第三列第四行鍵,jie+1
  196.                                                                       jie++;
  197.                                                         break;
  198.                                           case 0x11:
  199.                                                                       jie--;                                                        //按第四列第四行jie-1
  200.                                                         break;                                                                                                
  201.                                                         default:
  202.                                                         break;
  203.                             }
  204.               }


  205.               }            
  206. }
  207. // Some Functions
  208. void Delay(void)                                                        //延時子程序               
  209. {
  210.               unsigned char m,n;
  211.               for(m=200;m>0;m--)
  212.               for(n=200;n>0;n--);
  213. }

  214. //***************************************************************************************
  215. //* FunctionName  : Write_595()                                                                                                                                                                                                       **
  216. //* Descriptions  : write 595                                                                                                                                                                                                         **
  217. //* Input         : led_buf[]&bit_buf[]                                                                                                                                                                           **
  218. //* Output        : None                                                                                                                                                                                                                     **
  219. //***************************************************************************************
  220. void Write_595(void)                                          //定義595寫入函數(shù)
  221. {
  222.               uchar i,j;
  223.               uint  dat;            
  224.               for(i=0;i<8;i++)                                               //發(fā)送命令字
  225.               {
  226.                             RCK_595_PIN=0;
  227.                             dat =bit_buf[i];
  228.                             dat =dat<<8;
  229.                             dat |= num_buf[led_buf[i]];                           
  230.                             for(j=0;j<16;j++)
  231.                             {
  232.                                           SCK_595_PIN = 0;
  233.                                           if(dat & 0x8000)
  234. {
  235.                                                         DAT_595_PIN = 1;
  236.                                           }else{
  237.                                                         DAT_595_PIN = 0;
  238.                                           }
  239.                                           dat=dat<<1;
  240.                                           SCK_595_PIN = 1;                                                      
  241.                             }
  242.                             RCK_595_PIN = 1;
  243.               }            
  244. }
  245. //***************************************************************************************
  246. //* FunctionName  : Num_change()                                                                                                                                                                                         **
  247. //* Descriptions  : Num_change                                                                                                                                                                                           **
  248. //* Input         :                                                                                                                                                                                                                                                 **
  249. //* Output        : None                                                                                                                                                                                                                     **
  250. //***************************************************************************************
  251. uchar Scan_Key(void)        
  252. {
  253.   uchar sm;                  //存放行掃描代碼,該函數(shù)的返回值的低四位
  254.   uchar fh;                 //該函數(shù)的返回值的高四位
  255.   P2 = 0xf0;
  256.   if((P2&0xf0)!=0xf0)          //判斷是否有按鍵按下  
  257.   {
  258.                 Delay();                   //去抖動延時(1~10ms)
  259.     if((P2&0xf0)!=0xf0)
  260.     {


  261. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
完整論文下載(word格式可編輯):
籃球計分器.doc (920.5 KB, 下載次數(shù): 152)
回復(fù)

使用道具 舉報

ID:210017 發(fā)表于 2020-12-3 19:25 | 顯示全部樓層
感謝樓主分享學(xué)習(xí)資料
回復(fù)

使用道具 舉報

ID:876495 發(fā)表于 2021-1-11 21:44 | 顯示全部樓層
這是縫合怪
回復(fù)

使用道具 舉報

ID:876538 發(fā)表于 2021-1-11 22:02 | 顯示全部樓層
厲害,參考性很好
回復(fù)

使用道具 舉報

ID:1086350 發(fā)表于 2023-6-28 15:18 | 顯示全部樓層
萬分感謝樓主的學(xué)習(xí)資料
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美在线播放 | 国产免费播放视频 | 亚洲一级二级三级 | 日韩精品免费一区二区在线观看 | 国产视频中文字幕 | 丁香五月网久久综合 | 亚洲精品一 | caoporn国产精品免费公开 | 大陆一级毛片免费视频观看 | 天天成人综合网 | 成人欧美一区二区三区黑人孕妇 | 一本在线| 国产精品一码二码三码在线 | 97视频成人 | 国产清纯白嫩初高生视频在线观看 | 亚洲最大看片网站 | 五月婷亚洲| 日本视频在线 | 中国一级特黄视频 | 亚洲精品成人免费 | 欧美精品乱码久久久久久按摩 | 久久久精品久久 | 日韩精品免费播放 | 亚洲欧美一区二区三区1000 | 嫩草视频在线 | 久久久久无码国产精品一区 | 亚洲视频手机在线 | 久久tv在线观看 | 国内久久 | 高清国产午夜精品久久久久久 | 国产在线一区二区 | 免费国产一区二区视频 | 日本在线免费看最新的电影 | 一久久久 | 99视频在线 | 亚洲大片一区 | 夜夜精品浪潮av一区二区三区 | 91精品久久久久久久久久入口 | 日本一二区视频 | 国外激情av | 国产福利视频导航 |