发布时间:2019-08-09 15:03:08
#include <reg51.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define TIMER0_HIGHT 0xDC //设置定时器0工作方式1自动装载初值,定时10ms,Fosc=11.059200MHZ
#define TIMER0_LOW 0x00
sbit keyin = P3^1; //按键输入
bit starttest; //启动测脉搏标志
uint16 cnt10ms; //10ms计数器
uint8 cnt1s; //1秒计数器
uint8 Pulsecnt; //脉搏次数,计数器
uint8 Pulsenum; //上次测试脉搏的次数
uint8 code DispCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管段码表
void Init_Extint(void);
void TimerInitProc();
void initvar();
void Init_System(void);
void Display(uint8 chose_dat, uint8 dat);
void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8tcnt1s);
void DelayMs(uint8 Ms);
void main()
{
Init_System(); //初始化
while(1)
{
ShowDisp(Pulsenum,Pulsecnt, cnt1s); //显示
}
}
/*******************************************************************************
* 函 数 名: Exti0_interrupt
* 函数功能: INT0引脚下降沿进入中断
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void Ext0_interrupt(void) interrupt 0
{
if(starttest== 1) //处在测试状态
{
Pulsecnt++; //来一次中断脉搏计数器加1
}
}
/********************************************************************
函数功能:定时器/计数器0中断处理
入口参数:null
返 回:null
备 注:null
********************************************************************/
void Timer0IntProc() interrupt 1
{
TH0 =TIMER0_HIGHT; //设置定时器0高字节初值
TL0 =TIMER0_LOW; //设置定时器0低字节初值
if(++cnt10ms== 100) //1s计时到
{
cnt10ms= 0;
if(starttest== 1) //处在测试状态
{
if(++cnt1s== 60) //一分钟时间到
{
starttest= 0; //一次检测完毕,等待下一次检测
Pulsenum= Pulsecnt; //保存测得脉搏值
}
}
}
if(keyin== 0) //检测按键
{
if(starttest== 1) //处在测试状态
{
cnt10ms= 0; //复位测试值,重新开始测试
cnt1s= 0;
Pulsecnt= 0;
}
else //不在测试状态,开始新的一次测试
{
starttest= 1;
cnt10ms= 0;
}
}
}
/////////////////////////End ofTimer0IntProc////////////////////////
void Init_Extint(void)
{
IT0 =1; //外部中断1设置为下降沿触发
IE0 =0; //标志位清0
EX0 =1; //允许外部中断1
}
/********************************************************************
函数功能:定时器/计数器初始化
入口参数:null
返 回:null
备 注:null
********************************************************************/
void TimerInitProc()
{
TMOD&= 0xF0;
TMOD |=0x01; //设置定时器0,方式1:16位定时器
TH0 =TIMER0_HIGHT; //设置定时器0高字节初值
TL0 =TIMER0_LOW; //设置定时器0低字节初值
TR0 = 1; //启动定时器0
ET0 = 1; //开定时器0中断
EA =1; //开总中断
}
/////////////////////////End of TimerInitProc////////////////////////
void initvar()
{
starttest= 0;
cnt10ms =0;
cnt1s = 0;
Pulsecnt =0;
Pulsenum =0;
}
void Init_System(void)
{
Init_Extint();
TimerInitProc();
initvar();
}
/******************************************************************************
* 函 数 名: Display(uchar chose_dat,uchar dat)
* 函数功能: 数码管显示
* 入口参数: chose_dat数码管显示字位,dat显示字型
* 返 回: 无
*******************************************************************************/
void Display(uint8 chose_dat, uint8 dat)
{
P0 = dat; //送显示字型
P2 = ~(0x01<<chose_dat);//送显示字位
DelayMs(1); //延时1MS
P2 =0xFF; //关闭显示
}
void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8tcnt1s)
{
Display(6,DispCode[tPulsenum%10]); //显示上次测量的脉搏
tPulsenum= tPulsenum/10;
Display(7,DispCode[tPulsenum%10]);
Display(3,DispCode[tPulsecnt%10]); //显示测试中的脉搏
tPulsecnt= tPulsecnt/10;
Display(4,DispCode[tPulsecnt%10]);
Display(0,DispCode[tcnt1s%10]); //显示测试中的时间
tcnt1s =tcnt1s/10;
Display(1,DispCode[tcnt1s%10]);
}
/********************************************************************
函数功能:延时ms
入口参数:MS
返 回:null
备 注:null
********************************************************************/
void DelayMs(uint8 Ms)
{
unsignedchar i,j;
do
{
for(i=5;i>0;i--)
for(j=98;j>0;j--);
}while(--Ms);
//Test for12M
}
///////////////////////////End ofDelayMs////////////////////////////