📄 weigh.c
字号:
#include "weigh.h"
//10000记数 = 10kg=10000g
#define CAL_MIN_MAX_SPAN 10000
#define BRIDGE_SUPPLY (BIT0 | BIT1)
#define PUSH_BUTTON BIT0
int nStart;
int ad_flag;
void Init_Sys(void)
{
//停止看门狗
WDTCTL = WDTPW + WDTHOLD;
//设置晶体的电容
FLL_CTL0 |= XCAP18PF;
//定时器的中断为0.5s
BTCTL = BTDIV + BT_fCLK2_DIV64;
//定时器中断使能
IE2 |= BTIE;
//P1口输出为1
P1OUT = 0xff;
//P1口为输出方向
P1DIR = 0xff;
//P1.0为输入方向
P1DIR &= ~PUSH_BUTTON;
//下降沿触发中断
P1IES = PUSH_BUTTON;
//清除中断标志
P1IFG = 0;
//使能P1.0中断
P1IE = PUSH_BUTTON;
//P2口输出为1
P2OUT = 0xff;
//P2口为输出方向
P2DIR = 0xff;
//SD16设置
//增益为32,信道对为A0+,A0-
SD16INCTL0 = SD16GAIN_32 + SD16INCH_0;
//连续转换方式
//SD16转换中断使能
SD16CCTL0 = SD16DF + SD16IE;
}
void StartNextConversion(void)
{
//结果清零
SD16Temp = 0;
SD16TempCtr = 0;
//对全桥传感器供电
P2OUT |= BRIDGE_SUPPLY;
//允许电压的设置时间,(46+4)x244us=12ms
VoltageSettleCtr = 46;
//开始转换
SD16CCTL0 |= SD16SC;
}
#if __VER__ < 200
interrupt [SD16_VECTOR] void SD16_ISR(void)
#else
#pragma vector=SD16_VECTOR
__interrupt void SD16_ISR(void)
#endif
{
long CurrentResult;
//读转换结果
SD16CCTL0 &= ~SD16LSBACC;
CurrentResult = (long)(int)SD16MEM0 << 2;
SD16CCTL0 |= SD16LSBACC;
CurrentResult |= ((int)SD16MEM0 & 0xc0) >> 6;
//等待电压设置
if(VoltageSettleCtr)
{
//减数
VoltageSettleCtr--;
return;
}
//累加求和
SD16Temp += CurrentResult;
//是否采集了256次
if(++SD16TempCtr >= 256)
{
//设置转换完成标志
ad_flag = 1;
//结果清零
SD16TempCtr = 0;
//累加结果除以256得到转换结果的平均数
SD16Result = SD16Temp >> 8;
//禁止转换
SD16CCTL0 &= ~SD16SC;
//停止对全桥传感器供电
P2OUT &= ~(BRIDGE_SUPPLY);
//存储新的转换结果
LastADCValue = SD16Result;
//进入LPM3低功耗模式
__bis_SR_register_on_exit(LPM3_bits);
}
}
#if __VER__ < 200
interrupt [PORT1_VECTOR] void PORT1_ISR(void)
#else
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
#endif
{
volatile unsigned int i;
//是否有按键按下?
if(P1IFG & BIT0)
{
//清除中断标志位
P1IFG &= ~(BIT0);
}
//延迟一点时间
for (i = 0x7fff; i; i--);
__bic_SR_register_on_exit(SCG1 + SCG0);
}
void main(void)
{
long ad_value;
//关闭中断
_DINT();
//初始化
Init_Sys();
//初始化变量
nStart = 0;
//打开中断
_EINT();
//循环处理
for(;;)
{
//测量按纽按下
if(nStart == 1)
{
//清除标志
nStart = 0;
//开启转换
StartNextConversion();
//转换完成
if(ad_flag == 1)
{
//清除标志
ad_flag = 0;
ad_value = LastADCValue;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -