第一篇:單片機(jī)課程設(shè)計(jì)報(bào)告——智能數(shù)字頻率計(jì)
單片機(jī)原理課程設(shè)計(jì)報(bào)告
題目:智能數(shù)字頻率計(jì)設(shè)計(jì)
專業(yè): 信息工程 班級:信息111 學(xué)號:*** 姓名:*** 指導(dǎo)教師:***
北京工商大學(xué)計(jì)算機(jī)與信息工程學(xué)院
1、設(shè)計(jì)目的
(1)了解和掌握一個(gè)完整的電子線路設(shè)計(jì)方法和概念;
(2)通過電子線路設(shè)計(jì)、仿真、安裝和調(diào)試,了解和掌握電子系統(tǒng)研發(fā)產(chǎn)品的一個(gè)基本流程。
(3)了解和掌握一些常見的單元電路設(shè)計(jì)方法和在電子系統(tǒng)中的應(yīng)用: 包括放大器、濾波器、比較器、計(jì)數(shù)和顯示電路等。
(4)通過編寫設(shè)計(jì)文檔與報(bào)告,進(jìn)一步提高學(xué)生撰寫科技文檔的能力。
2、設(shè)計(jì)要求
(1)基本要求
設(shè)計(jì)指標(biāo):
1.頻率測量:0~250KHz; 2.周期測量:4mS~10S; 3.閘門時(shí)間:0.1S,1S;
4.測量分辨率:5位/0.1S,6位/1S; 5.用圖形液晶顯示狀態(tài)、單位等。
充分利用單片機(jī)軟、硬件資源,在其控制和管理下,完成數(shù)據(jù)的采集、處理和顯示等工作,實(shí)現(xiàn)頻率、周期的等精度測量方案。在方案設(shè)計(jì)中,要充分估計(jì)各種誤差的影響,以獲得較高的測量精度。
(2)擴(kuò)展要求
用語音裝置來實(shí)現(xiàn)頻率、周期報(bào)數(shù)。
(3)誤差測試
調(diào)試無誤后,可用數(shù)字示波器與其進(jìn)行比對,記錄測量結(jié)果,進(jìn)行誤差分析。
(4)實(shí)際完成的要求及效果
1.測量范圍:0.1Hz~4MHz,周期、頻率測量可調(diào); 2.閘門時(shí)間:0.05s~10s可調(diào); 3.測量分辨率:5位/0.01S,6位/0.1S; 4.用圖形液晶顯示狀態(tài)、單位(Hz/KHz/MHz)等。
3、硬件電路設(shè)計(jì)
(1)總體設(shè)計(jì)思路 本次設(shè)計(jì)的智能數(shù)字頻率計(jì)可測量矩形波、鋸齒波、三角波、方波等信號的頻率。系統(tǒng)共設(shè)計(jì)包括五大模塊: 主芯片控制模塊、整形模塊、分頻模塊、檔位選擇模塊、和顯示模塊。設(shè)計(jì)的總的思想是以AT89S52單片機(jī)為核心,將被測信號送到以LM324N為核心的過零比較器,被測信號轉(zhuǎn)化為方波信號,然后方波經(jīng)過由74LS161構(gòu)成的分頻模塊進(jìn)行分頻,再由74LS153構(gòu)成的四選一選擇電路控制檔位,各部分的控制信號以及頻率的測量主要由單片機(jī)計(jì)數(shù)及控制,最終將測得的信號頻率經(jīng)LCD1602顯示。
各模塊作用如下: 1.主芯片控制模塊: 單片機(jī)AT89S52 內(nèi)部具有2個(gè)16位定時(shí)/計(jì)數(shù)器T0、T1,定時(shí)/計(jì)數(shù)器的工作可以由編程來實(shí)現(xiàn)定時(shí)、計(jì)數(shù)和產(chǎn)生計(jì)數(shù)溢出時(shí)中斷要求的功能。利用單片機(jī)的計(jì)數(shù)器和定時(shí)器的功能對被測信號進(jìn)行計(jì)數(shù)。以AT89S52 單片機(jī)為控制核心,來完成對各種被測信號的精確計(jì)數(shù)、顯示以及對分頻比的控制。利用其內(nèi)部的定時(shí)/計(jì)數(shù)器完成待測信號周期/頻率的測量。
2.整形模塊:整形電路是將一些不是方波的待測信號轉(zhuǎn)化成方波信號,便于測量。本設(shè)計(jì)使用運(yùn)放器LM324連接成過零比較器作為整形電路。
3.分頻模塊: 考慮單片機(jī)利用晶振計(jì)數(shù),使用11.0592MHz 時(shí)鐘時(shí),最大計(jì)數(shù)速率將近500 kHz,因此需要外部分頻。分頻電路用于擴(kuò)展單片機(jī)頻率測量范圍,并實(shí)現(xiàn)單片機(jī)頻率測量使用統(tǒng)一信號,可使單片機(jī)測頻更易于實(shí)現(xiàn),而且也降低了系統(tǒng)的測頻誤差。本設(shè)計(jì)使用的分頻芯片是74LS161實(shí)現(xiàn)4分頻及16分頻。
4.檔位選擇模塊:控制74LS161不分頻、4分頻 或者 16分頻,控制芯片是74LS153。5.顯示模塊:編寫相應(yīng)的程序可以使單片機(jī)自動調(diào)節(jié)測量的量程,并把測出的頻率數(shù)據(jù)送到顯示電路顯示,本設(shè)計(jì)選用LCD1602。
(2)測頻基本設(shè)計(jì)原理
所謂“頻率”,就是周期性信號在單位時(shí)間(1s)內(nèi)變化的次數(shù)。若在一定時(shí)間間隔T內(nèi)測得這個(gè)周期性信號的重復(fù)變化次數(shù)N,則其頻率可表示為f=N/T(右圖3-1所示)。其中脈沖形成電路的作用是將被測信號變成脈沖信號,其重復(fù)頻率等于被測頻率fx。利用單片機(jī)的定時(shí)/計(jì)數(shù)T0、T1的定時(shí)、計(jì)數(shù)功能產(chǎn)生周期為1s的時(shí)間脈沖信號,則門控電路的輸出信號持 圖3-1 續(xù)時(shí)間亦準(zhǔn)確地等于1s。閘門電路由標(biāo)準(zhǔn)的秒脈沖信號進(jìn)行控制,當(dāng)秒脈沖信號來到時(shí),閘門開通,被測脈沖信號通過閘門送到計(jì)數(shù)譯碼顯示電路。秒脈沖信號結(jié)束時(shí)閘門關(guān)閉,計(jì)數(shù)器停止計(jì)數(shù)。由于計(jì)數(shù)器計(jì)得的脈沖數(shù)N是在1秒時(shí)間內(nèi)的累計(jì)數(shù),所以被測頻率fx=NHz。
(2)系統(tǒng)框圖
本智能數(shù)字頻率計(jì)系統(tǒng)框圖如圖3-2所示
圖3-2智能數(shù)字頻率計(jì)系統(tǒng)框圖
(3)單片機(jī)部分
P0口經(jīng)上拉后做LCD數(shù)據(jù)接口 P2.1~P2.3作為LCD控制端口 P2.4~P2.5作為分頻選擇端口 P3.5作為被測信號輸入端口
P3.2~P3.4作為開關(guān)控制端口(對應(yīng)電路圖中K1,K2,SET)
圖3-3 89D52單片機(jī)部分電路
(4)分頻部分
74HC161與74ls161功能兼容,是常用的四位二進(jìn)制可預(yù)置的同步加法計(jì)數(shù)器,他可以靈活的運(yùn)用在各種數(shù)字電路,以及單片機(jī)系統(tǒng)中實(shí)現(xiàn)分頻器等很多重要的功能。
其管腳圖如圖3-4所示:
圖3-4 74HC161 圖3-5 74HC153管腳圖
74HC153是一個(gè)雙4選1數(shù)據(jù)選擇器,其管腳圖如圖3-5所示:
74LS161對整形后的防波信號進(jìn)行分頻,Q1為四分頻輸出,Q3為16分頻輸出。未經(jīng)分頻、經(jīng)過四分頻和經(jīng)過16分頻的三路信號作為74LS153的一個(gè)4選1數(shù)據(jù)選擇器低三位輸入,由單片機(jī)控制選擇分頻數(shù),然后再送單片機(jī)內(nèi)部計(jì)數(shù)器T1(如圖3-6)。
圖3-6 分頻、選擇分頻檔位電路圖
(5)LCD顯示部分
LCD顯示,1602的八位數(shù)據(jù)I/O口與單片機(jī)的P0口相連,讀寫控制端接P2.0-P2.2口。三個(gè)按鍵中,設(shè)置鍵接P3.2單片機(jī)按外部中斷0接口,當(dāng)按鍵按下后,置P3.2口低電平,單片機(jī)中斷。S1、S2為頻率/周期、閘門時(shí)間加/減選擇按鍵(如圖3-7)。
圖3-7 LCD顯示部分電路圖
4、軟件設(shè)計(jì)
(1)主程序流程圖設(shè)計(jì)
本次程序設(shè)計(jì)采用的是C語言程序設(shè)計(jì),其設(shè)計(jì)流程圖4-1所示:
圖4-1主程序流程圖
(2)子程序流程圖設(shè)計(jì)
<1>顯示程序:
LCD顯示程序設(shè)計(jì)流程如圖4-2所示:
圖4-2顯示程序流程圖 <2>頻率測量程序框圖:
頻率測量程序的整體架構(gòu)如圖4-3所示:
圖4-3頻率測量框架圖
(3)中斷服務(wù)流程圖
INT0中斷流程圖如圖4-4所示:
圖4-4INT0中斷流程圖
(4)程序代碼
#include
//頻率 float p;
//周期 float sj;
//閘門時(shí)間 char idata buff[20];char flag=0;
//頻率、周期選擇標(biāo)志位
char xs=0;//設(shè)置閘門時(shí)間結(jié)束后是否顯示結(jié)果的標(biāo)志位
unsigned char m=0,n=0,yichu=0,fenpin;
//m定時(shí)中斷次數(shù) n計(jì)數(shù)中斷次數(shù) yichu判斷是定時(shí)
//器還是計(jì)數(shù)器溢出
#define Key_Set P3 #define K1 0xf7
//11110111
P33 #define K2 0xef
//11101111
P34 #define NO_Set 0xff #define Freq 0 #define Peri 1
sbit B153=P2^4;sbit A153=P2^3;sbit P17=P3^4;sbit P16=P3^3;sbit P35=P3^5;sbit Set=P3^2;unsigned char LCD_Wait(void);void LCD_Write(bit style, unsigned char input);void LCD_SetDisplay(unsigned char DisplayMode);void LCD_SetInput(unsigned char InputMode);void LCD_Initial();void GotoXY(unsigned char x, unsigned char y);void Print(unsigned char *str);void C52_Initial();void Delay(unsigned int t);void display(float f);void cepin();void panduan();void timedisplay(float sj);void Time_Set1();void Time_Set2();void t0();void t1();
/*****模塊名稱 LCD1602顯示程序******/
/***********************端口定義 ***********************************/
sbit LcdRs= P2^0;sbit LcdRw= P2^1;sbit LcdEn= P2^2;sfr DBPort= 0x80;
//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口 /************************內(nèi)部等待函數(shù)********************************/
unsigned char LCD_Wait(void){
LcdRs=0;
//寄存器選擇輸入端 1:數(shù)據(jù) 0:指令
LcdRw=1;
_nop_();//RW:為0:寫狀態(tài);為1:讀狀態(tài);
LcdEn=1;
_nop_();
//使能輸入端,讀狀態(tài),高電平有效;寫狀態(tài),下降沿有效
LcdEn=0;
return DBPort;
} /**********************向LCD寫入命令或數(shù)據(jù)***************************/
#define LCD_COMMAND 0
// Command #define LCD_DATA 1
// Data #define LCD_CLEAR_SCREEN
0x01
// 清屏 #define LCD_HOMING
0x02
// 光標(biāo)返回原點(diǎn) void LCD_Write(bit style, unsigned char input){
LcdEn=0;
LcdRs=style;
LcdRw=0;
_nop_();
DBPort=input;
_nop_();//注意順序
LcdEn=1;
_nop_();//注意順序
LcdEn=0;
_nop_();
LCD_Wait();} /********************設(shè)置顯示模式*********************************/
#define LCD_SHOW
0x04
//顯示開 #define LCD_HIDE
0x00
//顯示關(guān)
#define LCD_CURSOR
0x02
//顯示光標(biāo)
#define LCD_NO_CURSOR
0x00
//無光標(biāo)
#define LCD_FLASH
0x01
//光標(biāo)閃動 #define LCD_NO_FLASH
0x00
//光標(biāo)不閃動 void LCD_SetDisplay(unsigned char DisplayMode){
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
} /*********************設(shè)置輸入模式***********************************/ #define LCD_AC_UP 0x02 #define LCD_AC_DOWN 0x00
// default #define LCD_MOVE 0x01
// 畫面可平移 #define LCD_NO_MOVE 0x00
//default void LCD_SetInput(unsigned char InputMode){
LCD_Write(LCD_COMMAND, 0x04|InputMode);} /******************初始化LCD**************************************/
void LCD_Initial(){
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38);
//8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
//開啟顯示, 無光標(biāo)
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);
//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);
//AC遞增, 畫面不動 }
/************************************************************************/ void GotoXY(unsigned char x, unsigned char y){ if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));} void Print(unsigned char *str){
while(*str!='