社区首页
技术讨论创新帖
全部新帖
资料区
社区活动
联系管理员
★ 社区积分制度
★ 新手必读
★ 申请版主★
请
登录
后使用快捷导航
没有帐号?
注册
首页
|
电子技术
|
嵌入式
模拟电子
单片机
电源管理
传感器
半导体
电子应用
|
工业控制
物联网
汽车电子
网络通信
医疗电子
手机便携
测试测量
安防电子
家用电子
机器人
新能源
电子头条
|
社区
|
论坛
测评
博客
大学堂
|
下载
|
下载中心
电路图
精品文集
电路图
|
参考设计
|
Datasheet
|
活动
|
直播
datasheet
datasheet
文章
搜索
登录
注册
中文
En
论坛
切换旧版
电子工程世界-论坛
»
论坛
›
专业技术中心
›
TI技术论坛
›
微控制器 MCU
›
msp430g2553单片机 感应温度的呼吸灯
返回列表
发新帖
回复
阅
2577
|
回
0
fish001
当前离线
纯净的硅(中级)
最后登录
2023-10-7
在线时间
253 小时
威望
1125分
芯积分
830分
(兑换)
E金币
0枚
(兑换)
(兑换)
好友
0
fish001
3836
帖子
19
TA的资源
纯净的硅(中级)
+ 好友
私信
楼主
发表于2017-12-16 11:07
只看该作者
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
;
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
= 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设置为比较模式,输出模式为“置位/复位” ,中断允许 ??OUTMOD_3有什么用? // TACCTL1 Capture Compare
}
//TACCR0中断专用, Timer A0 interrupt service routine
#pragma
vector=TIMER0_A0_VECTOR
__interrupt
void
Timer_A
(
void
)
{
if
(tempPolarity == TEMP_HOT)
{
//LED_OUT |= LED1; //如果相对于参考温度偏差为正,LED1绿灯置为亮
TIMER_PWM_PERIOD -= tempDifference;
if
(TIMER_PWM_PERIOD < 0)
{
LED_DIR |= LED1;
LED_OUT |= LED1;
//TIMER_PWM_PERIOD = 1;
}
tempCalibrated = tempAverage;
}
if
(tempPolarity == TEMP_COLD)
{
//LED_OUT |= LED2; //如果相对于参考温度偏差为负,LED2红灯置为亮
TIMER_PWM_PERIOD += tempDifference;
tempCalibrated = tempAverage;
if
(TIMER_PWM_PERIOD>0)
{
LED_OUT &= ~LED1;
}
}
TACCTL0 &= ~CCIFG; //清中断标志位??有必要么?不是自动清除?
TACCTL0 &= ~CCIE;
}
//TACCR1和定时器共用中断向量
#pragma
vector=TIMER0_A1_VECTOR
__interrupt
void
ta1_isr
(
void
)
{
TACCTL1 &= ~CCIFG; //捕获比较中断标志CCIFG。比较模式:定时器 TAR 值等于寄存器 CCR1 值时CCIFG置位。需手动清除
if
(applicationMode == APP_APPLICATION_MODE)
{
//LED_OUT &= ~(LED1 + LED2); //如果程序运行至是应用模式,置两灯皆灭
TACCTL1 &= ~CCIE;
}
else
LED_OUT ^= (LED1 + LED2); //如果是待机模式,异或,原来两个灯本来就是一亮一灭的,所以反复中断的效果是交替闪烁。PreApplicationMode(void)中
}
void
InitializeClocks
(
void
)
{
BCSCTL1 = CALBC1_1MHZ; //用FLASH中信息存贮器A段的校准数据设置基本时钟系统控制寄存器 1 // Set range
DCOCTL = CALDCO_1MHZ; //用FLASH中信息存贮器A段的校准数据设置 DCO 控制寄存器,设置DCO校准为1MHz,详细原理请查看G2系列芯片的Users Guide
BCSCTL2 &= ~(DIVS_3); //SMCLK为0分频DCO // SMCLK = DCO = 1MHz
}
void
InitializeButton
(
void
) // Configure Push Button
{
BUTTON_DIR &= ~BUTTON; //按键对应的端口方向为输入
BUTTON_OUT |= BUTTON; //设置输出寄存器对应的按键位为1
BUTTON_REN |= BUTTON; //使能上拉电阻,因为对应的输出寄存器位为1。反之如果对应的输出寄存器位为0则自动选择下拉电阻。
BUTTON_IES |= BUTTON; //选择下降沿中断
BUTTON_IFG &= ~BUTTON; //中断标志清零
BUTTON_IE |= BUTTON; //按键中断允许
}
//设置两颗LED对应的端口并两设置为熄灭初始状态
void
InitializeLeds
(
void
)
{
LED_DIR |= LED1 + LED2; //P1DIR=BIT1+BIT6 p1.0和P1.6口为输出
LED_OUT &= ~(LED1 + LED2); //两个LED低电平熄灭
}
/* *************************************************************
* Port Interrupt for Button Press
* 1. During standby mode: to exit and enter application mode
* 2. During application mode: to recalibrate temp sensor
* *********************************************************** */
#pragma
vector=PORT1_VECTOR
__interrupt
void
PORT1_ISR
(
void
)
{
BUTTON_IFG = 0; //清P1口所有中断标志
BUTTON_IE &= ~BUTTON; //禁止按键中断使能,防抖动,经过看门狗定时器延时在看门狗定时器中断中再打开 /* Debounce */
WDTCTL = WDT_ADLY_250; //=(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)看门狗设置为定时器模式,计数清零,时钟源为辅助时钟ACLK,定时周期为Taclk×32768
IFG1 &= ~WDTIFG; //清看门狗定时器中断标志 /* clear interrupt flag */
IE1 |= WDTIE; //使能看门狗定时器中断
if
(applicationMode == APP_APPLICATION_MODE) //如果是应用模式
{
//tempCalibrated = tempAverage; //???如果中断发生在for (i = 0; i < 8; i++) tempAverage += tempMeasured
;不是错了么?
calibrateUpdate = 1; //参考温度校准标志变量
}
else
{
applicationMode = APP_APPLICATION_MODE; //由待机模式切换到应用模式 // Switch from STANDBY to APPLICATION MODE
__bic_SR_register_on_exit(LPM3_bits); //退出低功耗模式LPM3
}
}
// WDT Interrupt Service Routine used to de-bounce button press
#pragma
vector=WDT_VECTOR
__interrupt
void
WDT_ISR
(
void
)
{
IE1 &= ~WDTIE; //禁止看门狗定时器中断 /* disable interrupt */
IFG1 &= ~WDTIFG; //清看门狗定时器中断标志 /* clear interrupt flag */
WDTCTL = WDTPW + WDTHOLD; //使看门狗关闭状态 /* put WDT back in hold state */
BUTTON_IE |= BUTTON; //使能按键中断 /* Debouncing complete */
}
// ADC10 interrupt service routine
#pragma
vector=ADC10_VECTOR
__interrupt
void
ADC10_ISR
(
void
)
{
__bic_SR_register_on_exit(CPUOFF); //退出省电模式 // Return to active mode
}
此帖出自
微控制器 MCU论坛
点赞
关注
(0)
TI培训
回复
分享
扫一扫,分享给好友
复制链接分享
链接复制成功,分享给好友
举报
提升卡
变色卡
千斤顶
返回列表
发新帖
回复
您需要登录后才可以回帖
登录
|
注册
发表回复
回帖后跳转到最后一页
活动
更多>>
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
安世半导体智能工业应用探索站,闯关赢好礼!
PI 电源小课堂:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
Microchip喊你探索dsPIC33A 芯片,70份好礼等你赢!
【瓜分2500元红包】票选2024 DigiKey “感知万物,乐享生活”创意大赛人气作品TOP3!
DigiKey应用探索站重磅上线!潮流应用,硬核技术探秘,N多干货,一站get!
验证并选择心仪MOSFET,探寻选型奥秘!注册、体验双重好礼等你拿~
免费申请测评 | 泰坦触觉 TITAN Core开发套件
开源项目
更多>>
LTC3642EDD 高效 15V、10mA 稳压器的典型应用电路
双向非隔离式降压升压转换器
PAM8124EVB,基于PAM8124 15W高效D类音频功率放大器的评估板
MPC86XADS、XPC8xx 参考板,基于 XPC860T MPU PowerQUICC MPC8xx 处理器
具有 ON/OFF 拨动开关的 LF18CPT-TR 1.8V 多路低压降稳压器电源的典型应用
AD8602DRMZ-REEL 低侧运算放大器电流监视器的典型应用
AZ34063U电压反相转换器的典型应用
homework1
UWB定位行驶小车
使用 LTC3639HMSE 低输出电压纹波 100mA 稳压器和 75ms 软启动的典型应用
随便看看
“我只要你的壳”之TI-82计算器改造(1)
前阵子我在 拆解TI-82计算器尸体帖子中留了一个悬念,我买计算器尸体干啥?要逐步揭晓谜底了。这款计算器尸体我前后一共买了好几块,最初买已经是几年前的事情了,当时觉得TI-82的键盘手感还不错,有改造利用价值,于是就有一个DIY计算器的想法。因为我囤积 ...
【Luckfox Pico】开发环境搭建
《Linux内核深度解析》-- 中断控制器注册逻辑
用仿真器下载程序后,写保护了,现在下载不下去了?
【玩转C2000 Launchpad】数字功放
C6000优化inline举例
今日直播:TI毫米波雷达在汽车领域的最新应用
有在arm+linux上做过摄像头的吗
查找数据手册?
搜索
EEWorld Datasheet 技术支持
热门标签
源代码
单片机
放大器
TI
ST
电源
分立器件
传感器
测试测量
模拟
交流漏电流传感器
计算机仿真技术
柱式传感器
非线性失真
模糊函数
消磁电阻
反向偏置
pn结击穿
传输层
串口
相关文章
更多>>
苹果M4 Mac mini曝出USB-C接口问题!随机间歇性断开连接
1月17日消息,苹果M4 Mac mini自2024年底发布以来,收获了不少好评,然而近期一些用户在使用过程中发现,该设备的USB-C接口似乎存在连接性问题,给使用带来了不便。 有用户反映M4 Ma
消息称 SK 海力士有望 2 月启动业界最先进 1c nm 制程 DRAM 内存量产
1 月 17 日消息,韩媒 MT(IT之家注:全称 MoneyToday)当地时间今日报道称,SK 海力士近日已成功完成内存业界最先进 1c 纳米制程 DRAM 的批量产品认证,连续多个以 25 块
未经同意出售用户数据,通用汽车遭美国 FTC 处罚
1 月 17 日消息,当地时间周四,美国联邦贸易委员会(FTC)宣布通用汽车及其子公司 OnStar 因未经用户同意出售用户位置和驾驶行为数据,因此将对其进行处罚,包括在五年内禁止向消费者报告机构披
日本三井住友银行推出半导体设备抵押贷款,铠侠已率先获益
联想宣布收购Infinidat,扩充高端企业存储业务
台积电董事长:我们不是美积电 最先进制程不会搬到美国
曝台积电拒绝代工三星Exynos处理器:理由是怕泄密
SK 海力士被曝上半年削减 10% NAND 闪存产量
苹果加入UALink联盟 成员含AMD、英特尔、谷歌等公司
英特尔宣布将逐渐停产第 12 代 Alder Lake 移动处理器,覆盖酷睿、奔腾及赛扬
新帖速递
STM32和无源蜂鸣器播放声音的问题
车规级AECQ200介绍,混合铝电解电容器的选择
嵌入式教程_DSP技术_DSP实验箱操作教程:2-28 搭建轻量级WEB服务器实验
OPA847IDBVR运放器国产替代
AG32VF407测试UART
【得捷电子Follow Me第二期】第一章 收到货物的分享
请问这个红外接收头是什么型号?能用哪个型号代替?谢谢
出售全新未拆封ZYNQ 7Z020 FPGA核心板
用在锂电池供电的水表设置上的LORA模块,当有100块水表集中安装在一个楼道内时,节能
请问一下,当某个端口被设置为 RX0后,这个端口的输入输出方向还有必要设置吗
今年怎么这么难,比疫情时还难,三十了面临失业好迷茫
请教稳压管测试问题
【小华HC32F448测评】关于小华半导体的UART中断发送和PRINTF构造和重定向
【BIGTREETECH PI开发板】 HDMI输出测试
【BIGTREETECH PI开发板】+08.音频测试(zmj)
安世半导体智能工业应用探索站,闯关赢好礼!
点击页面内“开始探索”按钮,填写并提交表单;
请根据序号依次完成3个安世半导体智能工业应用的探索,并根据给出的资料完成共计9题(每个应用3题),答对5题以上的玩家即可获得抽奖资格;
每人仅有一次参与答题的机会,请慎重作答,活动结束后,我们将抽取30位玩家赠送礼品。
查看 »
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
直播主题:多相降压电源控制技术的发展与探讨
直播时间:2025年2月25日(星期二)上午10:30-11:30
快来报名!
查看 »
回帖赢好礼 | 关于无线技术的那些事儿
【活动时间】即日起—2025年1月31日
【活动好礼】50元京东卡
查看 »
答题赢好礼,PI电源小课堂第3期来啦!
本期内容:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
活动时间:即日起-2月28日
看视频答题即可赢取京东卡!
查看 »
Microchip喊你探索 dsPIC33A 芯片,70份好礼等你赢!
活动时间:即日起-1月26日
活动奖励:随身Wi-Fi、家用多功能电烤箱、20000mAh充电宝、50元京东卡
查看 »
DigiKey应用探索站重磅上线!潮流应用,硬核技术探秘,N多干货,一站get!
当月好物、热门技术资源、潮流应用技术、特色活动、DigiKey在线实用工具,干货多多~
查看 »
本周精选下载推荐:电源管理基础Dummies
本周小编给大家带来一本超简单、超干货的电子书——《电源管理基础Dummies》!内容深入浅出,排版舒服简洁,分分钟能get到电源管理最核心的知识内容。
查看 »
下载资料赢好礼!看Vicor模块化电源解决方案如何推动创新
活动时间:即日起-2024年12月31日
如何参与:点击活动页内您想了解的模块,找到资料下载即可参与抽奖,活动结束后统一发奖!
查看 »
验证并选择心仪MOSFET,探寻选型奥秘!注册、体验双重好礼等你拿~
MOSFET 选型有点难
选N沟道MOSFET?还是选P沟道MOSFET?
封装如何选:不同封装尺寸有不同的热阻和耗散功率。
瞬态散热更严苛,热设计需要如何处理?
用东芝在线电路仿真器,一键解锁MOSFET选型的秘密!
查看 »
关闭
站长推荐
1
/9
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
电信业务审批[2006]字第258号函
京公网安备 11010802033920号
Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复
返回顶部
返回列表
论坛首页
版块列表
专业技术中心
TI技术论坛
ST传感器与低功耗无线技术论坛
ADI参考电路
DigiKey得捷技术专区
ADI · 世健工业技术
电子技术交流
嵌入式系统
单片机
国产芯片交流
电机驱动控制
FPGA/CPLD
模拟电子
电源技术
PCB技术
RF/无线
传感器
综合技术交流
下载中心专版
大学堂专版
测评中心专版
创意与实践
电子竞赛
DIY/开源硬件专区
淘e淘
创意市集
行业应用
汽车电子
移动便携
医疗电子
工控电子
安防电子
休息一下
聊聊、笑笑、闹闹
工作这点儿事
为我们提意见&公告
EEWorld颁奖专区
信息发布
最新帖子
最新帖子
最新回复
精华
消灭零回复
测评中心
活动中心
积分兑换
E金币兑换
芯积分
厂商专区
TI技术论坛
ST传感器与低功耗无线技术论坛