⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 weigh.c

📁 MSP430单片机常用模块与综合系统实例精讲 的:“程序代码”、“实例插图”、“电路图”3个文件夹。以及MSP430F14X系列单片机的官方源码"CODE-MSP430F14X" 其中各个文件夹主要
💻 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 + -