1、脉搏测试程序#include msp430g2553.h#include lcd12864.h#define CPU_F (double)1000000)#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0) / 调用delay_us(x); 延时 X us#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0) / 调用delay_ms(2000);延时2000MSextern unsigned char Key_Flag;const unsig
2、ned char zuobiao;unsigned int ms_count;unsigned char dat,pulse_count=0,Pulse_Input;unsigned int ADC_max=0,ADC_result106=0;unsigned char i,Cap_counter=0;unsigned int Cap_first,Cap_last,cap_time;unsigned char cap_flag,disp7= , , , , , , ; /存放AD转换的电压值的字符数组disp6,定义格式为123.45Vunsigned char shuzu3= , , ; /
3、存放由整形数据转换的字符串unsigned char Pulse_Max3=0,0,0,Pulse_Min3=0,0,0;unsigned char geshu,y_location,x_location;float volt,freq;unsigned char num_flag=0,Pulse_mHigh,Pulse_mLow; /键盘输入数字计数/* 系统时钟初始化*/void OSCILLATOR_Init(void) if (CALBC1_1MHZ = 0xFF | CALDCO_1MHZ = 0xFF) while(1); / If calibration constants er
4、ased, trap CPU! BCSCTL1 = CALBC1_1MHZ; / Set range DCOCTL = CALDCO_1MHZ; / Set DCOCLK=1MHz / BCSCTL3 |= LFXT1S_2; / Set LFXT1 IFG1 &= OFIFG; / Clear OSCFault flag BCSCTL2 |=SELM_1 + DIVM_0; / Set MCLK=DCOCLK=1MHzvoid ADC_Init(void) ADC10CTL0 |= ADC10SHT_2 + ADC10ON ;/ADC10SHTx=10 采样保持时间设为16个ADC10CLK
5、周期,ADC10开启 ADC10CTL0 |= SREF_1 + REFON + REF2_5V; /选择内部参考源2.5V,打开基准源 ADC10CTL1 |= CONSEQ_0 + INCH_1+ SHS_2; / INCHx=0001选择输入通道 A1, / CONSEQ_0, 工作模式为单通道单次采样 ADC10AE0 |= 0x02; / 外部输入通道 A1(P1.1) 使能 /_bis_SR_register(GIE);void Draw_columnPointer(unsigned char x,unsigned char y) lcd_cs0; dat |= 0x01(y&0x
6、07); /更新要画点所在的页的字节数据 lcd_address(y/8+1),x); transfer_data_lcd(dat); lcd_cs1;void Draw_rowPointer(unsigned char x,unsigned char y) unsigned char dat=0; /画横向点的时候dat要清零 lcd_cs0; dat |= 0x01(y&0x07); /更新要画点所在的页的字节数据 /调用格式 lcd_address(uchar page,uchar column) /page: 18 column:1128 lcd_address(y/8+1),x);
7、transfer_data_lcd(dat); lcd_cs1;void number_to_char(float voltage)/分解成3位整数、2位小数的电压值显示 unsigned char j; /disp0 = (unsigned int)(voltage)/100; /从整数中分离出百位 /voltage -= disp0*100; disp0 = (unsigned int)(voltage)/10; /分离出十位 voltage -= disp0*10; disp1 = (unsigned int)voltage; /分离出个位 voltage -= disp1; disp3
8、 = (unsigned int)(voltage*10); /分离十分位 voltage -= disp3*0.1; disp4 = (unsigned int)(voltage*100);/分离百分位 disp0 |= 0x30; disp1 |= 0x30; disp2 = .; disp3 |= 0x30; disp4 |= 0x30; /将分离的各位整数转换成字符型数据 disp5 = V; disp6 = ; for(j=0;j2;j+) if(dispj = 0) /如果数组中存放在有效整数之前有无效的0,则将0用空格替换 dispj= ; else break; void in
9、ter_to_char(float num) unsigned char i; shuzu0 = (unsigned int)(num)/100; /从整数中分离出百位 num -= shuzu0*100; shuzu1 = (unsigned int)(num)/10; /分离出十位 num -= shuzu1*10; shuzu2 = (unsigned int)num; /分离出个位 shuzu0 |= 0x30; shuzu1 |= 0x30; shuzu2 |= 0x30; for(i=0;i2;i+) if(shuzui=0x30) shuzui=0x20; else break;
10、 void char_to_number(unsigned char *dp) unsigned char k; for(k=0;kEXIT); delay_ms(1000); while(1) Key_Scan(); /做键扫描 if(Key_Flag) /如果Key_Flag标志不为0,则有键按下 Key_Flag = 0; delay_ms(15); Key_Value(); switch(Key_Flag) case 1:Pulse_Maxnum_flag=1;break; case 2:Pulse_Maxnum_flag=2;break; case 3:Pulse_Maxnum_fl
11、ag=3;break; case 4:Pulse_Maxnum_flag=4;break; case 5:Pulse_Maxnum_flag=5;break; case 6:Pulse_Maxnum_flag=6;break; case 7:Pulse_Maxnum_flag=7;break; case 8:Pulse_Maxnum_flag=8;break; case 9:Pulse_Maxnum_flag=9;break; case 0:Pulse_Maxnum_flag=0;break; case F:finish_flag=1;break; default: break; if(num
12、_flag=3) num_flag=0; if(!finish_flag) /数据输入并显示 display_5x7(5,20+num_flag*7,Pulse_Maxnum_flag);num_flag+; else finish_flag=0; char_to_number(Pulse_Max);/输入字符转换成数字 Pulse_mHigh=Pulse_Input; num_flag=0; /输入数据结束,退出数据输入和显示循环 clear_screen(); display_string(3,8,A-输入脉搏上限); display_string(5,8,B-输入脉搏下限); displ
13、ay_string(7,8,C-脉搏图形显示); break; if(Key_Flag = B) /等待输入脉搏上限值 clear_screen(); display_string(1,1,最小脉搏次数:); display_string_57(8,71,F-EXIT); delay_ms(1000); while(1) Key_Scan(); /做键扫描 if(Key_Flag) /如果Key_Flag标志不为0,则有键按下 Key_Flag = 0; delay_ms(15); Key_Value(); switch(Key_Flag) case 1:Pulse_Minnum_flag=1
14、;break; case 2:Pulse_Minnum_flag=2;break; case 3:Pulse_Minnum_flag=3;break; case 4:Pulse_Minnum_flag=4;break; case 5:Pulse_Minnum_flag=5;break; case 6:Pulse_Minnum_flag=6;break; case 7:Pulse_Minnum_flag=7;break; case 8:Pulse_Minnum_flag=8;break; case 9:Pulse_Minnum_flag=9;break; case 0:Pulse_Minnum_
15、flag=0;break; case F:finish_flag=1;break; default: break; if(num_flag=3) num_flag=0; if(!finish_flag) /数据输入并显示 display_5x7(5,20+num_flag*7,Pulse_Minnum_flag);num_flag+; else finish_flag=0; char_to_number(Pulse_Min);/输入字符转换成数字 Pulse_mLow=Pulse_Input; num_flag=0; /输入数据结束,退出数据输入和显示循环 clear_screen(); di
16、splay_string(3,8,A-输入脉搏上限); display_string(5,8,B-输入脉搏下限); display_string(7,8,C-脉搏图形显示); break; if(Key_Flag = C) clear_screen(); display_12864(zuobiao); display_string_57(8,7,Vm); display_string_57(8,38, ); display_string_57(8,76,Pu); display_string_57(8,110,/s); _EINT(); /开总中断 #pragma vector=TIMER0_
17、A0_VECTOR /定时器Timer0中断_interrupt void Timer_A0_ISR(void) ADC10CTL0 |= ADC10SHT_2 + ADC10ON + ADC10IE;/ADC10SHTx=10 采样保持时间设为16个ADC10CLK周期,ADC10开启 ADC10CTL0 |= SREF_1 + REFON + REF2_5V; /选择内部参考源2.5V,打开基准源 /ADC10CTL0 |= SREF_1 + REFON; /选择内部参考源1.5V ADC10CTL0 |= ENC; / ADC10 enable set/将脉搏的电信号进行AD转换,并画出
18、脉搏波形#pragma vector=ADC10_VECTOR_interrupt void ADC10_ISR(void) ADC10CTL0 &= ENC; / ADC10 disabled ADC10CTL0 = 0; / ADC10, Vref disabled completely if(pulse_count 106) ADC_resultpulse_count = ADC10MEM; /每次采样结果送入数组 geshu = ADC_resultpulse_count*35/1023; y_location = 64-(18+geshu); x_location = 15+pulse_count; Draw_rowPointer(x_location,y_location); /扫描点送显 if(ADC_max Pulse_mHigh | (unsigned int)(freq)Pulse_mLow) P1OUT |= BIT2; else P1OUT &= BIT2; inter_to_char(freq); display_string_57(8,91,shuzu); /显示每分钟的脉搏次数 /else / freq=0; _EINT(); /开总中断 br
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1