久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2977|回復: 0
打印 上一主題 下一主題
收起左側

脈搏測試儀(電子設計競賽試題)

[復制鏈接]
跳轉到指定樓層
樓主
脈搏測試儀(電子設計競賽試題)


單片機源程序如下:
  1. #include <MSP430x14x.h>      //F149的頭文件
  2. #include "LCD12864.h"
  3. #include "key.h"
  4. #define uchar unsigned char     
  5. #define uint  unsigned int

  6. void put(char x,char y,int c);  //電壓顯示
  7. void put_time(char x,char y,char z);//時間顯示
  8. void put_HZ(char A,char B,char shu);
  9. void put_one(char A,char B,char shu);
  10. void draw(double a);
  11. void pict(uint n);
  12. void count();
  13. void clear();
  14. void huaxian();
  15. void key_action();

  16. uint minute=0,second=0,second_1=0;
  17. uint n=0,number=0,temp0=0,temp2=0;//定義周期個數,邊沿
  18. double u,fanhui=0;
  19. uint data[128],save[128],z[128];
  20. uint y,start=0,time_flag=0;
  21. uint basic_flag=0;      //基本模式標志
  22. uchar key_val,jilu=0;
  23. uint cont_flag=0;
  24. uint comp_max,comp_min;//最大值和最小值上限下限
  25. uint key1_val=0,key2_val=0;//按鍵鍵值  (代表按鍵按幾次)
  26. uint ceshi[128]={
  27.   23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
  28.   23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
  29.   23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
  30.   23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
  31.   23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
  32.   23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
  33.   23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12,
  34.   23,25,18,10,5,2,8,12,23,25,18,10,5,2,8,12
  35.    
  36. };

  37. //系統時鐘初始化
  38. void sys_Init()
  39. {
  40.   volatile unsigned int i;
  41.   BCSCTL1&=~XT2OFF;          //打開XT2振蕩器
  42.   do
  43.   {
  44.     IFG1 &= ~OFIFG;     // 清除振蕩器失效標志
  45.     for (i = 0xFF; i > 0; i--);  // 延時,等待XT2起振
  46.   } while ((IFG1 & OFIFG) != 0);    // 判斷XT2是否起振
  47.   BCSCTL2 =SELM_2+SELS;     //選擇MCLK=SMCLK為XT2
  48. }
  49. //定時器A初始化
  50. void timer0()
  51. {
  52.   TACTL = TASSEL_2 + MC_2;  // 設置定時器A使用MCLK,不分頻,連續計數模式  
  53.   CCR0 = 40000;              //CCR0初值
  54.   CCTL0 =  CCIE;             // 允許CCR0 中斷
  55. }
  56. //ADC初始化
  57. void ADC_Init()
  58. {
  59.   P6SEL |= 0x02; // P6.1為ADC輸入
  60.   ADC12CTL0 = REFON+ REF2_5V;     // REFON為打開內部電壓發生器的意思,REF2_5V為設置參考電壓選擇為2.5v的意思
  61.   ADC12CTL0 |= SHT0_2 + ADC12ON;   // 設置采樣保持時間為4個ADC12CLK(SHT_2),開啟ADC12模塊(ADC12ON)
  62.   ADC12CTL1 = SHP;
  63.   ADC12MCTL0 = INCH_1+SREF_1;             // Vr+=Vref+=2.5V
  64.   ADC12IE = 0x01;                  // 設置ADC12的中斷使能,不用對應A1通道
  65.   ADC12CTL0 |= ENC;               //  // 使能AD轉換
  66. }
  67. uchar flag=0;
  68. void main(void)
  69. {
  70.   WDTCTL = WDTPW + WDTHOLD;   // Stop WDT,關閉看門狗定時器
  71.   sys_Init();
  72.   timer0();
  73.   ADC_Init();
  74.   P2DIR |=0XFF;
  75.   LCD_init();    //液晶模塊的初始化  
  76.   Write_Cmd(0x01);
  77.   GUI_Fill_GDRAM(0x00);      //清屏函數
  78.   LCD_write_string(0,0,"系統啟動。。");
  79.   LCD_write_string(0,1,"通信工程系fu!!");
  80.   LCD_write_string(0,2,"通工系fu!!");
  81.   LCD_write_string(0,3,"系統啟動fu。。");
  82.   _EINT();      //開啟總中斷(fuliang)
  83.   //_BIS_SR(LPM0_bits + GIE);        // 進入 LPM0 低功耗模式,允許中斷,CPU停止工作,單片機等待
  84.   while(1)
  85.   {
  86.    
  87.     if(start==1)   //每20ms判斷成立一次,下面的句子才能運行
  88.     {     
  89.       switch(key2_val)   //每20ms運行一次,switch這些句子能否運行要取決于“shart=1”
  90.       {  
  91.       case 1:      //本按鍵按一次的情況
  92.         if(flag==1)    //設置flag變量目的只讓這里面的程序執行一次,
  93.         {
  94.           LCD_write_string(0,0,"回放模式");  //雖然程序只執行一次,但下面并沒有清屏,所以只要按
  95.                                            //鍵不再一次按下,字符不會消失
  96.          
  97.           for(int i=0;i<128;i++)
  98.           {
  99.             z[i]=save[i];
  100.           }
  101.           count();//顯示次數
  102.           for(int i=0;i<128;i+=16)
  103.           {
  104.             pict(i);
  105.           }
  106.           flag=0;
  107.         }
  108.         break;
  109.       case 2:         //本按鍵再次按下情況
  110.         LCD_write_string(0,0,"光電脈搏動態顯示");
  111.         for(int i=0;i<128;i++)
  112.         {
  113.           z[i]=save[i];
  114.         }
  115.         
  116.         for(int i=0;i<128;i+=16)
  117.         {
  118.           pict(i);
  119.         }
  120.         break;
  121.       case 3:        //本按鍵第三次按下情況
  122.         LCD_write_string(0,0,"監護模式");
  123.         time_flag=1;//倒計時標志
  124.         put_time(7,1,60-second_1);
  125.         count();//顯示次數
  126.         put_HZ(0,3,cont_flag);
  127.         
  128.       default: break;
  129.       }
  130.       start=0;      //最后要記得清零
  131.     }   
  132.   }  
  133. }

  134. // Timer A0 interrupt service routine
  135. //CCR0比較捕捉中斷服務函數
  136. #pragma vector=TIMERA0_VECTOR
  137. __interrupt void Timer_A0 (void)
  138. {  
  139.   static uchar temp;
  140.   CCR0 += 40000;    //8M/40000=200Hz==>5ms//計時
  141.   if(++temp==200)  //5ms*200=1s
  142.   {
  143.   P2OUT ^=BIT0;
  144.   temp=0;
  145.   if(time_flag==1)  //監護模式倒計時標志
  146.   {
  147.     second_1++;     
  148.     if(second_1>59)
  149.     {
  150.     time_flag=0;
  151.     second_1=0;
  152.     cont_flag=0;  
  153.     }
  154.   }
  155.   else second_1=0;   
  156.   second++;
  157.   if(basic_flag==1&&second_1>58)//測試完成判斷
  158.   {
  159.     Write_Cmd(0x01);
  160.     LCD_write_string(0,0,"完成!");
  161.     basic_flag=0;
  162.     time_flag=0;
  163.   }
  164.   if(basic_flag==1&&(second<10))
  165.   {
  166.     Write_Cmd(0x01);
  167.     LCD_write_string(0,0,"請重新放入!");  
  168.   }
  169.   if(second==1&&minute==0)
  170.   {
  171.     Write_Cmd(0x01);
  172.     LCD_write_string(0,0,"系統已工作ABC!");
  173.     LCD_write_string(0,1,"光纖通信一班符亮");
  174.   }
  175.   if(second>59)
  176.   {
  177.     second=0;
  178.     minute++;
  179.     if(minute>19)
  180.     {
  181.       minute=0;
  182.     }   
  183.   }
  184.   }   
  185.   if(temp%4==0)    //每5ms*4==20ms運行一次按鍵程序,對應下面的"start"標志
  186.   {
  187.     key_action();      
  188.   }
  189.   if(temp%10==0)
  190.   {
  191.     cont_flag++;
  192.     ADC12CTL0 |= ADC12SC;  //啟動ADC12轉換,讓ADC12每隔50ms轉換一次,
  193.   }
  194. }

  195. //AD中斷
  196. #pragma vector=ADC_VECTOR
  197. __interrupt void ADC12_ISR (void)
  198. {
  199.   static double d=0;
  200.   static int x=0;
  201.   d=ADC12MEM0;//累加ad轉換的值,多次轉換可以保證轉換的精度
  202.   u=d*25*100/4096;        
  203.   y=(int)((u/2500.0)*32);
  204.   save[x]=31-y;
  205.   x++;
  206.   if(x>127)
  207.   {     
  208.     x=0;
  209.   }
  210. }
  211. /*********************************************************
  212. 函數名稱:display()
  213. 函數功能:在1602指定位置顯示兩位數,被顯示的數值應在0~99之間
  214. ***********************************************************/

  215. void put(char x,char y,int c)
  216. {  
  217.   uchar ch[]=":0.000V";
  218.   ch[1]=c/1000%10+'0';
  219.   ch[3]= c/100%10+'0';
  220.   ch[4]= c/10%10+'0';
  221.   ch[5]= c%10+'0';   
  222.   LCD_write_string(x,y,ch);   //顯示千位,v的單位為mV
  223. }

  224. void put_time(char x,char y,char z)
  225. {
  226.   uchar time[]="  ";
  227.   time[0]=z/10%10+'0';
  228.   time[1]=z%10+'0';
  229.   LCD_write_string(x,y,time);
  230. }

  231. void put_HZ(char A,char B,char shu)
  232. {
  233.   uchar hz[]="次數:   ";
  234.   hz[5]=shu/100%10+'0';
  235.   hz[6]=shu/10%10+'0';
  236.   hz[7]=shu%10+'0';
  237.   LCD_write_string(A,B,hz);
  238. }
  239. void put_one(char A,char B,char shu)
  240. {
  241.   uchar hz[]="個數:   ";
  242.   hz[5]=shu/100%10+'0';
  243.   hz[6]=shu/10%10+'0';
  244.   hz[7]=shu%10+'0';
  245.   LCD_write_string(A,B,hz);
  246. }

  247. /*********************/
  248. //畫線//
  249. /********************/
  250. void pict(uint n)
  251. {
  252.   uint i,j;
  253.   uint d[32],k;
  254.   //Write_Cmd(0x34); //設置為8 位MPU 接口,擴充指令集,繪圖模式關
  255.   LCD_en_command(0x36);
  256.   for(i=0;i<32;i++)
  257.     d[i]=0;
  258.   k=0x8000;
  259.   for(i=n;i<n+16;i++)
  260.   {
  261.     if(z[i]<=z[i+1])
  262.     {
  263.       for(j=z[i];j<=z[i+1];j++)
  264.       {
  265.         d[j]|=k;
  266.       }
  267.     }
  268.     else
  269.     {
  270.       for(j=z[i+1];j<=z[i];j++)
  271.       {
  272.         d[j]|=k;
  273.       }
  274.     }
  275.     k>>=1;
  276.   }
  277.   
  278.   for(j=0;j<32;j++)
  279.   {
  280.     LCD_en_command(0x80+j); //垂直地址Y
  281.     LCD_en_command(0x88+(n/16)); //水平地址X
  282.     LCD_en_dat(d[j]>>8);
  283.     LCD_en_dat(d[j]&0x00ff);
  284.   }
  285.   // Write_Cmd(0x36); //打開繪圖模式
  286.   LCD_en_command(0x30); //恢復基本指令集,關閉繪圖模式
  287. }

  288. void key_action()    //按鍵函數,每20ms運行一次這個函數
  289. {
  290.   start=1;    //按鍵按下的情況為“1”,每20ms運行一次(定時器里面是這么設置的)
  291.   key_val=inkey();
  292.   if(key_val!=0xff)    //如果按鍵按下的情況,0xff表沒有按鍵按下
  293.     Write_Cmd(0x01);   //清除顯示
  294.   if(key_val==1)       //第一個按鍵按下
  295.   {   
  296.     key2_val++;
  297.     if(key2_val==1)
  298.     {
  299.       flag=1;
  300.     }
  301.     if(key2_val==4)
  302.       key2_val=0;
  303.   }
  304.   if(key_val==2)        //當第二個按鍵按下情況
  305.   {
  306.    // exit_flag++;
  307.     key2_val=0;
  308.     Write_Cmd(0x01);
  309.     LCD_write_string(0,1,"基本模式");
  310.     LCD_write_string(0,2,"請等待!");
  311.     basic_flag=1;    //基本模式標志
  312.     time_flag=1;
  313.   }
  314.   
  315. }

  316. ……………………

  317. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
脈搏.zip (492.68 KB, 下載次數: 17)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av影音资源 | 亚洲一区二区三区四区五区中文 | 久久精品免费一区二区 | 精品国产一区二区三区在线观看 | 国产美女视频 | 亚洲精品一区中文字幕乱码 | 精品久久国产 | 午夜免费看 | 日韩在线不卡 | 亚洲精品久久久久久一区二区 | 成人黄色电影免费 | 欧美日韩一 | 天堂亚洲 | 久久久久久一区 | 一级片网址 | 免费视频二区 | 综合五月 | 国产精品成人一区二区 | 欧美一级大片 | 一级毛片在线播放 | 亚洲欧洲成人在线 | 亚洲黄色国产 | 欧美亚洲第一区 | 欧美精品在线播放 | 日本天天操 | 国产成人综合久久 | 久久精品国产v日韩v亚洲 | 国产清纯白嫩初高生视频在线观看 | 亚洲久在线 | 亚洲 欧美 综合 | 美国a级毛片免费视频 | 综合精品久久久 | 欧美日本韩国一区二区三区 | 精品久久久久一区二区国产 | 五月综合激情在线 | 日韩欧美在线视频观看 | 一区二区三区四区国产 | a毛片 | 中文字幕免费视频 | 亚洲伊人久久综合 | 网色|