課程設(shè)計(jì)文檔,含原理圖,程序。
課程設(shè)計(jì)(論文)任務(wù)書(shū)目錄
摘要
第1章 緒論
1.1籃球計(jì)分器簡(jiǎn)介
1.2設(shè)計(jì)主要內(nèi)容
1.2.1設(shè)計(jì)方案
1.2.2設(shè)計(jì)的主要步驟
1.2.3主要功能
第2章 系統(tǒng)硬件設(shè)計(jì)
2.1硬件組成
2.2顯示模塊
2.3時(shí)鐘電路、復(fù)位電路模塊
2.4按鍵模塊
第3章 系統(tǒng)軟件設(shè)計(jì)
3.1 主程序框圖
3.2程序分析
3.2.1延時(shí)子程序
3.2.2比分顯示程序
3.2.3時(shí)間顯示程序
3.2.4鍵盤(pán)掃描程序
3.2.5定義的74ls595寫(xiě)入程序
第4章 實(shí)驗(yàn)與分析
4.1 籃球計(jì)分器的比分測(cè)試
4.1.1相關(guān)功能鍵的測(cè)試
4.1.2出現(xiàn)的問(wèn)題與分析
4.2籃球計(jì)分器時(shí)間測(cè)試
4.2.1相關(guān)功能鍵的測(cè)試
4.2.2出現(xiàn)的問(wèn)題與分析
參考文獻(xiàn)
心得體會(huì)
附錄 硬件電路圖
附錄 程序清單
摘要隨著人們生活水平的提高和生活節(jié)奏的加快,對(duì)時(shí)間的要求越來(lái)越高,精準(zhǔn)數(shù)字計(jì)時(shí)的消費(fèi)需求也是越來(lái)越多。 我國(guó)生產(chǎn)的電子萬(wàn)年歷有很多種,總體上來(lái)說(shuō)以研究多功能電子萬(wàn)年歷為主,使萬(wàn)年歷除了原有的顯示時(shí)間,日期等基本功能外,還具有鬧鈴,報(bào)警等功能。商家生產(chǎn)的電子萬(wàn)年歷更從質(zhì)量,價(jià)格,實(shí)用上考慮,不斷的改進(jìn)電子萬(wàn)年歷的設(shè)計(jì),使其更加的具有市場(chǎng)。 本設(shè)計(jì)為軟件,硬件相結(jié)合的一組設(shè)計(jì)。在軟件設(shè)計(jì)過(guò)程中,應(yīng)對(duì)硬件部分有相關(guān)了解,這樣有助于對(duì)設(shè)計(jì)題目的更深了解,有助于軟件設(shè)計(jì)。基本的要了解一些主要器件的基本功能和作用。 此次課程設(shè)計(jì)使用專(zhuān)門(mén)的時(shí)鐘芯片DS1302在液晶顯示器LCD12864上顯示時(shí)鐘,并能通過(guò)按鍵對(duì)其進(jìn)行調(diào)試和校準(zhǔn)以及實(shí)現(xiàn)年月日。DS1302是一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘芯片,它能夠?qū)r(shí)分秒進(jìn)行精確計(jì)時(shí)。將RST、SCLK、I/O引腳分別與STC12C5A60S2單片機(jī)P2^0、P2^1、P2^2相連,使單片機(jī)對(duì)其進(jìn)行讀寫(xiě)操作,把讀出的數(shù)據(jù)送到LCD12864上顯示,通過(guò)4個(gè)按鍵實(shí)現(xiàn)對(duì)時(shí)間的調(diào)整和鬧鈴的設(shè)定和調(diào)整,具有顯示直觀、電路簡(jiǎn)潔、使用方便簡(jiǎn)單等優(yōu)點(diǎn)。
第1章 緒論1.萬(wàn)年歷簡(jiǎn)介電子萬(wàn)年歷是一種非常廣泛的日常計(jì)時(shí)工具,它可以對(duì)年、月、日、周、時(shí)、分、秒進(jìn)行精確計(jì)時(shí)在日常生活中極為實(shí)用,DS1302是常用的時(shí)鐘芯片,價(jià)格低廉,精度高且對(duì)與數(shù)字電子萬(wàn)年歷采用直觀的數(shù)字顯示,還具有時(shí)間校準(zhǔn)等功能。 1.2設(shè)計(jì)主要內(nèi)容1.2.1設(shè)計(jì)方案- 顯示部分:通過(guò)12864液晶顯示模塊顯示年、月、日、時(shí)、分、秒,并可以切換顯示時(shí)間設(shè)置、鬧鐘設(shè)置和波形圖。
- 按鍵部分:本次設(shè)計(jì)將采用
1.003.jpg (21.67 KB, 下載次數(shù): 104)
下載附件
2017-4-22 23:28 上傳
矩陣鍵盤(pán)作為功能按鍵,需要的功能按鍵有:日期/時(shí)間切換鍵,控制鍵,加鍵,減鍵,鬧鐘關(guān)閉鍵,貪睡鍵,方波輸出鍵,正弦波輸出鍵。
(3)時(shí)鐘模塊:采用時(shí)鐘芯片DS1302。美國(guó)DALLAS公司推出的具有涓細(xì)電流充電能的低功耗實(shí)時(shí)時(shí)鐘電路DS1302。它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),還具有閏年補(bǔ)償?shù)榷喾N功能,而且DS1302的使用壽命長(zhǎng),誤差小。對(duì)于數(shù)字電子萬(wàn)年歷采用直觀的數(shù)字顯示,可以同時(shí)顯示年、月、日、周日、時(shí)、分、秒,還具有時(shí)間校準(zhǔn)等功能。利用單片機(jī)對(duì)其進(jìn)行讀寫(xiě)操作,然后將讀出的時(shí)間數(shù)據(jù)送到LCD12864上顯示。 - 查閱相關(guān)資料,了解老師所給的資料里面開(kāi)發(fā)板的線路連接和各個(gè)模塊資料;
- 用protel實(shí)現(xiàn)硬件的仿真,畫(huà)出原理圖以及PCB圖;
- 參照老師所給示例程序和網(wǎng)上資料用keil 軟件進(jìn)行單片機(jī)的編程設(shè)計(jì),運(yùn)行調(diào)試;
- 將keil生成的hex文件燒錄進(jìn)入開(kāi)發(fā)板,進(jìn)行測(cè)試。
1.2.3主要功能(1)使用掃描式鍵盤(pán),通過(guò)按鍵實(shí)現(xiàn)設(shè)定、修改日期和時(shí)間,省電(關(guān)閉顯示)等功能,鍵盤(pán)功能自行定義; (2)實(shí)現(xiàn)倒計(jì)時(shí)功能,倒計(jì)時(shí)時(shí)間由鍵盤(pán)輸入設(shè)定,定時(shí)時(shí)間到LED閃爍; (3)實(shí)現(xiàn)4路可調(diào)鬧鐘功能,當(dāng)4路鬧鈴中的任一路時(shí)間到時(shí),通過(guò)不同的鈴聲顯示鬧鈴時(shí)間到,且鈴聲持續(xù)時(shí)間不超過(guò)1分鐘。1分鐘以內(nèi)若按下停止鍵,鈴聲停止;若按下貪睡鍵,鈴聲停止,3分鐘以后再次響鈴;1分鐘以內(nèi)若不按任何鍵,鈴聲自動(dòng)停止,3分鐘后再次響鈴。 (4)通過(guò)2個(gè)按鍵,分別實(shí)現(xiàn)輸出10Hz的正弦波及方波。
第2章 系統(tǒng)硬件設(shè)計(jì) 2.1硬件組成硬件以STC12C5A60S2單片機(jī)為核心,外部擴(kuò)展LCD12864液晶顯示模塊、按鍵控制鍵盤(pán)模塊、DS1302時(shí)鐘芯片,蜂鳴器模塊實(shí)現(xiàn)動(dòng)態(tài)顯示時(shí)間日期,鬧鈴設(shè)置,倒計(jì)時(shí),波形圖顯示等功能。 基本硬件結(jié)構(gòu)圖如圖2.1所示。
1.004.jpg (16.42 KB, 下載次數(shù): 122)
下載附件
2017-4-22 23:28 上傳
圖2.1 萬(wàn)年歷基本硬件結(jié)構(gòu)圖 2.2顯示模塊
1.005.jpg (43.36 KB, 下載次數(shù): 111)
下載附件
2017-4-22 23:28 上傳
圖2.2 數(shù)碼管 顯示模塊用的是兩個(gè)4位7段數(shù)碼管,切換顯示比分和時(shí)間,例如比分顯示為111--111,時(shí)間顯示為01-12-00:1為第一節(jié),12-00為倒計(jì)時(shí)。 2.3時(shí)鐘電路、復(fù)位電路模塊
1.006.jpg (33.24 KB, 下載次數(shù): 115)
下載附件
2017-4-22 23:28 上傳
圖2.3 時(shí)鐘電路、復(fù)位電路 時(shí)鐘電路在單片機(jī)系統(tǒng)中有著非常重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。在一個(gè)單片機(jī)應(yīng)用系統(tǒng)中,時(shí)鐘是保證系統(tǒng)正常工作的基準(zhǔn)震蕩定時(shí)信號(hào),主要由晶振和外圍電路組成,晶振頻率的大小決定了系統(tǒng)工作的快慢。圖中采用12MHZ的晶振,另外有兩個(gè)30P的電容,兩晶振引腳分別連到XTAL1和XTAL2振蕩脈沖輸入引腳。復(fù)位電路是單片機(jī)的初始化操作,圖中RST引腳是復(fù)位信號(hào)的輸入端。具體連接如圖2.3所示。 2.4按鍵模塊S2控制甲隊(duì)加分,S5控制甲隊(duì)減分;S3控制乙隊(duì)加分,S6控制乙隊(duì)減分;S8控制比分互換;S13控制比分切換到時(shí)間,S11控制時(shí)間切換到比分;S9為比分清零;S12為增加節(jié)數(shù),S21為減少節(jié)數(shù)。具體連接分布如圖2.4所示。
1.007.jpg (51.1 KB, 下載次數(shù): 127)
下載附件
2017-4-22 23:28 上傳
圖2.4 矩陣鍵盤(pán)電路 第3章 系統(tǒng)軟件設(shè)計(jì)3.1 主程序框圖當(dāng)程序啟動(dòng)時(shí),先進(jìn)入各個(gè)模塊初始化,初始化完成后,進(jìn)入鬧鐘判斷,若是鬧鐘設(shè)置的時(shí)間到了,則進(jìn)入鬧鐘中斷子程序中,處理鬧鐘中斷;若是沒(méi)有,則是在數(shù)碼管上顯示初始化程序里的時(shí)間。接著是調(diào)用鍵盤(pán)掃描程序,判斷控制鍵是否按下,若按下,則i的值加1,同時(shí)進(jìn)入相應(yīng)的功能程序。其中主要的功能程序有:4個(gè)鬧鐘時(shí)間的設(shè)置,波形輸出,時(shí)間的設(shè)置,以及倒計(jì)時(shí)功能。當(dāng)它們執(zhí)行完相應(yīng)的子程序后,則返回時(shí)間顯示界面。
1.008.jpg (26.35 KB, 下載次數(shù): 97)
下載附件
2017-4-22 23:28 上傳
圖3.1 主程序框圖 3.2控制鍵程序 控制鍵按下時(shí),程序的變量i會(huì)相應(yīng)地加1,而且同時(shí)進(jìn)入相應(yīng)的功能程序,例如i=1、2、3時(shí),會(huì)進(jìn)入相應(yīng)地鬧鐘時(shí)間設(shè)置,分別設(shè)置鬧鐘1的時(shí)/分/秒。同理,i=4~12分別設(shè)置鬧鐘2、3、4的時(shí)間。然后i=13、14、15、16、17、18接下來(lái)是正常的時(shí)間設(shè)置,分別設(shè)置年/月/日/小時(shí)/分鐘/秒鐘。I=19時(shí),進(jìn)入波形輸出,i=20時(shí),進(jìn)入倒計(jì)時(shí)功能。最后程序返回時(shí)間顯示,同時(shí)i的值清零。
1.009.jpg (33.5 KB, 下載次數(shù): 109)
下載附件
2017-4-22 23:28 上傳
圖3.2.控制鍵程序流程圖
1.010.jpg (1.86 KB, 下載次數(shù): 94)
下載附件
2017-4-22 23:28 上傳
東北大學(xué)課程設(shè)計(jì)報(bào)告 參考文獻(xiàn) 3.3日期/時(shí)間設(shè)置流程圖控制鍵按下時(shí),i=13、14、15,分別進(jìn)入年/月/日的設(shè)置,然后通過(guò)加/減鍵來(lái)使當(dāng)前鍵值加1或者減1;當(dāng)i=1、4、7、10、16時(shí),進(jìn)入小時(shí)設(shè)置;當(dāng)i=2、5、8、11、17進(jìn)入分鐘設(shè)置;i=3、6、9、12、18,進(jìn)入秒鐘設(shè)置。
1.011.jpg (58.17 KB, 下載次數(shù): 117)
下載附件
2017-4-22 23:28 上傳
圖3.3時(shí)間/日期設(shè)置程序流程圖
3.4 DS1302程序
1.012.jpg (32.69 KB, 下載次數(shù): 106)
下載附件
2017-4-22 23:28 上傳
圖3.4DS1302時(shí)控流程圖 3.4.1 DS1302讀寫(xiě)程序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)生一個(gè)上升沿 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)生一個(gè)下降沿 if(DP) RecDat|=0x01<<i; 讀入數(shù)據(jù)[="" align]" }[="" rst="0;" return(recdat);="" 返回?cái)?shù)值[="" null,="" left][size="12pt]當(dāng)鬧鐘設(shè)置的時(shí)間到了時(shí),這時(shí)程序就會(huì)進(jìn)入鬧鐘中斷程序。例如鬧鐘1設(shè)置的時(shí)間到了,就會(huì)使蜂鳴器響起鬧鈴,鍵盤(pán)掃描停止鍵是否按下,若在一分鐘內(nèi)按下,則鬧鐘停止,同時(shí)鍵盤(pán)掃描判斷貪睡鍵是否按下,若按下,則三分鐘后再次響鈴,若一分鐘內(nèi)沒(méi)有鍵按下,自動(dòng)停止,然后3分鐘后響鈴;
1.013.jpg (19.88 KB, 下載次數(shù): 105)
下載附件
2017-4-22 23:28 上傳
圖3.5鬧鐘中斷程序流程圖
第4章 實(shí)驗(yàn)與分析為了實(shí)現(xiàn)籃球計(jì)分器的功能,我們必須通過(guò)不斷地測(cè)試和分析,實(shí)現(xiàn)軟件與硬件融為一體。從內(nèi)容上,我們將它分為比分的測(cè)試和時(shí)間的測(cè)試。 4.1 籃球計(jì)分器的比分測(cè)試4.1.1相關(guān)功能鍵的測(cè)試- 按下S2鍵控制A隊(duì)加1分(2)按下S5鍵控制A隊(duì)減1分(3)按下S3鍵控制B隊(duì)加1分(4)按下S6鍵控制B隊(duì)減1分(5)按下S8鍵控制比分互換(6)按下S9鍵為比分清零
如圖4.1所示,當(dāng)前比分為24比17 圖4.1籃球計(jì)分器比分測(cè)試圖 4.1.2出現(xiàn)的問(wèn)題與分析- 按下S2鍵時(shí)給A隊(duì)加分時(shí),發(fā)現(xiàn)兩邊都加了一分
分析:出現(xiàn)這種情況可能的原因:一、硬件方面,可能是矩陣鍵盤(pán)的S2和S3連線問(wèn)題,使按下它們兩個(gè)鍵時(shí),實(shí)現(xiàn)功能相同,二、軟件方面,可能是定義該功能時(shí),重復(fù)使用了該鍵。沿著這兩個(gè)思路,我們首先將老師給的例程燒錄進(jìn)去,該例程實(shí)現(xiàn)的功能就是按下不同的鍵,數(shù)碼管將會(huì)顯示不同的數(shù)字,當(dāng)我們分別按下S2和S3時(shí),出現(xiàn)的數(shù)字不同,那么證明硬件方面沒(méi)問(wèn)題。然后查了一遍程序,果然是編寫(xiě)程序時(shí),重復(fù)使用了該鍵。 - 按下S8比分交換鍵時(shí),比分卻沒(méi)有交換
分析:可能原因一、S8鍵可能出現(xiàn)故障了,二,編寫(xiě)程序時(shí),比分交換的那段代碼邏輯結(jié)構(gòu)出錯(cuò)。因?yàn)橐呀?jīng)檢測(cè)過(guò)矩陣鍵盤(pán)的所有按鍵,都是好的,那么只能時(shí)軟件方面出錯(cuò)。最后發(fā)現(xiàn)果然是t=a1,a1=a2,a2==t這個(gè)邏輯關(guān)系順序?qū)戝e(cuò)了。 4.2籃球計(jì)分器時(shí)間測(cè)試4.2.1相關(guān)功能鍵的測(cè)試- 按下S13鍵控制比分切換到時(shí)間(2)按下S11鍵控制時(shí)間切換到比分(3)按下S12鍵為增加節(jié)數(shù)(4)按下S21鍵為減少節(jié)數(shù)。
如圖4.2所示,當(dāng)前時(shí)間顯示為第一節(jié)還剩9分42秒。 圖4.2籃球計(jì)分器時(shí)間測(cè)試圖 4.2.2出現(xiàn)的問(wèn)題與分析- 按下S13鍵比分切換到時(shí)間時(shí),再次按時(shí),卻無(wú)法將時(shí)間切換比分
分析:首先這種情況不可能是硬件問(wèn)題,因?yàn)?S13鍵按下后能有反應(yīng),那么只能是程序問(wèn)題。后面經(jīng)過(guò)多次分析程序,發(fā)現(xiàn)還是自己程序結(jié)構(gòu)問(wèn)題,因?yàn)槎x了兩種情況,f==0和f==1,從而實(shí)現(xiàn)比分和時(shí)間切換,用兩個(gè)鍵簡(jiǎn)單快捷。當(dāng)按下某一鍵只能實(shí)現(xiàn)f==0或f==1,所以需要兩個(gè)鍵。 - 一直不停按S2鍵節(jié)數(shù)減,當(dāng)它小于零時(shí),沒(méi)有示數(shù)了
分析:因?yàn)榘凑账銛?shù)邏輯,節(jié)數(shù)一直減總會(huì)減到小于零,而數(shù)碼管無(wú)法顯示小于零的數(shù),所以它只能是邏輯上存在而無(wú)法顯示,當(dāng)我們按下S12鍵使節(jié)數(shù)加時(shí),一直加到大于零時(shí),它又將重新顯示出來(lái)。
參考文獻(xiàn)- 張建勛編著. C語(yǔ)言程序設(shè)計(jì)教程. 北京:清華大學(xué)出版社,2008.
- 曾屹、劉輝編著. 單片機(jī)原理及應(yīng)用. 中南大學(xué)出版社,2009
心得體會(huì)剛選這個(gè)題目,我以為很簡(jiǎn)單到網(wǎng)上一搜就有,誰(shuí)知道自己真正做起來(lái)才知道這個(gè)課題要實(shí)現(xiàn)的功能很多,在網(wǎng)上找了好多類(lèi)似的但都用不了,不是編譯錯(cuò)誤就是功能太復(fù)雜不會(huì)改。這個(gè)星期由于是考試周的原因,對(duì)于這個(gè)課題我一心就想早點(diǎn)把它搞好,以后的時(shí)間好復(fù)習(xí)。但是和伙伴早晚一直待在實(shí)驗(yàn)室連續(xù)做了4天還是沒(méi)有很大的進(jìn)展,剛開(kāi)始的時(shí)候用的是數(shù)碼管切換顯示時(shí)間和日期,但是考慮到還要加4個(gè)鬧鐘和倒計(jì)時(shí)、顯示波形等功能,我們改用了LCD12864來(lái)顯示這些東西,本來(lái)想把兩個(gè)結(jié)合起來(lái),但一直搞不好,第三天的時(shí)候?qū)r(shí)間和日期顯示到了液晶屏上,接下來(lái)我們想辦法設(shè)計(jì)程序來(lái)調(diào)節(jié)從DS1302讀出來(lái)的時(shí)間,參考網(wǎng)上的程序嘗試了好幾次,卻一直沒(méi)有想要的結(jié)果,就這樣一直到了第四天驗(yàn)收,雖然通過(guò)了,但離題目要求還差很遠(yuǎn),自己還有好多需要學(xué)習(xí)的東西,還有好多沒(méi)有理解的東西,真正在做的時(shí)候才發(fā)現(xiàn)自己差的并不只是一點(diǎn)。 雖然這次課設(shè)過(guò)程很艱難,成果也很有限,但是還是學(xué)到了許多東西,以后在接觸到類(lèi)似的東西就不會(huì)還是一頭霧水,遇到問(wèn)題要一步一步來(lái),不斷取得一些進(jìn)展,才能激發(fā)自己前進(jìn)的動(dòng)力。
程序清單:
- #include
- #include
- #define uchar unsigned char
- #define uint unsigned int
- sbit DP=P1^6;
- sbit CLK=P1^5;
- sbit RST =P1^7;
- sbit DAT_595_PIN = P1^0; //串行數(shù)據(jù)輸入
- sbit SCK_595_PIN = P1^2; //移位時(shí)鐘脈沖
- sbit RCK_595_PIN = P1^1; //輸出鎖存器控制脈沖
- uint a1=0;
- uint a2=0;
- uint t=0;
- uint ft=0;
- uint jie=1;
- uchar Year,Month,Day,Week,Hour,Minute,Sec;
- uchar code num_buf[22]= {0xf5,0x05,0xb3,0x97,0x47,0xd6,0xf6,0x85,0xf7,0xd7,
- //0 1 2 3 4 5 6 7 8 9
- 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xef,0xef,0x02,0x00};
- //0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
- Uchar code bit_buf[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//0xf7,0xef,0xdf,0xbf,0x7f};
- uchar data led_buf[8] = {0,0,0,20,20,0,0,0};
- unsigned int num;
- // Function Declare ********************************************************************
- void Delay(void);
- void Write_595(void);
- uchar Scan_Key(void);
- void delay(int ms)
- {
- while(ms--)
- {
- uchar i;
- for(i=0;i<250;i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- void mDelay(uchar DelayTime) //延時(shí)子程序,入口參數(shù)每加1約加2us
- { while(--DelayTime);
- }
- 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)生一個(gè)上升沿
- 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)生一個(gè)下降沿
- if(DP) RecDat|=0x01<<i; 讀入數(shù)據(jù)
- }
- RST=0;
- return(RecDat); //返回?cái)?shù)值
- }
-
- void OscCtrl(bit CtrlDat) //振蕩起動(dòng)和停止控制,入口參數(shù)1(起動(dòng))或0(停止)
- {
- if (CtrlDat) SendByte(0x80,0x00);
- else SendByte(0x80,0x80);
- }
- // Main Function
- void main(void) //主程序
- {
- uchar key_value,cnt;
- uchar i;
- OscCtrl(1);
- SendByte(0x80,0x00); //送字節(jié)
- SendByte(0x82,0x20);
- SendByte(0x84,0x13);
- SendByte(0x86,2);
- SendByte(0x88,1);
- SendByte(0x8C,11);
- while(1){
- while(ft==0)
- {
- led_buf[0] = a1/100; //左側(cè)比分的百位
- led_buf[1] = (a1%100)/10; //左側(cè)比分的十位
- led_buf[2] = a1%10; //左側(cè)比分的個(gè)位
- led_buf[3] = 20; //短橫線
- led_buf[4] = 20; //短橫線
- led_buf[5] = a2/100; //右側(cè)比分百位
- led_buf[6] = (a2%100)/10; //右側(cè)比分十位
- led_buf[7] = a2%10; //右側(cè)比分個(gè)位
- Write_595();
- key_value = Scan_Key();
- //keydown();
- //Delay();
- switch(key_value) //鍵盤(pán)掃描函數(shù)
- {
- case 0:
- break;
- case 0x88: //按第一列第一行鍵a1+1
- a1++;
- break;
- case 0x84: //按第一列第二行鍵a1-1
- a1--;
- break;
- case 0x82: //交換比分
- t=a1;
- a1=a2;
- a2=t ;
- break;
- case 0x81: // ft=1,切換比分/時(shí)間
- ft=1;
- break;
- case 0x48: //按第二列第一行鍵a2+1
- a2++;
- break;
- case 0x44: //按第二列第一行鍵a2-1
- a2--;;
- break;
- case 0x42: //clear,比分置零
- a1 = 0;
- a2 = 0;
- break;
- case 0x41: //ft=0,按第二列第四行鍵切換比分
- ft=0;
- break;
- default:
- break;
- }
- }
- while(ft==1) //當(dāng)ft=1時(shí),即定義切換成時(shí)間顯示函數(shù)
- {
- Year =ReadByte(0x8D); //讀小時(shí)
- Month =ReadByte(0x89); //讀分鐘
- Day =ReadByte(0x87); //讀秒
- Hour =ReadByte(0x85); //讀小時(shí)
- Minute=ReadByte(0x83); //讀分鐘
- Sec =ReadByte(0x81); //讀秒
- if((Minute/16*10+Minute%16)<=21) {
- led_buf[0] = 0; //0
- led_buf[1] = jie; //節(jié)
- led_buf[2] = 20; //短橫線
- led_buf[3] = 1;
- led_buf[4] = 1-Minute%16; //11分
- led_buf[5] = 20; //短橫線
- led_buf[6] = 5-Sec/16;
- led_buf[7] = 9-Sec%16; //59秒
- }
- else{
- led_buf[0] = 0; //0
- led_buf[1] = jie; //jie
- led_buf[2] = 20; //-
- led_buf[3] = 0; //0
- if(11-Minute%16<10){
- led_buf[4] = 11-Minute%16;
- }
- else{
- led_buf[4] = 1-Minute%16; //1
- }
- led_buf[5] = 20; //-
- led_buf[6] = 5-Sec/16; //5
- led_buf[7] = 9-Sec%16; //9
- }
- Write_595();
- key_value = Scan_Key();
- //keydown();
- //Delay();
- switch(key_value) //鍵盤(pán)掃描函數(shù)
- {
- case 0:
- break;
- case 0x81: // 按第一列第四行鍵 ft=1; 比分和時(shí)間轉(zhuǎn)換
- ft=1;
- break;
- case 0x41: // 按第二列第四行ft=0;時(shí)間/比分轉(zhuǎn)換
- ft=0;
- break;
- case 0x21: //按第三列第四行鍵,jie+1
- jie++;
- break;
- case 0x11:
- jie--; //按第四列第四行jie-1
- break;
- default:
- break;
- }
- }
-
-
- }
- }
- // Some Functions
- void Delay(void) //延時(shí)子程序
- {
- unsigned char m,n;
- for(m=200;m>0;m--)
- for(n=200;n>0;n--);
- }
-
- //***************************************************************************************
- //* FunctionName : Write_595() **
- //* Descriptions : write 595 **
- //* Input : led_buf[]&bit_buf[] **
- //* Output : None **
- //***************************************************************************************
- void Write_595(void) //定義595寫(xiě)入函數(shù)
- {
- uchar i,j;
- uint dat;
- for(i=0;i<8;i++) //發(fā)送命令字
- {
- RCK_595_PIN=0;
- dat =bit_buf[i];
- dat =dat<<8;
- dat |= num_buf[led_buf[i]];
- for(j=0;j<16;j++)
- {
- SCK_595_PIN = 0;
- if(dat & 0x8000)
- {
- DAT_595_PIN = 1;
- }else{
- DAT_595_PIN = 0;
- }
- dat=dat<<1;
- SCK_595_PIN = 1;
- }
- RCK_595_PIN = 1;
- }
- }
- //***************************************************************************************
- //* FunctionName : Num_change() **
- //* Descriptions : Num_change **
- //* Input : **
- //* Output : None **
- //***************************************************************************************
- uchar Scan_Key(void)
- {
- uchar sm; //存放行掃描代碼,該函數(shù)的返回值的低四位
- uchar fh; //該函數(shù)的返回值的高四位
- P2 = 0xf0;
- if((P2&0xf0)!=0xf0) //判斷是否有按鍵按下
- {
- Delay(); //去抖動(dòng)延時(shí)(1~10ms)
- if((P2&0xf0)!=0xf0)
- {
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼完整論文下載(word格式可編輯):
籃球計(jì)分器.doc
(920.5 KB, 下載次數(shù): 152)
2017-4-22 14:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|