系统总体设计由STC89C52、按键、数码管、光电传感器、时钟模块、运放等构成,如图2.1所示,系统设有四个按键,可以设置上下限脉搏数,当超过范围的时候单片机会驱动蜂鸣器发响,脉搏测量的时候需要人把手轻轻的按在光电传感器上面,由于人脉搏跳动的时候,血液的透光性不一样会导致接收器那边接收的信号强弱不一样,间接的把人脉搏信号传回,通过运放对其进行放大、整形后连接到单片机的IO口,单片机利用外部中断对其进行计数,最终换算成人一分钟脉搏的跳动次数,最终显示在数码管上。
资料包括:
原理图:
实物图:
程序运行图:
t flag_300ms ;
uchar menu_1; //菜单设计的变量
uchar smg_i = 3; //显示数码管的个位数
uchar code table_num[]="0123456789abcdefg";
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0x14,0x77,0x4c,0x44,0x27,0x82,0x84,0x87,0x04,0x05,
// A B C D E F 不显示
0x06,0xa4,0x9c,0x64,0x8c,0x8e,0xff}; //断码
uchar dis_smg[8] ={0};
//数码管位选定义
sbit smg_we1 = P2^4; //数码管位选定义
sbit smg_we2 = P2^5;
sbit smg_we3 = P2^6;
sbit smg_we4 = P2^7;
unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
unsigned int time[6]={0};
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/***********************数码位选函数*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}
/***********************数码显示函数*****************************/
void display()
{
static uchar i;
i++;
if(i >= smg_i)
i = 0;
P0 = 0xff; //段选
smg_we_switch(i); //位选
P0 = dis_smg[i]; //段选
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/***********外部中断0初始化程序****************/
void init_int0() //外部中断0初始化程序
{
EX0=1; //允许外部中断0中断
EA=1; //开总中断
IT0 = 1; //外部中断0负跳变中断
}
/****************主函数***************/
void main()
{
static uint value;
time_init(); //初始化定时器
init_int0(); //外部中断0初始化程序
while(1)
{
value ++;
if(value >= 300) //300ms
{
value = 0;
if(displayOK==0)//如果显示关
{
rate =