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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32單片機+ads1292心率檢測顯示程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:1067025 發表于 2023-3-20 00:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
該演示程序使用的芯片為:STM32F103C8T6

功能:
    單片機采集ADS1292模塊數據,通過串口輸出。
串口:
    UART1
    波特率:115200
    停止位:1
    數據為:8
    奇偶校驗:無   


引腳定義及連線:
    1292模塊--STM32F1:
    VDD---3.3V/5V
    GND---GND
    DRDY---PA8
    CS---PB12
    SCK---PB13
    MISO---PB14
    MOSI---PB15

單片機源程序如下:
  1. #include "ADS1292.h"
  2. #include "spi.h"
  3. #include "delay.h"
  4. #include "usart.h"
  5. #include "Timer.h"
  6. #include "key.h"
  7. #include "led.h"



  8. #define DEBUG_ADS1292        //寄存器printf調試


  9. u8 ADS1292_REG[12];                //ads1292寄存器數組
  10. ADS1292_CONFIG1         Ads1292_Config1                ={DATA_RATE};                                                                                                                                                                //CONFIG1
  11. ADS1292_CONFIG2         Ads1292_Config2                ={PDB_LOFF_COMP,PDB_REFBUF,VREF,CLK_EN,INT_TEST};                //CONFIG2
  12. ADS1292_CHSET                 Ads1292_Ch1set                ={CNNNLE1_POWER,CNNNLE1_GAIN,CNNNLE1_MUX};                                        //CH1SET
  13. ADS1292_CHSET                 Ads1292_Ch2set                ={CNNNLE2_POWER,CNNNLE2_GAIN,CNNNLE2_MUX};                                        //CH2SET
  14. ADS1292_RLD_SENS        Ads1292_Rld_Sens        ={PDB_RLD,RLD_LOFF_SENSE,RLD2N,RLD2P,RLD1N,RLD1P};        //RLD_SENS
  15. ADS1292_LOFF_SENS        Ads1292_Loff_Sens        ={FLIP2,FLIP1,LOFF2N,LOFF2P,LOFF1N,LOFF1P};                                        //LOFF_SENS
  16. ADS1292_RESP1                        Ads1292_Resp1                        ={RESP_DEMOD_EN1,RESP_MOD_EN,RESP_PH,RESP_CTRL};                //RSP1
  17. ADS1292_RESP2                        Ads1292_Resp2                        ={CALIB,FREQ,RLDREF_INT};                                                                                                                //RSP2

  18.        

  19. //ADS1292的IO口初始化       
  20. void ADS1292_Init(void)
  21. {               
  22.                 GPIO_InitTypeDef         GPIO_InitStructure;       
  23.                 EXTI_InitTypeDef         EXTI_InitStructure;
  24.                 NVIC_InitTypeDef        NVIC_InitStructure;
  25.        
  26.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);          
  27.                 SPI2_Init();//初始化SPI引腳       
  28.                                                                         //250ns 頻率4.5M        發送八組時鐘需要23 us       
  29.                                                                         //125ns 頻率9M,                發送八組時鐘需要14 us       
  30.                                                                         //55ns 頻率18M                發送八組時鐘需要9.2us
  31.                                                                         //30ns 36M                                發送八組時鐘需要9.2us
  32.                                                                         //手冊10頁里寫的最小時鐘周期為50ns                       
  33.                 //DRDY        //待機時高電平,采集時低電平有效
  34.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  35.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入
  36.                 GPIO_Init(GPIOC, &GPIO_InitStructure);               
  37.                 //CS
  38.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  39.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  40.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出
  41.                 GPIO_Init(GPIOB, &GPIO_InitStructure);       
  42.                
  43. //                //RESRT
  44. //                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  45. //                GPIO_Init(GPIOA, &GPIO_InitStructure);       
  46. //                //START
  47. //                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  48. //                GPIO_Init(GPIOA, &GPIO_InitStructure);       
  49. //                //CLKSEL
  50. //                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  51. //                GPIO_Init(GPIOA, &GPIO_InitStructure);               


  52.                 //DRDY中斷初始化
  53.           EXTI_ClearITPendingBit(EXTI_Line8);//清除中斷標志
  54.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8);//選擇管腳
  55.           EXTI_InitStructure.EXTI_Line=EXTI_Line8;                                                 //選擇中斷線路
  56.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //設置為中斷請求,非事件請求
  57.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發
  58.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                 //外部中斷使能
  59.           EXTI_Init(&EXTI_InitStructure);         
  60.                
  61.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  62.           NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                                        //選擇中斷通道
  63.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //搶占優先級
  64.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                //子優先級
  65.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                //使能外部中斷通道
  66.           NVIC_Init(&NVIC_InitStructure);
  67.                
  68.                 EXTI->IMR &= ~(EXTI_Line8);//屏蔽外部中斷       
  69.                 ADS_CS=1;               
  70.                 ADS1292_PowerOnInit();//上電復位,進入待機模式       
  71. }

  72. volatile u8 ads1292_recive_flag=0;        //數據讀取完成標志
  73. volatile u8 ads1292_Cache[9];        //數據緩沖區


  74. void EXTI9_5_IRQHandler(void)
  75. {
  76.        
  77.                 if(EXTI->IMR&EXTI_Line8 && ADS_DRDY==0)//數據接收中斷                               
  78.                 {               
  79.                                 EXTI_ClearITPendingBit(EXTI_Line8);        
  80.                                 ADS1292_Read_Data(ads1292_Cache);//數據存到9字節緩沖區
  81.                                 ads1292_recive_flag=1;
  82.                 }       
  83. }



  84. //讀取72位的數據1100+LOFF_STAT[4:0]+GPIO[1:0]+13個0+2CHx24位,共9字節
  85. //        1100        LOFF_STAT[4                        3                        2                        1                        0        ]        //導聯脫落相關的信息在LOFF_STAT寄存器里
  86. //                                                                        RLD                1N2N        1N2P        1N1N        1N1P       
  87. //        例        C0 00 00 FF E1 1A FF E1 52       

  88. u8 ADS1292_Read_Data(u8 *data)//72M時鐘下函數耗時大約10us  8M時鐘下 函數耗時大約 100us
  89. {               
  90.                 u8 i;       
  91.                
  92.                 ADS_CS=0;//讀9個字節的數據
  93.                 //delay_us(10);
  94.                 for(i=0;i<9;i++)
  95.                 {       
  96.                                 *data=ADS1292_SPI(0X00);       
  97.                                 data++;
  98.                 }
  99.                 //delay_us(10);
  100.                 ADS_CS=1;               
  101.                 return 0;
  102. }


  103. //設置寄存器數組
  104. void ADS1292_SET_REGBUFF(void)
  105. {
  106.         ADS1292_REG[ID] =        ADS1292_DEVICE;//ID只讀
  107.          
  108.         ADS1292_REG[CONFIG1] =        0x00;                //0000 0aaa        [7] 0連續轉換模式  [6:3] 必須為0
  109.         ADS1292_REG[CONFIG1] |=        Ads1292_Config1.Data_Rate;//[2:0] aaa 采樣率設置采樣率

  110.         ADS1292_REG[CONFIG2] =        0x00;                //1abc d0e1        [7] 必須為1  [2] 必須為0  [0] 設置測試信號為1HZ、±1mV方波
  111.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Pdb_Loff_Comp<<6;        //[6]a 導聯脫落比較器是否掉電
  112.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Pdb_Refbuf<<5;                //[5]b 內部參考緩沖器是否掉電
  113.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Vref<<4;                                        //[4]c 內部參考電壓設置,默認2.42V
  114.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Clk_EN<<3;                                //[3]d CLK引腳輸出時鐘脈沖?
  115.         ADS1292_REG[CONFIG2] |=        Ads1292_Config2.Int_Test<<1;                        //[1]e 是否打開內部測試信號,
  116.         ADS1292_REG[CONFIG2] |=        0x81;//設置默認位
  117.        
  118.         ADS1292_REG[LOFF] =        0x10;//[7:5]        設置導聯脫落比較器閾值 [4]        必須為1                 [3:2] 導聯脫落電流幅值                [1]        必須為0        [0]        導聯脫落檢測方式 0 DC 1 AC

  119.         ADS1292_REG[CH1SET] =        0x00;         //abbb cccc
  120.         ADS1292_REG[CH1SET] |=Ads1292_Ch1set.PD<<7;                //[7]  a                 通道1斷電?
  121.         ADS1292_REG[CH1SET] |=Ads1292_Ch1set.GAIN<<4;        //[6:4]bbb        設置PGA增益
  122.         ADS1292_REG[CH1SET] |=Ads1292_Ch1set.MUX;                        //[3:0]cccc        設置通道1輸入方式

  123.         ADS1292_REG[CH2SET] =        0x00;        //abbb cccc
  124.         ADS1292_REG[CH2SET] |=Ads1292_Ch2set.PD<<7;                //[7]  a                 通道2斷電?
  125.         ADS1292_REG[CH2SET] |=Ads1292_Ch2set.GAIN<<4;        //[6:4]bbb        設置PGA增益
  126.         ADS1292_REG[CH2SET] |=Ads1292_Ch2set.MUX;                        //[3:0]cccc        設置通道2輸入方式
  127.        
  128.         ADS1292_REG[RLD_SENS] = 0X00; //11ab cdef        [7:6] 11 PGA斬波頻率        fMOD/4
  129.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Pdb_Rld<<5;                                        //[5]a        該位決定RLD緩沖電源狀態
  130.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld_Loff_Sense<<4;        //[4]b        該位使能RLD導聯脫落檢測功能
  131.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld2N<<3;                                                //[3]c        這個位控制通道2負輸入        用于右腿驅動的輸出
  132.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld2P<<2;                                                //[2]d        該位控制通道2正輸入                用于右腿驅動的輸出
  133.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld1N<<1;                                                //[1]e        這個位控制通道1負輸入        用于右腿驅動的輸出
  134.         ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld1P;                                                        //[0]f        該位控制通道1正輸入                用于右腿驅動的輸出       
  135.         ADS1292_REG[RLD_SENS] |=        0xc0;//設置默認位

  136.         ADS1292_REG[LOFF_SENS] = 0X00;  //00ab cdef        [7:6] 必須為0
  137.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Flip2<<5;                //[5]a        這個位用于控制導聯脫落檢測通道2的電流的方向
  138.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Flip1<<4;                //[4]b        這個位控制用于導聯脫落檢測通道1的電流的方向
  139.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff2N<<3;        //[3]c        該位控制通道2負輸入端的導聯脫落檢測
  140.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff2P<<2;        //[2]d        該位控制通道2正輸入端的導聯脫落檢測
  141.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff1N<<1;        //[1]e        該位控制通道1負輸入端的導聯脫落檢測
  142.         ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff1P;                        //[0]f        該位控制通道1正輸入端的導聯脫落檢測
  143.        
  144.         ADS1292_REG[LOFF_STAT] =        0x00;                //[6]0 設置fCLK和fMOD之間的模分頻比 fCLK=fMOD/4  [4:0]只讀,導聯脫落和電極連接狀態
  145.        
  146.         ADS1292_REG[RESP1] = 0X00;//abcc cc1d
  147.         ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_DemodEN<<7;//[7]a                這個位啟用和禁用通道1上的解調電路               
  148.         ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_modEN<<6;        //[6]b                這個位啟用和禁用通道1上的調制電路       
  149.         ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_ph<<2;                        //[5:2]c        這些位控制呼吸解調控制信號的相位       
  150.         ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_Ctrl;                        //[0]d                這個位設置呼吸回路的模式
  151.         ADS1292_REG[RESP1] |=        0x02;//設置默認位       
  152.        
  153.         ADS1292_REG[RESP2] = 0x00; //a000 0bc1        [6:3]必須為0 [0]必須為1
  154.         ADS1292_REG[RESP2] |=        Ads1292_Resp2.Calib<<7;                                //[7]a 啟動通道偏移校正?
  155.         ADS1292_REG[RESP2] |=        Ads1292_Resp2.freq<<2;                                //[2]b 呼吸頻率設置
  156.         ADS1292_REG[RESP2] |=        Ads1292_Resp2.Rldref_Int<<1;        //[1]c RLDREF信號源外部饋電?
  157.         ADS1292_REG[RESP2] |= 0X01;//設置默認位       

  158.         ADS1292_REG[GPIO] =        0x0C;                        //GPIO設為輸入                [7:4]必須為0         [3:2]11 GPIO為輸入 [1:0] 設置輸入時,指示引腳電平,設置輸出時控制引腳電平
  159. }

  160. //通過SPI總線與ADS1292通信
  161. u8 ADS1292_SPI(u8 com)
  162. {       
  163.                 return SPI2_ReadWriteByte(com);
  164. }
  165. //寫命令
  166. void ADS1292_Send_CMD(u8 data)
  167. {
  168.                 ADS_CS=0;
  169.                 delay_us(100);
  170.                 ADS1292_SPI(data);               
  171.                 delay_us(100);       
  172.                 ADS_CS=1;
  173. }


  174. /*ADS1291、ADS1292和ADS1292R串行接口以字節形式解碼命令,需要4個tCLK周期來解碼和執行.
  175. 因此,在發送多字節命令時,4 tCLK周期必須將一個字節(或操作碼)的結束與下一個字節(或操作碼)分開。
  176. 假設CLK(時鐘)為512 kHz,則tSDECODE (4 tCLK)為7.8125 us。
  177. 當SCLK(數據速率)為16mhz時,一個字節可以在500ns中傳輸,此字節傳輸時間不符合tSDECODE規范;
  178. 因此,必須插入一個延遲,以便第二個字節的末尾晚于7.3125us到達。
  179. 如果SCLK為1 MHz,則在8u秒內傳輸一個字節。由于此傳輸時間超過tSDECODE規范,處理器可以不延遲地發送后續字節。
  180. 在后面的場景中,可以對串行端口進行編程,使其從每個循環的單字節傳輸轉移到多個字節*/

  181. //讀寫多個寄存器
  182. void ADS1292_WR_REGS(u8 reg,u8 len,u8 *data)
  183. {
  184.                 u8 i;
  185.                 ADS_CS=0;       
  186.                 delay_us(100);
  187.                 ADS1292_SPI(reg);
  188.                 delay_us(100);
  189.                 ADS1292_SPI(len-1);
  190.                 if(reg&0x40) //寫
  191.                 {
  192.                                 for(i=0;i<len;i++)
  193.                                 {
  194.                                                 delay_us(100);               
  195.                                                 ADS1292_SPI(*data);
  196.                                                 data++;                               
  197.                                 }                       
  198.                 }
  199.                 else //讀               
  200.                 {
  201.                                 for(i=0;i<len;i++)
  202.                                 {
  203.                                                 delay_us(100);               
  204.                                                 *data = ADS1292_SPI(0);
  205.                                                 data++;
  206.                                 }
  207.                 }                       
  208.                 delay_us(100);       
  209.                 ADS_CS=1;
  210. }


  211. //寄存器數組寫入寄存器
  212. u8 ADS1292_WRITE_REGBUFF(void)
  213. {
  214.                 u8 i,res=0;
  215.                 u8 REG_Cache[12];        //存儲寄存器數據
  216.                 ADS1292_SET_REGBUFF();//設置寄存器數組               
  217.                 ADS1292_WR_REGS(WREG|CONFIG1,11,ADS1292_REG+1);//數組變量寫入寄存器
  218.                 delay_ms(10);               
  219.                 ADS1292_WR_REGS(RREG|ID,12,REG_Cache);//讀寄存器
  220.                 delay_ms(10);       
  221.                
  222.                 //        #ifdef DEBUG_ADS1292       
  223.                 //                printf("WRITE REG:\r\n");
  224.                 //                for(i=0;i<12;i++        )//要寫的數據                                                               
  225.                 //                                printf("%d %x\r\n",i,ADS1292_REG[i]);       
  226.                 //                printf("READ REG:\r\n");
  227.                 //        #endif       
  228.        
  229.        
  230.                 for(i=0;i<12;i++        )        //檢查寄存器       
  231.                 {                                               
  232.                                 if(ADS1292_REG[i] != REG_Cache[i])
  233.                                 {
  234.                                                 if(i!= 0 && i!=8 && i != 11)        //0 8 和11是ID 導聯脫落和GPIO相關
  235.                                                                 res=1;
  236.                                                 else
  237.                                                                 continue;
  238.                                 }                                       
  239.                 //                        #ifdef DEBUG_ADS1292
  240.                 //                                printf("%d %x\r\n",i,REG_Cache[i]); //讀到的數據                       
  241.                 //                        #endif
  242.                   }       

  243.                 #ifdef DEBUG_ADS1292       
  244.                         if(res == 0)
  245.                                         printf("REG write success\r\n");
  246.                         else               
  247.                                         printf("REG write err\r\n");
  248.                 #endif
  249.                 return res;                               
  250. }


  251. void ADS1292_PowerOnInit(void)
  252. {       
  253.                 u8 i;
  254.                 u8 REG_Cache[12];       
  255.        
  256. //                ADS_CLKSEL=1;//啟用內部時鐘
  257. //                ADS_START=0; //停止數據輸出       
  258. //                ADS_RESET=0; //復位
  259. //                delay_ms(1000);
  260. //                ADS_RESET=1;//芯片上電,可以使用       
  261. //                delay_ms(100);        //等待穩定
  262.        
  263.                 ADS1292_Send_CMD(SDATAC);//發送停止連續讀取數據命令
  264.                 delay_ms(100);       
  265.                 ADS1292_Send_CMD(RESET);//復位
  266.                 delay_s(1);               
  267.                 ADS1292_Send_CMD(SDATAC);//發送停止連續讀取數據命令
  268.                 delay_ms(100);               
  269.        
  270.                 //#ifdef DEBUG_ADS1292       
  271.                 //                ADS1292_WR_REGS(RREG|ID,12,REG_Cache);
  272.                 //                printf("read default REG:\r\n");
  273.                 //                for(i=0;i<12;i++        )        //讀默認寄存器
  274.                 //                                printf("%d %x\r\n",i,REG_Cache[i]);               
  275.                 //#endif
  276.                 //ADS1292_Send_CMD(STANDBY);//進入待機模式       
  277. }



  278. //設置通道1內部1mV測試信號
  279. u8 ADS1292_Single_Test(void) //注意1292R開了呼吸解調,會對通道一的內部測試信號波形造成影響,這里只參考通道2即可,1292不受影響
  280. {
  281.                 u8 res=0;
  282.                 Ads1292_Config2.Int_Test = INT_TEST_ON;//打開內部測試信號
  283.                 Ads1292_Ch1set.MUX=MUX_Test_signal;//測試信號輸入       
  284.                 Ads1292_Ch2set.MUX=MUX_Test_signal;//測試信號輸入       
  285.                
  286.                 if(ADS1292_WRITE_REGBUFF())//寫入寄存器
  287.                                 res=1;       
  288.                 delay_ms(10);                       
  289.                 return res;               
  290. }
  291. //設置內部噪聲測試
  292. u8 ADS1292_Noise_Test(void)
  293. {
  294.                 u8 res=0;
  295.                 Ads1292_Config2.Int_Test = INT_TEST_OFF;//關內部測試信號
  296.                 Ads1292_Ch1set.MUX = MUX_input_shorted;//輸入短路       
  297.                 Ads1292_Ch2set.MUX = MUX_input_shorted;//輸入短路       

  298.                 if(ADS1292_WRITE_REGBUFF())//寫入寄存器
  299.                                 res=1;       
  300.                 delay_ms(10);                       
  301.                 return res;                       
  302. }

  303. //正常信號采集模式
  304. u8 ADS1292_Single_Read(void)
  305. {
  306.                 u8 res=0;
  307.                 Ads1292_Config2.Int_Test = INT_TEST_OFF;//關內部測試信號
  308.                 Ads1292_Ch1set.MUX = MUX_Normal_input;//普通電極輸入
  309.                 Ads1292_Ch2set.MUX = MUX_Normal_input;//普通電極輸入
  310.        
  311.                 if(ADS1292_WRITE_REGBUFF())//寫入寄存器
  312.                                 res=1;
  313.                 delay_ms(10);               
  314.                 return res;               
  315. }       

  316. //配置ads1292采集方式
  317. u8 Set_ADS1292_Collect(u8 mode)
  318. {
  319.                 u8 res;
  320.                
  321.                 delay_ms(10);       
  322.                 switch(mode)//設置采集方式
  323.                 {
  324.                                 case 0:
  325.                                         res =ADS1292_Single_Read();                                                                                               
  326.                                 break;
  327.                                 case 1:
  328.                                         res =ADS1292_Single_Test();                                                                                       
  329.                                 break;
  330.                                 case 2:
  331.                                         res =ADS1292_Noise_Test();                                                                                       
  332.                                 break;
  333.                 }               
  334.                 if(res)return 1;//寄存器設置失敗               
  335.                 ADS1292_Send_CMD(RDATAC); //啟動連續模式
  336.                 delay_ms(10);               
  337.                 ADS1292_Send_CMD(START);        //發送開始數據轉換(等效于拉高START引腳)       
  338.                 delay_ms(10);               
  339.                 return 0;
  340. }
復制代碼


  1. #include "sys.h"         //系統配置
  2. #include "delay.h"       //延時
  3. #include "usart.h"       //串口                 
  4. #include "led.h"      
  5. #include "ADS1292.h"
  6. #include "Timer.h"
  7. #include "dma.h"

  8. u8 xinlv;
  9. extern u8 xinlv1;
  10. s32 get_volt(u32 num);
  11. u8 flag;
  12. u16 flag1;
  13. //main
  14. int main(void)
  15. {       
  16.                 u8 res,i,sum;       
  17.                 u8 data_to_send[60];//串口發送緩存
  18.                 u8 usbstatus=0;       
  19.                 u32 cannle[2];        //存儲兩個通道的數據
  20.                 s32        p_Temp[2];        //數據緩存
  21.        
  22.                 data_to_send[0]=0xAA;
  23.                 data_to_send[1]=0xAA;
  24.                 data_to_send[2]=0xF1;       
  25.                 data_to_send[3]=8;
  26.                 data_to_send[13] = 0X0D;        //校驗和
  27.                 data_to_send[14] = 0X0A;        //校驗和

  28. //初始化系統時鐘         72M       
  29.                 SystemInit();       
  30.                 delay_init();       
  31.                 delay_ms(100);
  32.                 uart1_init(500000);//串口初始化為115200               
  33.                 DMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)data_to_send);//串口1DMA設置
  34.                 USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //DMA       
  35.                 LED_Init();                       

  36.                 ADS1292_Init();        //初始化ads1292                                       
  37.                 while(Set_ADS1292_Collect(0))
  38.                 {       
  39.                                 printf("1292寄存器設置失敗\r\n");
  40.                                 delay_s(1);               

  41.                 }       
  42.                 printf("寄存器設置成功\r\n");
  43.                 delay_s(1);                       
  44.                 TIM2_Init(50,1439);//系統指示
  45.                 TIM4_Init(50,1439);//打印心率
  46.                
  47.                 EXTI->IMR |= EXTI_Line8;//開DRDY中斷                       
  48.                 while(1)//循環發送數據               
  49.                 {                               
  50.                        
  51.                                 if(ads1292_recive_flag==1)
  52.                                 {               
  53.                                                 flag1++;                               
  54.                                                         cannle[0]=ads1292_Cache[3]<<16 | ads1292_Cache[4]<<8 | ads1292_Cache[5];//獲取原始數據
  55.                                        
  56.                                                         cannle[1]=ads1292_Cache[6]<<16 | ads1292_Cache[7]<<8 | ads1292_Cache[8];  //
  57.                                                
  58.                                                         p_Temp[0] = get_volt(cannle[0]);        //把采到的3個字節轉成有符號32位數
  59.                                        
  60.                                                         p_Temp[1] = get_volt(cannle[1]);        //把采到的3個字節轉成有符號32位數
  61.                                        
  62.                
  63.                                                         cannle[0] = p_Temp[0];
  64.                                        
  65.                                                         cannle[1]        = p_Temp[1];
  66.                                                         data_to_send[4]=cannle[0]>>24;                //25-32位
  67.                                                         data_to_send[5]=cannle[0]>>16;          //17-24
  68.                                                         data_to_send[6]=cannle[0]>>8;                //9-16
  69.                                                         data_to_send[7]=cannle[0];                         //1-8

  70.                                                         data_to_send[8]=cannle[1]>>24;                //25-32位
  71.                                                         data_to_send[9]=cannle[1]>>16;          //17-24
  72.                                                         data_to_send[10]=cannle[1]>>8;                //9-16
  73.                                                         data_to_send[11]=cannle[1];                         //1-8
  74.                                                        
  75.                                                         for(i=0;i<12;i++)
  76.                                                                         sum += data_to_send[i];       
  77.        //       printf("%d\r\n",sum);                                                                               
  78.                                                         data_to_send[12] = sum;        //校驗和                                                       
  79.                                         //                DMA_Enable(DMA1_Channel4,13);//串口1DMA
  80.                                                                                                                                                                
  81.                                                         ads1292_recive_flag=0;
  82.                                                         sum = 0;       
  83.                                                        
  84.                 if((p_Temp[1]>265000)&&(flag==1))       
  85.                         {
  86.                         xinlv++;               
  87.                                 flag=0;
  88.                         }
  89.                         else if((p_Temp[1]<265000)&&(flag==0))
  90.      flag=1;

  91.                                 }
  92.                                

  93.                 }               
  94. }


  95. /*功能:把采到的3個字節轉成有符號32位數 */
  96. s32 get_volt(u32 num)
  97. {               
  98.                         s32 temp;                       
  99.                         temp = num;
  100.                         temp <<= 8;
  101.                         temp >>= 8;
  102.                         return temp;
  103. }

復制代碼

Keil代碼下載:
代碼.7z (207.13 KB, 下載次數: 50)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 综合精品久久久 | 成人在线免费av | 久久久新视频 | 欧美视频三级 | 国产在线精品一区二区 | 亚洲午夜在线 | 欧美视频免费在线 | 91中文字幕在线 | 久草精品视频 | 亚洲一区二区中文字幕在线观看 | 久久乐国产精品 | 亚洲一av | 亚洲成人三级 | 久久精品无码一区二区三区 | 国产成人免费在线 | 喷潮网站 | 国产精品国产精品国产专区不片 | 精品成人| 男人天堂免费在线 | 久久毛片 | 日韩a在线观看 | 麻豆精品国产91久久久久久 | 一级毛片视频免费观看 | 一区二区视频在线观看 | 国产精品午夜电影 | 又爽又黄axxx片免费观看 | 91传媒在线观看 | 国产精品视频一区二区三区不卡 | 国产一区二区三区四区五区3d | 伦理一区二区 | 日韩欧美一区二区三区在线播放 | 91精品久久久久久久久久入口 | 99久久精品国产一区二区三区 | 国产草草视频 | 日本福利在线观看 | 999久久久久久久久6666 | 久在线观看| 国产天天操 | 日韩国产在线 | 日本五月婷婷 | 91久久久久 |