计时器与计频器实验及其几种典型的应用案例分享
大小:0.1 MB 人气: 2017-09-06 需要积分:0
1、计时器实验I-垂询方式-高低位灯互闪
/* ch07-5-1.c - 计时器实验I-垂询方式-高低位灯互闪 *///==声明区================================
#include
#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
#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
#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
#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
} // 延迟函数结束
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%