脈搏測試儀(電子設計競賽試題)
0.png (61.01 KB, 下載次數: 35)
下載附件
2017-7-18 00:37 上傳
單片機源程序如下:
- #include <MSP430x14x.h> //F149的頭文件
- #include "LCD12864.h"
- #include "key.h"
- #define uchar unsigned char
- #define uint unsigned int
- void put(char x,char y,int c); //電壓顯示
- void put_time(char x,char y,char z);//時間顯示
- void put_HZ(char A,char B,char shu);
- void put_one(char A,char B,char shu);
- void draw(double a);
- void pict(uint n);
- void count();
- void clear();
- void huaxian();
- void key_action();
- uint minute=0,second=0,second_1=0;
- uint n=0,number=0,temp0=0,temp2=0;//定義周期個數,邊沿
- double u,fanhui=0;
- uint data[128],save[128],z[128];
- uint y,start=0,time_flag=0;
- uint basic_flag=0; //基本模式標志
- uchar key_val,jilu=0;
- uint cont_flag=0;
- uint comp_max,comp_min;//最大值和最小值上限下限
- uint key1_val=0,key2_val=0;//按鍵鍵值 (代表按鍵按幾次)
- uint ceshi[128]={
- 23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
- 23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
- 23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
- 23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
- 23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
- 23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
- 23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
- 23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12
-
- };
- //系統時鐘初始化
- void sys_Init()
- {
- volatile unsigned int i;
- BCSCTL1&=~XT2OFF; //打開XT2振蕩器
- do
- {
- IFG1 &= ~OFIFG; // 清除振蕩器失效標志
- for (i = 0xFF; i > 0; i--); // 延時,等待XT2起振
- } while ((IFG1 & OFIFG) != 0); // 判斷XT2是否起振
- BCSCTL2 =SELM_2+SELS; //選擇MCLK=SMCLK為XT2
- }
- //定時器A初始化
- void timer0()
- {
- TACTL = TASSEL_2 + MC_2; // 設置定時器A使用MCLK,不分頻,連續計數模式
- CCR0 = 40000; //CCR0初值
- CCTL0 = CCIE; // 允許CCR0 中斷
- }
- //ADC初始化
- void ADC_Init()
- {
- P6SEL |= 0x02; // P6.1為ADC輸入
- ADC12CTL0 = REFON+ REF2_5V; // REFON為打開內部電壓發生器的意思,REF2_5V為設置參考電壓選擇為2.5v的意思
- ADC12CTL0 |= SHT0_2 + ADC12ON; // 設置采樣保持時間為4個ADC12CLK(SHT_2),開啟ADC12模塊(ADC12ON)
- ADC12CTL1 = SHP;
- ADC12MCTL0 = INCH_1+SREF_1; // Vr+=Vref+=2.5V
- ADC12IE = 0x01; // 設置ADC12的中斷使能,不用對應A1通道
- ADC12CTL0 |= ENC; // // 使能AD轉換
- }
- uchar flag=0;
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // Stop WDT,關閉看門狗定時器
- sys_Init();
- timer0();
- ADC_Init();
- P2DIR |=0XFF;
- LCD_init(); //液晶模塊的初始化
- Write_Cmd(0x01);
- GUI_Fill_GDRAM(0x00); //清屏函數
- LCD_write_string(0,0,"系統啟動。。");
- LCD_write_string(0,1,"通信工程系fu!!");
- LCD_write_string(0,2,"通工系fu!!");
- LCD_write_string(0,3,"系統啟動fu。。");
- _EINT(); //開啟總中斷(fuliang)
- //_BIS_SR(LPM0_bits + GIE); // 進入 LPM0 低功耗模式,允許中斷,CPU停止工作,單片機等待
- while(1)
- {
-
- if(start==1) //每20ms判斷成立一次,下面的句子才能運行
- {
- switch(key2_val) //每20ms運行一次,switch這些句子能否運行要取決于“shart=1”
- {
- case 1: //本按鍵按一次的情況
- if(flag==1) //設置flag變量目的只讓這里面的程序執行一次,
- {
- LCD_write_string(0,0,"回放模式"); //雖然程序只執行一次,但下面并沒有清屏,所以只要按
- //鍵不再一次按下,字符不會消失
-
- for(int i=0;i<128;i++)
- {
- z[i]=save[i];
- }
- count();//顯示次數
- for(int i=0;i<128;i+=16)
- {
- pict(i);
- }
- flag=0;
- }
- break;
- case 2: //本按鍵再次按下情況
- LCD_write_string(0,0,"光電脈搏動態顯示");
- for(int i=0;i<128;i++)
- {
- z[i]=save[i];
- }
-
- for(int i=0;i<128;i+=16)
- {
- pict(i);
- }
- break;
- case 3: //本按鍵第三次按下情況
- LCD_write_string(0,0,"監護模式");
- time_flag=1;//倒計時標志
- put_time(7,1,60-second_1);
- count();//顯示次數
- put_HZ(0,3,cont_flag);
-
- default: break;
- }
- start=0; //最后要記得清零
- }
- }
- }
- // Timer A0 interrupt service routine
- //CCR0比較捕捉中斷服務函數
- #pragma vector=TIMERA0_VECTOR
- __interrupt void Timer_A0 (void)
- {
- static uchar temp;
- CCR0 += 40000; //8M/40000=200Hz==>5ms//計時
- if(++temp==200) //5ms*200=1s
- {
- P2OUT ^=BIT0;
- temp=0;
- if(time_flag==1) //監護模式倒計時標志
- {
- second_1++;
- if(second_1>59)
- {
- time_flag=0;
- second_1=0;
- cont_flag=0;
- }
- }
- else second_1=0;
- second++;
- if(basic_flag==1&&second_1>58)//測試完成判斷
- {
- Write_Cmd(0x01);
- LCD_write_string(0,0,"完成!");
- basic_flag=0;
- time_flag=0;
- }
- if(basic_flag==1&&(second<10))
- {
- Write_Cmd(0x01);
- LCD_write_string(0,0,"請重新放入!");
- }
- if(second==1&&minute==0)
- {
- Write_Cmd(0x01);
- LCD_write_string(0,0,"系統已工作ABC!");
- LCD_write_string(0,1,"光纖通信一班符亮");
- }
- if(second>59)
- {
- second=0;
- minute++;
- if(minute>19)
- {
- minute=0;
- }
- }
- }
- if(temp%4==0) //每5ms*4==20ms運行一次按鍵程序,對應下面的"start"標志
- {
- key_action();
- }
- if(temp%10==0)
- {
- cont_flag++;
- ADC12CTL0 |= ADC12SC; //啟動ADC12轉換,讓ADC12每隔50ms轉換一次,
- }
- }
- //AD中斷
- #pragma vector=ADC_VECTOR
- __interrupt void ADC12_ISR (void)
- {
- static double d=0;
- static int x=0;
- d=ADC12MEM0;//累加ad轉換的值,多次轉換可以保證轉換的精度
- u=d*25*100/4096;
- y=(int)((u/2500.0)*32);
- save[x]=31-y;
- x++;
- if(x>127)
- {
- x=0;
- }
- }
- /*********************************************************
- 函數名稱:display()
- 函數功能:在1602指定位置顯示兩位數,被顯示的數值應在0~99之間
- ***********************************************************/
- void put(char x,char y,int c)
- {
- uchar ch[]=":0.000V";
- ch[1]=c/1000%10+'0';
- ch[3]= c/100%10+'0';
- ch[4]= c/10%10+'0';
- ch[5]= c%10+'0';
- LCD_write_string(x,y,ch); //顯示千位,v的單位為mV
- }
- void put_time(char x,char y,char z)
- {
- uchar time[]=" ";
- time[0]=z/10%10+'0';
- time[1]=z%10+'0';
- LCD_write_string(x,y,time);
- }
- void put_HZ(char A,char B,char shu)
- {
- uchar hz[]="次數: ";
- hz[5]=shu/100%10+'0';
- hz[6]=shu/10%10+'0';
- hz[7]=shu%10+'0';
- LCD_write_string(A,B,hz);
- }
- void put_one(char A,char B,char shu)
- {
- uchar hz[]="個數: ";
- hz[5]=shu/100%10+'0';
- hz[6]=shu/10%10+'0';
- hz[7]=shu%10+'0';
- LCD_write_string(A,B,hz);
- }
- /*********************/
- //畫線//
- /********************/
- void pict(uint n)
- {
- uint i,j;
- uint d[32],k;
- //Write_Cmd(0x34); //設置為8 位MPU 接口,擴充指令集,繪圖模式關
- LCD_en_command(0x36);
- for(i=0;i<32;i++)
- d[i]=0;
- k=0x8000;
- for(i=n;i<n+16;i++)
- {
- if(z[i]<=z[i+1])
- {
- for(j=z[i];j<=z[i+1];j++)
- {
- d[j]|=k;
- }
- }
- else
- {
- for(j=z[i+1];j<=z[i];j++)
- {
- d[j]|=k;
- }
- }
- k>>=1;
- }
-
- for(j=0;j<32;j++)
- {
- LCD_en_command(0x80+j); //垂直地址Y
- LCD_en_command(0x88+(n/16)); //水平地址X
- LCD_en_dat(d[j]>>8);
- LCD_en_dat(d[j]&0x00ff);
- }
- // Write_Cmd(0x36); //打開繪圖模式
- LCD_en_command(0x30); //恢復基本指令集,關閉繪圖模式
- }
- void key_action() //按鍵函數,每20ms運行一次這個函數
- {
- start=1; //按鍵按下的情況為“1”,每20ms運行一次(定時器里面是這么設置的)
- key_val=inkey();
- if(key_val!=0xff) //如果按鍵按下的情況,0xff表沒有按鍵按下
- Write_Cmd(0x01); //清除顯示
- if(key_val==1) //第一個按鍵按下
- {
- key2_val++;
- if(key2_val==1)
- {
- flag=1;
- }
- if(key2_val==4)
- key2_val=0;
- }
- if(key_val==2) //當第二個按鍵按下情況
- {
- // exit_flag++;
- key2_val=0;
- Write_Cmd(0x01);
- LCD_write_string(0,1,"基本模式");
- LCD_write_string(0,2,"請等待!");
- basic_flag=1; //基本模式標志
- time_flag=1;
- }
-
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
脈搏.zip
(492.68 KB, 下載次數: 17)
2017-7-17 12:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|