|
基于avr單片機做的心率脈搏測量儀
(包含模擬部分的和單片機仿真)以及完整的測量程序代碼
下面是proteus仿真圖:
電路原理圖要用Multisim仿真軟件打開
下面是部分程序預覽(完整版本請下載附件)
- #include<avr/io.h>
- #include<util/delay.h>
- #include<avr/interrupt.h>
- #define uc unsigned char
- #define ui unsigned int
- volatile uc led[8]={2,4,8,16,1,32,128,64},number[10],no1,no2,no3,no4,t=1;
- volatile ui count=1000;
- volatile uc cnt=0;
- volatile ui mSec=0;
- volatile uc k=1,keyFlag=0,voice=0,alarm=1,flash=0;
- void calcnum(){//初始化數碼管參數,不用管
- number[0]=led[0]+led[1]+led[2]+led[4]+led[5]+led[6];
- number[1]=led[2]+led[5];
- number[2]=led[0]+led[2]+led[3]+led[4]+led[6];
- number[3]=led[0]+led[2]+led[3]+led[5]+led[6];
- number[4]=led[1]+led[2]+led[3]+led[5];//+led[6];
- number[5]=led[0]+led[1]+led[3]+led[5]+led[6];
- number[6]=led[0]+led[1]+led[3]+led[4]+led[5]+led[6];
- number[7]=led[0]+led[2]+led[5];
- number[8]=255-led[7];
- number[9]=number[8]-led[4];
- }
- void timer0_init(void)//初始化定時器,Timer0 1ms,Timer1 50ms,不用管
- {
- TCCR0 = 0x00; //stop
- TCNT0 = 0x06; //set count
- TCCR0 = 0x03; //start timer
- TCCR1B = 0x00; //stop
- TCNT1H = 0xCF; //setup
- TCNT1L = 0x2C;
- OCR1AH = 0x30;
- OCR1AL = 0xD4;
- OCR1BH = 0x30;
- OCR1BL = 0xD4;
- ICR1H = 0x30;
- ICR1L = 0xD4;
- TCCR1A = 0x00;
- TCCR1B = 0x03; //start Timer
- }
- SIGNAL(SIG_OVERFLOW0)//定時器0溢出中斷,1ms一次
- {
- //以下為更新數碼管
- if(t==1){
- t=2;
- PORTC=~no2;
- }
- else if(t==2){
- t=8;
- PORTC=~no3;
- }
- else if(t==8){
- t=16;
- PORTC=~no4;
- }
- else{
- t=1;
- PORTC=~no1;
- }
- PORTB&=0xe4;//0b11100100;
- PORTB|=t;
- no1=number[k];
- no2=number[count/100%10];
- no3=number[count/10%10];
- no4=number[count%10];
- //以上為更新數碼管
- mSec++;
- if(keyFlag>0&&(mSec%2))keyFlag--;
- if(voice)PORTA|=0x80;
- else PORTA&=~0x80;
- //重置定時器
- TCNT0 = 0x06; //reload counter value
- TCCR0 = 0x03; //start timer
- }
- SIGNAL(SIG_OVERFLOW1)//定時器1溢出中斷,50ms一次
- {
- //如果為警報狀態則閃爍LED報警
- if(alarm){
- if(flash)PORTA&=0xfe;
- else PORTA|=0x01;
- flash=1-flash;
- PORTA|=0x02;
- }
- else{
- flash=0;
- PORTA=0;
- }
- //重置定時器
- TCNT1H = 0xCF; //reload counter high value
- TCNT1L = 0x2C; //reload counter low value
- TCCR1A = 0x00;
- TCCR1B = 0x03; //start Timer
- }
- SIGNAL(SIG_INTERRUPT0){//中斷0,對應按鍵1
- if(keyFlag)return;
- voice=1-voice;
- keyFlag=50;
- }
- SIGNAL(SIG_INTERRUPT1){//中斷1,對應按鍵2
- if(keyFlag)return;
- if(k==9){
- k=1;
- }
- else{
- k++;
- }
- cnt=0;
- mSec=0;
- keyFlag=50;
- }
- SIGNAL(SIG_INTERRUPT2){//外部中斷2,對應心跳
- cnt++;
- if(cnt==k){
- cli();
- count=60000/mSec*k;
- uc t=count;
- if(t<40||t>150){
- alarm=1;
- if(voice)voicealarm(t);//這里加了個參數t。
- }else alarm=0;
- mSec=0;
- cnt=0;
- sei();
- }
- }
- void voicealarm(uc t){//語音報警,未測試,50Khz
- uc addr=0x80;//地址,根據需要修改
- if(t<40)addr=0x81;//0x80為心律過高的提示音的地址,0x81為心律過低的地址。也可以改成別的地址。
- int i;
- PORTA&=~0x04;
- _delay_ms(50);
- PORTA|=0x04;
- for(i=7;i>=0;i--){
- if(addr&(1<<i))
- PORTA|=0x04;
- else
- PORTA&=~0x04;
- PORTA&=~0x08;
- _delay_us(10);
- PORTA|=0x08;
- _delay_us(10);
- }
- PORTA|=0x04;
- }
- int main(){
- //以下均為初始化
- DDRA=0xff;
- PORTA=0xfc;
- DDRB=~0x04;
- PORTB=0xff;
- DDRC=0xff;
- PORTC=0xff;
- DDRD=0x00;
- PORTD=0xff;
- calcnum();
- timer0_init();
- MCUCR=0x0A;//0b00001010;
- GICR=(1<<INT1)+(1<<INT0)+(1<<INT2);
- GIFR=0;
- TIMSK = 0x05; //timer interrupt sources
- sei();
- while(1);
- // _delay_ms(1);
- }
復制代碼
全部資料:
基于avr單片機的脈搏測量儀.rar
(9.57 MB, 下載次數: 99)
2016-4-20 20:31 上傳
點擊文件名下載附件
|
|