电子血压计

2019-07-18 08:42发布

程序如下:
  1. #define DAC_1    XBYTE[0x2000]
  2. #define DAC_2    XBYTE[0x4000]
  3. #define ADC_0    XBYTE[0x6000]
  4. #define ADC_1    XBYTE[0x6001]
  5. #define ADC_2    XBYTE[0x6002]
  6. #define ADC_3    XBYTE[0x6003]
  7. #define ADC_4    XBYTE[0x6004]
  8. #define ADC_5    XBYTE[0x6005]
  9. #define ADC_6    XBYTE[0x6006]
  10. #define ADC_7    XBYTE[0x6007]
  11. unsigned char       dspbuf[4]={0xef,0xef,0xef,0xef},sel=0,key_sta=0,key_num;
  12. unsigned int        adcount=0;
  13. sbit D_SER     =P1^0;
  14. sbit D_SRCLK   =P1^1;
  15. sbit D_RCLK    =P1^2;
  16. sbit KEY1      =P3^4;
  17. sbit KEY2      =P3^5;
  18. 定时器初始化:
  19. void init_timer0(void)
  20.   {
  21.   TMOD TMOD =0X22;         //定时器0以方式2(自动重新装载8位计数器)自动计数
  22.   TL0 = 0X06;
  23. TH0 = 0X06;                 //至初始值为6,每0.25ms进入一次中断
  24.   TL1 = 0Xe8;
  25.   TH1 = 0Xe8;
  26. TR0 = 1;
  27. TR1 = 1;
  28.   ET0 = 1;
  29. }
  30. 中断设置:
  31. void init_special_interrupts(void)
  32.   {
  33.   EX0 = 0;
  34.   ET0 = 1;
  35.   EX1 = 0;
  36.   ET1 = 0;
  37.   ES  = 1;
  38.   EA  = 1;
  39.   PT0 = 0;
  40.   PX1 = 1;
  41. PS  = 0;
  42. SCON=0x50;   //串行口方式1工作
  43. }
  44. 数码管显示:
  45. void dsptask()
  46.   {
  47.   unsigned chari;
  48.   unsigned chara,b;
  49.   switch(sel)
  50.    {
  51.    case 0:a=0x01;  break;
  52.    case 1:a=0x02;  break;
  53.    case 2:a=0x04;  break;
  54.    default:a=0x08;
  55.    }
  56. for(b=0x80,i=0;i<8;i++)
  57.     {
  58.    if(a&b)  D_SER=1;
  59.     else     D_SER=0;
  60.     D_SRCLK=0;
  61.     D_SRCLK=1;
  62.     D_SRCLK=0;
  63.    b=b>>1; b=b&0x7f;
  64.     }
  65.   a=dspbuf[sel];
  66.   key_num=sel;
  67.   sel++;
  68.   if(sel>=4)sel=0;
  69. for(b=0x80,i=0;i<8;i++)
  70.     {
  71.    if(a&b)  D_SER=1;
  72.     else     D_SER=0;
  73.     D_SRCLK=0;
  74.     D_SRCLK=1;
  75.     D_SRCLK=0;
  76.    b=b>>1;  b=b&0x7fff;
  77.     }
  78.   D_RCLK=0;
  79.   D_RCLK=1;
  80.   D_RCLK=0;
  81.   }
  82. 键盘扫描:                        //键盘值为1~8
  83. void key_service()
  84.   {
  85. if(key_sta&0x01) return;            // key_sta.0=1
  86.    if(KEY2)
  87.      {
  88.    key_num=key_num+1;                  
  89.        key_sta=key_sta|0x01;              // 置key_sta.0=1
  90.        }
  91.    else if(KEY1)
  92.             {
  93.              key_num=key_num+5;   
  94.          key_sta=key_sta|0x01;        // 置key_sta.0=1
  95.              }
  96.   }
  97. 定时器0中断处理:
  98. void timer_isr() interrupt 1  {
  99.   EA=0;
  100. adcount++;                       //计数,便于放气速度设置
  101. key_service();                     //键盘扫描
  102.   EA=1;
  103.   }
  104. 扫描字显示转化:
  105. fdisp(unsigned char n,unsigned char m)      //将需要显示的数转化成相应的显示码
  106.   {
  107.   char  c;
  108.    switch(n)
  109.     {
  110.     case 0:  c=0x11; break;
  111.     case 1:  c=0x7d; break;
  112.     case 2:  c=0x23; break;
  113.     case 3:  c=0x29; break;
  114.     case 4:  c=0x4d; break;
  115.     case 5:  c=0x89; break;
  116.     case 6:  c=0x81; break;
  117.     case 7:  c=0x3d; break;
  118.     case 8:  c=0x01; break;
  119.     default:c=0x09;
  120.     }
  121.    dspbuf[m]=c;
  122.   }
  123. 主函数:
  124. void main(void)
  125. {
  126.        floatmax=0,min=0,minus=0,mmax=0,om=0;
  127.        intos=0,od=0,os0=0,os1=0,os2=0,od0=0,od1=0,od2=0;
  128.        unsignedchar t,i,flag=0,high=0,hhigh=0,ave=0;
  129.        init_timer0();                  //初始化定时器0
  130.        init_special_interrupts();      //设置中断
  131.        for(i=0;i<4;i++){fdisp(0,i);}
  132.        dsptask();
  133.        for(;;)
  134.     {
  135.               if(key_num==1)                      //开始放气
  136.               {
  137.                      key_sta=key_sta&0xfe;           // 置key_sta.0=0
  138.                      t=ADC_0;
  139.                      if(t>max)max=t;
  140.                      elseif(t<min) min=t;
  141.                      if(adcount>199)
  142.                      {
  143.                             adcount=0;
  144.                             DAC_1=0xf0;             //由D/A输出来控制放气速度
  145.                             if(min!=0&&max!=0)  {minus=max-min;if(minus>mmax){mmax=minus;ave=min;}}
  146.                      }
  147.               }                                 //求出振荡波峰峰值最大时平均压对应的电压值
  148.               elseif(key_num==2)                 //停止放气,求出所需数值并显示
  149.               {
  150.                      key_sta=key_sta&0xfe;
  151.                      if(adcount>199)adcount=0;
  152.                      max=0;   
  153.                      min=0;
  154.                      minus=0;
  155.                      om=ave/(28*3.5*0.133);        
  156. //常数28为放大倍数,根据硬件的实际情况可有所调整
  157.                      os=om*0.8;
  158.                      od=om*0.5;       //根据固定比率法求出收缩压和舒张压,单位为mmHg
  159.                      if(os>140||od>90)high=1;      
  160.                      if(os>160||od>100){high=0;hhigh=1;}
  161. //收缩压大于160mmHg为超高血压,大于130mmHg为高血压
  162.                      os2=os/100;
  163.                      os=os%100;
  164.                      os1=os/10;
  165.                      os0=os%10;
  166.                      od2=od/100;
  167.                      od=od%100;
  168.                      od1=od/10;
  169.                      od0=os%10;
  170.                      do{
  171.                             if(flag=0&&adcount>199)      //显示收缩压
  172.                             {
  173.                                    adcount=0;
  174.                                    flag=1;
  175.                                    fdisp(os0,0);
  176.                                    fdisp(os1,1);
  177.                                    fdisp(os2,2);
  178.                                    fdisp(0,3);
  179.                                    dsptask();
  180.                             }
  181.                             elseif(flag=1&&adcount>199)
  182.                             {
  183.                                    adcount=0;
  184.                                    flag=0;
  185.                                    fdisp(od0,0);
  186.                                    fdisp(od1,1);
  187.                                    fdisp(od2,2);
  188.                                    fdisp(0,3);
  189.                                    dsptask();                   //显示舒张压
  190.                                    if(adcount>199!=key_num!=3)
  191.                                    {
  192.                                           if(high==1)
  193.                                           {
  194.                                                  fdisp(1,0);
  195.                                                  fdisp(0,1);
  196.                                                  fdisp(0,2);
  197.                                                  fdisp(0,3);
  198.                                                  dsptask();                                       
  199.                                           }                   //显示高血压
  200.                                           elseif(hhigh==1)
  201.                                           {
  202.                                                  fdisp(2,0);
  203.                                                  fdisp(0,1);
  204.                                                  fdisp(0,2);
  205.                                                  fdisp(0,3);
  206.                                                  dsptask();                                       
  207.                                           }                     //显示超高血压
  208.                                           else
  209.                                           {
  210.                                                  for(i=0;i<4;i++)fdisp(0,i);
  211.                                                  dsptask();                                       
  212.                                           }                     //显示血压正常
  213.                                    }
  214.                             }
  215.                      }while(key_num!=3);
  216.               }
  217.               elseif(key_num==3)                       //复位
  218.              {
  219.                      key_sta=key_sta&0xfe;           // 置key_sta.0=0
  220.                      for(i=0;i<4;i++){fdisp(0,i);}
  221.                      dsptask();
  222.                      high=0;
  223.                      hhigh=0;
  224.                      max=0,min=0,minus=0,mmax=0,om=0;
  225.                      os=0,od=0,os0=os1=os2=0,od0=od1=od2=0;
  226.                      flag=0;
  227.                      if(adcount>199)adcount=0;
  228.               }
  229.               elsekey_sta=key_sta&0xfe;           // 置key_sta.0=0;
  230.        }
  231. }
复制代码但试了一下,无法实现,求助
这是网上原理图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。