您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>C/C++语言编程>

计时器与计频器实验及其几种典型的应用案例分享

大小:0.1 MB 人气: 2017-09-06 需要积分:0

1、计时器实验I-垂询方式-高低位灯互闪

/* ch07-5-1.c - 计时器实验I-垂询方式-高低位灯互闪 */
//==声明区================================
#include  // 定义8x51暂存器之标头档,P2-17~19 
#define LED P1   // 定义LED接至Port 1
#define count 50000 // T0(MODE 1)之计量值,约0.05秒(7-8页)
#define   TH_M1 (65636-count)/256 // T0(Mode 1)计量高8位元 
#define   TL_M1 (65636-count)%256 // T0(Mode 1)计量低8位元 
//==主程序================================
main()     // 主程序开始 
{ int  i;    // 宣告i变数 
 TMOD &= 0xf1;  // 设定T0为mode 1(7-3页)
 TMOD |= 0x01;  // 设定T0为mode 1(7-3页)
 LED=0xf0;   // LED初值=1111 0000,右4灯亮 
 while(1)   // 无穷循环,程序一直跑 
 { for (i=0;i<5;i++)// for循环,计时中断5次 
   {  TH0=TH_M1; // 设置高8位元 
   TL0=TL_M1; // 设置低8位元 
   TR0=1;  // 启动T0(7-7页)
   while(TF0==0);// 等待溢位(TF0==1)
   TF0=0;  // 溢位後,清除TF0,关闭T0
  }    // for循环计时结束 
  LED=~LED;  // 输出反相 
 }    // while循环结束 
}     // 主程序结束 
 
 

2、计时器实验2-中断方式-高低位灯互闪

/* ch07-5-2.c - 计时器实验2-中断方式-高低位灯互闪  */
//==声明区================================
#include  // 定义8x51暂存器之标头档,P2-17~19 
#define LED P1   // 定义LED接至Port 1
#define count 50000 // T0(MODE 1)之计量值,约0.05秒 
#define   TH_M1 (65636-count)/256 // T0(Mode 1)计量高8位元 
#define   TL_M1 (65636-count)%256 // T0(Mode 1)计量低8位元 
int  IntCount=0;  // 宣告IntCount变数,计算T0中断次数 
//==主程序================================
main()     // 主程序开始 
{ IE=0x82;   // 启用T0中断(6-4页)
 TMOD &= 0xf1;TMOD |= 0x01; // 设定T0为mode 1(7-3页)
 TH0=TH_M1; TL0=TL_M1;  // 设置T0计数量高8位元、低8位元 
 TR0=1;    // 启动T0
 LED=0xf0;   // LED初值=1111 0000,右4灯亮 
 while(1);   // 无穷循环,程序停滞 
}      // 主程序结束 
//== T0中断子程序- 每中断5次,LED反相 ================
void timer0(void) interrupt 1 // T0中断子程序开始 
{ TH0=TH_M1; TL0=TL_M1;  // 设置T0计数量高8位元、低8位元 
 if (++IntCount==5)   // 若T0已中断5次数 
 { IntCount=0;    // 重新计次 
  LED^=0xff;    // 输出相反 
 }       // if叙述结束 
}        // T0中断子程序
 
 

3、计时器实验3 -60秒计数器,每1分钟LED反相1次

/* ch07-5-3.c - 计时器实验3 -60秒计数器,每1分钟LED反相1次 */
//==声明区================================
#include  // 定义8x51暂存器之标头档,P2-17~19 
#define SEG P2   // 定义七节显示器接至Port 2
#define SCANP P1  // 定义扫瞄线接至Port 1
sbit  LED=P0^7;   // 声明LED接至P0.7
/*声明T0计时相关声明*/  // THx TLx 计算参考 
#define  count_M1   50000   // T0(MODE 1)之计量值,0.05s 
#define  TH_M1  (65636-count_M1)/256// T0(MODE 1)计量高8位元 
#define  TL_M1  (65636-count_M1)%256// T0(MODE 1)计量低8位元 
int count_T0=0;      // 计算 T0中断次数 
/*声明T1扫瞄相关声明*/
#define  count_M2   250   // T1(MODE 2)之计量值,0.25ms
#define  TH_M2  (256-count_M2) // T1(MODE 2)自动载入计量  
#define  TL_M2  (256-count_M2) // T1(MODE 2)计数量 
char count_T1=0;    // 计算 T1中断次数  
/* 声明七节显示器驱动信号阵列(共阳) */
char code TAB[10]={ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0-4
     0x92, 0x83, 0xf8, 0x80, 0x98 }; //数字5-9
char disp[2]={ 0xc0, 0xc0 }; // 声明显示区阵列初始显示00
/* 声明基本变量 */
char seconds=0;   // 秒数 
char scan=0;   // 扫瞄信号 
//==主程序================================
main()     // 主程序开始 
{ IE=0x8a;   // 1000 1010,启用TF0、TF1中断(6-4页)
 TMOD=0x21;   // 0010 0001,T1采mode 2、T0采mode 1
 TH0=TH_M1; TL0=TL_M1;// 设置T0计数量高8位元、低8位元 
 TR0=1;    // 启动T0(7-7页)
 TH1=TH_M2; TL1=TL_M2;// 设置T1自动载入值、计数量 
 TR1=1;    // 启动T1
 LED=1;    // 关闭LED
 while(1);   // 无穷回圈,程序停滞 
}      // 主程序结束  
//== T0中断子程序- 计算并显示秒数 ==================
void T0_1s(void) interrupt 1 // T0中断子程序开始 
{ TH0=TH_M1; TL0=TL_M1;  // 设置T0计数量高8位元、低8位元 
 if (++count_T0==20)   // 若中断20次,即0.05x20=1秒 
 { count_T0=0;    // 重新计次 
  seconds++;    // 秒数加1
  if (seconds==60)   // 若超过60秒 
  { seconds=0;   // 秒数归0,重新开始 
   LED=~LED;    // 切换LED
  }      // if叙述结束(超过60秒)
 }       // if叙述结束(中断20次)
 disp[1]=TAB[seconds/10];  // 填入十位数显示区 
 disp[0]=TAB[seconds%10];  // 填入个位数显示区 
}        // T0中断子程序结束 
//===T1中断子程序 - 扫瞄 =========================
void T1_8ms(void) interrupt 3 // T1中断子程序开始 
{ if (++count_T1==32)   // 若中断32次,即0.25mx32=8ms
  { count_T1=0;   // 重新计次 
   if (++scan==3) scan=1;// 若超过十位数,显示个位  
   SEG=0xff;   // 关闭7段显示器 
   SCANP=~scan;  // 输出扫瞄信号 
   SEG=disp[scan-1]; // 输出显示信号 
  }      // 结束if判断(中断32次)
}        // T0中断子程序结束 
 
 

4、计频器实验

/* ch07-5-6.c - 计频器实验 - 由P3.5输入信号,按下PB0於1秒後显示其频率 */
//==声明区================================
#include  // 定义8x51暂存器之标头档,P2-17~19 
#define SEG  P2  // 定义七节显示器接至Port 2
#define SCANP P1  // 定义扫瞄线接至Port 1
sbit  PB0=P3^2;   // 声明PB0按钮,接至P3.2
char code TAB[11]={ 0xc0, 0xf9, 0xa4, 0xb0, 0x99,   // 数字0-4
        0x92, 0x83, 0xf8, 0x80, 0x98 , 0xbf }; // 数字5-9,及-号 
char disp[4]={ 0xc0, 0xc0, 0xc0, 0xc0}; // 声明显示区阵列初始显示0000
/* 声明T0计时相关声明 */    // THx TLx 计算参考 7-8页 
#define  count_M1   50000    // T0(MODE 1)之计量值,0.05s 
#define  H_0  (65636-count_M1)/256  // T0(MODE 1)计量高8位元 
#define  L_0  (65636-count_M1)%256  // T0(MODE 1)计量低8位元 
char times=0;    // 计算 T0中断次数 
/* 声明基本变量 */
bit  status_F = 1;  // 状态旗标 
char  scan = 1;   // 扫瞄信号 
unsigned int freq = 0; // 频率变量 
sfr16  DPTR = 0x82;  // 声明DPTR
void delay1ms(int);  // 声明延迟函数 
void measure(void);  // 声明量测函数 
void display(void);  // 声明显示函数 
//==主程序======================================
main()     // 主程序开始 
{ while(1)   // 无穷回圈,程序一直跑 
 { if (PB0==0)  // 若按下PB0
  { status_F=0; // 则进入量测阶段 
   measure(); // 呼叫量测函数 
   while(status_F==0); } // 等待0,量测完毕 
  else display(); // 显示阶段 
 }     // while回圈结束 
}      // 主程序结束 
//==量测函数====================================
void measure(void)  // 量测函数开始
{ SCANP=0xff;   // 关闭显示器 
 IE=0x8a;   // 10001010,启用T0、T1中断
 TMOD=0x51;   // 7-3 页 
 /*0101 0001:T1为计数器、T0为计时器,都采mode 1*/
 TH0=H_0;TL0=L_0; // 设置T0计数量之高、低八位元 
 TH1=0;TL1=0;  // 设置T1归零 
 TR0=1;TR1=1;  // 启动T0、T1
}      // 量测函数结束 
//===T0_1S=================================
void T0_1S(void) interrupt 1  // T0_1S中断副程序开始 
{ TH0=H_0;TL0=L_0; // 设置T0计数量之高、低八位元 
 if (++times==20) // 若达到1秒 
 { times=0;  // 重新计次 
  status_F=1;  // 完成量测 
  TR1=0;TR0=0; // 关闭T1、T0
  DPL=TL1;  // 计数量之低八位元 
  DPH=TH1;  // 计数量之高八位元 
  freq=DPTR;  // 计数量放入freq变量 
  if (freq>=10000)// 超过10 kHz
  { disp[3]=TAB[10];   // 负号填入千位数显示区 
   disp[2]=TAB[10];   // 负号填入百位数显示区 
   disp[1]=TAB[freq/10000]; // 填入十位数显示区 
   disp[0]=TAB[(freq/1000)%10];}// 填入个位数显示区 
  else       // 低於10 kHz
  { disp[3]=TAB[freq/1000];  // 填入千位数显示区     
   disp[2]=TAB[(freq/100)%10]; // 填入百位数显示区 
   disp[1]=TAB[(freq/10)%10]; // 填入十位数显示区 
   disp[0]=TAB[freq%10];}  // 填入个位数显示区 
 }         // 结束if判断(达到1秒)
}          // T0_1S中断副程序结束 
//===显示函数================================
void display(void)   // 显示函数开始 
{ char i;     // 声明变量 
 while (PB0==1)   // 若按下PB0
 { scan=0x01;   // 初始扫瞄信号 
  for (i=0;i<4;i++) // 扫瞄4次 
  { SEG=0xff;  // 关闭7段显示器 
   SCANP=~scan; // 输出扫瞄信号 
   SEG=disp[i]; // 输出显示信号 
   delay1ms(4);  // 延迟4ms
   scan<<=1;  // 下一个扫瞄信号 
   }     // for结束扫瞄4次 
 }      // 结束while(按下PB0)
}       // 显示函数结束 
//===延迟函数================================
void delay1ms(int x)  // 延迟函数开始 
{ int i,j;    // 声明变量 
 for(i=0;i   for(j=0;j<120;j++); // 数120次,约1ms
}       // 延迟函数结束 

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!