#include <reg51.h>
#include <stdio.h>
#include <1602.h>
unsigned int n,mb,Dispdata,time,moshi;
unsigned int shang=100,xia=60;
unsigned char code zifu0[]="0123456789abcdef";
unsigned char code zifu2[]="Pulse: ci/min ";
unsigned char code zifu1[]=" Pulse Meter ";
unsigned char code zifu3[]="Max : ci/min ";
unsigned char code zifu4[]="Min : ci/min ";
#define INT8 char
#define UINT8 unsigned char
#define INT16 short
#define UINT16 unsigned short
#define INT32 int
#define UINT32 unsigned int
sbit beer=P2^4;//报警引脚
sbit qiehuan=P1^0;//切换引脚
sbit jia=P1^1;//加键引脚
sbit jian=P1^2;//减键引脚
void delay(unsigned char DelayTime);
void main() //主程序
{
beer=1;
lcd1602_init();
TMOD=0x01; //定时器T0工作于方式1
TH0=0x0fc;
TL0=0x18; //T0定时时间为1ms
IE=0X83; //开中断
IT0=1; //外部中断0为边沿触发方式
TR0=1; //开定时器T0
LCD1602_string(1,1,zifu1);
LCD1602_string(1,1,zifu1);
LCD1602_string(2,1,zifu2);
for(;;) //脉搏指示灯控制
{
if(qiehuan==0)
{moshi=moshi+1;if(moshi==3)moshi=0;while(qiehuan==0);
if(moshi==0)
{
LCD1602_string(1,1,zifu1);
LCD1602_string(2,1,zifu2);
}
LCD1602_string(1,1,zifu3);
LCD1602_string(2,1,zifu4);
}
}
if(moshi==0)//显示是脉搏值和时间
{
lcd1602_adr(0x46);
lcd1602_writenumber(0x30+Dispdata/100);
lcd1602_writenumber(0x30+Dispdata%100/10);
lcd1602_writenumber(0x30+Dispdata%10);
if((Dispdata>shang)||(Dispdata<xia)) beer=0;//大于上限小于下限报警
else beer=1;
}
if(moshi==1)//设置上限值,加按下1次,加1 减按下1次减1
{
if(jia==0) {shang=shang+1;if(shang>150)shang=150;while(jia==0);}
if(jian==0){shang=shang-1;if(shang<60) shang=60; while(jian==0);}
lcd1602_adr(0x06);
lcd1602_writenumber(0x30+shang/100);
lcd1602_writenumber(0x30+shang%100/10);
lcd1602_writenumber(0x30+shang%10);
lcd1602_adr(0x46);
lcd1602_writenumber(0x30+xia/100);
lcd1602_writenumber(0x30+xia%100/10);
lcd1602_writenumber(0x30+xia%10);
lcd1602_adr(0x0f);
lcd1602_writenumber('<');
lcd1602_adr(0x4f);
lcd1602_writenumber(' ');
}
if(moshi==2)//设置下限值,加按下下限加1 减按下1次减1
{
if(jia==0) {xia=xia+1;if(xia>150)xia=150;while(jia==0);}
if(jian==0){xia=xia-1;if(xia<40)xia=40; while(jian==0);}
lcd1602_adr(0x06);
lcd1602_writenumber(0x30+shang/100);
lcd1602_writenumber(0x30+shang%100/10);
lcd1602_writenumber(0x30+shang%10);
lcd1602_adr(0x46);
lcd1602_writenumber(0x30+xia/100);
lcd1602_writenumber(0x30+xia%100/10);
lcd1602_writenumber(0x30+xia%10);
lcd1602_adr(0x0f);
lcd1602_writenumber(' ');
lcd1602_adr(0x4f);
lcd1602_writenumber('<');
}
}
}
external0() interrupt 0//外部中断服务程序
{
if(n==0)
{
mb=0;
}
else
{
time = n; //保存间隔时间,单位毫秒
mb=60000/n; //计算每分钟脉搏数 每分钟有60000ms,除以间隔时间则为每分钟脉搏数
}
Dispdata=mb; //保存数据用于显示
n=0; //清零
}
//定时时间为1ms
Timer0() interrupt 1//定时中断服务程序
{
TH0=0x0fc;
TL0=0x18;
n++; //计数一毫秒加一次
if(n==10000)//10秒钟测不到心率,n复位
{
n=0;
}
}
emmm你不发1602.h,谁知道你1602.h里面写的啥啊
sbit RS=P2^5; //写信号
sbit RWW=P2^6; //读信号
sbit E=P2^7; //使能信号
#define e1 E=1
#define rd1 RWW=1
#define rs1 RS=1
#define e0 E=0
#define rd0 RWW=0
#define rs0 RS=0
#define PP P0
//写1602控制字
void _delay_us(unsigned char t)
{
while(t>0)t--;
}
void lcd1602_writecrtl(unsigned char dat)
{
rd0;//读信号置0
rs0;//写信号置0
_delay_us(5);
PP=dat;
e1;//使能信号置1
_delay_us(5);
e0;//使能信号置0
}
//写1602数据
void lcd1602_writenumber(unsigned char dat)
{
rd0;//读信号置0
rs1;//写信号置1
_delay_us(5);
PP=dat;
e1;//使能信号置1
_delay_us(5);
e0;//使能信号置0
}
//1602初始化
void lcd1602_init()
{
lcd1602_writecrtl(0x38); //显示模式
lcd1602_writecrtl(0x06); //显示光标移动位置
lcd1602_writecrtl(0x0c); //显示开及光标设置
lcd1602_writecrtl(0x01); //显示清屏
}
//显示地址
void lcd1602_adr(unsigned char dat)
{
lcd1602_writecrtl(0x80 | dat);
}
//行显示-
void LCD1602_string(unsigned char hang,unsigned char lie,unsigned char const *p)
{
unsigned char a;
if(hang == 1) a = 0x00;
if(hang == 2) a = 0x40;
a = a + lie - 1;
lcd1602_adr(a);
while(1)
{
if(*p == '\0') break;
lcd1602_writenumber(*p);
p++;
}
}