單片機(jī)課程設(shè)計(jì) (1)_第1頁(yè)
單片機(jī)課程設(shè)計(jì) (1)_第2頁(yè)
單片機(jī)課程設(shè)計(jì) (1)_第3頁(yè)
單片機(jī)課程設(shè)計(jì) (1)_第4頁(yè)
單片機(jī)課程設(shè)計(jì) (1)_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、單片機(jī)課程設(shè)計(jì)一、本設(shè)計(jì)任務(wù)及完成的功能1、本設(shè)計(jì)任務(wù):實(shí)現(xiàn)最長(zhǎng)99S的倒計(jì)時(shí)功能;利用數(shù)碼管或液晶屏顯示數(shù)字;利用按鍵可以設(shè)置倒計(jì)時(shí)時(shí)間;設(shè)置倒計(jì)時(shí)開始啟動(dòng)鍵;時(shí)間到,聲(光)報(bào)警,示意倒計(jì)時(shí)時(shí)間到。2、完成的功能:實(shí)現(xiàn)了099S之間任意整數(shù)秒的倒計(jì)時(shí),通過(guò)矩陣按鍵中09數(shù)字鍵設(shè)置倒計(jì)時(shí)間,按下*或#鍵開始倒計(jì)時(shí),當(dāng)?shù)褂?jì)時(shí)間結(jié)束時(shí),LED燈亮,停止倒計(jì)時(shí)。二、倒計(jì)時(shí)器硬件設(shè)計(jì)1、元器件AT89C51單片機(jī)1個(gè)、兩位動(dòng)態(tài)共陰數(shù)碼管1個(gè)、9個(gè)引腳的排阻、1k電阻3個(gè)、12MHz晶振1個(gè)、33pF電容2個(gè)、10uF極性電容1個(gè)、獨(dú)立按鍵1個(gè)、4行3列矩陣按鍵1個(gè)、LED指示燈1個(gè)、電源和地若干2、

2、系統(tǒng)的硬件構(gòu)成及功能最長(zhǎng)99秒計(jì)時(shí)器的原理框圖如圖1所示。圖1 99秒計(jì)時(shí)器系統(tǒng)原理框圖系統(tǒng)硬件連線: (1)P1口接矩陣按鍵 (2)P2口接動(dòng)態(tài)數(shù)碼管的8個(gè)段選 (3)P06、P07分別接動(dòng)態(tài)數(shù)碼管的十位和個(gè)位 (4)P37接LED指示燈 (5)XTAL1和XTAL2接晶振 (6)RST接復(fù)位電路 三、系統(tǒng)的軟件設(shè)計(jì)本系統(tǒng)的軟件系統(tǒng)主要可分為主程序設(shè)計(jì)和定時(shí)中斷程序。系統(tǒng)主程序設(shè)計(jì)主程序包括主函數(shù)、矩陣按鍵掃描函數(shù)、對(duì)矩陣按鍵掃描進(jìn)行相應(yīng)處理函數(shù)、動(dòng)態(tài)數(shù)碼管顯示函數(shù)等。1、矩陣按鍵掃描函數(shù)ankey()矩陣按鍵的原理和方法:矩陣按鍵的兩端都與單片機(jī)的I/O口相連,在檢測(cè)時(shí),人為的通過(guò)單片機(jī)I

3、/O口送出低電平。檢測(cè)時(shí),先送一列為低電平,其余幾列全為高電平(這時(shí)就確定了列數(shù)),然后立即輪流檢測(cè)一次個(gè)行是否有低電平,若檢測(cè)到某一行為低電平(這時(shí)就確定了行數(shù)),則可以確定單前被按下的鍵是哪行哪列。同樣,用這種方法輪流檢測(cè)各行各列,這樣就可以檢測(cè)所有按鍵,當(dāng)有鍵按下時(shí),就可判斷是哪個(gè)鍵被按下。當(dāng)然,也可以將行線置為低電平,掃描列是否有低電平。本設(shè)計(jì)用的是4行3列矩陣按鍵,它接AT89C51單片機(jī)的P1口,接法如圖所示:當(dāng)按下09數(shù)字鍵時(shí),會(huì)產(chǎn)生相應(yīng)數(shù)值賦給矩陣按鍵掃描函數(shù)中以定義的參數(shù)key,當(dāng)按下#或*鍵時(shí),會(huì)分別產(chǎn)生11或10賦給key。這時(shí)調(diào)用對(duì)矩陣按鍵掃描進(jìn)行相應(yīng)處理函數(shù)text(

4、uchar )且key賦給它,text(uchar )函數(shù)對(duì)key值進(jìn)行相應(yīng)處理:如果只按下一次數(shù)字鍵,那這數(shù)字就會(huì)是倒計(jì)時(shí)的個(gè)位,如果按下兩次數(shù)字鍵,那第一次的數(shù)字就會(huì)是倒計(jì)時(shí)的十位,第二次數(shù)字的數(shù)字就會(huì)是倒計(jì)時(shí)的個(gè)位,當(dāng)按下#或*鍵時(shí),開始倒計(jì)時(shí)。2、動(dòng)態(tài)數(shù)碼管顯示函數(shù)動(dòng)態(tài)數(shù)碼管顯示就是輪流向各位數(shù)碼管送出段選及相應(yīng)的位選,利用發(fā)光管的余輝和人眼視覺(jué)暫留作用,使人眼感覺(jué)各位數(shù)碼管同時(shí)都在顯示,實(shí)際上多位數(shù)碼管是一位一位輪流顯示的,只是輪流比較快,我們分辨不出來(lái)。本設(shè)計(jì)用的是兩位動(dòng)態(tài)共陰數(shù)碼管顯示,它和單片機(jī)的連接如圖所示:其中那排阻是驅(qū)動(dòng)電路。3、復(fù)位電路如圖:RST為復(fù)位信號(hào)輸入端,高電

5、平有效。系統(tǒng)上電后,當(dāng)已經(jīng)進(jìn)行過(guò)倒計(jì)時(shí),這時(shí)想進(jìn)行不同時(shí)間的倒計(jì)時(shí),只要按下復(fù)位按鈕后,就可以進(jìn)行新的倒計(jì)時(shí)。中斷函數(shù)設(shè)計(jì)先初始化中斷函數(shù):TMOD=0x01;設(shè)置定時(shí)器0為工作方式1(0000 0001)TH0=(65536-50000)/256;/裝初值50ms一次中斷TL0=(65536-50000)%256;EA=1; /開總中斷ET0=1; /開定時(shí)器0中斷TR0=0; /先別啟動(dòng)中斷,留著用按鍵啟動(dòng),以便開始倒計(jì)時(shí)中斷函數(shù)如下:void T0_time() interrupt 1/定時(shí)器0中斷函數(shù)TH0=(65536-50000)/256;/重裝初值TL0=(65536-50000

6、)%256;numt0+;/50ms中斷一次四、總體程序如下:#include <reg51.h> #define uchar unsigned char#define uint unsigned int sbit sw=P06;/十位位選sbit gw=P07;/個(gè)位位選sbit led=P37;/LED燈uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/編碼定義uchar numt0,num;void delayms(uint);void text(uchar);void display(uc

7、har numdis) /動(dòng)態(tài)數(shù)碼管顯示子函數(shù)uchar shi,ge; /分離兩個(gè)分別要顯示的數(shù)shi=numdis/10;ge=numdis%10;sw=0;P2=tableshi; /送十位段選數(shù)據(jù)delayms(5);/延時(shí)sw=1;gw=0;P2=tablege; /送個(gè)位段選數(shù)據(jù)delayms(5);gw=1;void delayms(uint x)/延時(shí)x msuint i,j;for(i=x;i>0;i-) /i=x即延時(shí)約x毫秒for(j=110;j>0;j-);void ankey() /鍵盤掃描uchar temp,key;P1=0xef;/第1行 temp=

8、P1; temp=temp&0x0f;/temp高4位清0; if(temp!=0x0f) /判斷是否有鍵按下 delayms(10); /延時(shí),消除抖動(dòng) if(temp!=0xf0)/判斷是否有鍵按下 temp=P1; /重新讀取P1口 switch(temp)/判斷哪個(gè)鍵按下 case 0xeb: key=1; break; case 0xed: key=2; break; case 0xee: key=3; break; text(key); while(temp!=0x0f)/判斷按鍵是否釋放 temp=P1; temp=temp&0x0f; P1=0xdf;/第2行

9、temp=P1; temp=temp&0x0f; if(temp!=0x0f) delayms(10); if(temp!=0xf0) temp=P1; switch(temp) case 0xdb: key=4; break; case 0xdd: key=5; break; case 0xde: key=6; break; text(key); while(temp!=0x0f) temp=P1; temp=temp&0x0f; P1=0xbf;/第3行 temp=P1; temp=temp&0x0f; if(temp!=0x0f) delayms(10); if(

10、temp!=0xf0) temp=P1; switch(temp) case 0xbb: key=7; break; case 0xbd: key=8; break; case 0xbe: key=9; break; text(key); while(temp!=0x0f) temp=P1; temp=temp&0x0f; P1=0x7f;/第4行 temp=P1; temp=temp&0x0f; if(temp!=0x0f) delayms(10); if(temp!=0xf0) temp=P1; switch(temp) case 0x7b: key=10; break;c

11、ase 0x7d: key=0; break; case 0x7e: key=11; break; text(key); while(temp!=0x0f) temp=P1; temp=temp&0x0f; void text(uchar key)/判斷鍵盤掃描結(jié)果,并倒計(jì)時(shí)static uchar n,bb,s;/靜態(tài)局部變量s=1;if(key=0|key=1|key=2|key=3|key=4|key=5|key=6|key=7|key=8|key=9)n+;/有數(shù)字鍵被按下,n加1if(key=10|key=11)n=3;/*和#被按下,n置3switch(n)case 1:

12、bb=key;key=20;display(bb);break;/第1次按下數(shù)字鍵case 2: bb=bb*10+key;n=0;key=20;display(bb);break;/第2次按下數(shù)字鍵case 3: num=bb;/*和#被按下,開始倒計(jì)時(shí)while(s=1)TR0=1;/啟動(dòng)定時(shí)器0中斷if(numt0=20)/如果到了20次,說(shuō)明1秒時(shí)間到numt0=0;/然后把numt0清0重新再計(jì)20次num-;/num自減if(num=0)/如果num等0TR0=0;/關(guān)閉定時(shí)器0中斷s=0; /推出循環(huán)led=0;/點(diǎn)亮LED燈display(num);/顯示num break;v

13、oid init() /初始化函數(shù) TMOD=0x01;/設(shè)置定時(shí)器0為工作方式1(0000 0001)TH0=(65536-50000)/256;/裝初值50ms一次中斷TL0=(65536-50000)%256;EA=1; /開總中斷ET0=1; /開定時(shí)器0中斷TR0=0; sw=1;/關(guān)數(shù)碼管十位位選gw=1; /關(guān)數(shù)碼管個(gè)位位選void main()/主函數(shù)init();/初始化函數(shù)num=0;while(1) /循環(huán)ankey(); /鍵盤掃描display(num);/動(dòng)態(tài)數(shù)碼管顯示void T0_time() interrupt 1/定時(shí)器0中斷函數(shù)TH0=(65536-500

14、00)/256;/重裝初值TL0=(65536-50000)%256;numt0+;/50ms中斷一次五、結(jié)束語(yǔ)當(dāng)我第一眼看到這個(gè)倒計(jì)時(shí)的題目時(shí),我感覺(jué)到并不難,沒(méi)怎么在意,因?yàn)樯蠈W(xué)期學(xué)單片機(jī)的時(shí)候我們班大多數(shù)同學(xué)都自己買了單片機(jī)實(shí)驗(yàn)板(我也買了)回宿舍玩。那段時(shí)間我自己寫了不少程序下載到單片機(jī)實(shí)驗(yàn)板上玩,其中就有寫過(guò)倒計(jì)時(shí)程序和矩陣按鍵掃描程序,只是那時(shí)寫的倒計(jì)時(shí)程序的倒計(jì)時(shí)間是不可調(diào)的,矩陣按鍵只是設(shè)置1位數(shù)的。我當(dāng)時(shí)就想把這兩個(gè)程序組合起來(lái),用按鍵來(lái)設(shè)置倒計(jì)時(shí)間和控制倒計(jì)時(shí)的開始和結(jié)束不就行了嗎?可是當(dāng)我真正開始做的時(shí)候,問(wèn)題出來(lái)了。第一次連好電路圖后,先分別寫了倒計(jì)時(shí)間不可調(diào)的倒計(jì)時(shí)程

15、序和矩陣按鍵掃描程序,分別仿真,都沒(méi)問(wèn)題。把兩程序組合起來(lái)的時(shí)候,出來(lái)問(wèn)題,我辛辛苦苦組合起來(lái)的程序竟然不聽我話。先是不管我怎么按,數(shù)碼管的顯示一點(diǎn)都沒(méi)反應(yīng),估計(jì)是矩陣按鍵掃描函數(shù)那里弄錯(cuò)了;修改后,按下的數(shù)字可以按我的意圖顯示了,但又不能倒計(jì)。唉!還不行!繼續(xù)修改,終于可以倒計(jì)時(shí)了,可是高興地太早了,運(yùn)行了好幾次,發(fā)現(xiàn)只能設(shè)置個(gè)位的倒計(jì)時(shí),設(shè)置十位的時(shí)候它沒(méi)反應(yīng)。真正的問(wèn)題出現(xiàn)了,我就被卡在這里了,而且卡了好幾天,這期間我進(jìn)行了很多次的修改,也多次請(qǐng)教別的同學(xué)幫忙,不知為什么,就是修改不好,不是改得更差了,就是改好了這個(gè)功能同時(shí)別的功能不行了。唉!我快要崩潰了,期末考試就來(lái)了,本來(lái)想早點(diǎn)弄好它,以便專心去復(fù)習(xí),可看是簡(jiǎn)單就偏偏弄不出來(lái)。不管了,先復(fù)習(xí)、準(zhǔn)備考試去了。幾天后,我連

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論