在測量控制系統(tǒng)中,常常要求有一些實時時鐘,以實現(xiàn)定時控制、定時測量或延時動作,也往往要求有計數(shù)器能對外部事件計數(shù),如測電機轉速、頻率、工件個數(shù)等。廣泛用于個人家庭、學校、工廠等場所,是人們?nèi)粘I睢⒐ぷ髦胁豢扇鄙俚谋匦杵贰?/p>
實現(xiàn)定時,有軟件、數(shù)字電路和可編程定時器3種主要方法。可編程定時計數(shù)器是為方便微型計算機系統(tǒng)的設計和應用而研制的,它是硬件定時,又能很容易地通過軟件來確定和改變它的定時值,通過初始化編程,能夠滿足各種不同的定時要求,因而在嵌入式系統(tǒng)的設計和應用中得到廣泛的應用。
單片計算機即單片微型計算機,是集CPU、RAM、ROM、定時/計數(shù)和多種接口于一體的微控制器。它體積小,成本低,功能強,廣泛應用于智能產(chǎn)品和工業(yè)自動化。而51單片機是各單片機中最為典型和最有代表性的一種。
方波是一種非正弦曲線的波形,通常會于電子和訊號處理時出現(xiàn)。理想方波只有“高”和“低”這兩個值。電流的波形為矩形的電流即為方波電流。不論時間軸上下是不是對稱的,只要是矩形就可叫方波,必要時,可加“對稱”,“不對稱”加以說明
通過單片機內(nèi)部的計數(shù)器/定時器,采用軟件編程來產(chǎn)生方波,這種方法的硬件線路較簡單,系統(tǒng)的功能一般與軟件設計相關。
選擇MCS-51系列中的8031單片機,由于是用指示燈顯示輸出方波信號,一個LED顯示燈即可滿足設計要求。
8031是最常見的的MCS-51系列單片機,是inter公司早期的成熟的單片機產(chǎn)品,應用范圍涉及到各行各業(yè)。
存儲器空間以及存儲器
1、內(nèi)部數(shù)據(jù)存儲器結構:
復位后:內(nèi)部RAM 區(qū)及外部RAM 區(qū)皆保持原值
2、程序狀態(tài)字: PSW
CY:進、借位,有進、借位:CY=1
AC:半進、借位,有半進、借位:AC=1
F0:用戶標志位(由用戶設定)
RS1,RS0:工作寄存器組選擇位
00:選擇0組
01:選擇1組
10:選擇2組
11:選擇3組
OV:溢出位,有溢出:OV=1
X:無效位
P:奇偶位,運算結果有奇數(shù)個1:P=1
3、程序存儲器特定入口:
0000H: 復位或開機后的程序入口
0003H: 外部中斷0 服務程序入口
000BH: 定時/計數(shù)器0 中斷服務程序入口
0013H: 外部中斷1 服務程序入口
001BH: 定時/計數(shù)器1 中斷服務程序入口
0023H: 串行I/O 中斷服務程序入口
定時/計數(shù)器
8031 片內(nèi)有兩個16位定時/計數(shù)器(增量式計數(shù))
1、工作方式(方式0、方式1、方式2、方式3)
以定時/計數(shù)器1為例
⑴方式0(13位定時/計數(shù))
⑵方式1(16位定時/計數(shù))
⑶方式2(8位自動重裝時間常數(shù)定時/計數(shù))
⑷方式3(僅適用于定時/計數(shù)器0)
TL0 用于8位定時/計數(shù)
TH0 只用于8位定時
控制寄存器
⑴定時/計數(shù)器方式控制寄存器:TMOD
GATE: 門控位,1:打開,0:關閉
C/T: 工作狀態(tài)選擇,1:計數(shù)狀態(tài),0:定時狀態(tài)
M1,M0:工作方式選擇
00 方式0
01 方式1
10 方式2
11 方式3
⑵定時/計數(shù)器控制寄存器:TCON
中斷系統(tǒng)
5個中斷源:
INT0: 外部中斷0
INT1: 外部中斷1
T0: 定時/計數(shù)器0中斷
T1: 定時/計數(shù)器1中斷
TI/RI: 串行I/O中斷
⑴中斷允許寄存器:IE(1:允許;0:不允許)
PT1:T1 中斷優(yōu)先位
PX1:INT1 中斷優(yōu)先位
PT0:T0 中斷優(yōu)先位
PX0:INT0 中斷優(yōu)先位
(同級中斷時的優(yōu)先順序:INT0→T0→INT1→T1→RI/TI) CPU 響應中斷后,自動清除中斷請求標志(只有串行口中斷請求標志需用軟件清除),并將程序計數(shù)器PC 之值壓入堆棧,然后將相應的中斷入口地址裝入PC,使程序轉入相應的中斷服務程序。
并行I/O端口(P0、P1、P2、P3)
8031 單片機中:
P0 口:作為地址低8位和雙向數(shù)據(jù)總線 P2 口:作為地址高8位總線 1、P1 端口
P1 口每一位的內(nèi)部結構如下:
注:當P1 口作輸入時,必須先向P1 口寫“FFH”(即11111111),由于單片機上電或復位后P0 口-P3 口皆置為“FFH”,故一般不需人為寫“FFH”。 說明:其他端口本設計電路所用甚少,這里不作詳細介紹。
串行I/O端口
8031 有一個串行端口
? ? ? ? 1、串行通訊基本方式
⑴異步傳送: ⑵同步傳送:
2、串行端口的工作方式(方式0、方式1、方式2、方式3)
? ? ? ? 3、串行端口的控制寄存器
⑴SCON:串口控制寄存器 ⑵PCON:電源控制寄存器
主程序模塊
主程序主要用于系統(tǒng)初始化:P1.7初始化清零,P1.0置位,設T1為定時器方式1,計數(shù)器方式2,置計數(shù)器初始值,然后啟動計數(shù)器。
定時器/計數(shù)器的啟停
T0為定時方式,在置TR0=1以后,定時立即開始,但在定時時間到后,還必須用軟件再次裝入初值,重新啟動才能開始新的定時。
T1為計數(shù)方式2,在置TR1=1以后,計數(shù)開始,在計數(shù)次數(shù)到以后,自動裝入初始值并重新計數(shù),因此軟件設計不再考慮裝入初值
計數(shù)/定時器模塊
1、計數(shù)/定時器工作方式的選擇
根據(jù)課題要求,可將T0設定為50ms的定時間隔,才用工作方式1。當定時時間到后,將P1.0輸出反相,再加到T1輸入端作計數(shù)脈沖。
從T1端輸入,需要定時兩次才能構成一個完整的計數(shù)脈沖。因此,設T1計數(shù)次數(shù)為10次,就能完成1S的定時:
(50ms+50ms)×10=1s
由于LED的亮/滅是持續(xù)不斷的,所以可以將T1設成為方式2,自動裝入初值,重復進行計數(shù)。 2、定時/計數(shù)器初值的計算與裝入 X=65536-Focs/12·T
=65536-11.0592/12·1000000×50×0.001=19 456=4C00H 即TH0=4CH,TL0=00H
T1計數(shù)器在方式2下是8位的,計數(shù)10次的初值為: (256-10)=246=F6H
同時裝入TH1和TL1,即TH1=0F6H,TL1=0F6H
8051單片機,用定時器輸出方波。周期20ms,占空比5%-10%,可通過串口調(diào)節(jié),P1.0輸出波形,P1.1串口輸入,C程序。
串口接收占空比,定時器控制,比如串口接受到的數(shù)據(jù)是8,那么占空比就是8%,定時器就按這個數(shù)來控制波形。
用標準串口吧,比較簡單一點,用P1.1的話,還得編驅動,很麻煩的。
#include《reg51.h》
#define uchar unsigned char
sbit pwm=P1^0;
uchar u_p=5,num=0;
void t0isr() interrupt 1
{
num++;
if(num《=u_p)pwm=1;
if(num》u_p)pwm=0;
num%=100;
}
void uart() interrupt 4
{
if(RI)
{
RI=0;
u_p=SBUF;
}
}
main()
{
TMOD=0x22;
TH0=56;
TL0=56;
TH1=0xfd;
TL1=0xfd;
TR0=1;
TR1=1;
ET0=1;
ES=1;
EA=1;
pwm=1;
while(1);
}
使用單片機定時器在P1.0口產(chǎn)生200Hz方波程序
#include
void main()
{
P1^0 = 0; // 清P0口
/////////
TMOD = 0x00; // T0使用定時模式,工作模式0,無門控位
TH0 = 0x60; // 為T0填入初值,定時時間5ms
TL0 = 0x78;
TR0 = 1; // 啟動T0
ET0 = 1; // 允許定時器0中斷
EA = 1; // CPU開放中斷
while(1); // 循環(huán)等待
}
void timer0_int () interrupt 1 using 2 // T0溢出中斷,使用工作組2
{
TH0 = 0x60; // 重新填入初值
TL0 = 0x78;
P1^0= ~P1^0; // P1.0取反,產(chǎn)生方波
}
單片機 定時器產(chǎn)生10k方波
#include《reg52.h》 //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
sbit OUT=P1^2; //定義OUT輸出端口
/*------------------------------------------------
定時器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用“|”符號可以在使用多個定時器時不受影響
//TH0=0x00; //給定初值,這里使用定時器最大值從0開始計數(shù)一直到65535溢出
//TL0=0x00;
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關打開
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
Init_Timer0();
while(1);
}
/*------------------------------------------------
定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
TH0=(65536-50)/256; //重新賦值 12M晶振計算,指令周期1uS,
TL0=(65536-50)%256; //1mS方波半個周期50uS,即定時50次
//溢出然后輸出端取反
OUT=~OUT; //用示波器可看到方波輸出
}
評論