0.png (45.82 KB, 下載次數: 92)
下載附件
2018-12-2 16:26 上傳
單片微型計算機簡稱單片機,又稱為微控制器,是將CPU、RAM、ROM、定時/計數器、I/O接口電路集成到一塊電路芯片上構成的微型計算機。本次設計的系統由單片機系統、數碼管顯示系統、鍵盤、蜂鳴器等組成,通過按鍵來控制單片機實現數字時鐘的時、分、秒顯示,12、24制轉換,設定時間、鬧鐘等不同功能,并通過P0口的輸出在LED上顯示。該設計具有結構簡單、使用方便等特點。
目錄
第一章 設計目的及要求
1.目的
2.題目與要求
第二章 理論基礎
1.AT89C52芯片
2.Keil的簡單介紹
3.Protues的簡單介紹
第三章 設計原理以及方案
1.系統總體框圖
2.硬件電路
2.1晶振電路
2.2復位電路
2.3蜂鳴器電路
2.4數碼管顯示電路
2.5鍵盤電路
2.6總體電路
3.軟件系統設計
3.1單片機的使用情況
3.2軟件系統的各個模塊
3.3軟件系統程序流圖
第四章 仿真結果與分析
1.仿真結果
2.仿真結果分析
第五章 總結
參考文獻
附錄:
程序清單
PCB原理圖
第一章 設計目的及要求
1.目的
通過對電子時鐘系統進行編程與Protues仿真,進一步掌握單片機的組成,P1、P0、P2、P3口的應用,蜂鳴器的應用,定時中斷程序的編寫及應用,對之前學習的單片機課程進行回顧與應用;初步掌握Protues仿真方法以及用keil軟件編寫程序的方法。
2.題目與要求
本次課程設計的題目為:電子時鐘的設計,其具體要求為:
(1)能實現時、分、秒的顯示;
(2)能實現12、24小時制的切換;
(3)能設定時間;
(4)能設定鬧鐘;
整個系統要設計鍵盤和顯示器,利用單片機內部時鐘完成定時器的定時設計。
第二章 理論基礎 1.AT89C52芯片 AT89C52芯片的引腳圖如圖1所示。 圖1 AT89C52芯片引腳 其中主要應用到的引腳口介紹: (1)P0口的第一功能是作為一般I/O口使用,第二功能是在CPU訪問外部存儲器時,分時提供低8位地址和8位雙向數據。 (2)P1口是8位準雙向I/O口,51子系列中P1只能用作一般I/O口,52子系列中P1.0和P1.1引腳還具有第二功能。 (3)P2口是8位準雙向I/O口,第二功能是在CPU訪問外部存儲器時,作為高8位地址總線,輸出高8位地址。 (4)P3口是8位準雙向I/O口,其第一功能是用作一般I/O口,第二功能是作為中斷信號和外部數據存儲器的讀寫控制信號。 (5)RES,復位信號高電平有效。 2.Keil的簡單介紹 Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統。Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境(μVision)將這些部分組合在一起。此處簡單介紹一下Keil 工程的建立等,以Keil μVision2界面為例。 (1)建立一個工程,選擇菜單欄中的【Project】下的【New Project】,菜單欄如圖2所示。 圖2 菜單欄 (2)選擇工程要保存的路徑并且輸入工程名,以電子時鐘工程的建立為例,如圖3所示。 圖3 “保存新工程”對話框 (3)選擇系統要用的單片機如圖4(a)所示,選擇添加啟動文件如圖4(b)所示。 圖4(a)“選擇單片機”對話框 圖4(b)“添加啟動文件”對話框 (4)建立文件,選擇菜單【File】下的【New】,出現界面如圖5所示。 圖5 新建文件界面 (5)保存文件為“*.c”文件,并且添加文件到所建的工程下,保存文件截面圖如圖6所示,添加文件顯示界面如圖7所示,右鍵點擊SourceGroup添加。 圖6 保存文件界面 圖7 添加文件界面 3.Protues的簡單介紹 Proteus軟件是英國Lab Center Electronics公司出版的EDA工具軟件,它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前比較好的仿真單片機及外圍器件的工具,可以仿真51系列、AVR、PIC、ARM、等常用主流單片機。在PROTEUS繪制好原理圖后,調入已編譯好的目標代碼文件:*.HEX,可以在PROTEUS的原理圖中看到模擬的實物運行狀態和過程。 (1)Keil中生成*.HEX的界面如圖8所示。 圖8 生成HEX文件界面 (2)Protues中加載HEX文件,在Protues界面中雙擊AT89C51芯片,所示界面如圖9所示。 圖9 加載HEX文件界面 第三章 設計原理以及方案 1.系統總體框圖 本電子時鐘主要由單片機、鍵盤、數碼管顯示接口電路、蜂鳴器電路和復位電路構成,設計的總體方案如圖10所示: 圖10 總體方案 2.硬件電路 2.1晶振電路 晶振電路如圖11所示。 圖11 晶振電路 2.2復位電路 復位電路如圖12所示。 圖12 復位電路 2.3蜂鳴器電路 蜂鳴器電路如圖13所示。 圖13 蜂鳴器電路 2.4數碼管顯示電路 數碼管顯示電路如圖14所示。 圖14 數碼管顯示電路 2.5鍵盤電路 鍵盤電路如圖15所示。 圖15 鍵盤電路 2.6總體電路 在Protues中仿真的總體電路圖如圖16所示。 圖16 總體電路 3.軟件系統設計 3.1單片機的使用情況 設計電子時鐘使用單片機資源的情況如下: P0口輸出數碼管段選信號,P2口輸出數碼管位選信號;調整功能選擇鍵kgnxz:P3.0口,通過其選擇調整時鐘還是調整鬧鐘;調整秒 ksec:P3.1口,按一次使秒加1;調整分kmin:P3.2;按一次使分加1;調整小時khour:P3.3口,按一次使時加1;12與24小時制的轉換鍵kzh:P3.4,默認24小時制,按一次鍵之后轉換為12小時制。具體如下: (1)實現基本的走時間和顯示時間的時、分、秒,上電自動顯示初始時間00-00-00。 (2)當第一次按下第一個彈性按鍵時進入時間的調節狀態,按下第二個按鍵時實現秒的加一調節,按下第三個按鍵時實現分的加一調節,按下第四個按鍵時實現小時的加一調節。 (3)當第二次按下第一個彈性按鍵時進入鬧鐘的調節狀態(鬧鐘初始值設定為01-00-30),按下第二個按鍵時實現秒的加一調節,按下第三個按鍵時實現分的加一調節,按下第四個按鍵時實現小時的加一調節。 (4)當第三次按下第一個彈性按鍵時進入原顯示時間的狀態。 (5)按下第五個按鍵時實現24到12小時制的轉換。 (6)當第五次按下第一個彈性按鍵時返回正常的顯示時間走時狀態。 3.2軟件系統的各個模塊 時鐘系統的軟件設計主要采用以下基本模塊來實現,主程序、定時中斷服務程序、鍵盤掃描程序模塊、時鐘顯示模塊、鬧鐘顯示模塊、轉換模塊、延時模塊和蜂鳴器模塊。 主程序:對中斷程序初值進行設定,在各種情況下對子函數的調用,保證整個程序的順序執行。 定時中斷服務程序:用于電子時鐘的準確運行。 鍵盤掃描程序模塊:用于確定按鍵并在按鍵按下時調用相應的程序進行顯示。 時鐘顯示模塊:用于顯示正常走表的時間。 鬧鐘顯示模塊:用于顯示設定鬧鐘的時間。 轉換模塊:用于將默認的24小時制轉換為12小時制。 延時模塊:程序中調用延時子程序,用于按鍵消抖動,數碼管消影等。 蜂鳴器模塊:用于在設定的鬧鐘時間與走表的時間相等時,鬧鐘響起。 3.3軟件系統程序流圖 主程序的順序流圖如圖17所示。 圖17 主程序順序流圖 顯示程序的順序流圖如圖18所示。 圖18 顯示程序順序流圖 中斷程序的順序流圖如圖19所示。 圖19 中斷程序順序流 第四章 仿真結果與分析 1.仿真結果 上電走表仿真結果圖如圖20所示。 圖20 上電之后走表仿真結果圖 按下一次kgnxz鍵,再分別調整時、分、秒各按鍵,使得顯示時間為15-15-15仿真結果圖如圖21所示。 圖21 調整時分秒仿真結果圖 按下kzh鍵,使得顯示時間為03-15-19仿真結果圖如圖22所示。 圖22 24小時制轉換為12小時制仿真結果圖 按下第二次kgnxz鍵,再分別調整時、分、秒各按鍵,即調整的便是鬧鐘的設定時間(初始設定為01-00-30),仿真結果圖如圖23所示。 圖23 鬧鐘顯示仿真結果圖 調整鬧鐘的設定時間為03-20-30,仿真結果圖如圖24所示。 圖24 鬧鐘調整顯示仿真結果圖 按下第三次kgnxz鍵時,顯示走表的時間,并且在到達設定的鬧鐘時間時蜂鳴器發出聲音,即在蜂鳴器發聲過程中P1.0口會由原高電平變為低電平,仿真結果圖如圖25所示。 圖25 蜂鳴器發聲仿真圖 2.仿真結果分析 讓手機中的秒表與Protues仿真中的秒同時開始,可以發現他們幾乎是同步的(由于個人反應導致按下手機秒表瞬間有微小誤差)。而鬧鐘設定值是完全沒有誤差的,當時間與設定鬧鐘時間完全相等時蜂鳴器就會發聲。 第五章 總結 本次課程設計利用Keil以及Protues軟件,完成了電子時鐘系統的程序編寫與電路圖搭建,并對所設計的電子時鐘系統進行了仿真測試。 完成本次課程設計的過程,經歷了興奮、自信、失落、奮發、所悟、完成幾個過程。剛開始做課程設計時,仔細閱讀設計的題目和要求,想到理論課學得也還差不多,以為沒什么太大困難,所用的知識書上都有,各部分程序大都可以參考課本例題完成。開始前兩天我就熟悉課本,參考課本內容在稿紙上把自己的思路和各部分程序寫了下來,然后就是銜接起來在Keil中編寫。經過三天的努力,毫無結果。埋頭苦干的過程是痛苦的,尤其是在按自己覺得理論上合理的算法和程序做完,發現根本顯示不了的時候,是迷茫,煩躁的。在第三天下午參考別人只是顯示出來走表就可以的程序,并且接受別人建議按一步一步調試去編寫的情況下,編寫運行找錯地不斷循環中,終于在第五天完善了程序。 通過這次課程設計,我感覺到自己從課本上學到的理論知識和實踐仍有很大的差距。學習理論課時也是有實踐課的,但當時自己只是追求明白課本例題的程序,幾乎很少在Protues上去畫例題中的仿真圖,導致自己對Protues的應用不熟悉,而且也沒深入想過課本上那些小的程序之間的聯系應用。所以學習知識不能太局限于理論,要與實踐結合。學會了單片機的一般設計過程,通常都要進行系統擴展與配置,因此,要完成一個單片機的設計工作,必須依次做到下述工作: - 硬件電路的設計、組裝與調試;
- 應用軟件的編寫、調試;
- 完整應用軟件的調試、固化和脫機運行。
而在進行硬件系統設計時我們應當盡量做到: - 盡可能的選擇典型電路,并符合單片機的常規使用方法;
- 在充分滿足系統功能要求前提下,留余地以便于二次開發;
- 硬件結構設計應與軟件設計方案一并考慮;
- 整個系統相關器件要力求性能的匹配;
- 硬件上要有可靠性與抗干擾設計;
- 充分考慮單片機的帶載驅動能力。
所以我用單片機編寫了上面的程序,因為基礎知識學的不怎么好,如有錯誤之處,還望老師理解,并加以批改。通過這次設計使我對單片機有了更深入的了解。培養了我的動手實踐能力。
PCB原理圖
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #include<absacc.h>
- sbit kgnxz=P3^0; //功能選擇鍵,按一次設定時間,按兩次設定鬧鐘時間,按三次又顯示時間表
- sbit ksec=P3^1;//調整秒
- sbit kmin=P3^2;//調整分
- sbit khour=P3^3;//調整時
- sbit kzh=P3^4;//24與12小時制轉換
- sbit bear=P1^0;//蜂鳴器控制口
- unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0,flag=0,//flag是按鍵的計數
- secshi1=0,secge1=0,minshi1=0,minge1=0,hourshi1=0,hourge1=0;//定義存儲時間和鬧鐘時分秒的個位和十位
- unsigned int num=0,sec=0,min=0,hour=0,sec1=30,min1=0,hour1=1, num1=0;//定義時間和鬧鐘的時分秒
- unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數碼管段控口
- void keyscan();//鍵盤掃描函數
- void display();//時鐘顯示函數
- void display1();//鬧鐘顯示函數
- void clock();//鬧鐘函數即蜂鳴器函數
- /***延時函數****/
- void delay(unsigned char z)
- {unsigned char x,y;
- for(x=z;x>0;x--)
- for(y=255;y>0;y--);
- }
- /***中斷函數****/
- void time0() interrupt 1
- {num++;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- if(num==20)
- {num=0;
- sec++;
- if(sec==60)
- {sec=0;
- min++;
- if(min==60)
- {min=0;
- hour++;
- if(hour==24)
- {hour=0;
- }
- }
- }
- display(); }
- }
- /******時鐘顯示函數******/
- void display()
- {
- secge=sec%10;
- secshi=sec/10;
- minge=min%10;
- minshi=min/10;
- hourge=hour%10;
- hourshi=hour/10;
- P2=0xfe;
- P0=table[secge];
- delay(5);
- P2=0xfd;
- P0=table[secshi];
- delay(5);
- P2=0xfb;
- P0=0x40;
- delay(5);
- P2=0xf7;
- P0=table[minge];
- delay(5);
- P2=0xef;
- P0=table[minshi];
- delay(5);
- P2=0xdf;
- P0=0x40;
- delay(5);
- P2=0xbf;
- P0=table[hourge];
- delay(5);
- P2=0x7f;
- P0=table[hourshi];
- delay(5);
- }
- /*****鬧鐘顯示函數****/
- void display1()
- {
- secge1=sec1%10;
- secshi1=sec1/10;
- minge1=min1%10;
- minshi1=min1/10;
- hourge1=hour1%10;
- hourshi1=hour1/10;
- P2=0xfe;
- P0=table[secge1];
- delay(10);
- P2=0xfd;
- P0=table[secshi1];
- delay(15);
- P2=0xfb;
- P0=0x40;
- delay(15);
- P2=0xf7;
- P0=table[minge1];
- delay(15);
- P2=0xef;
- P0=table[minshi1];
- delay(15);
- P2=0xdf;
- P0=0x40;
- delay(15);
- P2=0xbf;
- P0=table[hourge1];
- delay(15);
- P2=0x7f;
- P0=table[hourshi1];
- delay(15);
- }
- /*****鍵盤掃描*********/
- void keyscan()
- {if(kgnxz==0) //功能選擇鍵是否按下
- { delay(10);//延時消抖
- if(kgnxz==0)//再次判斷鍵是否按下
- {flag++;} //計數,功能選擇鍵按鍵次數加一
- while(!kgnxz);} //釋放鍵
- if(flag==1)//功能選擇鍵
- {if(ksec==0)//秒調整鍵
- {delay(10);//延時消抖
- if(ksec==0)//再次判斷鍵是否按下
- {sec++;//秒加加
- if(sec>=60)//如果秒大于60
- sec=0;//秒清零
- }
- while(ksec==0)//釋放鍵
- display();}
- if(kmin==0)
- {delay(10);
- if(kmin==0)
- {min++;
- if(min>=60)
- min=0;
- }
- while(kmin==0)
- display();
- }
- if(khour==0)
- {delay(10);
- if(khour==0)
- {hour++;
- if(hour==24)
- hour=0;
- }
- while(khour==0)
- display();
- }
- }
- if(flag==2)//鬧鐘調整
- {if(ksec==0)
- {delay(5);
- if(ksec==0)
- {sec1++;
- if(sec1==60)
- sec1=0;}
- while(!ksec)
- {display1();delay(50);}
- }
- if(kmin==0)
- {delay(5);
- if(kmin==0)
- {min1++;
- if(min1==60)
- min1=0;}
- while(!kmin)
- {display1();}
- }
- if(khour==0)
- {delay(5);
- if(khour==0)
- {hour1++;
- if(hour1==24)
- hour1=0;}
- while(!khour)
- {display1();} } }}
- /*****蜂鳴器*********/
- void clock()
- { unsigned int i;
- for(i=1000;i>0;i--)
- {bear=1;
- P1=0xfe;
- delay(10);
- bear=0;
- P1=0xff;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載(由于我初學,程序還存在一些bug,歡迎大家指正,一起學習研究):
單片機電子時鐘.rar
(1.47 MB, 下載次數: 627)
2018-12-2 15:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
大家也可以在51hei搜索"電子時鐘"4個字有人很多人上傳,其中不乏也有優秀的作品
|