心率计51单片机代码.doc

合集下载

基于51单片机的心率计设计

基于51单片机的心率计设计

基于51单片机的心率计设计一、引言心率是人体健康状况的一个重要指标,测量心率对于预防心血管疾病和监控身体健康非常重要。

本文将介绍基于51单片机的心率计的设计。

二、硬件设计1. 传感器心率计的核心是心率传感器,用于检测心脏的跳动并转化为电信号。

常见的心率传感器有光电传感器和压电传感器。

本设计选用光电传感器,通过红外光发射二极管和光敏二极管组成,以非侵入性的方式测量心率。

2. 信号放大与滤波电路由于心率信号较小,需要经过放大与滤波电路进行信号处理。

设计中使用运放对信号进行放大,并通过带通滤波器滤除杂散信号。

3. 数模转换放大滤波后的心率信号是模拟信号,需要通过模数转换器(ADC)将其转换为数字信号,以便后续处理和显示。

4. 显示屏心率计的设计中需要一个合适的显示屏来显示测量出的心率数值。

常见的显示屏有LCD液晶屏和LED数码管。

5. 51单片机本设计使用51单片机作为控制核心,负责对信号的采集、处理和显示。

51单片机具有成熟的开发环境和丰富的外设资源,非常适合嵌入式系统的设计。

三、软件设计1. 信号采集通过51单片机的IO口连接传感器,定时采集传感器输出的心率信号,并将其转换为数字信号。

2. 信号处理通过软件算法对采集到的心率信号进行滤波和处理,去除噪声和干扰,提取出准确的心率数值。

3. 心率计算根据心率信号的特征,设计一个合适的算法对心率进行计算。

常用的算法有峰值检测法和自相关法等。

4. 数据显示将计算得到的心率数值通过LCD屏或数码管显示出来,以便用户直观地了解自己的心率状况。

四、实验结果与讨论经过实验验证,基于51单片机的心率计设计能够准确地测量心率,并将心率数值显示在屏幕上。

通过与商用心率计的比对,结果显示该设计具有较高的准确性和稳定性。

五、应用前景基于51单片机的心率计设计可以应用于医疗领域、体育训练和健康监控等方面。

例如,可以将心率计嵌入健康手环中,实时监测用户的心率状况,并提醒用户进行适当的运动。

基于51单片机心率测量电路设计

基于51单片机心率测量电路设计

基于51单片机心率测量电路设计作者:蒋铁生来源:《科学导报·学术》2019年第10期1.1选题背景心率是人的重要的可被测量的生理指标。

在现代社会,随着人类社会生活水平的提高,人们的生活方式和饮食结构的改变,高血压,冠心病等心脏方面的疾病渐渐成为人们的常见病。

由有关数据显示,中国城市人口每五个成年人中就有一个人患有不同程度的心血管方面的疾病。

由于心脏不健康而导致的心肌梗塞,猝死等事件时有发生,并且心脏疾病方面发病率逐年提升,发病年龄也是下降趋势。

要减小心血管疾病给人们带来的健康危害,早期有效的测量設备与判断方法是十分重要的。

心率是人体十分重要有效的信息,是可以被检测的生物信号,它是反映心脏是否正常工作的一个重要参数,可以根据心率值判断一个人是否患有心率过速,早搏等几种常见的心脏病。

因此,设计一种简单,能显示心率的仪器十分有必要。

1.2 主要内容本心率测量电路设计是一个硬软件相结合的设计类题目。

要求设计一个基于51单片机的心率的检测电路。

可以实现与心率检测功能,整个系统电路的设计功能包括:1、使用MAX30102心率传感器模块进行心率采集;2、使用STC89C52芯片为控制核心;3、使用OLED液晶进行显示。

2 总体方案设计2.1整体设计思路本设计采用的是STC89C52芯片,通过STC89C52最小系统,心率模块、液晶屏,实现心率的测量与现实。

实时的心率显示在OLED液晶上。

由于STC89C52有较多的引脚数,能实现OLED液晶驱动以及实时心率测量等这些功能。

电源部分是通过USB线来外接可移动电源或电池供电。

2.2心率测量模块光电式传感器。

光电式传感器测量方法灵活多样,可测量参数较多,具有非接触,高精度,高分辨率,高可靠性,反映快等特点。

适合用来测量心率。

测量原理:随着心脏的跳动,人体组织半透明随之改变,当血液到达人体组织时,组织班透明度减小,当血液回流心脏时,组织的半透明度加大。

这种现象在人体组织较薄的地方比较明显,例如手指尖,耳垂部位。

基于单片机心率计程序

基于单片机心率计程序

#include <reg52.h>#include <intrins.h> // 包含头文件#define uint#define uchar#define ulong#define LCD_DATA unsigned intunsigned charunsigned longP0//宏定义//定义P0 口为LCD_DATAsbit LCD_RS =P2^5; sbit LCD_RW =P2^6;sbit LCD_E =P2^7;sbit Xintiao =P3^2 ; sbit speaker =P2^4;//定义LCD 控制引脚//脉搏检测输入端定义//蜂鸣器引脚定义void delay5ms(void); //误差0usvoid LCD_WriteData(uchar LCD_1602_DATA); void LCD_WriteCom(uchar LCD_1602_COM); ***********/ /********LCD1602 数据写入***********/ /********LCD1602 命令写入void lcd_1602_word(uchar Adress_Com,uchar Num_Adat,uchar *Adress_Data); /*1602字符显示函数,变量挨次为字符显示首地址,显示字符长度,所显示的字符*/void InitLcd();//液晶初始化函数void Tim_Init();uchar Xintiao_Change=0; //uint Xintiao_Jishu;uchar stop;uchar View_Data[3];uchar View_L[3];uchar View_H[3];uchar Xintiao_H=100; //脉搏上限uchar Xintiao_L=40; //脉搏下限uchar Key_Change;uchar Key_Value; uchar View_Con; uchar View_Change; //按键键值//设置的位(0 正常工作,1 设置上限,2 设置下限)void main(){//主函数InitLcd();Tim_Init();lcd_1602_word(0x80,16,"Heart Rate: "); //初始化显示TR0=1;TR1=1; //打开定时器while(1) //进入循环{if(Key_Change) //有按键按下并已经得出键值{Key_Change=0; //将按键使能变量清零,等待下次按键按下View_Change=1;switch(Key_Value) //判断键值{case 1:{View_Con++;if(View_Con==3)View_Con=0;break;}case 2:{if(View_Con==2)//设置键按下//设置的位加//都设置好后将此变量清零//跳出,下同//加键按下//判断是设置上限{if(Xintiao_H<150)Xintiao_H++;}if(View_Con==1){ //上限数值小于150 //上限+//如果是设置下限if(Xintiao_L<Xintiao_H-1)//下限值小于上限-1 (下限值不能超过上限)Xintiao_L++;}break;}case 3:{if(View_Con==2){ //下限值加//减键按下//设置上限if(Xintiao_H>Xintiao_L+1)//上限数据大于下限+1 (同样上限值不能小于下限)Xintiao_H--; //上限数据减}if(View_Con==1) //设置下限{if(Xintiao_L>30) //下限数据大于30 时Xintiao_L--;}break;}}//下限数据减}if(View_Change)// 显示变量{View_Change=0;//变量清零if(stop==0) //心率正常时{if(View_Data[0]==0x30) //最高位为0 时不显示View_Data[0]=' ';}else超过5s)不显示数据//心率不正常(计数超过5000,也就是两次信号时间{View_Data[0]=' ';View_Data[1]=' ';View_Data[2]=' ';}switch(View_Con){case 0: //正常显示{lcd_1602_word(0x80,16,"Heart Rate:lcd_1602_word(0xc0,16,"lcd_1602_word(0xcd,3,View_Data);break;}case 1: //设置下限时显示{lcd_1602_word(0x80,16,"Heart Rate:lcd_1602_word(0x8d,3,View_Data);View_L[0]=Xintiao_L/100+0x30;View_L[1]=Xintiao_L%100/10+0x30;View_L[2]=Xintiao_L%10+0x30;if(View_L[0]==0x30)View_L[0]=' ';lcd_1602_word(0xC0,16,"Warning L :lcd_1602_word(0xCd,3,View_L);");//显示一行数据");//显示第二行数据//第二行显示心率");//第一行显示心率//将下限数据拆字//最高位为0 时,不显示");//第二行显示下限数据break;}case 2: //设置上限时显示(同上){lcd_1602_word(0x80,16,"Heart Rate: ");lcd_1602_word(0x8d,3,View_Data);View_H[0]=Xintiao_H/100+0x30;View_H[1]=Xintiao_H%100/10+0x30;View_H[2]=Xintiao_H%10+0x30;if(View_H[0]==0x30)View_H[0]=' ';lcd_1602_word(0xC0,16,"Warning H : ");lcd_1602_word(0xCd,3,View_H);break;}}}}}void Time1() interrupt 3 //定时器1 服务函数{static uchar Key_Con,Xintiao_Con;TH1=0xd8; TL1=0xf0; switch(Key_Con) {case 0:{//10ms//重新赋初值//无按键按下时此值为0 //每10ms 扫描此处if((P1&0x07)!=0x07)//扫描按键是否有按下{Key_Con++;}break;}case 1:{ //有按下此值加1,值为1//10ms 后二次进入中断后扫描此处(Key_Con 为1)if((P1&0x07)!=0x07)//第二次进入中断时,按键仍然是按下 (起到按键延时去抖的作用){Key_Con++; //变量加1,值为2switch(P1&0x07) //判断是哪个按键按下{case 0x06:Key_Value=1;break; //判断好按键后将键值赋值给变量Key_Valuecase 0x05:Key_Value=2;break;case 0x03:Key_Value=3;break;}}else //如果10ms 时没有检测到按键按下(按下时间过短){Key_Con=0;}break;}case 2:{if((P1&0x07)==0x07){Key_Change=1;//变量清零,重新检测按键//20ms 后检测按键//检测按键是否还是按下状态//有按键按下使能变量, (此变量为1 时才会处理键值数据)Key_Con=0;}//变量清零,等待下次有按键按下break;}}switch (Xintiao_Con)//此处与上面按键的检测类似{case 0: //默认Xintiao_Con 是为0 的{if(!Xintiao)//每10ms (上面的定时器)检测一次脉搏是否有信号{Xintiao_Con++;//如果有信号,变量加一,程序就会往下走了}break;}case 1:{if(!Xintiao) //每过10ms 检测一下信号是否还存在{Xintiao_Con++;//存在就加一}else{Xintiao_Con=0;//如果不存在了,检测时间很短,说明检测到的不是脉搏信号,可能是其他干扰,将变量清零,跳出此次检测}break;}case 2:{if(!Xintiao){Xintiao_Con++;//存在就加一}else{Xintiao_Con=0;//如果不存在了,检测时间很短,说明检测到的不是脉搏信号,可能是其他干扰,将变量清零,跳出此次检测}break;}case 3:{if(!Xintiao){Xintiao_Con++;//存在就加一}else{Xintiao_Con=0;//如果不存在了,检测时间很短,说明检测到的不是脉搏信号,可能是其他干扰,将变量清零,跳出此次检测}break;}case 4:{if(Xintiao)//超过30ms 向来有信号,判定此次是脉搏信号,执行以下程序{if(Xintiao_Change==1)//心率计原理为检测两次脉冲间隔时间计算心率,变量Xintiao_Change 第一次脉冲时为0 的,所有走下面的else,第二次走这里{if(60000/Xintiao_Jishu>200){View_Data[0]='-';View_Data[1]='-';View_Data[2]='-';speaker=1; //不响}else{View_Data[0]=(60000/Xintiao_Jishu)/100+0x30; // 计算心跳并拆字显示:心跳计时是以10ms 为单位,两次心跳中间计数如果是100 次,也就是100*10ms=1000ms=1sView_Data[1]=(60000/Xintiao_Jishu)%100/10+0x30; // 那么计算出的一分钟(60s)心跳数就是:60*1000/ (100*10ms) =60 次其中60 是一分钟60s ,1000 是一秒有1000ms ,100 是计数值,10 是一次计数对应的时间是10msView_Data[2]=(60000/Xintiao_Jishu)%10+0x30; // 计算出的心跳数/100 得到心跳的百位,%100 是取余的,就是除以100 的余数,再除以10 就得到十位了,以此类推//0x30 的目的是得到对应数字的液晶显示码,数字0 对应的液晶显示码是0x30 ,1 是0x30+1,以此类推if(((60000/Xintiao_Jishu)>=Xintiao_H)||((60000/Xintiao_Jishu)<=Xintiao_L))//心率不在范围内报警speaker=0;elsespeaker=1; } //蜂鸣器响//不响View_Change=1;Xintiao_Jishu=0;Xintiao_Change=0;stop=0;}//计算出心率后启动显示//心跳计数清零//计算出心率后该变量清零,准备下次检测心率//计算出心率后stop 邈else//第一次脉冲时Xintiao_Change 为0{Xintiao_Jishu=0; //脉冲计时变量清零,开始计时Xintiao_Change=1;//Xintiao_Change 置1,准备第二次检测到脉冲时计算心率}Xintiao_Con=0;break;}}}}//清零,准备检测下一次脉冲/**定时器T0 工作函数**/void Time0() interrupt 1{TH0=0xfc; TL0=0x18; //1ms//重新赋初值Xintiao_Jishu++; //心跳计数加if(Xintiao_Jishu==5000)//心跳计数大于5000 {Xintiao_Jishu=0; View_Change=1; //数据清零//显示位置1Xintiao_Change=0; //置零,准备再次检测stop=1; //心跳计数超过5000 后说明心率不正常或者没有测出,stop 置1speaker=1; //关闭蜂鸣器}}/**定时器初始化函数**/void Tim_Init(){EA=1;ET0=1;ET1=1; TMOD=0x11; TH0=0xfc; TL0=0x18; //打开中断总开关//打开T0 中断允许开关//打开T1 中断允许开关//设定定时器状态//1ms//赋初值TH1=0xd8;TL1=0xf0; }//10ms //赋初值/**在指定地址显示指定数量的指定字符**//**Adress_Com 显示地址,Num_Adat 显示字符数量,Adress_Data 显示字符串内容**/ void lcd_1602_word(uchar Adress_Com,uchar Num_Adat,uchar *Adress_Data){uchar a=0;uchar Data_Word;LCD_WriteCom(Adress_Com); //选中地址for(a=0;a<Num_Adat;a++) //for 循环决定显示字符个数{Data_Word=*Adress_Data; //读取字符串数据LCD_WriteData(Data_Word); //显示字符串Adress_Data++; //显示地址加一}}/***************1602 函数*******************/void LCD_WriteData(uchar LCD_1602_DATA) /********LCD1602 数据写入***********/ {delay5ms(); //操作前短暂延时,保证信号稳定LCD_E=0;LCD_RS=1;LCD_RW=0;_nop_();LCD_E=1;LCD_DATA=LCD_1602_DATA;LCD_E=0;LCD_RS=0;}/********LCD1602 命令写入***********/void LCD_WriteCom(uchar LCD_1602_COM){delay5ms();//操作前短暂延时,保证信号稳定LCD_E=0;LCD_RS=0;LCD_RW=0;_nop_();LCD_E=1;LCD_DATA=LCD_1602_COM;LCD_E=0;LCD_RS=0;}void InitLcd() //初始化液晶函数{delay5ms();delay5ms();LCD_WriteCom(0x38); //display modeLCD_WriteCom(0x38); //display modeLCD_WriteCom(0x38); //display modeLCD_WriteCom(0x06); //显示光标挪移位置LCD_WriteCom(0x0c); //显示开及光标设置LCD_WriteCom(0x01); //显示清屏delay5ms();delay5ms();}void delay5ms(void) //5ms 延时函数{unsigned char a,b;for(b=185;b>0;b--)for(a=12;a>0;a--);}。

基于51单片机脉搏测量仪

基于51单片机脉搏测量仪

基于51单片机脉搏测量仪
本文介绍一种用单片机制作的脉搏测量仪,只要把手指放在传感器内,很快就可以精确测出每分钟脉搏数,测量的结果用三位数字显示出来。

一、电路工作原理
电路原理见附图。

电路由传感器电路、信号放大和整形电路、单片机电路、数码显示电路等四部分组成。

传感器由红外线发射二极管和接收二极管组成,测量原理如下:将手指
放在红外线发射二极管和接收二极管之间,血管中血液的流量随着心脏的跳动
变化,由于手指放在光的传递路径中,血管中血液饱和度的变化将引起光的传
递强度变化,此变化和心跳的节拍相对应,因此红外接收二极管的电流也跟着
心跳的节拍改变,使得红外接收二极管输出与心跳节拍相对应的脉冲信号。


脉冲信号经F1~F3、R3~R5。

C1、C2等组成的低通放大器放大,
F4、R6、R7、C3组成的放大器进一步放大后,送给由F5、F6、RP1、R8等组成的施密特触发器整形后输出,作为单片机的外部中断信号。

电路中的可变电
阻RP1用来调整施密特触发器的阈值压。

IC2、X1、R10、C5等组成单片机电路。

单片机对由P3.2输入的脉冲信号进行计算处理后,送到数码管显示。

发光二极管VD3作脉搏测量状态显示,脉搏每跳动一次,VD3点亮一次。

三只数码管VT1~VT3、R12-R21等组成数码显示电路。

本机采用动态扫描显示方式,使用共阳数码管,P3.3~P3.5口作三只数码管的动态扫描位驱动码输出,通过三极管VT1-VT3驱动数码管。

P1.0-P1.6口作数码管段码输出。

二、软件设计。

单片机脉搏计-51程序

单片机脉搏计-51程序
{
TR0 = 1; //开定时器
}
else
{
time[i] = timecount * 50 + TH0 + TL0;//算出间隔时间
timecount = 0; //50ms计数清零
i++;
if(i == 6) //记录到超过等于6次时间
{
TMOD = 0X20; //定时器T1作为波特率发生器
SCON = 0X50; //串口方式1,允许接收
PCON &= 0X7F; //波特率不倍增
TH1 = TL1 = 0XFD; //计数器初始值设置,注意波特率是9600的
TR1 = 1; //启动波特率发生器
{
i = 1; //计数从1开始
displayOK = 1;//测得5次开始显示?
}
}
}
4、TIME0.h
//======================================================
#ifndef __TIME0_H__
#define __USART_H__
//串口初始化
void UsartConfiguration();
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
TI = 0;
}
*
/*******************************************************************************

基于51单片机的心率脉搏计的设计楼俊君

基于51单片机的心率脉搏计的设计楼俊君

基于51单片机的心率脉搏计的设计楼俊君发布时间:2021-10-18T06:54:22.642Z 来源:《学习与科普》2021年11期作者:楼俊君[导读] 人体的心率脉搏信号中蕴含丰富的信息,通过对它进行测量分析,可对人体的健康情况尤其是心脑血管方面进行初步的判断。

上海电力大学自动化工程学院摘要:基于51单片机的心率脉搏计由单片机、光电传感器、显示屏、报警装置、供电模块组成。

心脏搏动产生的血液流动会导致人体组织透光度发生变化,使用光电传感器将之采集转换为模拟信号,该信号经过硬件电路滤波、放大、整形,将心脏搏动一次转换为一个下跳沿,送至单片机计算后即可得到心率,并送往显示屏显示。

本设计有一定的实用性。

关键词:单片机;测量;心率前言人体的心率脉搏信号中蕴含丰富的信息,通过对它进行测量分析,可对人体的健康情况尤其是心脑血管方面进行初步的判断。

心脑血管疾病是我国乃至世界的常见病、多发病,在全球死亡原因排名前十,常发于老年群体中,为防止悲剧的发生,设计一个能够及时对心率进行测量并发出异常警报的仪器非常必要;除了应用于医疗领域,在生活中常见的一些智能设备上也配有心率监测功能,在运动时对心率进行实时测量,提醒运动者调整训练量,使身体处在最佳状态,提高运动效率。

一、总体设计方案心率脉搏计的功能有测量并显示心率脉搏,设置正常心率上下限范围,当测得心率超过设置范围后报警。

为实现以上功能,首先进行整体方案设计,如图1所示。

图1 心率脉搏计的系统组成心率脉搏信号的采集模块,经过选择对比,选用ST188集发射器与接收器一体的反射式光电传感器;采集到的心率信号是非常微弱的低频信号,需要滤波、放大、整形再送至单片机;主控制器选择AT89C51,负责控制整个系统的工作;显示模块选择LCD1602;当测得的心率不在设置的正常范围内,通过蜂鸣器报警。

二、硬件设计2.1 单片机AT89C51AT89C51是一种可以对它编程以及擦除的低电压、低功耗、高性能的八位微处理器,使用特点如下:4k字节Flash存储器,128字节片内数据存储器,数据可以保存十年;外设丰富,两个16位定时/计数器,5个中断;有丰富的通信端口,32个I/O 口,1个全双工串行通信口。

基于51单片机的心率计设计

基于51单片机的心率计设计

基于51单片机的心率计设计一、引言心率是反映心脏功能的重要指标之一,对于人体健康的监测具有重要意义。

本文将介绍一种基于51单片机的心率计设计方案,通过测量心电信号来实时监测心率变化,并将结果显示在液晶屏上。

二、硬件设计1. 传感器选择心电信号的采集是心率计设计的关键,常用的传感器有心电图传感器和心率带。

本设计选择心电图传感器作为采集装置,它能够直接测量心脏电活动,并将信号转化为模拟电压。

2. 信号放大与滤波由于心电信号较弱且容易受到干扰,需要对信号进行放大和滤波处理。

可以采用运算放大器进行信号放大,并通过滤波电路去除高频干扰和基线漂移。

3. 信号采样与转换经过放大和滤波处理的心电信号需要进行模数转换,将模拟信号转换为数字信号以便单片机处理。

可以选择12位的AD转换器进行采样,并通过SPI接口与单片机进行通信。

4. 单片机控制与显示选取51单片机作为控制核心,通过编程实现信号的采集、处理和显示功能。

使用GPIO口与AD转换器和液晶屏连接,通过串口通信实现与电脑的数据传输。

三、软件设计1. 信号采集与处理通过单片机的GPIO口实现对AD转换器的控制,进行心电信号的采集。

同时,通过软件滤波算法对信号进行滤波处理,去除噪声和干扰。

2. 心率计算心率的计算可以通过测量心跳的时间间隔来实现。

在信号处理过程中,可以设置一个阈值,当信号超过该阈值时,计数器加一。

根据连续心跳的次数和采样频率,可以计算出心率的值。

3. 数据显示与存储通过液晶屏显示心率的实时数值,并提供用户界面操作。

同时,可以通过串口将数据传输到电脑进行进一步的分析和存储。

四、实验结果与讨论本设计基于51单片机成功实现了心率计的功能。

通过实验验证,心率计能够准确地测量心率,并实时显示在液晶屏上。

通过与商用心率计进行对比,结果表明本设计具有较高的准确性和稳定性。

五、总结与展望本文介绍了一种基于51单片机的心率计设计方案。

通过对心电信号的采集、处理和显示,实现了心率的实时监测。

基于单片机的脉搏测量仪-程序代码

基于单片机的脉搏测量仪-程序代码

基于单片机的脉搏测量仪-程序代码#include "reg51.h"#define uint8 unsigned char#define uint16 unsigned int#define uchar unsigned char#define uint unsigned int#define TIMER0_HIGHT 0x3C //设置定时器0工作方式1自动装载初值,定时50ms,Fosc=12MHZ#define TIMER0_LOW 0xB0unsigned char keyin = 1; //按键输入bit starttest; //启动测脉搏标志unsigned int cnt10ms; //10ms计数器unsigned char cnt1s; //1秒计数器unsigned intPulsecnt; //脉搏次数,计数器unsigned char NowPulse; //现在测试脉搏的次数unsigned char OLDPulse; //上次测试脉搏的次数char DECPulse; //脉搏的次数差unsigned intPulsenum; //上次测试脉搏的次数unsigned char start=0; //unsigned intPulseTime; //10ms计数器unsigned int Pulse; //10ms计数器unsigned intZs=0; //指数unsigned int SUM=0; //3次脉搏之和unsigned char cnt1s=0; //1s计数器unsigned char cnt1s_flag=0; //1s标志unsigned char cnt10s=0;unsigned char cnt1s2=0; //1s计数器unsigned char cnt1s_flag2=0; //1s标志unsignedint cnt1s2_count=0;unsigned char START1=0;unsigned char Timeover=0;unsigned char PLSEover=0;voidInit_Extint(void);voidTimerInitProc();voidInit_System(void);void Display(uint8 chose_dat, uint8 dat);voidShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8 tcnt1s);voidDelayMs(uint8 Ms);unsigned char Pulse_FLAG=0;unsigned char Pulse_5=0;unsigned char MODE_SET_OK=0;#define LCD_Data P0 //LCD的数据口sbit LCD_BF=LCD_Data^7; //LCD忙信号位sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_EN=P2^2;#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位//输入方式设置#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动//设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON 0x0C //显示开#define LCD_DISPLAY_OFF 0x08 //显示关#define LCD_CURSOR_ON 0x0A //光标显示#define LCD_CURSOR_OFF 0x08 //光标不显示#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁//光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位//工作方式设置#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示/*定义子程序*/void LCD_ClrAll(void); //清屏void Judge_LCD_busy(void); //检测是否忙碌void LCD_Write(ucharWriteData); //写控制字void LCD_write_data(ucharLCD_data); //写数据显示void LCD_cursor(uchar x); //光标起始地址void LCD_printc(unsigned char lcd_data) ; //输出一个字符void LCD_prints(unsigned char *lcd_string);//输出字符串/*LCD1602忙碌判断子程序*/void Judge_LCD_busy(void) //判断LCD1602是否忙状态{while(1){LCD_EN=0;LCD_RS=0;LCD_RW=1;LCD_Data=0xff;LCD_EN=1; //EN 是 1—0 使能if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
t=1500;
while(t--);
}
}
void SMG_Display(unsigned int num)
{
SMG_ShowNum(num/1000);
P0 =0x08>>1;
delay_ms(2);
SMG_ShowNum((num%1000)/100);
P0 =0x08>>2;
delay_ms(2);
void Timer0_Init()
{
TMOD = 0x01;
TR0 = 1;//16位定时器工作方式
TH0 = T1MS>>8;
TL0 = T1MS;
ET0 = 1;//打开定时器0中断
EA = 1;//打开总中断
}
void Timer0_ISR() interrupt 1
{
unsigned int temp;
count++;
TH0 = T1MS>>8;
TL0 = T1MS;
if(count=5000)
temp=Xinlv;
for{}
SMG_Display(temp);
}
数码管部分代码
void HC595_send_byte(unsigned char byte)
{
unsigned char i,temp;
unsigned char seg[10] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
sbit HC595_RST = P0^6;
sbit HC595_SCK = P0^4;
sbit HC595_RCK = P0^5;
sbit HC595_DAT = P0^7;
for(i=0;i<8;i++)
{
temp = byte&(1<<i);
if(temp) HC595_DAT = 1;
else HC595_DAT = 0;
HC595_SCK = 1;//SCK产生一个上升沿
HC595_SCK = 0;
}
HC595_RCK = 1;//RCK产生一个上升沿
HC595_RCK = 0;
外部中断代码
void Exti0_Init()
{
IT0 = 1;//下降沿触发 TCON.0=1
EX0 = 1;//开外部中断0 IE.0=1
EA = 1;//开总中断
}
void Exit0_ISR() interrupt 0
{
Xinlv++;
LED0=0;
delay_ms(2);
LED0=1;
}
定时器代码
SMG_ShowNum((num%100)/10);
P0 =0x08>>3;
delay_ms(2);
SMG_ShowNum(num%10);
P0 =0x08>>4;
delay_ms(2);
}
void main(void)
{
while(1)
{
}
}
}
void SMG_ShowNum(unsigned int num)//数码管显示函数
{
HC595_send_byte(tab_seg[num]);
}
void delay_ms(unsigned int time)//延时函数
{
unsigned int t;
for(;time>0;time--)
{
#includeude "SMG.h"
#define FSOC 24000000L
#define T1MS (65536-FSOC/12/1000)
sbit LED0 = P0^0;
unsigned int count=0;计时标志数
unsigned int xinlv=0;心率计算器
相关文档
最新文档