?? frcount.c
字號:
/*--------------------------------------------------
程序功能:利用單片機(jī)定時計數(shù)器,測量信號頻率
入口參數(shù):
出口參數(shù):
程序編寫:zqp
創(chuàng)建時間:2007-8-9
聯(lián)系方式:QQ:30871641
修改日志:
NO.1:顯示定時時間改為10MS,便于軟件仿真
---------------------------------------------------*/
#include <AT89X52.H>
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7, //位選通代碼
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //共陰代碼
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10}; //顯示緩沖區(qū),只用六位
unsigned char temp[8]; //暫存數(shù)組
unsigned char dispcount; //顯示計數(shù)變量
unsigned char T0count; //T0計數(shù)變量
unsigned char timecount; //定時計數(shù)變量
bit flag; //1秒到標(biāo)志位
unsigned long x; //被測頻率值(沒處理)
/*--------------------------------------------------
程序功能:初始化,處理數(shù)據(jù),T0用作計數(shù)
入口參數(shù):
出口參數(shù):
---------------------------------------------------*/
void main(void)
{
unsigned char i;
TMOD=0x15; //T1用作定時,定時方式1,T0用作計數(shù),方式1
TH0=0; //T0計數(shù)初值為0
TL0=0;
TH1=(65536-10000)/256; //T1定時10ms
TL1=(65536-10000)%256;
TR1=1; //啟動定時器T1
TR0=1; //啟動計數(shù)器T0
ET0=1; //允許TO中斷
ET1=1; //允許T1中斷
EA=1; //允許總中斷
while(1)
{
if(flag==1)
{
flag=0;
x=T0count*65536+TH0*256+TL0; //處理一秒內(nèi)計的脈沖個數(shù)
for(i=0;i<8;i++)
{
temp[i]=0;
}
i=0;
while(x/10) //把計數(shù)結(jié)果各位分離出來,保存在數(shù)組temp[]中
{
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<6;i++) //把數(shù)組temp[]中的計數(shù)結(jié)果傳送給數(shù)組dispbuf[]
{
dispbuf[i]=temp[i];
}
timecount=0; //計時變量清零
T0count=0; //計數(shù)變量清零
TH0=0; //計數(shù)器T0初值清零
TL0=0;
TR0=1; //重起計數(shù)器T0
}
}
}
/*--------------------------------------------------
程序功能:T0中斷服務(wù)程序
入口參數(shù):
出口參數(shù):T0count
---------------------------------------------------*/
void t0(void) interrupt 1 using 0
{
T0count++; //T0計數(shù),當(dāng)TH0,TL0計數(shù)溢出后,T0count加1,即計數(shù)65536后
}
/*--------------------------------------------------
程序功能:T1中斷服務(wù)程序 顯示數(shù)據(jù)
入口參數(shù):
出口參數(shù):TR0, flag, P0口位選通口, P2口數(shù)據(jù)口
---------------------------------------------------*/
void t1(void) interrupt 3 using 0
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
timecount++;
if(timecount==100) //如果一秒到
{
TR0=0; //停止計數(shù)
timecount=0; //計時變量清零
flag=1; //標(biāo)志變量置1,通知主程序進(jìn)行數(shù)據(jù)處理
}
P2=dispcode[dispbuf[dispcount]];
P0=dispbit[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -