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