体重计c语言程序,利用MSP430F149和HX711模块制作体重秤?
已结贴√
问题点数: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模块制作体重秤?相关推荐
- c语言程序中的基本功能,c语言程序中的基本功能模块为什么?
c语言程序中的基本功能模块为"函数".一个C语言程序可以由一个主函数和若干个函数构成:一个大的应用程序一般应该分为多个程序模块,每一个模块用来实现一个功能,而模块的功能是由函数完成 ...
- hx711c语言程序,STM32写的HX711程序
查看: 35712|回复: 60 STM32写的HX711程序 当前离线积分 初级会员, 积分 73, 距离下一级还需 127 积分 积分金钱73 注册时间2014-8-20 在线时间0 小时 电梯直 ...
- 贪吃蛇c++语言程序,利用C/C++实现较完整贪吃蛇游戏
记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇.于是本人利用空余时间写出了这么一个简单的小游戏. 由于当时的我还没有能力构造出用户界面,故直接使用do ...
- 2位数码管秒表c语言程序,利用定时器实现2位数码管秒表0到99循环
描述: 2位LED数码显示"秒表",显示时间为00~99秒,每秒自动加1, ; 一个"开始"键,一个"复位"键,一个"暂停&quo ...
- 向串口助手发送数据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 ...
- 无线发射器c语言程序代码,单片机编码 无线模块发送与接收 程序
单片机编码 无线模块发送与接收 程序 模块型号,可在万能的某宝搜索[超再生无线模块] 接收距离:空旷200米[这是卖家说的,有待考验] 接收端在没有收到讯号,会生成间歇性尖状脉冲,data接LED负极 ...
- 电子时钟单片机c语言程序,一款51单片机电子钟制作(C语言)
//主程序/ void main()//主程序开始 { chushi();//初始化 while(1)//大循环 { if(g!=1)//如果g不等于1,就执行下一句,否则跳过下一句 disy(fen ...
- hc sr501 c语言程序,HC-SR501人体红外感应模块资料汇总(原理图、常见问题、程序等)...
HC-SR501是基于红外线技术的自动控制模块,采用德国原装进口LHI778探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品. 电气参数 ...
- 自动计数报警器c语言程序,简易STC15F104E单片机定时报警器制作 附程序
非常时期,孩子不能上学,大人没在家,每天早上都睡得十几点,有点过份,所以作个简易定时报警器作闹钟用,主要是配合小米智能插座的网络定时功能用,只是自己的小制作,供有需求的人参考用: 制作出来的实物图如下 ...
最新文章
- 有关(int)和(int)的区别
- js layui 弹出子窗体_Layui中JS实现弹出层的应用
- c语言随机三位数,【分享代码】弥补c语言随机数不足
- 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]
- u盘复制不进去东西_限制电脑只能识别自己指定的U盘
- Linux内核分析06
- MySQL_多表链接查询
- springboot实现定时任务常用的2种方式
- 使用python排序_Python排序
- 房子过户给子女哪种方式最合适?买卖?赠与?继承?不看就亏大了!
- linux下简易搭建svnserver
- 功夫小子实践开发-资源异步加载及过渡场景的分析和实现
- Maven的下载与配置(包含阿里云镜像配置)
- 史上最详细的Maven安装教程以及Maven和eclipse集成
- android imageview实现点击图片放大,Android 点击图片放大方法
- 前端数据可视化插件(四)关系图
- Zotero-word中引用跳转到参考文献/建立超链接-引用格式(Xie et al 2021, Achanta et al 2012)
- 绅聚科技推出首款国产化VoIP专用芯片A1010
- 【招聘】极限网络全国招聘,海量岗位职等你来
- 如果不是对的人,最终的结局大概不会好吧