已结贴√

问题点数:20 回复次数:1

利用MSP430F149和HX711模块制作体重秤?

以下代码是我从另一个论坛大拿那里看来的,如何改动才能只保留数码管显示体重呢?不需要蓝牙模块等等。救救毕设做不出来的孩子吧,以下是我贴的大神的设计:

智能体重秤主要由压力秤模块、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<

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++);

}

体重计c语言程序,利用MSP430F149和HX711模块制作体重秤?相关推荐

  1. c语言程序中的基本功能,c语言程序中的基本功能模块为什么?

    c语言程序中的基本功能模块为"函数".一个C语言程序可以由一个主函数和若干个函数构成:一个大的应用程序一般应该分为多个程序模块,每一个模块用来实现一个功能,而模块的功能是由函数完成 ...

  2. hx711c语言程序,STM32写的HX711程序

    查看: 35712|回复: 60 STM32写的HX711程序 当前离线积分 初级会员, 积分 73, 距离下一级还需 127 积分 积分金钱73 注册时间2014-8-20 在线时间0 小时 电梯直 ...

  3. 贪吃蛇c++语言程序,利用C/C++实现较完整贪吃蛇游戏

    记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇.于是本人利用空余时间写出了这么一个简单的小游戏. 由于当时的我还没有能力构造出用户界面,故直接使用do ...

  4. 2位数码管秒表c语言程序,利用定时器实现2位数码管秒表0到99循环

    描述: 2位LED数码显示"秒表",显示时间为00~99秒,每秒自动加1, ; 一个"开始"键,一个"复位"键,一个"暂停&quo ...

  5. 向串口助手发送数据c语言程序,利用DSP2812编写直流电机PID调速程序(C语言)

    ==57) { Scia_VarRx=9; } kb=Scia_VarRx[0]*1000; hd=Scia_VarRx[1]*100; de=Scia_VarRx[2]*10; un=Scia_Va ...

  6. 无线发射器c语言程序代码,单片机编码 无线模块发送与接收 程序

    单片机编码 无线模块发送与接收 程序 模块型号,可在万能的某宝搜索[超再生无线模块] 接收距离:空旷200米[这是卖家说的,有待考验] 接收端在没有收到讯号,会生成间歇性尖状脉冲,data接LED负极 ...

  7. 电子时钟单片机c语言程序,一款51单片机电子钟制作(C语言)

    //主程序/ void main()//主程序开始 { chushi();//初始化 while(1)//大循环 { if(g!=1)//如果g不等于1,就执行下一句,否则跳过下一句 disy(fen ...

  8. hc sr501 c语言程序,HC-SR501人体红外感应模块资料汇总(原理图、常见问题、程序等)...

    HC-SR501是基于红外线技术的自动控制模块,采用德国原装进口LHI778探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品. 电气参数 ...

  9. 自动计数报警器c语言程序,简易STC15F104E单片机定时报警器制作 附程序

    非常时期,孩子不能上学,大人没在家,每天早上都睡得十几点,有点过份,所以作个简易定时报警器作闹钟用,主要是配合小米智能插座的网络定时功能用,只是自己的小制作,供有需求的人参考用: 制作出来的实物图如下 ...

最新文章

  1. 有关(int)和(int)的区别
  2. js layui 弹出子窗体_Layui中JS实现弹出层的应用
  3. c语言随机三位数,【分享代码】弥补c语言随机数不足
  4. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]
  5. u盘复制不进去东西_限制电脑只能识别自己指定的U盘
  6. Linux内核分析06
  7. MySQL_多表链接查询
  8. springboot实现定时任务常用的2种方式
  9. 使用python排序_Python排序
  10. 房子过户给子女哪种方式最合适?买卖?赠与?继承?不看就亏大了!
  11. linux下简易搭建svnserver
  12. 功夫小子实践开发-资源异步加载及过渡场景的分析和实现
  13. Maven的下载与配置(包含阿里云镜像配置)
  14. 史上最详细的Maven安装教程以及Maven和eclipse集成
  15. android imageview实现点击图片放大,Android 点击图片放大方法
  16. 前端数据可视化插件(四)关系图
  17. Zotero-word中引用跳转到参考文献/建立超链接-引用格式(Xie et al 2021, Achanta et al 2012)
  18. 绅聚科技推出首款国产化VoIP专用芯片A1010
  19. 【招聘】极限网络全国招聘,海量岗位职等你来
  20. 如果不是对的人,最终的结局大概不会好吧

热门文章

  1. 「涪陵榨菜」使用区块链溯源系统?回应:看榨菜集团的安排
  2. 文字图片行内垂直居中对齐方法
  3. 7-12 验证哥德巴赫猜想 (10 分)
  4. 【Spark】--SparkCore6
  5. Spring @Value读取配置文件
  6. ArcMap:线、面符号的制作(通用线符号的制作)超详细
  7. 小米手机升级后便签内容没了如何找回
  8. Mysql为何不推荐写多表SQL
  9. hanoi塔经典递归算法
  10. 高德坐标系转天地图坐标系(GCJ02转WGS坐标系)