使用計(jì)數(shù)器T0,工作在方式0,對(duì)外部脈沖進(jìn)行計(jì)數(shù),當(dāng)外部脈沖數(shù)量累計(jì)達(dá)到1000后LED顯示值加1。其實(shí)驗(yàn)電路如圖所示
分析: 使用計(jì)數(shù)器與使用定時(shí)器類似,只是計(jì)數(shù)脈沖由系統(tǒng)時(shí)鐘脈沖改為外部脈沖。也可以使用中斷查詢的方式進(jìn)行編程,就是先給定時(shí)器寄存器賦初值,當(dāng)計(jì)滿后就清掉溢出標(biāo)志TF0.再進(jìn)入下一輪中斷,當(dāng)然也可以不使用中斷查詢,而直接使用數(shù)值比較完成要求,數(shù)值比較其實(shí)就是每次都將TH0和TL0與預(yù)設(shè)的Hight和Lower進(jìn)行比較,當(dāng)比較的結(jié)果都為真時(shí),進(jìn)行計(jì)數(shù)到后的服務(wù)程序。下面依次給出其程序清單。
(1)使用中斷查詢方式的程序清單如下:
sfr data_buf=0xA0; //顯示數(shù)據(jù)端口
unsigned char conter; //全局變量,用于保存計(jì)數(shù)值
void main(void)
{
conter=0;
Conter_Init();
while(1)
{
Conter0();
disply(conter);
}
}
void Conter_Init(void)
{
TMOD=0x04; //工作方式設(shè)置
/*計(jì)數(shù)器初值設(shè)置*/
TH0=0xe0; //初始值設(shè)置,7192轉(zhuǎn)為13位后的高8位
TL0=0x18; //初始值設(shè)置,7192轉(zhuǎn)為13位后的低5位
/*關(guān)閉計(jì)數(shù)器中斷*/
EA=0 ; //關(guān)中斷
ET0=0 ; //關(guān)T0中斷
/*啟動(dòng)計(jì)數(shù)器*/
TR0=1 ; //啟動(dòng)T0
}
void Conter0(void)
{
if(TF0==1)
{
TF0=0;
/*計(jì)數(shù)器初值設(shè)置*/
TH0=0xe0; // 初始值設(shè)置
TL0=0x18;
conter++;
if(conter >=99)
conter=0;
}
}
void disply(unsigned char BCD) //顯示函數(shù)
{
unsigned char x,y; //定義x,y兩個(gè)變量
x=BCD%10; //取i的個(gè)位字符BCD編碼放于x中
y=BCD/10; //取i的十位字符BCD編碼放于y中
y< <=4; //x左移4位
data_buf=y|x; //返回個(gè)位與十位的組合BCD編碼并送P2口顯示
}
通過上面案例可以看出使用定時(shí)器/計(jì)數(shù)器的基本步驟如下。
1 寫TMOD,設(shè)置定時(shí)器/計(jì)數(shù)器的工作方式。
2 計(jì)算定時(shí)器/計(jì)數(shù)器的初值,并將初值寫入TH0/TH1、TL0/TL1。
3 設(shè)置IE、IP,以開放或關(guān)閉相應(yīng)的中斷和設(shè)定中斷優(yōu)先級(jí)。
4 啟動(dòng)定時(shí)/計(jì)數(shù)器。
5 根據(jù)條件調(diào)用定時(shí)器/計(jì)數(shù)器服務(wù)函數(shù)。
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120385 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2256瀏覽量
94581 -
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41505 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3248瀏覽量
114832 -
CD4511
+關(guān)注
關(guān)注
3文章
24瀏覽量
29518
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論