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