找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6755|回复: 4
打印 上一主题 下一主题
收起左侧

单片机脉搏测量仪制作 程序电路及仿真都有

[复制链接]
跳转到指定楼层
楼主
基于avr单片机做的心率脉搏测量仪

(包含模拟部分的和单片机仿真)以及完整的测量程序代码


下面是proteus仿真图:




电路原理图要用Multisim仿真软件打开

下面是部分程序预览(完整版本请下载附件)
  1. #include<avr/io.h>
  2. #include<util/delay.h>
  3. #include<avr/interrupt.h>
  4. #define uc unsigned char
  5. #define ui unsigned int
  6. volatile uc led[8]={2,4,8,16,1,32,128,64},number[10],no1,no2,no3,no4,t=1;
  7. volatile ui count=1000;
  8. volatile uc cnt=0;
  9. volatile ui mSec=0;
  10. volatile uc k=1,keyFlag=0,voice=0,alarm=1,flash=0;
  11. void calcnum(){//初始化数码管参数,不用管
  12.          number[0]=led[0]+led[1]+led[2]+led[4]+led[5]+led[6];
  13.          number[1]=led[2]+led[5];
  14.          number[2]=led[0]+led[2]+led[3]+led[4]+led[6];
  15.          number[3]=led[0]+led[2]+led[3]+led[5]+led[6];
  16.          number[4]=led[1]+led[2]+led[3]+led[5];//+led[6];
  17.          number[5]=led[0]+led[1]+led[3]+led[5]+led[6];
  18.          number[6]=led[0]+led[1]+led[3]+led[4]+led[5]+led[6];
  19.          number[7]=led[0]+led[2]+led[5];
  20.          number[8]=255-led[7];
  21.          number[9]=number[8]-led[4];
  22. }
  23. void timer0_init(void)//初始化定时器,Timer0 1ms,Timer1 50ms,不用管
  24. {
  25.         TCCR0 = 0x00; //stop
  26.         TCNT0 = 0x06; //set count
  27.         TCCR0 = 0x03; //start timer

  28.         TCCR1B = 0x00; //stop
  29.         TCNT1H = 0xCF; //setup
  30. TCNT1L = 0x2C;
  31. OCR1AH = 0x30;
  32. OCR1AL = 0xD4;
  33. OCR1BH = 0x30;
  34. OCR1BL = 0xD4;
  35. ICR1H  = 0x30;
  36. ICR1L  = 0xD4;
  37. TCCR1A = 0x00;
  38. TCCR1B = 0x03; //start Timer
  39. }
  40. SIGNAL(SIG_OVERFLOW0)//定时器0溢出中断,1ms一次
  41. {
  42. //以下为更新数码管
  43.         if(t==1){
  44.                 t=2;
  45.                 PORTC=~no2;
  46.         }
  47.         else if(t==2){
  48.                 t=8;
  49.                 PORTC=~no3;
  50.         }
  51.         else if(t==8){
  52.                 t=16;
  53.                 PORTC=~no4;
  54.         }
  55.         else{
  56.                 t=1;
  57.                 PORTC=~no1;
  58.         }
  59.         PORTB&=0xe4;//0b11100100;
  60.         PORTB|=t;
  61.         no1=number[k];
  62.         no2=number[count/100%10];
  63.         no3=number[count/10%10];
  64.         no4=number[count%10];

  65. //以上为更新数码管
  66.         mSec++;
  67.         if(keyFlag>0&&(mSec%2))keyFlag--;
  68.         if(voice)PORTA|=0x80;
  69.         else PORTA&=~0x80;
  70. //重置定时器
  71.         TCNT0 = 0x06; //reload counter value
  72.         TCCR0 = 0x03; //start timer
  73. }
  74. SIGNAL(SIG_OVERFLOW1)//定时器1溢出中断,50ms一次
  75. {
  76. //如果为警报状态则闪烁LED报警
  77.         if(alarm){
  78.                 if(flash)PORTA&=0xfe;
  79.                 else PORTA|=0x01;
  80.                 flash=1-flash;
  81.                 PORTA|=0x02;
  82.         }
  83.         else{
  84.                 flash=0;
  85.                 PORTA=0;
  86.         }
  87.         //重置定时器
  88.         TCNT1H = 0xCF; //reload counter high value
  89.         TCNT1L = 0x2C; //reload counter low value
  90.         TCCR1A = 0x00;
  91.         TCCR1B = 0x03; //start Timer
  92. }
  93. SIGNAL(SIG_INTERRUPT0){//中断0,对应按键1
  94.         if(keyFlag)return;
  95.         voice=1-voice;
  96.         keyFlag=50;
  97. }
  98. SIGNAL(SIG_INTERRUPT1){//中断1,对应按键2
  99.         if(keyFlag)return;
  100.         if(k==9){
  101.                 k=1;
  102.         }
  103.         else{
  104.                 k++;
  105.         }
  106.         cnt=0;
  107.         mSec=0;
  108.         keyFlag=50;
  109. }
  110. SIGNAL(SIG_INTERRUPT2){//外部中断2,对应心跳
  111. cnt++;
  112. if(cnt==k){
  113. cli();
  114. count=60000/mSec*k;
  115. uc t=count;
  116. if(t<40||t>150){
  117. alarm=1;
  118. if(voice)voicealarm(t);//这里加了个参数t。
  119. }else alarm=0;
  120. mSec=0;
  121. cnt=0;
  122. sei();
  123. }
  124. }

  125. void voicealarm(uc t){//语音报警,未测试,50Khz
  126. uc addr=0x80;//地址,根据需要修改
  127. if(t<40)addr=0x81;//0x80为心律过高的提示音的地址,0x81为心律过低的地址。也可以改成别的地址。
  128. int i;
  129. PORTA&=~0x04;
  130. _delay_ms(50);
  131. PORTA|=0x04;
  132. for(i=7;i>=0;i--){
  133. if(addr&(1<<i))
  134. PORTA|=0x04;
  135. else
  136. PORTA&=~0x04;
  137. PORTA&=~0x08;
  138. _delay_us(10);
  139. PORTA|=0x08;
  140. _delay_us(10);
  141. }
  142. PORTA|=0x04;
  143. }

  144. int main(){
  145. //以下均为初始化
  146.         DDRA=0xff;
  147.         PORTA=0xfc;
  148.         DDRB=~0x04;
  149.         PORTB=0xff;
  150.         DDRC=0xff;
  151.         PORTC=0xff;
  152.         DDRD=0x00;
  153.         PORTD=0xff;
  154.         calcnum();
  155.         timer0_init();
  156.         MCUCR=0x0A;//0b00001010;
  157.         GICR=(1<<INT1)+(1<<INT0)+(1<<INT2);
  158.         GIFR=0;
  159.         TIMSK = 0x05; //timer interrupt sources
  160.         sei();

  161.         while(1);
  162. //                _delay_ms(1);        
  163. }
复制代码

全部资料: 基于avr单片机的脉搏测量仪.rar (9.57 MB, 下载次数: 97)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:139366 发表于 2016-11-17 18:00 | 只看该作者
来一份源码
回复

使用道具 举报

板凳
ID:209113 发表于 2017-6-8 11:06 | 只看该作者
proteus上面的仿真数码管的显示根本不正确啊?是不是代码有问题?
回复

使用道具 举报

地板
ID:354879 发表于 2018-6-20 09:22 | 只看该作者
能给我私发一份吗?qq1413315425,我静候佳音
回复

使用道具 举报

5#
ID:354879 发表于 2018-6-20 09:25 | 只看该作者
能线下联系你吗?我QQ1413315425
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表