點擊鏈接獲取Keil源碼與Project Backups仿真圖:
https://download.csdn.net/download/qq_64505944/87775018添加鏈接描述
源碼獲取
主要內容:
設計一個電子秒表,至少具有以下功能:開始/暫停、記錄、復位等。設計方案主要分為實驗的系統(tǒng)分析,具體的設計方案,以及最終的測試,最終完成實驗設計。
基本要求:
1、具有電路設計圖;
2、設計源程序;
3、keil運行源程序;
4、protus中仿真;
5、運行結果分析。
主要參考資料:
[1]劉守義等.單片機技術基礎[M].西安電子科技大學出版社,2007.
[2]王東峰等.單片機C語言應用100例[M].電子工業(yè)出版社,2009.
[3]馬忠梅等.單片機的C語言應用程序設計.北京航空航天大學出版社,2003.
[4]王晉凱.簡簡單單學通51單片機開發(fā) [M].清華大學出版社,2014.
[5]夏繼強.單片機實驗[M].北京: 航空航天大學出版社,2001.
完 成 期 限:12 月 11 日 - 12 月 26 日
指導教師簽名:
課程負責人簽名:
摘 要
近年來隨著科技的飛速發(fā)展,單片機的應用正在不斷地走向深入,同時帶動著傳統(tǒng)控制檢測日新月異的更新。在實時檢測和自動控制的單片機應用系統(tǒng)中,單片機往往是作為一個核心部件來使用,僅單片機方面的知識是不夠的,還要根據具體的硬件結構,以及針對具體的應用對象的軟件結合,加以完善。秒表的出現(xiàn),解決了傳統(tǒng)的由于人為因素造成的誤差和不公平性。
本次設計是采用AT89C52單片機為中心,利用其定時器/計數(shù)器定時和記數(shù)的原理,結合顯示電路、電源電路、LCD1602液晶以及鍵盤電路來設計計時器。將軟、硬件有機的結合起來,使得系統(tǒng)能夠實現(xiàn)四位LCD顯示,最大顯示時間為09:59:99,有開始/暫停、復位、記錄和查看功能,并設有每秒提醒功能。
關 鍵 詞:電子秒表;仿真;單片機;
目 錄
摘 要 I
1概述 1
1.1選題背景 1
1.2 單片機簡單介紹 1
1.3 設計的作用及目的 1
2系統(tǒng)分析 2
2.1 系統(tǒng)方案 2
2.2 原理分析 2
2.2.1計數(shù)器中斷過程分析 2
2.2.2計時器定時機器分析 3
3系統(tǒng)設計 4
3.1 總體設計 4
3.2 硬件設計 4
3.2.2按鍵電路 5
3.2.3蜂鳴器電路 5
3.2.4復位電路 6
3.2.5時鐘電路 6
3.3 軟件設計 7
3.3.1程序流程設計 7
3.3.2源程序 8
4 仿真測試 16
4.1 開始/暫停 16
4.3 查看下一條記錄 16
4.4 查看上一條記錄 16
4.4 復位 16
5 心得體會 17
參考文獻 18
1概述
1.1選題背景
在當下這個信息科技迅猛發(fā)展的時代,各領域對于時間精確要求越來越高,比如在物理界,做實驗需要精確的計時工具來測量時間參數(shù);在體育界,比賽場上需要精確的計時工具來區(qū)分運動員速度之間的細微差距;在IT行業(yè),時間的要求更是越來越高;最基本的在生活中,計時工具也是常被人使用。所以電子秒表實用域廣,性價比高,實用性強,市場前景一片光明。
1.2 單片機簡單介紹
單片機微型計算機簡稱單片機,是典型的嵌入式微控制器,常用英文字母MCU表示單片機,它最早是被用在工業(yè)控制領域。單片機由芯片內僅有CPU的專用處理器發(fā)展而來。最早的設計理念是通過將大量外圍設備和CPU集成在一個芯片內,是計算機系統(tǒng)更小,更容易集成進復雜的而對提及要求嚴格的控制設備當中。INTEL的Z80是最早按照這種設計思想設計出的處理器,之后,單片機和專用處理器被分開。早期的單片機是8位或4位的,其中最成功的是8031,因為簡單可靠性能好而獲好評。之后在8031基礎上發(fā)展了MCS51系列單片機系統(tǒng)。但性價比不理想而未被廣泛應用。90年代隨著電子產品飛速發(fā)展,單片機技術大大提高,處理能力也提高了數(shù)倍?,F(xiàn)代生活的幾乎所有電子和機械產品都集成有單片機。手機,電話,計算機,家庭電器,醫(yī)療儀器,電子玩具,掌上電腦等等都會配有單片機。汽車上一般要配有50多部單片機,復雜的工業(yè)控制系統(tǒng)上甚至可能有數(shù)百臺單片機子同時工作!
因此,本次大作業(yè)設計以單片機為核心,設計簡單的電子秒表,使它能夠正確的運行,并且可以用數(shù)碼管顯示,在現(xiàn)實中生活中應用廣泛,也有實現(xiàn)意義。
1.3 設計的作用及目的
本設計利用單片機原理,結合顯示電路,用四位數(shù)碼顯示管及按鍵來實現(xiàn)0電子秒表。將軟硬件合理結合,以實現(xiàn)系統(tǒng)正常運行,數(shù)碼管正常顯示的最終目的。本次課設是對電子秒表設計的基本功能,軟件模塊硬件模塊的設計思路及如何實現(xiàn)功能的主要概述。本次課程設計加深了對單片機課程的全面認識和對單片機課程的應用。培養(yǎng)了自己運用所學基礎理論解決實際問題的能力。 學習到設計課設寫作方法和用文與圖相結合直觀,詳細,具體地闡述設計成果。對數(shù)字電子秒表的設計、檢測、制作有了有更進一步的理解與操作,學會了把所學知識知識理論與動手實踐相結合。
2系統(tǒng)分析
2.1 系統(tǒng)方案
本系統(tǒng)采用AT89C52單片機為中心器件,利用其定時器/計數(shù)器定時和記數(shù)的原理,結合硬件電路來設計計時器、將軟硬件有機地結合起來。其中軟件系統(tǒng)采用c語言編寫程序,硬件系統(tǒng)利用PROTEUS強大的功能來實現(xiàn),簡單且易于觀察,在仿真中就可以觀察到實際的工作狀態(tài)。
2.2 原理分析
2.2.1計數(shù)器中斷過程分析
中斷是指cpu在執(zhí)行某一過程中由于外界原因必須暫?,F(xiàn)在的事情,處理別的事情,處理完了再回去執(zhí)行暫停的事情。中斷的優(yōu)點,分時操作,實時響應 ,可靠性高。IE寄存器:
1.單路開關:EX0 ET0 EX1 ET1 ES
EX0:外部中斷0允許位
ET0:定時/計數(shù)器T0中斷允許位
EX1:外部中斷1允許位
ET1:定時/計數(shù)器T1中斷允許位
ES:串行口中斷允許位
2.總開關
EA:CPU中斷允許位
EA=1打開
IP寄存器:
作用是選擇優(yōu)先級的,解決中斷優(yōu)先級問題。
IT0寄存器:選擇低電平有效還是下降沿有效,上電默認電平觸發(fā)方式,IT0=1是下降沿有效
T0 T1為定時器中斷,RX TX為串行口中斷
中斷優(yōu)先級順序由高到低:
外部中斷0(IE0)->定時/計數(shù)器0(TF0)->外部中斷1(IE1)->定時/計數(shù)器1(TF1)->串行口(R1或T1)
首先響應的是優(yōu)先級高的中斷請求,正在中斷的不會被新的中斷請求打斷,正在進行低優(yōu)先級中斷服務,能被高優(yōu)先級中斷請求中斷。
中斷函數(shù)一般形式:void 函數(shù)名() interrupt n{}
n代表中斷號,中斷號是編譯器識別不同中斷的唯一編號
中斷函數(shù)和普通函數(shù)的異同:
同:函數(shù)的形式非常類似,中斷響應過程和普通函數(shù)調用過程也非常相似
異:中斷函數(shù)不需要聲明,普通函數(shù)需要聲明
使用中斷函數(shù)需要遵循以下規(guī)則:
(1)中斷函數(shù)不能進行參數(shù)傳遞
(2)在任何情況下,都不能直接調用中斷函數(shù)
2.2.2計時器定時機器分析
加1計數(shù)器輸入的計數(shù)脈沖有兩個來源,一個是由系統(tǒng)的時鐘震潰器輸出脈沖經12分頻后送來;一個是T0或T1引腳輸入的外部脈沖源。
作為定時器使用時,定時器計數(shù)8051單片機片內振蕩器輸出經過12分頻后的脈沖個數(shù),即:每個機器周期使定時器T0/T1的寄存器值自動累加1,直到溢出,溢出后繼續(xù)從0開始循環(huán)計數(shù);所以,定時器的分辨率是時鐘振蕩頻率的1/12;
作為計數(shù)器使用時,通過引腳T0(P3.4)或T1(P3.5)對外部脈沖信號進行計數(shù),當輸入的外部脈沖信號發(fā)生從1到0的負跳變時,計數(shù)器的值就自動加1由于檢測一個從1到0的下降沿需要2個機器周期,因此要求被采樣的電平至少要維持一個機器周期。當晶振頻率為12MHz時,最高計數(shù)頻率不超過1/2MHz,即計數(shù)脈沖的周期要大于2微秒;計數(shù)器的最高頻率一般是時鐘振蕩頻率的1/24;
由此可知,不論是定時器還是計數(shù)器工作方式,定時器T0和T1均不占用cpu的時間,除非定時器/計數(shù)器T0和T1溢出,才可能引起CPU中斷,轉而去執(zhí)行中斷處理程序。所以說,定時器/計數(shù)器是單片機中效率高而工作靈活的部件。
本實驗使用工作模式0:
由TL0的低5位和TH0的全部8位共同構成一個13位的定時器/計數(shù)器,定時器/計數(shù)器啟動后,定時或計數(shù)脈沖個數(shù)加到TL0上,從預先設置的初值(時間常數(shù))開始累加,不斷遞增1,當 TL0計滿后,向TH0進位,直到13位寄存器計滿溢出,TH0溢出時,置位TCON中的TF0標志,向CPU發(fā)出中斷請求。并且定時器/計數(shù)器硬件會自動地把13位的寄存器值清0,如果需要進一步定時/計數(shù),需要使用相關指令重置時間常數(shù),并把定時器/計數(shù)器的中斷標記TF0置0。
3系統(tǒng)設計
3.1 總體設計
此次的設計是采用定時器進行計時并且在LCD1602上顯示時間,使用P2.0、P2.1、P2.2控制LCD的RE、RW、EN端口。P1.0控制蜂鳴器、P1.1控制開始/暫停、P1.2、P1.3控制查看上一條、下一條、P1.4控制記錄、P1.5控制復位、P1.6控制每秒提醒。當按下開始的時候,秒表開始計數(shù),當按下暫停的時候暫停計數(shù),當按下記錄的時候,可以記錄當前計數(shù)時間,按下上一條記錄的時候顯示屏上可以顯示上一次記錄的時間。并且每秒都有提醒。確定用P0并行端口進行LCD1602控制輸入,使用P2.0、P2.1、P2.2控制LCD的RE、RW、EN端口。P1.0控制蜂鳴器、P1.1控制開始/暫停、P1.2、P1.3控制查看上一條、下一條、P1.4控制記錄、P1.5控制復位、P1.6控制每秒提醒。如下圖3-1所示。
圖3-1 總電路圖
3.2 硬件設計
3.2.1LCD1602顯示電路
所謂的1602是指顯示的時候,有兩行內容每行有16個字符。如下圖3-2所示。
基本操作時有:
1.讀狀態(tài):輸入:RS=L,RW=H,E=H
–輸出:D0-D7=狀態(tài)字
2.寫指令:輸入:RS=L,RW=L,D0-D7=指令碼
–輸出:無
3.讀數(shù)據:輸入:RS=H,RW=H,E=H
–輸入:D0-D7=數(shù)據
4.寫數(shù)據:輸入:RS=H,RW=L,D0-D7=數(shù)據,E=高脈沖
–輸入:無
圖3-2 顯示電路圖
3.2.2按鍵電路
需要實現(xiàn)秒表的開始/暫停、記錄、查看上一條、查看下一條、復位、每秒提醒的開關。用6個按鍵實現(xiàn)。P1.1控制開始/暫停、P1.2、P1.3控制查看上一條、下一條、P1.4控制記錄、P1.5控制復位、P1.6控制每秒提醒。如下圖3-3所示。
圖3-3 按鍵電路圖
3.2.3蜂鳴器電路
蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發(fā)聲器件。蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。由于題目內容有計時時間每秒都得有提醒功能,因此我們還得用蜂鳴器。如圖3-4所示:
圖3-4 蜂鳴器電路圖
3.2.4復位電路
采用上電加按鍵復位電路,也就是手動復位,上電后,由于電容充電,使這RET持續(xù)一段高電平時間,當單片機運行時,按下復位鍵也能使RET持續(xù)一段時間的高電平,從而實現(xiàn)上電加開關復位的操作上電加復位電路。如下圖3-5所示。
圖3-5 復位電路圖
3.2.5時鐘電路
利用12分頻的晶振的一個機器周期為一微妙,通過循環(huán)延時產生0.1秒的延時,通過XTAL1和XTAL2外接晶體振蕩器構成內部振蕩方式。由于單片機內部有一個高增益反相放大器,當外接晶振后,就構成了自激振蕩器并產生振蕩時鐘脈沖。51單片機內部的振蕩電路是一個高增益反相放大器,引線XTAL1和XTAL2引腳分別為振蕩器的反相放大器輸入端,振蕩器的反相放大輸出端,再接上晶振形成一個完整電路,產生震蕩。如圖3-6所示。
圖3-6 時鐘電路圖
3.3 軟件設計
3.3.1程序流程設計
圖3-7 系統(tǒng)流程圖
3.3.2源程序
#include<reg52.h>
#include<intrins.h>
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P0
//按鍵定義
sbit key1=P1^3;
sbit key2=P1^2;
sbit key3=P1^1;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
//蜂鳴器定義
sbit Beep=P1^0;
//全局變量定義
unsigned int RecordTableH[11];
unsigned char RecordTableL[11];
unsigned int CountTimeH;
unsigned char CountTimeL;
unsigned char DataRecordFlag = 0;
unsigned char DataFlag = 0;
unsigned int buzzer=0;
code unsigned char NumTable[]="0123456789";
bit Counting = 0;
//函數(shù)聲明
void LCD1602_WriteCom(unsigned char com);
void LCD1602_WriteData(unsigned char Data);
void LCD1602_Clear(void);
void LCD1602_PutString(unsigned char x,unsigned char y,unsigned char *s);
void LCD1602_PutChar(unsigned char x,unsigned char y,unsigned char Data);
void LCD1602_Init(void);
void LCD1602_Delay(unsigned int t);
void delay_ms(unsigned int t);
void IniTC0(void) ;
void KeyWork(void);
void DisplayCountTime(void);
void main()
{
IniTC0();
LCD1602_Init();
Beep = 1;
LCD1602_PutString(4,0,"Well Come");
LCD1602_PutString(2,1," Stopwatch ");
delay_ms(1000);
LCD1602_Clear();
while(1)
{
DisplayCountTime();
KeyWork();
}
}
void LCD1602_WriteCom(unsigned char com)
{
LCD1602_Delay(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
void LCD1602_WriteData(unsigned char Data)
{
LCD1602_Delay(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}
void LCD1602_Clear(void)
{
LCD1602_WriteCom(0x01);
LCD1602_Delay(5);
}
void LCD1602_PutString(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD1602_WriteCom(0x80 + x);
}
else
{
LCD1602_WriteCom(0xC0 + x);
}
while (*s)
{
LCD1602_WriteData( *s);
s ++;
}
}
void LCD1602_PutChar(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD1602_WriteCom(0x80 + x);
}else {
LCD1602_WriteCom(0xC0 + x);
}
LCD1602_WriteData( Data);
}
void LCD1602_Init(void)
{
LCD1602_WriteCom(0x38);
LCD1602_Delay(5);
LCD1602_WriteCom(0x38);
LCD1602_Delay(5);
LCD1602_WriteCom(0x38);
LCD1602_Delay(5);
LCD1602_WriteCom(0x38);
LCD1602_WriteCom(0x08);
LCD1602_WriteCom(0x01);
LCD1602_WriteCom(0x06);
LCD1602_Delay(5);
LCD1602_WriteCom(0x0C);
LCD1602_Clear();
}
void LCD1602_Delay(unsigned int t)
{
unsigned char c;
while(t--)
{
for(c = 50; c > 0; c--);
}
}
void delay_ms(unsigned int t)
{
unsigned char c;
while(t--)
{
for(c = 50; c > 0; c--);
}
}
void IniTC0(void)
{
TMOD=0x01;
TR0 = 0;
TF0 = 0;
TH0=0xFC;
TL0=0x18;
ET0 = 1;
EA=1;
}
void KeyWork(void)
{
if(key1 == 0)
{
if(!Counting && DataRecordFlag != 0)(DataRecordFlag表示記錄的數(shù)據條數(shù))
{
DataFlag++;
if(DataFlag >= DataRecordFlag)
{
DataFlag = DataRecordFlag;
}
if(DataFlag >= 10)
{
LCD1602_PutString(0,1,"10: ");
}else {
LCD1602_PutChar(0, 1, NumTable[DataFlag]);
LCD1602_PutString(1,1,": ");
}
LCD1602_PutChar(4, 1, NumTable[(RecordTableH[DataFlag]/6000)%6]);
LCD1602_PutChar(5, 1, NumTable[(RecordTableH[DataFlag]/600)%10]);
LCD1602_PutChar(6, 1, ':');
LCD1602_PutChar(7, 1, NumTable[(RecordTableH[DataFlag]/100)%6]);
LCD1602_PutChar(8, 1, NumTable[(RecordTableH[DataFlag]/10)%10]);
LCD1602_PutChar(9, 1, ':');
LCD1602_PutChar(10, 1, NumTable[((RecordTableL[DataFlag]%10)%10)%10]);
LCD1602_PutChar(11, 1, NumTable[RecordTableL[DataFlag]/10]);
}
delay_ms(5);
while(!key1)
DisplayCountTime();
}
if(key2 == 0)
{
if(!Counting && DataRecordFlag != 0)
(DataRecordFlag表示記錄的數(shù)據條數(shù))
{
DataFlag--;
if(DataFlag == 0)
{
DataFlag = 1;
}
LCD1602_PutChar(0, 1, NumTable[DataFlag]);
LCD1602_PutString(1,1,": ");
LCD1602_PutChar(4, 1, NumTable[(RecordTableH[DataFlag]/6000)%6]);
LCD1602_PutChar(5, 1, NumTable[(RecordTableH[DataFlag]/600)%10]);
LCD1602_PutChar(6, 1, ':');
LCD1602_PutChar(7, 1, NumTable[(RecordTableH[DataFlag]/100)%6]);
LCD1602_PutChar(8, 1, NumTable[(RecordTableH[DataFlag]/10)%10]);
LCD1602_PutChar(9, 1, ':');
LCD1602_PutChar(10, 1, NumTable[((RecordTableL[DataFlag]%10)%10)%10]);
LCD1602_PutChar(11, 1, NumTable[RecordTableL[DataFlag]/10]);
}
delay_ms(5);
while(!key2)
DisplayCountTime(); }
if(key3 == 0)
{
Counting = !Counting;
if(Counting)
{
TR0 = 1;
}else {
TR0 = 0;
}
delay_ms(5);
while(!key3)
DisplayCountTime();
}
4 仿真測試
4.1 開始/暫停
圖4-1開始/暫停圖
4.2 記錄
圖4-2記錄時間圖
4.3 查看下一條記錄
圖4-3查看下一條記錄圖
4.4 查看上一條記錄
圖4-4查看上一條記錄圖
4.4 復位文章來源:http://www.zghlxwxcb.cn/news/detail-571804.html
圖4-5復位圖
5 心得體會
經過我的不懈努力終于完成了對電子秒表的設計,收獲頗多。也明白了自己在單片機學習上存在的一些問題,并且在用C語言編程方面也有缺點與不足。經過課程設計使我明白做一個完整的系統(tǒng)要用到我們學到的很多方面的知識,一個完整的系統(tǒng)包含的C語言知識很多,要有好強的綜合運用能力才能開發(fā)一個完整的系統(tǒng)。在程序操作過程中要有耐心,更要細心。同時,也體會到學本專業(yè)要有好強的動手能力,而實訓操作完成小系統(tǒng)鍛煉了我的動手能力,今后,在動手操作方面要加強,畢竟熟能生巧,練多了才能提高自己的編寫程序的能力。畢竟,對于本專業(yè)的初學者來說,起初的編程還屬于經驗編程,靠自己的學習及動手操作獲得經驗,以便為今后開發(fā)出新的程序打下基礎。
這次的課程設計也是一次很好的對自我的檢查。它讓我知道了自己對單片機的學習還不夠認真刻苦,很多知識點還是沒有很好的掌握,甚至有些知識點很生疏,這也許就是我在編寫代碼時老碰壁的原因所在! 從這一點上來看,發(fā)現(xiàn)我對待學習的態(tài)度還不夠端正,有待加強。
不管怎么說,經過這一次課程設計,在Java語言方面的收獲最大,讓我讀代碼的能力大大提升了不少,也鞏固了很多知識。同時也受到了老師的細心指導,非常感
參考文獻
[1] 何立民.單片機高級教程[M].北京: 航空航天大學出版社,2001.
[2] 王東峰等.單片機C語言應用100例[M].電子工業(yè)出版社,2009.
[3] 馬忠梅等.單片機的C語言應用程序設計.北京航空航天大學出版社,2003.
[4] 王晉凱.簡簡單單學通51單片機開發(fā) [M].清華大學出版社,2014.
[5] 夏繼強.單片機實驗[M].北京: 航空航天大學出版社,2001.文章來源地址http://www.zghlxwxcb.cn/news/detail-571804.html
到了這里,關于基于AT89C51單片機的電子秒表設計與仿真的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!