msp430g2553单片机 感应温度的呼吸灯

2020-02-08来源: eefocus关键字:msp430g2553  单片机  感应温度  呼吸灯

//程序烧进板子后先进入led灯交替闪烁的待机模式;按下按键后,进入应用模式,绿灯开始呼吸;此时温度上升后绿灯呼吸加快,温度下降后呼吸又会变慢。当温度过高时红灯亮


#include  "msp430g2553.h"


#define     LED1                  BIT0


#define     LED2                  BIT6


#define     LED_DIR               P1DIR


#define     LED_OUT               P1OUT


#define     BUTTON                BIT3  //P1.3为板上按键S2


#define     BUTTON_OUT            P1OUT //端口输出寄存器


#define     BUTTON_DIR            P1DIR //端口方向控制寄存器


#define     BUTTON_IN             P1IN  //端口输入寄存器


#define     BUTTON_IE             P1IE  //端口中断允许寄存器


#define     BUTTON_IES            P1IES //端口中断触发沿控制寄存器


#define     BUTTON_IFG            P1IFG //端口中断标志寄存器


#define     BUTTON_REN            P1REN //端口上下拉电阻使能控制寄存器


#define     APP_STANDBY_MODE      0 //待机模式标志,也就是接上电源(或USB)后红绿灯交替闪的状态


#define     APP_APPLICATION_MODE  1 //应用模式标志,也就是待机模式时按按键后进入的状态,也就是测量温度


#define     TIMER_PWM_MODE        0


long     TIMER_PWM_PERIOD   =   5000;


#define     TIMER_PWM_OFFSET      20


#define     TEMP_SAME             0


#define     TEMP_HOT              1


#define     TEMP_COLD             2


#define     TEMP_THRESHOLD        0


//   Conditions for 9600/4=2400 Baud SW UART, SMCLK = 1MHz


#define     Bitime_5              0x05*4                      // ~ 0.5 bit length + small adjustment


#define     Bitime                13*4//0x0D


unsigned char BitCnt;


unsigned char applicationMode = APP_STANDBY_MODE; //功能模式标志,初始值为待机模式


unsigned char timerMode = TIMER_PWM_MODE;


unsigned char tempMode;


unsigned char calibrateUpdate = 0;


unsigned char tempPolarity = TEMP_SAME;


unsigned int TXByte;


long tempMeasured[8]; //定义数组以计算8次10位ADC温度采样的平均值


unsigned char tempMeasuredPosition=0; //温度测量值数组索引


long tempAverage; //8次10位ADC温度采样的平均值


long tempCalibrated, tempDifference;


void InitializeLeds(void);  //IO端口初始化,设置两颗LED对应的端口并两设置为熄灭初始状态


void InitializeButton(void);  //IO端口初始化,配置按键


void PreApplicationMode(void);                     //进入待机模式,红绿灯交替闪,等待按键 Blinks LED, waits for button press


void ConfigureAdcTempSensor(void);  //配置温度传感器模数转换


void ConfigureTimerPwm(void); //配置定位器为PWM模式


void InitializeClocks(void);  //初始化时钟系统


void main(void)


{


  unsigned char i;


  WDTCTL = WDTPW + WDTHOLD;                 // 停止看门狗 Stop WDT


  InitializeClocks(); //初始化时钟系统


  InitializeButton(); //配置按键


  InitializeLeds(); //设置端口并两设置两颗LED对应为熄灭初始状态


  PreApplicationMode();


  applicationMode = APP_APPLICATION_MODE; //功能模式标志变成应用模式


  ConfigureAdcTempSensor(); //配置温度传感器模数转换


  ConfigureTimerPwm();  //配置定位器PWM模式


  __enable_interrupt();                     //使能全局中断 Enable interrupts.


  LED_OUT &=~LED1;


  while(1)


  {


    ADC10CTL0 |= ENC + ADC10SC;             //ADC使能,ADC开始转换一次 Sampling and conversion start


    __bis_SR_register(CPUOFF + GIE);


    P1SEL |=BIT6;


    P1OUT |=BIT6;


    ConfigureTimerPwm();


    unsigned int j;


        for(j=0;j


        {


          CCR1=j;


         _delay_cycles(1000);


         }


        for(j=TIMER_PWM_PERIOD ;j>0;j-=1)


        {


          CCR1=j;


          _delay_cycles(1000);


        }


        for (j=TIMER_PWM_PERIOD;j>0;j-=1)


        {


          _delay_cycles(100);


        }


    tempMeasured[tempMeasuredPosition++] = ADC10MEM;  //将温度采样值存入温度值数组下一位


    if (tempMeasuredPosition == 8)


      tempMeasuredPosition = 0; //复位温度采样值数组索引


    tempAverage = 0;


    for (i = 0; i < 8; i++)


      tempAverage += tempMeasured[i];


    tempAverage >>= 3;  //除以8得到平均值   Divide by 8 to get average


    tempDifference = tempAverage - tempCalibrated;  //计算相对于参考温度的差值


    if (tempDifference < -TEMP_THRESHOLD) //如果采样温度值低于参考温度值差值TEMP_THRESHOLD


    {


      tempDifference = -tempDifference; //差值取正


      tempPolarity = TEMP_COLD; //极性变量设为值TEMP_COLD


    }


    else


    if (tempDifference > TEMP_THRESHOLD)  //如果采样温度值高于参考温度值差值TEMP_THRESHOLD


    {

      tempPolarity = TEMP_HOT;  //极性变量设为值TEMP_HOT


    }


    else  //如果相对于参考温度值偏差没有超过阈值TEMP_THRESHOLD


    {


      tempPolarity = TEMP_SAME; //性变量设为值TEMP_SAME


      TACCTL0 &= ~CCIE; //关TACCTL0中断使能


      TACCTL1 &= ~CCIE; //关TACCTL1中断使能


    }


    if (tempPolarity != TEMP_SAME)  //如果相对于参考温度值偏差超过阈值TEMP_THRESHOLD


    {


      tempDifference <<= 9; //温度偏差值乘以8


      //tempDifference += TIMER_PWM_OFFSET; //加上一个偏置值


      TACCR1 = ( (tempDifference) < (TIMER_PWM_PERIOD-1) ? (tempDifference) : (TIMER_PWM_PERIOD-1) ); //置TACCR1,最大为TIMER_PWM_PERIOD-1。


      //TACCR1值控制亮的时间,定时器计数到TACCR1在中断中将关闭灯,在TACCR0中断中亮灯


      TACCTL0 |= CCIE;  //开TACCTL0中断使能


      TACCTL1 |= CCIE;  //开TACCTL1中断使能


    }


  } //返回主循环


}


//进入待机模式,红绿灯交替闪,等待按键


void PreApplicationMode(void)


{


  LED_DIR |= LED1 + LED2; //p1.0和P1.6口为输出


  LED_OUT |= LED1;


  LED_OUT &= ~LED2; //绿灯灭


  BCSCTL1 |= DIVA_1;


  BCSCTL3 |= LFXT1S_2;


  TACCR0 = 1200;


  TACTL = TASSEL_1 | MC_1;


  TACCTL1 = CCIE + OUTMOD_3;


  TACCR1 = 600;


  __bis_SR_register(LPM3_bits + GIE);


}


//配置温度传感器模数转换


void ConfigureAdcTempSensor(void)


{

  unsigned char i;


  /* Configure ADC Temp Sensor Channel */


  ADC10CTL1 = INCH_10 + ADC10DIV_3; //选择ADC通道为温度传感器,时钟4分频         // Temp Sensor ADC10CLK/4


  ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE;  // VR+ = VREF+ and VR- = VSS,采样保持时间=64×ADC10CLK周期,打开内部参考电压,打开ADC模块,ADC中断允许


  __delay_cycles(1000); //延时等待ADC参考电压建立                     // Wait for ADC Ref to settle


  ADC10CTL0 |= ENC + ADC10SC; //ADC使能,ADC开始转换一次                // Sampling and conversion start


  __bis_SR_register(CPUOFF + GIE);  //进入省电模式LPM0,等待AD转换完成中断          // LPM0 with interrupts enabled


  tempCalibrated = ADC10MEM;


  for (i=0; i < 8; i++)


    tempMeasured[i] = tempCalibrated;


  tempAverage = tempCalibrated; //第一次转换,平均温度取样值和校准值相等


}


//配置定位器为PWM模式


void ConfigureTimerPwm(void)


{


  timerMode = TIMER_PWM_MODE;


  TACCR0 = TIMER_PWM_PERIOD;                              //


  TACTL = TASSEL_2 | MC_1;  //定时器时钟源选择辅助时钟SMCLK,增计数模式                  // TACLK = SMCLK, Up mode.


TACCTL1 = OUTMOD_7;//CCIE + OUTMOD_3; //捕获/比较控制寄存器1设置为比较模式,输出模

[1] [2]
关键字:msp430g2553  单片机  感应温度  呼吸灯 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487540.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430 LaunchPad IO外部中断
下一篇:MSP430学习笔记1---点亮第一个LED

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430G2553 WDT的NMI中断例子
将 RST/NMI 引脚设为 NMI 模式,主程序中点亮 P1.0 口 LED,在 NMI 中断中关掉 LED。现象为当按下 RST 按键时,LED 熄灭,并且再也不亮(除非重新上电)。#include "MSP430G2553.h"void   main( void  ) {   WDTCTL = WDTPW + WDTHOLD +WDTNMI;     //NMI模式(非Reset模式)   IE1=NMIIE;         
发表于 2020-03-16
MSP430G2553 引脚简单使用
1.选择引脚功能 -- PxSEL,PxSEL2  PxSEL2        PxSEL      管脚功能  0             0          用作IO口  0             1          用作第一功能引脚  1     
发表于 2020-03-15
MSP430g2553硬件UART(基于官方例程的修改)
一开始官方例程的UART_Keyboard在电脑上老是运行不了,于是就自己上网学习了一下UART实现的具体过程,修改了一下官方的例程代码,在这里记录一下其实官方例程有时候运行不起在于:1.波特率设置2.官方的Rx中断处理函数并不适用于所有串口调试程序3.注意跳线帽!!!RX接TX,TX接RX!!官方例程的UART程序流程这里我用onenote大致画了一下对于Tx和Rx中断:当单片机内部的Rx_buf寄存器(一般来说8bits)收到了无符号字符型数据时,就会产生Rx中断,系统调用Rx中断处理函数,也就是说当收到一个字符串型数据时系统会产生多次Rx中断。当单片机内部的Tx_buf寄存器(也是8bits)将数据发送完毕时,会产生Tx中断,
发表于 2020-03-11
MSP430g2553硬件UART(基于官方例程的修改)
msp430g2553单片机学习心得
四年前学习的TI的Msp430g2553这款单片机,最近在整理学习记录的时候把当时的学习心得重新写下来。学习单片机最早是学习的51系列的,看的也是广为推崇的郭天祥郭老师的《十天学习单片机》,个人觉得单片机学习还是最先攻克51的。学习好51之后,对单片机操作有了基本的认识,再学习其他款单片机自然是能融会贯通。TI的430系列主打是低功耗,它的技术文档和Dome程序都非常详细,尤其是技术文档真让人有种膜拜的感觉,在每个模块的时候还有个框图,对理解模块内设置非常有帮助,我当时还特意打印了。当时它的User's Guide还没有中文版,如果实在看不懂,可以借鉴F149系列的(这款有人翻译了中文版本)。个人觉得在学习g2553这款
发表于 2020-03-09
学习MSP430G2553总结
个人感觉TI做的这块430就是一坨屎,内部时钟根本不稳,而且连datesheet都没有,但作为比赛指定的东西我们还是学了,这个连51都不如的16位单片机费了我四天时间把内部的模块给调了一遍,但是我调IIC时一直调不出来连时钟都没有,估计是做这块垃圾是连这个模块都没有吧,而且还写的那么复杂,连份像样的技术文档都没有,看的是别的技术文档,真是蛋疼无比,好了牢骚就发这么多,下面开始讲讲这块片子。首先介绍下MSP430G2553的时钟,这块芯片的时钟源是四个,时钟线是4个;时钟源我们就不说了,一般都是默认的选择内部的DCO作为时钟源,然后通过一系列的嫁接到MCLK SMCLK上,至于为什么这块芯片上不用锁相环的问题我深表不解,这个解释
发表于 2020-03-09
学习MSP430G2553总结
MSP430G2-LaunchPad简明教程02
发环境的准备包括驱动程序与开发工具两部分,本教程以Win7平台为例,Linux平台下的开发也可参考。驱动程序小红板自带一个免驱的USB仿真器供调试与程序烧写用途,以及一个最高支持9600bps波特率的application UART的通信接口。为避免后续开发中的奇怪问题,建议安装针对后者的驱动。驱动的下载地址为MSP-EXP430G2 LaunchPad Driver,解压后可得430cdc.cat(驱动数字签名)、430cdc.inf与LaunchPad_Driver.exe三个文件。将小红板使用USB数据线与PC连接后,在设备管理器中会产生3个新设备,其中的MSP430 Application UART是需要安装上述驱动方可
发表于 2020-03-06
MSP430G2-LaunchPad简明教程02
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved