導航:首頁 > 操作系統 > 89c51單片機論文

89c51單片機論文

發布時間:2022-12-19 18:13:58

單片機 89C51

89系列單片機的型號編碼由三個部分組成,它們分別是前綴,型號、後綴。它們的格式如下:
AT89C;×××
××××
其中:AT是前綴;
89C××××是型號;
××××是後綴。
下面分別對這三個部分進行說明,並且對其中有關參數的表示和意義作出相應的解釋。
1.前綴
前綴由字母「AT」組成,它表示該器件是ATMEL公司的產品。
2.型號
型號由「89C××××」或「89LV××××」或「89S××××」等表示。
「89C××××」中,9是表示內部含Flash存儲器;C表示是CMOS產品。
「89LV××××」中,LV表示低電壓產品。
「89S××××」中,S表示含可下載Flash存儲器。
在這個部分的××××表示器件型號數,例如:51,1051,8252等。
3.後綴
後綴由「××××」這4個參數組成。每個參數的表示和意義不同。在型號與後綴部分有「-」號隔開。
後綴中的第一個參數×用於表示速度,它的意義如下:
×=12,表示速度為12MHz,
×=16,表示速度為16MHz,
×=20,表示速度為20MHz,
×=24,表示速度為24MHz,
後綴中的第二個參數×用於表示封裝。它的意義如下:
×=D,Cerdip。
×=J,塑料J引線晶元載體。
×=L,無引線晶元載體。
×=P,表示塑料雙列直插DIP封裝。
×=S,表示SOIC封裝。
×=Q,表示PQFP封裝。
×=A,表示TQFP封裝。
×=W,表示裸晶元。
後綴中第三個參數×用於表示溫度范圍,它的意義如下:
×=C,表示商業產品,溫度范圍為0至+70℃。
×=I,表示工業產品,溫度范圍為-40至+85℃。
×=A,表示汽車用產品,溫度范圍為-40至+125℃。
×=M,表示軍用產品,溫度范圍為-55至+150℃。
後綴中的第四個參數×用於說明產品的處理情況,它的意義如下:
×為空,則表示處理工藝是標准工藝。
×=/883,則表示處理工藝採用MIL-STD-883標准。
例如,有一個單片機型號為「AT89C51-12PI」,則表示意義為,該單片機是ATMEL公司的Flash單片機,內部是C51結構,速度為12MHz,封裝為DIP,是工業用產品,按標准處理工藝生產。

㈡ 單片機課程設計以89C51為基礎設計SPWM波發生器

/******************************************************************************
FileName : main.c
Author : 9long
Date : 2010.5.11
Target : STC89C51
Crystal : 12M
*******************************************************************************
模塊功能 : 用定時中斷調試PWM可調模塊,可以接在直流電機上調速
******************************************************************************/

#include <REG52.H>

/*-----------------------------------宏定義----------------------------------*/
//鍵值表-----------------------------------------------------------------------
#define NOKEY 0
#define KEY1 128
#define KEY2 129
#define KEY3 131
#define KEY4 135
#define KEY5 64
#define KEY6 65
#define KEY7 67
#define KEY8 71
#define KEY9 32
#define KEY10 33
#define KEY11 35
#define KEY12 39
#define KEY13 16
#define KEY14 17
#define KEY15 19
#define KEY16 23

//數碼管位驅動-----------------------------------------------------------------
#define DIG0 0xfe
#define DIG1 0xfd
#define DIG2 0xfb
#define DIG3 0xf7
#define DIG4 0xef
#define DIG5 0xdf
#define DIG6 0xbf
#define DIG7 0x7f

//字元表-----------------------------------------------------------------------
#define CODE0 0xc0
#define CODE1 0xf9
#define CODE2 0xa4
#define CODE3 0xb0
#define CODE4 0x99
#define CODE5 0x92
#define CODE6 0x82
#define CODE7 0xf8
#define CODE8 0x80
#define CODE9 0x90
#define CODEA 0x88
#define CODEB 0x83
#define CODEC 0xc6
#define CODED 0xa1
#define CODEE 0x86
#define CODEF 0x8e
#define CODEH 0x89
#define CODEP 0x8c
#define POINT 0x7f
#define CODE_ 0xf7
#define CODENO 0xff

//LED控制位(PWM模塊介面定義,根據自已的需要更改)------------------------
sbit LED = P1^2;

/*---------------------------------變數定義----------------------------------*/
code const unsigned char NUMBER_CODE[10] =
{CODE0,CODE1,CODE2,CODE3,CODE4,CODE5,CODE6,CODE7,CODE8,CODE9};
code const unsigned char LED_DIG[8] =
{DIG0,DIG1,DIG2,DIG3,DIG4,DIG5,DIG6,DIG7};
unsigned char LED_SEG[8] = {0}; //顯示緩沖區

unsigned char flag_10ms = 0; //10ms標志位
unsigned char last_key = 0;
unsigned char key = 0;

unsigned char PWM_CYCLE = 0; //PWM的周期
unsigned char PWM_ON = 0; //PWM的占空比

/******************************************************************************
函數名稱:Delay1ms()
函數功能: 延時count*1ms
輸入參數:count,無符號整型,最多計65535ms count
輸出參數:無
全局變數:無
******************************************************************************/
void Delay1ms(unsigned int count)
{
unsigned int i=0;
unsigned int j=0;

for(i=0;i<count;i++)
for(j=0;j<120;j++);
}

/******************************************************************************
函數名稱:DisplayCode()
函數功能: 數碼管顯示緩沖,送段驅動
輸入參數:x,無符號整型,最多顯示65535
輸出參數:無
全局變數:LED_SEG[i],NUMBER_CODE[i]
******************************************************************************/
void DisplayCode(unsigned int x)
{
unsigned char m=0;

LED_SEG[7]=CODEF;
LED_SEG[6]=CODE_;
LED_SEG[5]=CODE_;
while(x>=10000){x=x-10000;m++;}LED_SEG[4]=NUMBER_CODE[m];m=0;
while(x>=1000) {x=x-1000;m++;} LED_SEG[3]=NUMBER_CODE[m];m=0;
while(x>=100) {x=x-100;m++;} LED_SEG[2]=NUMBER_CODE[m];m=0;
while(x>=10) {x=x-10;m++;} LED_SEG[1]=NUMBER_CODE[m];m=0;
while(x>=1) {x=x-1;m++;} LED_SEG[0]=NUMBER_CODE[m];m=0;
}

/******************************************************************************
函數名稱:ReadKey()
函數功能: 讀取4*4矩陣按鍵的鍵值
輸入參數:無
輸出參數:按鍵的鍵值
全局變數:無
******************************************************************************/
unsigned char ReadKey(void)
{
unsigned char cord_x=0; //定義行和列
unsigned char cord_y=0;

P3 = 0x0f; //行掃描,高四位輸出低電平,低四位高電平輸入狀態,進行行掃描
cord_x = (P3 & 0x0f); //行掃描值送入cord_x
if(cord_x == 0x0f)
return (0); //無鍵按下,返回0

else //有鍵按下,則繼續進行按鍵掃描
{
P3 = (cord_x | 0xf0); //列掃描,高四位高電平輸入狀態,低四位掃描到的行進行回掃,那一行輸出低電平
cord_y = P3 & 0xf0; //列掃描值送入cord_y
return (~cord_x + ~cord_y); //返回組合碼
}
}

/******************************************************************************
函數名稱:Play()
函數功能: 每10ms刷新顯示和掃描按鍵
輸入參數:無
輸出參數:無
全局變數:flag_10ms,last_key,key,LED_DIG[i],LED_SEG[i]
******************************************************************************/
void Play(void)
{
unsigned char i=0;

while(!flag_10ms); //有標志位則退出循環
flag_10ms = 0; //標志位清零

for(i=0;i<8;i++) //數碼管顯示
{
P2 = LED_DIG[i]; //位驅動
P0 = LED_SEG[i]; //段驅動
Delay1ms(1); //延時1ms
}
P2 = 0xff; //清顯示
P0 = 0xff;

last_key = key; //記住上次鍵值
key = ReadKey(); //讀新鍵值
}

/******************************************************************************
函數名稱:Timer1()
函數功能: 定時器0定時0.1ms
輸入參數:無
輸出參數:無
全局變數:PWM_ON為占空比,PWM_CYCLE為周期
******************************************************************************/
void timer1(void) interrupt 3
{
static unsigned char pwm=0;

pwm++;
if(pwm==PWM_ON)
LED=1; //燈滅
if(pwm==PWM_CYCLE)
{
pwm=0;
if(PWM_ON!=0)
LED=0; //燈亮
}
}

/******************************************************************************
函數名稱:Timer0()
函數功能: 定時器0定時10ms
輸入參數:無
輸出參數:無
全局變數:flag_10ms
******************************************************************************/
void Timer0(void) interrupt 1
{
TH0 = 0xd8; //定時10ms
TL0 = 0xf0;
flag_10ms = 1; //設定標志位
}

/******************************************************************************
函數名稱:main()
函數功能: 主函數
輸入參數:無
輸出參數:無
全局變數:last_key,key,PWM_ON為占空比,PWM_CYCLE為周期
******************************************************************************/
void main (void)
{
TMOD = 0x21; //time0方式1,timer1方式2
EA = 1; //開總中斷
ET0 = 1; //開定時器0中斷
TR0 = 1; //啟動定時器0
ET1 = 1; //開定時器1中斷
TR1 = 1; //啟動定時器1
TH1 = 0x9c; //定時0.1ms
TL1 = 0x9c;

PWM_ON= 1; //設定占空比為1/10;
PWM_CYCLE = 10; //周期為10*0.1ms,可調,隨便設置
P2 = 0x00; /*ULN2003有反向作用,ULN2003輸出為高電平*/

for(;;)
{
Play();
DisplayCode(PWM_ON);
if((last_key == NOKEY) && (key == KEY1))
{
PWM_ON++;
if(PWM_ON>=10)
PWM_ON=0; //調占空比
}
}
}

㈢ 89c51單片機原理

不是兩句話就可以講明白的,最好靜下心來看教材(書本),感覺看電子教材效果不太好,可能因人而異,教材太多了,找一本仔細看,戒驕戒躁,可以看看網上的視頻教程。對內部資源、IO口硬體上的理解很重要。我感覺51單片機就是判斷輸入口的電平狀態(高1低0),分析判斷計算,然後輸出一個電平信號(1或0)給後一級的電路。學習的關鍵是,靜。
剛才只看到你的「89c51單片機原理」了,沒注意下面的「秒錶設計報告「。由於時間關系,只能簡單說一下原理,①單片機內部定時器初始化;②顯示時間初始化,可賦值0;③按開始鍵開啟定時器進入定時器中斷,每記一秒時間值加1;④按復位鍵關閉定時器,並將時間計數器清零。

㈣ 畢業論文的開題報告題目是《基於MCS-51 多倍周期法連續測頻系統的設計與實現 》

基於 AT89C52 的多周期同步測頻技術的實現黃曉峰 上海工程技術大學高職學院,上海 200437 摘 要:論述了傳統的頻率測量方法的原理及誤差。提出了基於 AT89C52 實現多周期同步測頻的新方法。 構造了與待測信號同步的多周期閘門時間,實現了時基信號與待測信號的准同步計數,系統只用一個定時/ 計數器 T2 實現了多周期同步測頻。該頻率測試儀結構簡單,成本較低,能夠在高低頻段范圍內實現頻率參 數的等精度測量,具有較高的測量精度和較短的系統反應時間。 關鍵詞:頻率測量;多周期同步;閘門時間;AT89C52;捕捉方式; 關鍵詞:頻率測量;多周期同步;閘門時間;AT89C52;捕捉方式;等精度測量 中圖分類號: 中圖分類號: 文獻標識碼: 文獻標識碼:B 文章編號: 文章編號: Realization of multi-cycle synchronization based on AT89C52 HUANG Xiao-Feng Vocational Technical College, Shanghai University of Engineering Science, Shanghai, 200437 Abstract:The traditional frequency measuring principles and the errors are introced. The new way of : multi-cycle synchronization based on 89C52 is presented. By structuring multi-cycle gate time synchronistically with the frequency signal, the system use only T2 to acquire under synchronous time base with the frequency signal, and realize the new method of multi-cycle synchronization frequency measuring .With the characteristics of a simple structure ,low cost, high accuracy and short measuring time, this frequency meter can realize equal precision measurement from high frequency to low frequency . Keyword:frequency measurement; multi-cycle synchronization; gate time;AT89C52; capture function;equal : precision measurement 0 引言 頻率作為一種最基本的物理量,是電子測量技術中最重要的被測量之一。本文詳細論 述了傳統頻率測量方法及原理, 並對各種方法的測量誤差進行了分析。 為保證頻率測量精度 和兼顧測量反應時間, 採用多周期同步測頻技術, 設計了以 AT89C52 單片機為核心的頻率參 數測試儀, 由於充分利用 AT89C52 片內定時器/計數器 T2 所特有的捕捉功能, 使得該頻率參 數測試儀的軟硬體結構簡單, 實現了對高低頻段頻率參數的等精度測量, 具有較高的測量精 度和較短的系統反應時間。 1 傳統測頻方法及其誤差分析 頻率測量的方法主要有 M 法、T 法以及 M/T 法 [1] 。M 法的基本測頻原理是在選定的 閘門時間 T 內對被測脈沖信號進行計數,根據計數值 N x 和閘門時間 T 求得所測脈沖信號的 頻率。在 M 法中,由於閘門時間 T 由標准頻率源決定,而單片機的標准頻率源是由晶振頻 率分頻後獲得, 因而保證了閘門時間 T 的精確性。 但由於閘門的啟閉與待測計數脈沖不同步, 閘 門開 通時間 通常 不是待 測信 號周期 的整數 倍, 存在 待測脈 沖信號 的計 數量 化誤差 ?N x = ±1 。由 M 法的測頻原理可知,待測信號頻率 1 fx = Nx N ? f0 = x N0 T (1) 設待測脈沖頻率的准確值為 f xd , 由於單片機測頻系統中的標准頻率源通常是由晶振產 生的頻率信號分頻後得到的, 而晶振的穩定性很高, 只要按測量精度要求選擇合適的晶振後, 由標准頻率源的不穩定性所造成的測頻誤差就可以被忽略掉 (文中的誤差分析均是在忽略標 准頻率源的不穩定性下做出的) 。設 δ Mx 為測量的相對誤差 δM x = f xd = 得 δ Mx = f xd ? f x f xd (2) N x + ?N x T = ?N x N x + ?N x ≤ (3) f xd ? f x f xd 1 Nx (4) 由式(4)知, 當待測脈沖信號頻率較高時, 在閘門時間 T 內被測信號脈沖的計數值 N x 較 大, δ Mx 很小,M 法能夠達到較高的測量精度;而當待測脈沖信號頻率較低時,在閘門時間 T 內 N x 較小, δ Mx 很大,測頻精度降低。例如,被測信號的頻率為 100HZ,則在 1S 內的相對誤差 δ M x =1%。 而當待測脈沖信號的頻率為 10HZ, f x 在 T =1S 內的相對誤差 δ M x =10%。 則 雖然可以通過增大閘門時間 T 來提高測量精度,但閘門時間 T 過長將使系統的測量時間過 長,無法滿足實時性的要求。 T 法的基本原理是在待測脈沖的一個周期內對標准頻率信號進行計數,根據計數值 N 0 和標准信號的頻率 f 0 求得待測脈沖信號的頻率。在 T 法中,由於閘門時間 T 由待測脈沖信 號決定,不存在待測脈沖信號計數的量化誤差 ?N x 。但由於閘門的啟閉與標准頻率源不同 步,故存在對標准頻率源信號的計數量化誤差 ?N 0 = ±1 。由 T 法的測頻原理可知,待測信 號頻率 f x = 1 N 0T0 = f 0 N 0 其中 T0 為標准頻率源信號的周期。同理,可得 (5) δ Tx = f xd ? f x f0 f = ? 0 N 0 + ?N 0 N 0 f xd f0 N 0 + ?N 0 (6) 2 = ?N 0 N 0 ≤ 1 N 0 由於閘門時間 T 是待測脈沖信號周期的整數倍, 當待測脈沖頻率較低時, 閘門時間 T 較 長,對標准頻率源的計數值 N 0 較大,測量精度高;而當待測脈沖頻率較高時,閘門時間 T 過短,甚至與標准頻率源信號周期相近,故高頻測量時 T 法存在嚴重的測量誤差。 理論分析表明, 無論採取何種補償措施, 都無法同時消除對待測脈沖和標准信號的計數 量化誤差。將 M 法和 T 法結合起來就是 M/T 法,M/T 法結合了 M 法和 T 法各自的優點,在被 測信號頻率較高時採用 M 法,頻率較低時採用 T 法,這樣在高、低頻信號測量中都能獲得較 高的精度。但由於在 M 法中, ?N x 隨著被測信號頻率的降低而增大,在 T 法中 ?N 0 隨著被 測信號頻率的增大而增大, 因此必存在 M 法和 T 法的分界點, 在該點高低頻測量的相對誤差 相等且達到最大,即 δ max = δ M x = δ T x 。我們將該點的頻率稱為中界頻率 f C ,由式(1)知 N x = f x ? T ,由式(5)得 N 0 = f 0 f x ,則中界頻率 f C = f 0 T 。雖然 M/T 法能夠在兩端獲 得高精度,但在中界頻率處的誤差卻總是最大的。本系統採用多周期同步測頻原理,利用 AT89C52 片內定時器/計數器 T2 所特有的捕捉方式,實現對信號頻率、周期、脈寬以及占空 比的測量。 2 多周期同步測頻原理及其誤差分析 多周期同步測頻技術的基本原理是在待測脈沖的 m 個周期內同時對對待測脈沖和標准 信號計數, 根據待測脈沖的計數值 N x 和標准信號的計數值 N 0 求得被測信號的頻率 [2,3] 。 由 於閘門時間 T 為待測脈沖的 m 個周期即閘門時間與待測脈沖同步,從而消除了待測脈沖的 計數量化誤差 ?N x 。但由於閘門的啟閉與標准信號不同步,故仍存在對標准信號的計數量 化誤差 ?N 0 = ±1 。設兩個計數器在閘門時間 T 內同時對待測脈沖和標准信號的計數值分別 為 N x 和 N 0 ,則待測信號頻率 fx = Nx T f0 = N0 T 消去閘門時間 T ,得 f x = N x ? f 0 N 0 (7) (8) (9) 同理,相對誤差 δ = f xd ? f x f xd f0 f ?N ? Nx ? 0 x N + ?N 0 N0 = 0 f0 ? Nx N 0 + ?N 0 (10) = ?N 0 N 0 ≤ 1 N 0 = 1 f 0T 3 由式(10)知, δ 只與標准頻率源的頻率 f 0 和閘門時間 T 有關,與待測脈沖的頻率 f x 無 關,實現了整個測量頻段內的等精度測量,使測量精度大大提高。對於標准信號的計數量化 誤差 ?N 0 ,雖然可以通過提高標准頻率源的頻率 f 0 和加大閘門寬度 T 來減小,但需要考慮 標准頻率源工作頻率的限制,以及加大閘門寬度 T 所帶來的系統測量時間的增加。 3 基於 AT89C52 的多周期同步測頻技術的實現 AT89C52 片內有 1 個 16 位的定時/計數器 T2,T2 除具備和定時/計數器 T0、T1 相同的 功能外,還具有捕捉方式、16 位自動重裝等功能 [4,5] 。所謂捕捉功能就是當 T2 的外部輸入 端 T2EX(P1.1)的輸入電平發生負跳變時,就會把 TH2 和 TL2 的內容同時記錄到特殊功能寄存 器 RCAP2H 和 RCAP2L 中,並將外部中斷標志 EXF2 置位,向 CPU 發出中斷申請信號。T2 的 捕捉功能避免了 CPU 在讀計數值的高位元組時, 低位元組還在變化所引起的讀數誤差, 更重要的 是,T2EX(P1.1)上輸入電平連續兩次負跳變的計數差值,就是外部輸入脈沖的周期。 依據多周期同步測頻技術的原理,將 AT89C52 的定時/計數器 T2 設置為定時器捕捉工 作方式,閘門時間 T 為 m 個待測脈沖周期,被測信號經放大、整形、分頻後送入 T2 的外部 輸入端 T2EX(P1.1),在待測信號產生第一次負跳變時,TH2 和 TL2 中的內容(即時基脈沖計 數值)被同時捕捉至特殊功能寄存器 RCAP2H 和 RCAP2L,並在 T2 外部中斷服務程序中記錄 待測信號下降沿的數目, 以此實現閘門開啟及待測脈沖及和時基脈沖的同時計數, 閘門時間 到時(即 T2 的外部輸入端 T2EX 檢測到第 m + 1 個待測脈沖下降沿) ,一次測量過程結束。 在此過程中, 當外部待測脈沖的下降沿到來或定時器 T2 產生對時基脈沖的計數溢出時, T2 外部中斷標志 EXF2 或 T2 溢出標志 TF2 置位,並向 CPU 發出中斷申請信號。CPU 相應中 斷後,在 T2 中斷服務程序中通過軟體判斷是 EXF2 還是 TF2 產生的中斷,並進行相應的處 理,是 EXF2 產生的中斷就記錄下待測脈沖下降沿的數目,若是 TF2 就記錄下 T2 對時基脈 沖的溢出次數。待測頻率具體的計算如下: 設閘門時間 T 內共產生了 m + 1 次 T2 外部中斷( m 個待測脈沖)及 N 次 T2 溢出中斷, 且設第一個待測脈沖的下降沿到來時 T2 對時基的計數值為 l1 , m + 1 個待測脈沖的下降沿 第 到來時 T2 對時基的計數值為 l2 ,則 T2 對時基的計數過程如下(包括 N 次 T2 溢出中斷) 。 l1 L65535 → 0L65535 → 0L65535 → 0LLL0L65535 → 0Ll2 則閘門時間 T = ( l2 ? l1 + 65536 × N ) × T0 = mTx 其中 T0 為單片機時基信號周期, Tx 為待測脈沖信號周期,故被測信號頻率為 fx = k ( l2 ? l1 + 65536 × N ) × mT0 (11) 其中 k 為可編程分頻器相應的分頻數 4 4 系統的軟硬體設計 本系統採用多周期同 步 測 頻 原 理 [3] , 以 盤 AT89C52 單片機為核心, 顯 利用其片內定時器/計數 示 器 T2 所特有的捕捉功能, 器 XTAL2 利用定時器 T2 的捕捉功 復位電路 RESET VSS 能及外部中斷,軟硬體結 GND 合完成待測信號與閘門信 圖1 系統硬體組成框圖 號的同步,以及待測信號 與時基信號的同時刻計數,使用一個定時器/計數器 T2 實現多周期同步測頻技術,使得頻率 測試儀的軟硬體結構簡單易於實現。系統硬體組成框圖如圖 1 所示,主要由放大限幅電路、 波形轉換與整形電路、可編程分頻器電路、單片機最小應用系統及鍵盤顯示器電路組成。輸 入的正弦波、 三角波等各種形式的小信號電壓經放大限幅後, 通過波形轉換電路轉換為方波 信號,再利用 7414 整形為 TTL 電平信號,利用可編程分頻器來擴展頻率測量范圍的上限, 這樣將經過了放大、整形、分頻後的待測脈沖送入單片機最小應用系統的 P1.1(T2 的外部 輸入端 T2EX) ,通過鍵盤顯示器電路來實現被測頻率參數(頻率、周期、脈寬和占空比) 的選擇與動態顯示。 放 大 被測信號 與 限 幅 波 形 變 換 整 形 可 編 程 待測脈沖 分 頻 器 +5V VCC P1.1 XTAL1 鍵 軟體採用自頂向下的模塊化設計方法 [6] ,將 T2中斷服務程序流程圖 N 各個功能分成獨立的模塊,由系統的監控程序統 一管理執行。整個系統由初始化模塊、鍵輸入模 塊(用於測量參數的選擇)、信號頻率測量模塊、 數據處理模塊、數據顯示模塊等組成。上電後, 首先進入系統初始化模塊,在初始化子程序中完 成對定時/計數器 T2 的定時器及捕捉方式的設置, 並啟動 T2。 頻率測量模塊由 T2 中斷服務程序完成, 當外 部待測脈沖的下降沿到來或定時器 T2 產生對時基 脈沖的計數溢出時,T2 向 CPU 發出中斷申請。 CPU 響應中斷後, 通過軟體判斷是 EXF2 還使 TF2 產生的中斷,並進行相應處理。T2 中斷服務程序 流程圖如圖 2 所示。 5 結束語 本文討論了傳統頻率測量方法的原理及誤 差。在此基礎上,對多周期同步測頻技術的原理 及其誤差進行了詳細分析。由於多周期同步測頻 技術的測量精度與被測信號的頻率無關,實現了 整個測量頻段內的等精度測量,消除了 M 法中對 T2外部中斷? Y T2外中斷次數加1 T2溢出中斷 次數加1 Y 第1個外部 脈沖下降沿? N 第m+1個外部 脈沖下降沿? 捕捉寄存器 內容送時基 計數單元1 Y 捕捉寄存器內容 送時基計數單元2 存外中斷次數 外中斷次數清零 存T2溢出次數 溢出次數清零 清TF2中斷 標志 清EXF2中斷標志 中斷返回 圖2 T2中斷服務程序流程圖 5 被測脈沖信號的計數量化誤差 ?N x = ±1 , 克服了 M/T 法中高低頻兩端精度高而中界頻率附 近測量誤差最大的缺陷。 本文提出了基於 AT89C52 實現多周期同步測頻方法, 利用 T2 的捕 捉功能和外部中斷產生與待測信號同步的閘門時間,通過 T2 的定時功能實現了時基信號與 待測信號的同步計數,使得系統只用一個定時器/計數器 T2 就實現了多周期同步測頻技術, 該系統軟硬體結構簡單,具有較高的測量精度和較短的系統反應時間。 參考文獻: 參考文獻: [1] 尹克榮.智能儀表中的頻率測量方法[J].長沙電力學院學報,2002, 17(1):74-76 [2] 章軍,張平,於剛.多周期同步測頻測量精度的提高[J].電測與儀表,2003,40(6):16-18 [3] 王連符.測頻系統測量誤差分析及其應用[J].中國科技信息,2005,(18A):94-94 [4] 李全利.單片機原理及應用技術[M].北京:高等教育出版社,2001 [5] 李群芳 黃建.單片微型計算機與介面技術[M].北京:電子工業出版社,2002 [6] 孫傳友,孫曉斌,漢澤西等,測控系統原理與設計[M].北京:北京航空航天大學出版社,2002 作者簡介: 作者簡介: 黃曉峰(1969-),男,甘肅省甘谷縣人,副教授,碩士,研究方向為檢測技術及智能儀器儀表、計算機控制。 E-mail:[email protected] 電話:13816055435 6

基於 MCS_51單片機的直流電機轉速測控系統設計摘要: 給出了一種基於89C51單片機以及 PWM 控制思想的高精度、高穩定、多任務直流電機轉速測控系 統的硬體組成及關鍵單元設計方法。實驗結果表明該系統能實時、有效地對直流電機轉速進行監測與控制, 而且輸出轉速精度高、穩定性好。 0 引言 目前使用的電機模擬控制電路都比較復雜,測量范圍與精度不能兼顧, 且采樣時間較長, 難以測得 瞬時轉速。本文介紹的電機控制系統利用 PWM 控制原理, 同時結合霍爾感測器來採集電機轉速, 並經 單片機檢測後在顯示器上顯示出轉速值, 而單片機則根據感測器輸出的脈沖信號來分析轉速的過程量, 並 超限自動報警。本系統同時設置有按鍵操作儀表, 可用於調節電機的轉速。 1 系統方案的制定 直流電機控制系統主要是以 C8051單片機為核心組成的控制系統, 本系統中的電機轉速與電機兩端的 電壓成比例, 而電機兩端的電壓與控制波形的占空比成正比, 因此, 由 MCU 內部的可編程計數器陣列 輸出 PWM 波, 以調整電機兩端電壓與控制波形的占空比, 從而實現調速。本系統通過霍爾感測器來實 現對直流電機轉速的實時監測。系統的設計任務包括硬體和軟體兩大部分,其中硬體設計包括方案選定、 電路原理圖設計、PCB 繪制、線路調試; 軟體設計包括內存空間的分配, 直流電機控制應用程序模塊的 設計, 程序調試、軟體模擬等。 2 硬體設計 C8051是完全集成的混合信號系統級 MCU 晶元, 具有64個數字 I/O 引腳, 片內含有 VDD 監視器、 看門狗定時器和時鍾振盪器, 是真正能獨立工作的片上系統, 並能快捷准確地完成信號採集和調節。同 時也方便軟體編程、干擾防制、以及前向通道的結構優化。 本單片機控制系統與外部連接可實時接收到外部信號, 以進行對外部設備的控制, 這種閉環系統可 以較准確的實現設計要求, 從而制定出一個合理的方案, 圖1所示是電機測控系統框圖。 圖1 電機測控系統框圖。 本系統先由單片機發出控制信號給驅動電機, 同時通過感測器檢測電機的轉速信號並傳送給單片機, 單片機再通過軟體將測速信號與給定轉速進行比較, 從而決定電機轉速, 同時將當前電機轉速值送 LED 顯示。此外, 也可以通過設置鍵盤來設定電機轉速。系統中的轉速檢測裝置由霍爾感測器組成, 並通過 A/D 轉換將轉速轉換為電壓信號, 再以脈沖形式傳給單片機。這種設計方法具有頻率響應高(響應頻率達 20 kHz 以上)、輸出幅值不變、抗電磁干擾能力強等特點。其中霍爾感測器輸入為脈沖信號, 十分容易與 微處理器相連接, 也便於實現信號的分析處理。單片機的 T0口可對該脈沖信號進行計數。 設計時, 可通過單片機的 P0.1~P0.5 五個介面來完成鍵盤的輸入, P1.6口可完成鳴叫和報警, P2.0 接電機, P2.1~P2.4接顯示器的位選, P0口為顯示器段選碼, 其硬體連接電路如圖2所示。 圖2 硬體連接電路圖。 本系統的脈沖寬度調制(Pulse Width Molation)原理是: 脈沖寬度調制波由一列占空比不同的矩形脈 沖構成, 其占空比與信號的瞬時采樣值成比例。該系統由一個比較器和一個周期為 Ts 的鋸齒波發生器組 成。脈沖信號如果大於鋸齒波信號, 比較器輸出正常數 A, 否則輸出0。圖3所示為脈沖寬度調制系統的 調制原理和波形圖。 圖3 脈寬調制過程。 設樣本 τk 為均勻脈沖信號, 它的第 k 個矩形脈沖可以表示為: 其中, x {t} 是離散化信號; Ts 是采樣周期,τ0是未調制寬度, m 是調制指數。現假設脈沖幅度為 A, 中心在 t=kTs 處, τk 在相鄰脈沖間變化緩慢, 那麼, 其 Xp (t) 可表示為: 其中, 為電機角速度,結合式(2) 可見, 脈沖寬度信號可由信 號 x (t)加上一個直流成分以及相位調制波構成。當 τ0<<> 因此, 脈沖寬度調制波可以直接通過低通濾波器進行解調。C8051單片機有2個12位的電壓方式 DAC, 每個 DAC 的輸出擺幅為0 V~VREF, 對應的輸入碼范圍是0x000~0xFFF。通過交叉開關配置可將 CEX0~CEX4 配置到 P2 埠, 這樣, 改變 PWM 的占空比就可以調整電機速度。 LED 顯示採用動態掃描方式, 並用單片機 I/O 介面擴展輸出, 再由三極體驅動各顯示器的位選端並 放大電流。獨立式按鍵採用查詢方式, 按鍵輸入均採用低有效, 上拉電阻可用於保證在按鍵斷開使其 I/O 口為高電平。單片機的 I/O (P0.1~0.5)引腳所擴展的5個按鍵分別定義為: 設置、啟動、移位、開始、+1 功能。硬體電路確定以後, 電機轉速控制的主要功能將依賴於軟體來實現。 3 軟體設計 本系統的軟體程序的設計可分為5個步驟: 分別是綜合分析並確定演算法; 設計程序流程圖;合理選擇和分配內存單元以及工作寄存器; 編寫程 序; 上機調試運行程序。 應用軟體的設計可採用模塊化結構設計, 其優點是每個模塊的程序結構相對簡單, 且任務明確, 易 於編寫、調試和修改; 其次是程序可讀性好, 對程序的修改可局部進行, 而其他部分可以保持不變, 這 樣便於功能擴充和版本升級; 另外, 對於使用頻繁的子程序, 可以建立子程序庫, 以便於多個模塊調 用; 最後是便於分工合作, 多個程序員可同時進行程序的編寫和調試工作, 故可加快軟體研製進度。 本程序採用8051單片機的 C 語言編程來實現。 在系統的程序設計中, 可採用模塊化編程實現。 整個軟體由主程序模塊、轉速測量模塊、時鍾模塊、數據通信模塊、動態顯示模塊等組成。各模塊均 採用結構化程序設計思想設計, 因而具有較強的通用性; 而採用模塊化程序結構則可使軟體易於調試、 維護和移植。 系統軟體可根據硬體電路的功能與 AT89C51各管腳的連接情況對軟體進行設計。以便明確各引腳所要 完成的功能, 從而方便進行程序設計和內存地址的分配, 最終完成程序模塊化設計。 本系統為直流電機測控系統。根據系統性能要求, 除復位電路外, 還應該設置一些功能鍵: 包括啟動鍵、設置鍵、確定鍵、移位鍵、加1鍵等。由於本系統中的單片機還有閑置的 I/O 口線,而系 統要求所設置的按鍵數量也不多, 因此, 可以採用獨立式按鍵結構。 根據直流電機控制系統的結構, 該電機轉速控制系統為一簡單的應用系統, 可以採用順序的設計方 法。這種設計由主程序和若干個中斷服務程序構成, 整個電機轉速測控系統可分成六大模塊, 每個模塊 完成一定的功能。圖4所示是根據電路圖確定的程序設計模塊圖。 圖4 直流電機控制軟體設計模塊圖。 其中主程序模塊主要設置主程序的起始地址、中斷服務程序的起始地址、有關內存單元及相關部件的 初始化和一些子程序調用等。其主程序流程圖如圖5所示。 圖5 主程序流程圖。 對於定時器 T1 (1s) 子程序的設計,其實在單片機中,定時功能既可以由硬體(定時/計數器) 實現,也 可以通過軟體定時程序來實現。軟體延時程序要佔用 CPU 的時間, 因而會降低 CPU 的利用率。而硬體定 時則通過單片機內的定時器來定時, 而且, 定時器啟動以後可與 CPU 並行工作, 故不佔用 CPU 的時間, 從而可使 CPU 具有較高的工作效率。 本系統採用硬體定時和軟體定時並用的方式, 即用 T1溢出中斷功能來實現10 ms 定時, 而通過軟體 延時程序實現1 ms 定時。其中 T1定時器中斷服務程序的功能主要實現轉速值的讀入、檢測與緩存處理。 對於定時器 T1的計數初值計算, 由於本系統採用的是6 MHz 的時鍾頻率, 所以, 一個機器周期時 間是2 ?s。這樣, 根據 T1定時器產生500 ?s 的定時, 便可以計算出計數初值。 本文設計的轉速測控系統的工作方式寄存器 TMOD=00010000B, T1定時器以工作方式2來完成定時。 4 程序調試 程序調試可在偉福模擬軟體上進行編制, 該軟體支持離線運行, 純軟體環境可模擬單步、跟蹤、全 速、 斷點; 源文件模擬、 匯編等, 並可支持多文件混合編程。 模擬調試後的目標程序可以固化到 EPROM, 然後用專門的程序燒寫器對89C51單片機進行程序燒寫。 5 結束語 本設計採用 C51進行編程, 程序佔用存儲器單元少, 執行速度快, 並能夠准確掌握執行時間, 實 現精細控制。同時由於採用89C51為 CPU,並利用雜訊抵抗能力較強的 PWM 控制技術、串列口擴展顯示 器介面和 I/O 口擴展鍵盤, 因而可省去片外 RAM, 而且體積小, 功能全, 小巧靈活,操作方便, 又 可安裝在工作現場單獨工作。因而具有較大的實用價值和良好的應用前景。

㈤ 求智能型電熱水器控制系統(基於89C51)畢業設計論文綜述,謝謝啦

可不能馬虎,最好還是自己動動腦筋,好好的寫一寫。.網上那種免費的畢業設計千萬不能採用,要麼是論文不完整,要麼是程序運行不了,最重要的是到處都是,老師隨時都可以知道你是在網上隨便弄的那就不好了,我去年的畢業設計是在【天下文庫】寫的,質量挺不錯的。你要是實在沒辦法,可以去看下

1、論文題目:要求准確、簡練、醒目、新穎。
2、目錄:目錄是論文中主要段落的簡表。(短篇論文不必列目錄)
3、提要:是文章主要內容的摘錄,要求短、精、完整。字數少可幾十字,多不超過三百字為宜。
4、關鍵詞或主題詞:關鍵詞是從論文的題名、提要和正文中選取出來的,是對表述論文的中心內容有實質意義的詞彙。關鍵詞是用作機系統標引論文內容特徵的詞語,便於信息系統匯集,以供讀者檢索。 每篇論文一般選取3-8個詞彙作為關鍵詞,另起一行,排在「提要」的左下方。 主題詞是經過規范化的詞,在確定主題詞時,要對論文進行主題,依照標引和組配規則轉換成主題詞表中的規范詞語

㈥ 基於89C51單片機的溫度控制系統

看看這個行不?

㈦ 51單片機的畢設題目與資料有嗎

第四文件
1:小車計時
2:汽車座椅
3:沒意思 285922500萬年歷
4:智能照明+遙控+電力通訊+無線+原理圖
5:整理--室內環境監測系統的研究與設計二次修改
6:夏雪之夢 469857178溫控控制50---100AD+加熱製冷發送
7:基於51單片機的溫濕度計設計.doc
8:數控電源
9:交通燈20111217
10:基於單片機89C51的數字體溫計設計
11:基於AT892051單片機的倒車防撞預警系統設計和實現 .doc
12:浮雲單87714897電加熱器
13:純數字電路時鍾模擬+原理圖
14:車胎檢測--基於單片機AT89S52的汽車胎壓監測系統TPMS.doc
15:ad590+tl480+高低溫溫度控制+RS232
16:1602電子鍾課程設計無溫度
第三文件
17:LED燈無級調光智能控制系統的設計和實現 聲控變紅外控
18:基於PWM模塊的智能風扇調速
19:聲控彩燈基於單片機的音樂彩燈控制器.doc
20:液位感測器--基於AT89CS51液位控制器設計.doc
21:音樂播放--全套==基於單片機的音樂播放器設計——軟體設計.doc
第二文件
22:基於AT89c2051的簡易時鍾設計.doc
23:why的電熱水器==基於AT89S51單片機的智能電熱水器的設計--畢業設計.doc
24:場館入場人數統計--基於89s52的場館門票統計的設計.doc
25:計程車計價器簡單雙位計數+論文
26:基於89s51單片機的室內智能通風控制系統研究
27:電動自行車儀表顯示系統
28:基於單片機的超速報警器的電路設計
29:溫度濕度計LED顯示
30:智能路燈控制光控額時間控制無調光
第一文件
31:智能充電器
32:無線恆溫箱
33:萬年歷帶秒錶鬧鍾倒計時溫度禮拜帶紅外感應
34:萬年歷帶第幾周分屏顯示
35:基於AT89S51的停車場的設計.doc
36:生光觸延時開關
37:汽車座椅有記憶
38:偶爾偏執浴室水溫控制電路設計
39:交通燈001じ☆運♀志♂
40:基於AT89c51的簡易時鍾設計.doc
41:基於無線通訊技術的新型LED點陣屏的研製
42:基於數字邏輯電路的8路搶答器
43:基於51單片機電語音播報脈搏計
44:過客的溫度濕度計
45:多路遠程式控制制信息採集
46:單片機定時器在養雞場得應用
47:百秒倒計時--基於89C51的99秒倒計時設計.doc
48:89c51單片機8路搶答00
49:485通信智能窗簾
50:基於51單片機的8路無線搶答器

㈧ 求基於AT89C2051單片機的水溫控制系統開題報告和論文

用一個STC89S52單片機+DS18B20溫感可以不?!
ds18b20可以使用密封包裝,同樣能放置在水中,而且精確度能在0.1℃。

我的blog,歡迎學習交流!
http://blog.163.com/jammy_lee/

㈨ 單片機89c51的電子時鍾課程設計

#include <reg52.h>

#include<stddef.h>

#define uchar unsigned char

#define uint unsigned int

#define LCD1602_FLAG

#define LCD1602_PORT P0


sbit lcd1602_rs=P2^0;

sbit lcd1602_e=P2^2;

sbit lcd1602_rw=P2^1;

sbit lcd1602_busy=P0^7;

sbit key_ch=P3^5;

sbit key_add=P3^6;

sbit key_minus=P3^7;


uchar i,sec,min,h,date,month,flag;

uint year;

uchar *chgstr[7]={" ","sec","min","hour","date","min","year"};

uchar j,k,m,n,o,p;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uchar timestr[10],datestr[10];

void init();

void delay(uint);

void time_display();

void date_display();

void control();

void time();

/*

************************************

* 函數名稱:lcd1602_CheckBusy()

* 函數功能:狀態查詢

************************************

*/


void lcd1602_CheckBusy()

{

do

{

lcd1602_busy=1;

lcd1602_rs=0;

lcd1602_rw=1;

lcd1602_e=0;

lcd1602_e=1;

}

while(lcd1602_busy);

}


/*

***************************************

* 函數名稱: lcd1602_WriteCmd()

* 函數功能:寫命令

* 入口參數:命令字

* 出口參數:無

***************************************

*/


void lcd1602_WriteCmd(const uchar cmd)

{

lcd1602_CheckBusy();

lcd1602_rs=0;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=cmd;

lcd1602_e=0;

}


/*

*******************************************

* 函數名稱:lcd1602_WriteData()

* 函數功能:寫數據

* 入口參數:c--待寫數據

* 出口參數:無

*********************************************

*/


void lcd1602_WriteData(const uchar c)

{

lcd1602_CheckBusy();

lcd1602_rs=1;

lcd1602_rw=0;

lcd1602_e=1;

LCD1602_PORT=c;

lcd1602_e=0;

}


/*

***********************************************

* 函數名稱:lcd1602_Init()

* 函數功能:初始化LCD

* 入口參數:無

* 出口參數:無

***********************************************

*/


void lcd1602_Init()

{

lcd1602_WriteCmd(0x38); //顯示模式為8位2行5*7點陣

lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,

lcd1602_WriteCmd(0x06); //flag move to right,screen don't move

lcd1602_WriteCmd(0x01); //clear screen

}


/*

************************************************

* 函數名稱:lcd1602_Display()

* 函數功能: 字元顯示

* 入口參數:ptr--字元或字元串指針

* 出口參數:無

* 說 明:用戶可通過以下方式來調用:

* 1)lcd1602_Display("Hello,world!");

* 2) INT8U 存儲類型 txt[]="要顯示的字元串";

* 或者 INT8U 存儲類型 txt[]={'t','x','t',..,''};

* INT8U *ptr;

* ptr=&txt;

* lcd1602_Display(ptr);

* 或 lcd1602_Display(txt);

* 或 lcd1602_Display(&txt);

************************************************

*/


void lcd1602_Display(const uchar *ptr,uchar line,uchar xaddr)

{

uchar data i=0;

uchar *data q;


q=ptr;

switch(line)

{

case 0:

lcd1602_WriteCmd(0x80+xaddr);

while(q!=NULL && (*q!='') && i<16)

{

lcd1602_WriteData(*q);

q++;

i++;

}

break;

case 1:

lcd1602_WriteCmd(0xc0+xaddr);

while(q!=NULL && (*q!='') && i<16)

{

lcd1602_WriteData(*q);

q++;

i++;

}

break;

}

}



void main()

{

lcd1602_Init();

init();

while(1)

{

time_display();

date_display();

control();

}

}

void init()

{

i=0;

sec=0;

min=30;

h=7;

date=17;

month=10;

year=2017;

flag=0;

EA=1;

ET0=1;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void time_display()

{

timestr[7]=0x30+sec%10;

timestr[6]=0x30+sec/10;

timestr[5]=':';

timestr[4]=0x30+min%10;

timestr[3]=0x30+min/10;

timestr[2]=':';

timestr[1]=0x30+h%10;

timestr[0]=0x30+h/10;

timestr[8]=0;

lcd1602_Display(timestr,1,3);

}

void date_display()

{

datestr[9]=0x30+date%10;

datestr[8]=0x30+date/10;

datestr[7]=':';

datestr[6]=0x30+month%10;

datestr[5]=0x30+month/10;

datestr[4]=':';

datestr[3]=0x30+year%10;

datestr[2]=0x30+year/10%10;

datestr[1]=0x30+year/100%10;

datestr[0]=0x30+year/1000;

lcd1602_Display(datestr,0,2);

}

void control()

{

if(!key_ch)

{

delay(5);

if(!key_ch)

{

flag++;

TR0=0;

if(flag==7)

{flag=0;TR0=1;lcd1602_Init();}

lcd1602_Display(chgstr[flag],1,12);

}

}

while(!key_ch);

if(flag==1&&key_add==0)

{

while(!key_add);

sec++;

if(sec==60)

sec=0;

}

if(flag==1&&key_minus==0)

{

while(!key_minus);

sec--;

if(sec==-1)

sec=59;

}


if(flag==2&&key_add==0)

{

while(!key_add);

min++;

if(min==60)

min=0;

}

if(flag==2&&key_minus==0)

{

while(!key_minus);

min--;

if(min==-1)

min=59;

}


if(flag==3&&key_add==0)

{

while(!key_add);

h++;

if(h==24)

h=0;

}

if(flag==3&&key_minus==0)

{

while(!key_minus);

h--;

if(h==-1)

h=23;

}


if(flag==4&&key_add==0)

{

while(!key_add);

date++;

if(date==29)

if((year%4!=0)&&(month==2))

date=1;

if(date==30)

if((year%4==0)&&(month==2))

date=1;

if(date==31)

if((month==4)||(month==6)||(month==9)||(month==11))

date=1;

if(date==32)

if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))

date=1;

}


if(flag==4&&key_minus==0)

{

while(!key_minus);

if(date>1)date--;

}


if(flag==5&&key_add==0)

{

while(!key_add);

month++;

if(month==13)

month=1;

}

if(flag==5&&key_minus==0)

{

while(!key_minus);

month--;

if(month==0)

month=12;

}


if(flag==6&&key_add==0)

{

while(!key_add);

year++;

if(year==99)

year=1;

}

if(flag==6&&key_minus==0)

{

while(!key_minus);

year--;

if(year==0)

year=99;

}

}


void T0_rpt() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

i++;

time();

}


void time()

{

if(i==20)

{

i=0;

sec++;

if(sec==60)

{

sec=0;

min++;

if(min==60)

{

min=0;

h++;

if(h==24)

{

h=0;

min=0;

sec=0;

date++;

if(date==29)

if((year%4!=0)&&(month==2))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

if(date==30)

if((year%4==0)&&(month==2))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

if(date==31)

if((month==4)||(month==6)||(month==9)||(month==11))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

if(date==32)

if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))

{

date=1;

month++;

if(month==13)

{

month=1;

year++;

}

}

}

}

}

}

}

閱讀全文

與89c51單片機論文相關的資料

熱點內容
能否給隱藏相冊加密 瀏覽:594
糖心app改什麼名 瀏覽:823
戰地1控伺服器如何部署 瀏覽:392
xp還原系統輸入命令 瀏覽:321
mysql命令行版本 瀏覽:303
如何進入itunes找文件夾 瀏覽:832
CAD中重復命令使用 瀏覽:477
心智pdf 瀏覽:475
網站電台直播間源碼 瀏覽:852
文件夾14c和18c的區別 瀏覽:34
android隱式調用 瀏覽:667
plc的編程指令邊沿繼電器 瀏覽:723
voc文件夾 瀏覽:865
租廣東聯通伺服器注意什麼雲空間 瀏覽:934
javascript高級程序設計pdf 瀏覽:292
pwm單片機原理 瀏覽:346
ai演算法在線修復圖片 瀏覽:981
scratch編程中如何做射擊游戲 瀏覽:479
at89c51編程器 瀏覽:343
項目經理叫醒程序員 瀏覽:344