单片机脉搏计-51程序

单片机脉搏计-51程序
1、main.c
//======================================================
#include "INT0.h"
#include "TIME0.h"
#include "usart.h"

unsigned char rate = 0;
extern unsigned char displayOK;
extern unsigned int time[6];

void main()
{
/***********外部中断0初始化程序****************/
init_int0();
/*************定时器0初始化程序***************/
time0_init();
//串口初始化
UsartConfiguration();

while(1)
{
if(displayOK == 0)//如果显示关
{
rate = 0;
}
else//如果显示开
{
rate = 60000 / (time[1] + time[2] + time[3] + time[4] + time[5])/5;

SendByte(rate);
}
}
}

2、INT0.h
//======================================================
#ifndef __INT0_H__
#define __INT0_H__

/***********外部中断0初始化程序****************/
void init_int0(void); //外部中断0初始化程序

#endif

3、INT0.c
//======================================================
#include //调用单片机头文件
#include "INT0.h"

unsigned char timecount = 0, i = 0, displayOK = 0;
unsigned int time[6] = {0};

/***********外部中断0初始化程序****************/
void init_int0(void) //外部中断0初始化程序
{
EX0 = 1; //允许外部中断0中断
EA = 1; //开总中断
IT0 = 1; //外部中断0负跳变中断
}

void int0() interrupt 0
{
if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理
{
TR0 = 1; //开定时器
}
else
{
time[i] = timecount * 50 + TH0 + TL0;//算出间隔时间
timecount = 0; //50ms计数清零
i++;

if(i == 6) //记录到超过等于6次时间
{
i = 1; //计数从1开始
displayOK = 1;//测得5次开始显示?

}
}
}

4、TIME0.h
//======================================================
#ifndef __TIME0_H__
#define __TIME0_H__

/*************定时器0初始化程序***************/
void time0_init(void);

#endif

5、TIME0.c
//======================================================
#include "TIME0.h"
#include //调用单片机头文件

extern unsigned char timecount, i, displayOK;

/*************定时器0初始化程序***************/
void time0_init(void)
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}

/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0; // 50ms 12M
timecount++; //每50ms一次计数
if(timecount > 25) //当超过25*50ms=1.5s没有检测到信号停止显示
{
i = 0; //数据个数清零
timecount = 0;//50ms计数清零

displayOK = 0;//显示关
TR0 = 0; //定时器关
}
}

6、usart.h
//======================================================
#ifndef __USART_H__

#define __USART_H__


//串口初始化
void UsartConfiguration();

/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat);

#endif

7、usart.m
//======================================================
#include "usart.h"
#include //调用单片机头文件

/*******************************************************************************
* 实验名 : 串口实验
* 使用的IO : P2
* 实验效果 : 将接收到发送回电脑上面。
* 注意 :
*

/*******************************************************************************
* 函数名 :UsartConfiguration()
* 函数功能 :设置串口
* 输入 : 无
* 输出 : 无
*******************************************************************************/

unsigned char receiveData; //接收数据

//串口初始化
void UsartConfiguration()
{
TMOD = 0X20; //定时器T1作为波特率发生器
SCON = 0X50; //串口方式1,允许接收
PCON &= 0X7F; //波特率不倍增
TH1 = TL1 = 0XFD; //计数器初始值设置,注意波特率是9600的
TR1 = 1; //启动波特率发生器
ES = 1; //串口中断允许
EA = 1; //打开总中断
}

/*******************************************************************************
* 函数名 :Delay(unsigned int i)
* 函数功能 : 延时函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Usart() interrupt 4 //中断接收3个字节
{
if(RI) //是否接收到中断
{
RI = 0; //中断标志位清零,为下次做准备
receiveData = SBUF; //接收数据

/********* 发送返回--> 检验接收到用 ********************************/
SBUF = receiveData; //将接收到的数据放入到发送寄存器:返回给电脑
// while(!TI); //等待发送数据完成
// TI = 0; //清除发送完成标志位

if(TI)
TI = 0;

}
}

/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}




相关文档
最新文档