智能體重秤主要由壓力秤模塊、MPU 模塊和 App 模塊構成,將智能體重秤放置在床邊,每日清晨起床時站在秤上測量一下自己的體重,體重秤會通過數碼管將體重顯示出來,并與已知數據比較,系統會自動發出提示語音,然后通過內置在體重秤內的藍牙模塊將數據傳送到手機App 客戶端,將數據記錄下來,堅持每日測量的話,系統會根據每日的測量數據繪制體重曲線,進而通過曲線分析人體健康狀況,并給出合理建議。用戶還可以隨時查詢之前的體重數據,通過對比來更好地把握自己的健康狀況。 通過人體體重變化來監測人體健康情況已有相關文獻研究,我們可以借鑒相關的一些研究成果來對人體健康狀況進行分析。
模塊劃分: ①定時器模塊:定時期間只記錄一次數據,兩次計數之間用定時器定時。 ②HX711 數據采集模塊:采集來自 HX711 的串行數據。 ③串口模塊:單片機與手機藍牙串口助手交互功能。 ④數碼管模塊:依據不同的工作模式顯示不同的數據。
⑤按鍵功能模塊:根據不同的按鍵,進入不同的工作模式。共包括:測量模式、記錄模式、查詢模式、清零模式。
制作出來的實物圖如下:
實例
原理圖
單片機源程序如下:
- #include "io430.h"
- #include "in430.h"
- unsigned long int HX711_Read(); //HX711數據采集函數聲明
- void Segshow(int n,int a,int b,int c,int d); //數碼管顯示函數聲明
- void HC595SendData(unsigned char SendVal); //HC5955數據移入函數聲明
- void HC595ShowData(); //HC5955數據發送函數聲明
- void HX711_delay(); //HX711采集延遲函數聲明
- void USCIA0_init(); //藍牙設置初始化函數聲明
- void HX711_init(); //HX711設置初始化函數聲明
- void TAO_init(); //定時器設置初始化函數聲明
- void GPIO_init(); //GPIO設置初始化函數聲明
- char int_char(int n); //數據格式轉換函數聲明
- void delay(); //延時按鍵防抖函數聲明
- char buffer[32]; //藍牙收發數據緩沖區
- char advice1[50]="more exercise and less meat!”;//建議1字符串
- char advice2[50]="good body and keep on!”; //建議2字符串
- int weightdata[32]; //記錄體重數據的數據串
- unsigned int j=0; //計數變量i、j、k、l、p
- unsigned int i=0;
- unsigned int k=0;
- unsigned int l=0;
- unsigned int p=0;
- int num1,num2,num3,num4,n; //數碼管參數
- int count1=0; //兩次采集數據之間間隔計時
- int flag1=0; //測量模式
- int flag2=0; //記錄模式
- int flag3=0; //查詢模式
- int flag4=0; //建議1發送
- int flag5=0; //建議2發送
- int main( void )
- {
- WDTCTL = WDTPW + WDTHOLD; //關閉看門狗
- unsigned int m=0; //數碼管選通計數變量
- _EINT(); //中斷總控位打開
- USCIA0_init();
- HX711_init();
- GPIO_init();
- TAO_init();
- IE2|=UCA0RXIE; //接收中斷位打開
- //****************************************************
- //主循環:功能模式、數碼管顯示
- //****************************************************
- while(1)
- {
- if(flag1==1)//測量模式
- {
- num4=(n)%10;
- num3=(n%100)/10;
- num2=n/100;
- num1=0;
- }
- else if(flag2==1) //記錄模式
- {
- num4=(weightdata[k-1])%10;
- num3=(weightdata[k-1]%100)/10;
- num2=weightdata[k-1]/100;
- num1=0;
- }
- else if(flag3==1) //查詢模式
- {
- num4=(weightdata[l])%10;
- num3=(weightdata[l]%100)/10;
- num2=weightdata[l]/100;
- num1=0;
- }
- else //查詢清零模式
- {
- num4=0;
- num3=0;
- num2=0;
- num1=0;
- }
- Segshow(m,num1,num2,num3,num4);
- m=m+1;
- if(m==4) m=0;
- }
- }
- //****************************************************
- //中斷子函數
- //****************************************************
- #pragma vector=TIMER0_A0_VECTOR //定時器中斷
- __interrupt void timer0_A0_ISR()
- {
- if(count1<30)
- count1=count1+1;
- if(count1==30)
- {
- n=(HX711_Read()-8529600)/1000;//采集數據
- count1=0;
- }
- }
- #pragma vector=USCIAB0RX_VECTOR //藍牙接收中斷
- __interrupt void UCA0RX_isr()
- {
- buffer[j]=UCA0RXBUF; //讀接收緩沖器保存一個字符
- j++;
- if(buffer[0]=='a')
- {
- j=0;
- flag4=1;
- flag5=0;
- IE2|=UCA0TXIE; //打開發送中斷位
- }
- else if(buffer[0]=='b')
- {
- j=0;
- flag4=0;
- flag5=1;
- IE2|=UCA0TXIE; //打開發送中斷位
- }
- }
- #pragma vector=USCIAB0TX_VECTOR //藍牙發送中斷
- __interrupt void UCA0TX_isr()
- {
- if(flag4==1)
- {
- buffer[0]=int_char(num1);
- buffer[1]=int_char(num2);
- buffer[2]=int_char(num3);
- buffer[3]=int_char(num4);
- if(i<4)
- {
- UCA0TXBUF= buffer[i]; //從發送緩沖器發送一個字符
- }
- i++;
- if(i==4)
- {
- i=0;
- IE2&=~UCA0TXIE; //關閉發送中斷位
- }
- }
- else if(flag5==1)
- {
- if(weightdata[k-1]<400)
- {
- P2OUT|=BIT7;
- if(i<50)
- {
- UCA0TXBUF=advice2[i]; //從發送緩沖器發送一個字符
- }
- i++;
- if(i==50)
- {
- i=0;
- IE2&=~UCA0TXIE; //關閉發送中斷位
- }
- }
- else if(weightdata[k-1]>400)
- {
- P2OUT&=~BIT7;
- if(i<50)
- {
- UCA0TXBUF=advice1[i]; //從發送緩沖器發送一個字符
- }
- i++;
- if(i==50)
- {
- i=0;
- IE2&=~UCA0TXIE; //關閉發送中斷位
- }
- }
- }
- }
- #pragma vector=PORT1_VECTOR //P1向量中斷
- __interrupt void port_ISR1()
- {
- delay();
- if((P1IFG&BIT7)!=0) //進入記錄模式
- {
- P2OUT|=BIT7;
- weightdata[k]=n;
- if(k<5)
- k++;
- else if(k==5)
- k=0;
- flag1=0;
- flag2=1;
- flag3=0;
- p=0;
- P1IFG&=~BIT7;
- }
- if((P1IFG&BIT3)!=0) //進入測量模式
- {
- P2OUT|=BIT7;
- flag1=1;
- flag2=0;
- flag3=0;
- p=0;
- P1IFG&=~BIT3;
- }
- }
- #pragma vector=PORT2_VECTOR //P2向量中斷
- __interrupt void port_ISR2()
- {
- delay();
- if((P2IFG&BIT4)!=0) //進入查詢模式
- {
- flag1=0;
- flag2=0;
- flag3=1;
- p=0;
- if(l<5)
- l++;
- else if(l==5)
- l=0;
- P2IFG&=~BIT4;
- }
- if((P2IFG&BIT6)!=0) //進入清零模式
- {
- P2OUT|=BIT7;
- flag1=0;
- flag2=0;
- flag3=0;
- while(p<32) //所有數據清零
- {
- weightdata[p]=0;
- p++;
- }
- k=0; //從頭計數
- P2IFG&=~BIT6;
- }
- }
- //****************************************************
- //子函數
- //****************************************************
- void HC595SendData(unsigned char SendVal) //HC5955數據移入函數
- {
- int m;
- for(m=0;m<8;m++)
- {
- if((SendVal<<m)&0x80) P1OUT_bit.P4=1;
- else P1OUT_bit.P4=0;
- P1OUT_bit.P5=0; //從SHCP產生一上升沿(移入數據)
- P1OUT_bit.P5=1;
- }
- }
- void HC595ShowData() //HC5955數據發送函數
- {
- P1OUT_bit.P6=0; //STCP產生一上升沿(輸出數據)
- P1OUT_bit.P6=1;
- }
- void HX711_delay() //HX711采集延遲函數
- {
- int m;
- for(m=0;m<2;m++);
- }
- unsigned long int HX711_Read(int a,int b,int c,int d) //HX711數據采集函數
- {
- unsigned long int count;
- unsigned int k;
- HX711_delay();
- P1OUT_bit.P0=0;
- count=0;
- while(P2IN_bit.P5);
- for(k=0;k<24;k++) //前24個脈沖下降沿存下數據到count中
- {
- P1OUT_bit.P0=1;
- count=count<<1;
- P1OUT_bit.P0=0;
- if(P2IN_bit.P5)
- count++;
- }
- P1OUT_bit.P0=1;
- count=count^0x800000; //第25個脈沖下降沿來時,轉換數據
- HX711_delay();
- P1OUT_bit.P0=0;
- return(count);
- }
- void Segshow(int n,int a,int b,int c,int d) //數碼管顯示函數
- {
- unsigned char Segdata[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- switch(n)
- {
- case 0:
- HC595SendData(Segdata[d]); //注意數據和選通的先后順序
- HC595ShowData();
- P2OUT&=~BIT3;
- P2OUT|=BIT0;
- break;
- case 1:
- HC595SendData(Segdata[c]);
- HC595ShowData();
- P2OUT&=~BIT0;
- P2OUT|=BIT1;
- break;
- case 2:
- HC595SendData(Segdata[b]);
- HC595ShowData();
- P2OUT&=~BIT1;
- P2OUT|=BIT2;
- break;
- case 3:
- HC595SendData(Segdata[a]);
- HC595ShowData();
- P2OUT&=~BIT2;
- P2OUT|=BIT3;
- break;
- }
- }
- void USCIA0_init() //藍牙設置初始化函數
- {
- UCA0CTL1 |= UCSWRST; //swrst=1
- P1SEL |= BIT1+BIT2;
- P1SEL2 |= BIT1+BIT2; //P1.1和P1.2引腳功能設置
- UCA0CTL1 |= UCSSEL_2+UCRXEIE; //時鐘源選 SMCLK 默認約 1MHz
- UCA0BR1 = 0; //高八位 0
- UCA0BR0 = 104; //低八位為 104
- UCA0MCTL = UCBRS_1; //由上述計算出 0.167*8 近似為 1
- UCA0CTL1 &=~UCSWRST ; //swrst=0
- }
- void HX711_init() //HX711設置初始化函數
- {
- P2SEL&=~BIT5; //對應HX711的DOUT
- P2DIR|=BIT5;
- P2DIR&=~BIT5;
- P2REN|=BIT5;
-
- P1DIR|=BIT0; //對應HX711的SCK
- P1SEL&=~BIT0;
- P1SEL2&=~BIT0;
- P1OUT&=~BIT0;
- }
- void TAO_init() //定時器設置初始化函數
- {
- TA0CTL|=TACLR+TASSEL_2+MC_1; //設置TA0計時,選用DCO時鐘源1MHz
- TA0CCR0=10000;
- TA0CCTL0|=CCIE; //進入定時器中斷
- }
- void GPIO_init() //GPIO設置初始化函數
- {
- P1DIR|=BIT4+BIT5+BIT6; //數碼管顯示設置
- P1SEL&=~(BIT4+BIT5+BIT6);
- P1SEL2&=~(BIT4+BIT5+BIT6);
- P1OUT&=~(BIT4+BIT5+BIT6);
- P2DIR|=BIT0+BIT1+BIT2+BIT3;
- P2SEL&=~(BIT0+BIT1+BIT2+BIT3);
- P2SEL2&=~(BIT0+BIT1+BIT2+BIT3);
- P2OUT&=~(BIT0+BIT1+BIT2+BIT3);
-
- P2SEL&=~(BIT4+BIT6); //設置2.4、2.6允許中斷
- P2SEL2&=~(BIT4+BIT6);
- P2OUT|=(BIT4+BIT6);
- P2REN|=(BIT4+BIT6);
- P2DIR&=~(BIT4+BIT6);
- P2IES|=(BIT4+BIT6);
- P2IFG&=~(BIT4+BIT6);
- P2IE|=(BIT4+BIT6);
-
- P1SEL&=~(BIT3+BIT7); //設置1.3、1.7允許中斷
- P1SEL2&=~(BIT3+BIT7);
- P1OUT|=(BIT3+BIT7);
- P1REN|=(BIT3+BIT7);
- P1DIR&=~(BIT3+BIT7);
- P1IES|=(BIT3+BIT7);
- P1IFG&=~(BIT3+BIT7);
- P1IE|=(BIT3+BIT7);
-
- P2DIR|=BIT7; //蜂鳴器設置
- P2SEL&=~BIT7;
- P2SEL2&=~BIT7;
- P2OUT|=BIT7;
- }
- char int_char(int n) //數據格式轉換函數
- {
- char m;
- switch(n)
- {
- case(0): m='0';break;
- case(1): m='1';break;
- case(2): m='2';break;
- case(3): m='3';break;
- case(4): m='4';break;
- case(5): m='5';break;
- case(6): m='6';break;
- case(7): m='7';break;
- case(8): m='8';break;
- case(9): m='9';break;
- }
- return m;
- }
- void delay() //延時按鍵防抖函數
- { unsigned int o;
- for (o=0;o<0x00ff;o++);
- }
復制代碼
所有資料51hei提供下載:
智能體重秤源程序.zip
(2.91 KB, 下載次數: 20)
2018-12-2 10:29 上傳
點擊文件名下載附件
|