单片机实现秒表倒数计数器
單片機(jī)實(shí)現(xiàn)秒表計(jì)數(shù)器
最近博主在學(xué)習(xí)單片機(jī)的課程,這快到期末考試了,老師讓做個(gè)簡(jiǎn)單的課設(shè),我看了看老師給的課題,感覺這個(gè)比較容易實(shí)現(xiàn),今天下午花了兩個(gè)小時(shí)左右的時(shí)間,把仿真程序電路圖畫好了,現(xiàn)在分享大家,希望大家批評(píng)改正。
實(shí)驗(yàn)器材:**單片機(jī)、按鈕、電阻、PNP型三極管、有源蜂鳴器、共陰極數(shù)碼管
實(shí)現(xiàn)的功能:
通過(guò)按鍵實(shí)現(xiàn)倒計(jì)時(shí)
逐秒倒計(jì)時(shí)
使用4為一體數(shù)碼管顯示時(shí)間
時(shí)間到發(fā)出警報(bào)聲,或者在數(shù)碼管閃爍顯示0000
仿真電路圖:推薦使用網(wǎng)絡(luò)標(biāo)號(hào)連接電路圖,這樣作圖較為專業(yè),適合以后的大點(diǎn)的作圖方式。網(wǎng)絡(luò)標(biāo)號(hào)相同的即為相連接的,圖貌似不是很清晰,如果看不清,評(píng)論區(qū)留言,我發(fā)給你proteus仿真文件。
程序代碼:148行程序,不是太長(zhǎng)
//盡本人最大的努力,將程序中的每條語(yǔ)句較為詳細(xì)的講解 #include <reg51.h> #include <stdio.h> #define uint unsigned int #define uchar unsigned char uchar count=0,minute=0,second=3,flag=0,stop=0; uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰極 uchar disbuf[4]={0};//位選定義一個(gè)四位的數(shù)組,循環(huán)掃描顯示相應(yīng)的內(nèi)容 sbit buzzer=P1^0;//定義單片機(jī)的相應(yīng)引腳 sbit P1_1=P1^1; sbit P1_2=P1^2;void delay_ms(uint x) //延時(shí)消抖函數(shù) {uint t; while(x--) for(t = 0; t < 120; t++); }void display()//模塊化書寫函數(shù),進(jìn)行相應(yīng)的調(diào)用,實(shí)現(xiàn)模塊化編程 {uchar i,j;uchar sel;disbuf[0]=second%10; //disbuf[]每一個(gè)元素賦值,對(duì)秒賦值disbuf[1]=second/10;disbuf[2]=minute%10;//對(duì)分鐘賦值disbuf[3]=minute/10;P2=0XFF; //P2口接數(shù)碼管的位選端,選擇哪個(gè)數(shù)碼管工作 共陰極數(shù)碼管,位選0時(shí)有效 先置FF,使為選段為高電平,數(shù)碼管不工作sel=0x01;//定義一個(gè)掃描的位選端for(i=0;i<4;i++){j=disbuf[i]; //掃描依次顯示四個(gè)數(shù)碼管 上面的賦值已經(jīng)將disbuf數(shù)值更改,也就是1~9P0=table[j]; //將字形碼發(fā)送到P0端口,顯示位的數(shù)據(jù)P2=(sel^0xff); // ^異或相異為1,保證每次都有一個(gè)數(shù)碼管點(diǎn)亮delay_ms(1); // 延時(shí)后,防止程序運(yùn)行太快,跑飛P2=0XFF;sel=sel<<1; // 左移運(yùn)算 0x01左移,1將依次在四位上循環(huán)} }void modify_time()//更改計(jì)時(shí)器時(shí)間的函數(shù),修改初始定時(shí)時(shí)間 {if(flag==0)//修改秒{second++;if(second==60)//秒的最大為60,然后會(huì)發(fā)生進(jìn)位{second=0;disbuf[0]=0;disbuf[1]=0;}}else//修改分鐘{minute++;if(minute==60)//分鐘最大為60,到60以后會(huì)發(fā)生進(jìn)位{minute=0;disbuf[2]=0;disbuf[3]=0;}}} void main(void)//主函數(shù){ TMOD=0x01;//定時(shí)器T0,工作方式1,為16位定時(shí)器TH0=(65536-50000)/256;//高8位賦值TL0=(65536-50000)%256;//低8位賦值TR0=0;//默認(rèn)情況下,定時(shí)器不工作,在外部的觸發(fā)情況下,定時(shí)器,工作,開始減1運(yùn)算ET0=1;//打開定時(shí)器T0的中斷IT0=1;//設(shè)置外部中斷0的觸發(fā)方式EX0=1;//打開外部中斷的中斷IT1=1;//設(shè)置外部中斷0觸發(fā)方式EX1=1;//打開外部中斷1中斷EA=1;//總中斷while(1){if(stop==1)//當(dāng)計(jì)時(shí)倒計(jì)時(shí)完成以后,屏幕閃爍顯示{while(1){P2=~P2;delay_ms(150);}}elsedisplay();//調(diào)用顯示函數(shù),依次減一if(!P1_1)//判斷更改時(shí)間按鍵是否按鍵 進(jìn)行相應(yīng)的消抖{while(!P1_1) delay_ms(10); if(P1_1)modify_time();//調(diào)用調(diào)日期時(shí)間的函數(shù)} }}void inter1() interrupt 1//定時(shí)器T0的中斷 {count++;TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(count==20)//50ms 20次即為1s{ count=0;second--;if(second==0)//該處的程序結(jié)構(gòu)應(yīng)該仔細(xì)看下{if(minute!=0)//防止minute最后為0的時(shí)候,還執(zhí)行minute--,使程序出錯(cuò)。{minute--;second=60;second--;if(second==0){ if(minute==0){second=0;minute=0;TR0=0;count=0;buzzer=0;stop=1;}}}else{second=0;minute=0;TR0=0;count=0;buzzer=0;stop=1;}}} }void inter0() interrupt 0//外部中斷0 {flag=~flag;//flag參數(shù)的作用,是修改定時(shí)時(shí)間的時(shí),確定是分鐘位還是小時(shí)位。}void inter2() interrupt 2//外部中斷1 {TR0=~TR0;//按鍵3,奇數(shù)次按下,定時(shí)器開始工作,偶數(shù)次關(guān)閉。 }所用器材的介紹:
PNP型三極管:判斷的依據(jù),可根據(jù),箭頭方向來(lái)判斷,箭頭向外NPN,箭頭向內(nèi)PNP
蜂鳴器:選擇無(wú)源蜂鳴器 并且將電壓設(shè)置為2V,如果不這樣設(shè)置,可能蜂鳴器不發(fā)聲。
需要源程序和仿真文件的評(píng)論區(qū)留言哦。我可以私發(fā)給你呢。
工程文件自取:
https://pan.baidu.com/s/15O345ks9apFupH5Q-4swNw
提取碼:4qfb
點(diǎn)贊、點(diǎn)贊、點(diǎn)贊
總結(jié)
以上是生活随笔為你收集整理的单片机实现秒表倒数计数器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Altium Designer PCB界
- 下一篇: 西门子Wincc+S7-300污水处理大