定時器來輸出波形是一種比較簡單且準確的方式。但是即便是程序比較簡單也依然會存在相應的問題。本次實驗代碼將主要以代碼註釋的形式來輔助理解。
要求:
使用定時器T0,採用方式2定時,在P1.0腳輸出週期爲400μs,佔空比爲4:1的矩形脈衝,要求在P1.0腳接有虛擬示波器,觀察P1.0腳輸出的矩形脈衝波形。
(默認晶振頻率爲12MHz)
知識補充:
1.
根據所要設定的時間,計算設置引腳的初值應該採用如下公式
公式當中t代表要設置的定時時間,X代表初值,n代表你所用的方式當中對應的位數,f代表晶振(crystal oscillator)的頻率一般設定爲12.
補充:
方式0:n=13
方式1:n=16
方式2:n=8
2.
3.
有了週期的計算方式,我們要了解一下什麼是佔空比,佔空比4:1的意思實際上就是高電平與低電平在一個週期內所佔時間的比值。也就是說,一共有400μs那麼320μs是高電平,80μs爲低電平。
思路分析
這裏要做的實際上就是一個簡單的計時任務,但是表面上看存在的問題是方式二最大可以計時256μs而要求的是400μs,高電平的時間是320μs,是大於它的,無法計時。但是如果我們想深入一點,從中斷的角度考慮,我們可以在中斷以後對於現在週期的屬性進行一個判斷。從而得到答案。以此題爲例,我們的計時週期設定爲80μs,前四次進入中斷我讓它是高電平,第五次就讓它是低電平就可以了。既然這樣想到了,基本就解決了這道題。代碼如下:
#include <reg51.h>
char t=0;//用於記錄次數
sbit P1_0=P1^0;//P1的0口
void main(void)
{
TMOD=0x02;
TH0=0xb0;
TL0=0xb0;
P1_0=0;
EA=1;
ET0=1;
TR0=1;
while(1);//在此死循環等待中斷
}
void timer1() interrupt 1//中斷程序1意味着T0中斷
{
//由於本題的中斷時間是1:4所以單純的去翻
t+=1;
P1_0=1;
if(t>=4)//不要僅憑眼睛看那個藍燈不閃就說明錯誤,實際上頻率過快,肉眼無法分辨
{
t=0;
TL0=0xb0;
P1_0=0;
}
else
{
TL0=0xb0;
}
}
要說明的是這裏的0xb0也可以直接寫作對應的十進制就是176.
利用proteus進行仿真,如果不知道如何將二者進行連接的話,可以查看如下連接講述了兩個軟件的連接。
點我查看
Proteus電路圖
元件名稱:
接地:ground
電容:capacitor
電阻:RES
開關:BUTTON
示波器:下圖紅箭頭位置第一個
晶振:CRYSTAL
點擊運行後右擊示波器選擇最下面的選項(Digital Oscillorscope)即可查看波形
波形如下:
要注意的是右下角的第一個旋轉開關是可以調節每個小方格的週期長度的。我設置的是0.4μs也就是400ms