#include "msp430.h"
#include "HAL_Dogs102x6.h"
#define number_of_results 1000
#define Len_Vpp_value 1000
__no_init unsigned int result_dc[number_of_results];
__no_init unsigned int result_ac[number_of_results];
unsigned int count_of_result=0;
unsigned int npoint=0;
__no_init unsigned int temp_dc[5];
__no_init unsigned int temp_ac[5];
int j=0;
//函数声明
void Vpp_detection(void);//得最大vpp值
void AD_init_single(void);//单通道单词采样初始化
void AD_init(void);//序列通道多次采样初始化
void choise(unsigned int *a,int n);//选择排序法排序
void WDT_init(void); //8ms定时器初始化
void AD_start(void);//开始转换
int abs(int a);//求绝对值的函数
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Dogs102x6_init();
Dogs102x6_backlightInit();
Dogs102x6_setBacklight(8);
Dogs102x6_clearScreen(); //清屏
Dogs102x6_stringDraw(9, 0, "pressure", DOGS102x6_DRAW_NORMAL);
/*AD_init_single();
WDT_init();
//while(ADC12MEM0<)当充气到达定值前等待
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗定时器
//开始采集信号*/
/* AD_init();
AD_start();
WDT_init();
while(j<1000);//当放气到一定值前等待
WDTCTL = WDTPW + WDTHOLD; */
for(int i=0;i<1000;i++){
result_dc[i]=i;
}
Vpp_detection();
for(int j=0;j<101;j++){
Dogs102x6_pixelDraw(j,result_ac[j*3+100]/40, 0);
}
return 0;
}
//ADC采样中断函数
#pragma vector=ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
switch(__even_in_range(ADC12IV,34))
{
case 0: break; // Vector 0: No interrupt
case 2: break; // Vector 2: ADC overflow
case 4: break; // Vector 4: ADC timing overflow
case 6: // Vector 6: ADC12IFG0
if (ADC12MEM0 >= 0x7ff) // ADC12MEM = A0 > 0.5AVcc?
P1OUT |= BIT0; // P1.0 = 1
else
P1OUT &= ~BIT0; // P1.0 = 0
// Exit active CPU
case 8: //序列通道多次采样中断响应函数
temp_dc[npoint]=ADC12MEM0;
temp_ac[npoint]=ADC12MEM1;
if(npoint==4){
choise(temp_dc,5);
choise(temp_ac,5);
// result_dc[count_of_result]=(temp_dc[2]+temp_dc[1]+temp_dc[3])/3;
result_dc[count_of_result]=count_of_result;
result_ac[count_of_result]=(temp_ac[2]+temp_ac[1]+temp_ac[3])/3;
count_of_result++;
ADC12CTL0&=~ADC12ENC;
ADC12CTL0&=~ADC12SC;
}
npoint++;
// Vector 8: ADC12IFG1
case 10: break; // Vector 10: ADC12IFG2
case 12: break; // Vector 12: ADC12IFG3
case 14: break; // Vector 14: ADC12IFG4
case 16: break; // Vector 16: ADC12IFG5
case 18: break; // Vector 18: ADC12IFG6
case 20: break; // Vector 20: ADC12IFG7
case 22: break; // Vector 22: ADC12IFG8
case 24: break; // Vector 24: ADC12IFG9
case 26: break; // Vector 26: ADC12IFG10
case 28: break; // Vector 28: ADC12IFG11
case 30: break; // Vector 30: ADC12IFG12
case 32: break; // Vector 32: ADC12IFG13
case 34: break; // Vector 34: ADC12IFG14
default: break;
}
}
//定时器中断
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void){
npoint=0;
j++;
ADC12CTL0|=ADC12ENC;
ADC12CTL0|=ADC12SC;
}
//单通道单词采样初始化
void AD_init_single(){
P6SEL|=BIT6;
P6DIR|=BIT6;
ADC12CTL0=ADC12ON+ADC12REFON+ADC12SHT0_6;//采样时间26.6us采样一次+ADC12REF2_5V
ADC12CTL1=ADC12SHP;
ADC12MCTL0=ADC12INCH_6;//+ADC12SREF_0
ADC12IE=ADC12IE0;
_EINT();
ADC12CTL0|=ADC12ENC;
}
//序列通道多次采样初始化
void AD_init(){
P6SEL|=BIT7+BIT6;
P6DIR|=BIT7+BIT6;
ADC12CTL0=ADC12ON+ADC12REFON+ADC12MSC+ADC12SHT0_6;//采样时间26.6us采样一次,5个点共0.13ms+ADC12REF2_5V
ADC12CTL1=ADC12CONSEQ_3+ADC12SHP;
ADC12MCTL0=ADC12INCH_6;//+ADC12SREF_5
ADC12MCTL1=ADC12INCH_7+ADC12EOS;//+ADC12SREF_5
ADC12IE=ADC12IE1;
_EINT();
ADC12CTL0|=ADC12ENC;
}
//选择排序法排序
void choise(unsigned int *a,int n)
{
unsigned int i,j,k,temp;
for(i=0;i<n-1;i++) {
k=i; /*给记号赋值*/
for(j=i+1;j<n;j++)
if(a[k]>a[j]) k=j; /*是k总是指向最小元素*/
if(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
}
//8ms定时器初始化
void WDT_init(){
WDTCTL= WDT_MDLY_8;//8ms定时器
SFRIE1= WDTIE ;
_EINT();
}
//开始转换
void AD_start(){
ADC12CTL0|=ADC12SC;
}
//得最大vpp值
void Vpp_detection(void)
{
int NUM_OF_DATA ; /*数组长度没赋值 */
unsigned int Vpp_value[50] ;
unsigned int Dc_value[50];
unsigned int Time_count=0;
int Vppmax = 0;
int Vppmin = 0;
for(int i=0;i<NUM_OF_DATA;i++)
{
if(result_ac[i] >= Vppmax)
Vppmax = result_ac[i];
if(result_ac[i] <= Vppmin)
Vppmin = result_ac[i];
}
float Vpp_ref = 0.33*(Vppmax - Vppmin);
int i=0;
//将峰峰值与对应的直流量求出来
while(i<NUM_OF_DATA){
Vppmax=result_ac[i];
Vppmin=result_ac[i];
while(result_ac[i]<Vpp_ref&&i<NUM_OF_DATA){
if(result_ac[i]<Vppmin){
Vppmin=result_ac[i];
}
i++;
}
while(result_ac[i]>Vpp_ref&&i<NUM_OF_DATA){
if(result_ac[i]>Vppmax){
Vppmax=result_ac[i];
}
i++;
}
Vpp_value[Time_count]=Vppmax-Vppmin;
Dc_value[Time_count]=result_dc[i];
Time_count++;
}
//*****找到最大值对应的直流序号*****
int max_Vpp_value=Vpp_value[0];
int temp_Vppmax_num=0;
for(i=0; i< Time_count; i++ )
{
if(Vpp_value[i] > max_Vpp_value)
{
max_Vpp_value = Vpp_value[i];
temp_Vppmax_num = i;
}
}
int Dc_average_press=Dc_value[temp_Vppmax_num];//平均压
//*****求舒张压和收缩压*****
int half_Vppmax_value = max_Vpp_value / 2 ;
int threequarter_Vppmax_value = 3 * max_Vpp_value / 4 ;
unsigned int absVpp[50]; //重新开一个数组用来存放与0.5VPP差值的绝对值
int minabs=0;
int minabs_num=0;
for(i=0;i<Time_count;i++){
absVpp[i]=abs(Vpp_value[i]-half_Vppmax_value);
}
minabs=absVpp[0];
for(i=0; i<temp_Vppmax_num; i++ )
{
if (absVpp[i] < minabs)
{
minabs = absVpp[i] ;
minabs_num = i ;
}
}
int Dc_shrink_press = Dc_value[minabs_num]; //收缩压
for(i=0;i<Time_count;i++){
absVpp[i]=abs(Vpp_value[i]-threequarter_Vppmax_value);
}
minabs=absVpp[temp_Vppmax_num];
for(i=temp_Vppmax_num; i<Time_count; i++ )
{
if (absVpp[i] < minabs)
{
minabs = absVpp[i] ;
minabs_num = i ;
}
}
int Dc_diastolic_press = Dc_value[minabs_num]; //舒张压
}
int abs(int a){
if(a>0){
return a;}
else{
return -a;
}
}
xiaolan.rar_收缩压_收缩压 舒张压_收缩压‘_舒张压_血压
版权申诉
24 浏览量
2022-09-14
20:56:53
上传
评论
收藏 2KB RAR 举报
林当时
- 粉丝: 99
- 资源: 1万+
最新资源
- 基于GO语言实现的XUPT研究生学业奖学金评定系统
- nodejs制作excel表格到json格式、js文件
- 瓶装酒酒盖液体瑕疵缺陷检测数据集VOC+YOLO格式5031张13类别.7z
- 基于ASMSEdit的输入数据校验
- MySql5.7版本连接Unity需要的mysql.data.dll文件
- 基于Objective-C实现手机共享单车信息管理系统设计与实现
- Firewalls Don't Stop Dragons, 3rd Edition
- rk3588rk3588s使用c++多线程异步等优化c++实现源码(yolov5运行可达到142fps)+项目使用说明.zip
- Jenkins Continuous Integration Cookbook, Second Edition
- 首涂第二十八套-新版海螺M3多功能苹果CMSv10自适应全屏高端模板 (1).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0