和很多朋友一樣,在學51單片機的過程中我們肯定會涉及到制作一個秒表,牽涉到把單片機的多個部分組合起來使用,這對于我們初學者來說可能顯得有些困難,我同大家一樣,百思不得其解,最后頭都弄大了才把這個秒表制作出來,為了給以后的朋友們一些思路,一些參考,所以在這里我把自己制作的整個詳細過程整理出來供大家參考。我調試出來是沒有問題的,各方面都穩定運行,由于我水平有限,中間可能會有不對的地方,歡迎大家指正,我們一起學習,一起進步!
我將分為三個部分來介紹:1.整體思路,2.硬件電路方面,3.軟件編程方面。
1、整體思路
利用51單片機制作秒表時,我介紹精確到十分位(即0.1s)的制作,并讓其擁有啟動,暫停,復位三個功能。
用到的單片機部分:定時器部分,獨立按鍵的檢測與應用,數碼管的顯示,并結合一些簡單的程序即可實現。
用5位數碼管來進行顯示,分別顯示秒的十分位,秒的個位,秒的十位,分的個位,分的十位。用定時器定時50ms,2個定時器中斷即是0.1s,即秒的十分位,20個定時器中斷即是1s,60個1s即是1分鐘,通過程序將5位數碼管的值分離出來,并進行顯示。這就是我在數碼管顯示方面的思路,如果不是太清楚,結合我下面軟件編程方面的程序來看你可能就會明白,我會在那部分做詳細介紹,看完了可能你就懂了。
利用獨立按鍵設置啟動/暫停鍵和清零鍵,利用獨立按鍵的檢測,若啟動/暫停按鍵按下,秒表則啟動或者暫停,按下復位鍵,秒表清零復位。我在程序后面全都有注釋,不用擔心。看完你就會明白了。
這是我制作的的流程圖:
“ms100”表示秒的十分位,"s"表示秒的個位,“s1”表示秒的十位,“min”表示分的個位,“min1”表示分的十位。
“cnt”表示秒的計數位,即多少個一秒,定時滿一秒加1,“minu”表示分的計數位,即多少個一分鐘,一分鐘加1,
這個流程圖提供了大致思路,要結合下面的程序部分一起看。可能有些簡陋,請多多包涵!
看起來是不是好簡單?有木有?請繼續往下看。
2、硬件電路方面
每個人的硬件可能都不一樣,(哪些控制數碼管的位選,哪些控制數碼管的段選,哪些控制獨立按鍵等等),大家在自己制作過程中都要仔細考慮,我在這里就用我自己的硬件進行介紹。
這是我的數碼管的電路圖:(將J12用杜邦線接到對應的P0口,將J16用杜邦線接到對應的P1口)
位選端我用P1口控制,段選端我用P0口控制。在圖中我已標明秒的個位s,秒的十位s1,分的個位min,分的十位min1所對應的數碼管。該數碼管是共陰極。
秒的十分位我用的是另一個共陽數碼管。我用P3口控制該數碼管的段選,其圖如下:
而獨立按鍵我用的P2^7控制“啟動/暫停鍵”,P2^6控制復位鍵:電路圖如下:(將JP5通過杜邦線接到P3口)
硬件電路基本上就是這些,由于分和秒之間要用小數點分隔開,所以分的個位對應的數碼管的段碼要用帶小數點的段碼,其余的數碼管則不用。
硬件方面是為看懂軟件程序做準備,下面我們就開始我們的軟件程序方面吧!
3、軟件程序方面
#include
#defineucharunsignedchar
#defineuintunsignedint
#definePIN0P0//數碼管段選端
#definePIN1P1//數碼管位選端
#definePIN3P3//十分位數碼管的段碼端
sbitstart=P2^7;//啟動/暫停按鈕
sbitreset=P2^6;//復位按鈕
uintcnt=0;//1s的次數的計數值
uintnum=0;//進入中斷次數的計數值(一次50ms)
uintnum1=0;//0.1s的次數的計數值
ucharcodetable[]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//不帶小數點的共陰極數碼管段碼0-9
ucharcodetable1[]={0xbf,0x86,
0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//帶小數點的共陰極數碼管段碼0-9
charcodetable2[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//不帶小數點的共陽極數碼管段碼0-9
voidDisplay(uintw,uinta,uintb,uintc,uintd);//聲明顯示函數
voidInitTimer0();//聲明定時器初始化函數
voidDelayms(uintx);//聲明延時函數
voidmain()
{
uintms100=0;//秒的十分位
uints,s1,min,min1,minu=0;
//依次是秒的個位,秒的十位,分的個位,分的十位
InitTimer0();//初始化定時器
while(1)//進入死循環
{
if(start==0)//檢測啟動/暫停鍵是否按下
Delayms(20);//延時消抖
{
if(start==0)//消抖之后再次檢測
{
TR0=!TR0;//定時器的控制位取反
while(!start);//等待按鍵釋放
}
}
if(reset==0)//檢測復位鍵是否按下
{
Delayms(20);//延時消抖
if(reset==0)//消抖之后再次檢測
{
num=0;
num1=0;//進入中斷次數值清0
ms100=0;//十分位的計數值清0
cnt=0;//秒的計數值清0
minu=0;//分的計數值清0
while(!reset);//等待按鍵釋放
}
}
if(num1>=2)//檢測是否達到0.1s,(兩個50ms)
{
num1=0;//進入中斷次數值清零
ms100++;//秒的十分位的計數值加1
if(ms100>=10)//若秒的十分位計數值達到10
{
ms100=0;//清零秒的十分位的計數值
num1=0;//進入中斷次數值置0
}
}
if(num>=20)//判斷計時時間是否達到1s(20個50ms)
{
num=0;//進入中斷次數值置0
cnt++;//秒的計數值加1
if(cnt>=60)//判斷是否達到60s
{
cnt=0;//若達到60s,將秒的計數值置零
minu++;//分的計數值加1
if(minu>=60)//判斷是否達到60分鐘,一般秒表是用不到60分的,這是為了程序的嚴謹性
{
TR0=!TR0;//達到60分鐘則關閉定時器并清零所有的計數值
num1=0;
num=0;
ms100=0;
cnt=0;
minu=0;
}
}
}
s=cnt%10;//從秒的計數值里面分離秒的個位
s1=cnt/10;//從秒的計數值里面分離秒的十位
min=minu%10;//從分的計數值里面分離分的個位
min1=minu/10;//從分的計數值里面分離分的十位
Display(ms100,s,s1,min,min1);//顯示這5個數
}
}
voidInitTimer0()//定時器初始化函數
{
TMOD=0x01;//選擇定時器0的工作方式1
TH0=(65536-45872)/256;//裝初值(定時50ms),晶振11.0592MHz
TL0=(65536-45872)%256;
EA=1;//打開總中斷
ET0=1;//打開定時器中斷
TR0=0;//先不要啟動定時器
}
voidTIMER0()interrupt1//定時器中斷服務函數
{
TH0=(65536-45872)/256;//重裝初值
TL0=(65536-45872)%256;
num++;//讓進入中斷次數值加1,用于判斷是否達到1s
num1++;//讓進入中斷次數值加1,用于判斷是否達到0.1s
}
voidDelayms(uintx)//延時xms
{
uinti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
voidDisplay(uintw,uinta,uintb,uintc,uintd)//定義顯示函數
{
PIN3=table2[w];//秒的十分位的段選
Delayms(5);
PIN0=table[a];//秒的個位的段選
PIN1=0x7f;//秒的個位的位選
Delayms(5);
PIN0=table[b];//秒的十位的段選
PIN1=0xbf;//秒的十位的位選
Delayms(5);
PIN0=table1[c];//分的個位的段選(帶小數點)
PIN1=0xdf;//分的個位的位選
Delayms(5);
PIN0=table[d];//分的十位的段選
PIN1=0xef;//分的十位的位選
Delayms(5);
}
由于在打字時可能不小心會弄錯一丁點程序,我都是一個字母一個字母手打的,所以請大家理解思路即可,根據這個思路自己去寫,這樣得到的知識才是屬于自己的。畢竟 “讀別人的故事,悟自己的人生”。
下面來幾張實物圖給大家看一下我這個秒表的實際效果。
編譯結果:
燒寫進單片機的效果:(沒有按啟動按鈕之前)
按了啟動按鈕之后,秒表將會自動開始計時,由于無法演示動態過程,只能在中間按下暫停鍵給大家看看效果:
按下復位鍵后:
由于我用的是一個比較完整的51開發板,所以里面有很多部分,大家只需要注意觀察數碼管部分就好。
下面再來一個完整的圖:
結束語
至此,利用51單片機制作的秒表就已經完成了!若是文章中有什么不懂的地方或者是自己在制作過程中遇到什么問題都可以聯系我,或者給我留言,我一定竭盡全力幫助大家!我們一起學習,一起進步!希望大家都能在看完這篇文章后自己動手成功制作出一個秒表,祝愿大家學好單片機!當然,由于自身水平有限,文章中肯定會存在錯誤或者是考慮不周的的地方,懇請不吝賜教!謝謝大家!
(PS:我寫了一整天了,反復的看,反復的改,現在頭昏眼花,但是只要能對大家有所幫助,一切都是值得的。)
作者:wangwangpengpeng
來源:
http://blog.csdn.net/wangwangpengpeng/article/details/76065286
責任編輯:PSY
原文標題:用51單片機制作一個秒表的詳細過程(教程有程序)
文章出處:【微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。
-
單片機
+關注
關注
6035文章
44554瀏覽量
634640 -
51單片機
+關注
關注
274文章
5702瀏覽量
123491 -
秒表
+關注
關注
3文章
77瀏覽量
22012
原文標題:用51單片機制作一個秒表的詳細過程(教程有程序)
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論