2491|0

6587

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

MSP430单片机——内置温度传感器测试程序 [复制链接]

调了好久的程序终于搞定了,其实在之前问题就是出现在时钟的选择上不正确,没有配置好合适的时钟,初始化的时候没有选择XTS位,导致程序初始化不正确,希望大家不要犯类似的错误哦!由于是新人,程序中有什么错误还希望大家帮忙指正。
程序代码如下:
  • //*****************************************************************************
  • //程序主要是利用MSP430内置温度传感器检测CPU温度随外界温度的变化,由串口显示变化的情况,
  • //用TimerA0定时1s采集一个数据在发送到串口上,在没有取平均值之前检测到温度不是很准确
  • //******************************************************************************
  • #include
  • //#define ADCDeltaOn 1 // ~2 Deg C delta
  • #define CPU_F ((double)8000000)
  • #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  • #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
  • #define uchar unsigned char
  • #define uint unsigned int
  • #define ulong unsigned long
  • /*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/
  • #define baud 9600 //设置波特率的大小
  • #define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率计算公式
  • #define baud_h (uchar)(baud_setting>>8) //提取高位
  • #define baud_l (uchar)(baud_setting) //低位
  • int long temp;
  • int long sum;
  • int count_f=0;
  • //*************************************************************************
  • // 系统时钟初始化
  • //*************************************************************************
  • void Clock_Init()
  • {
  • uchar i;
  • BCSCTL1&=~(XT2OFF+XTS); //打开XT振荡器
  • BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
  • do{
  • IFG1&=~OFIFG; //清除震荡标志
  • for(i=0;i<100;i++)
  • _NOP(); //延时等待
  • }
  • while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待
  • IFG1&=~OFIFG;
  • }//*************************************************************************
  • // MSP430串口初始化
  • //*************************************************************************
  • void UART_Init()
  • {
  • U1CTL|=SWRST; //复位SWRST
  • U1CTL|=CHAR; //8位数据模式
  • U1TCTL|=SSEL1; //SMCLK为串口时钟
  • U1BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
  • U1BR0=baud_l; //N=UBR+(UxMCTL)/8
  • U1MCTL=0x00; //微调寄存器为0,波特率9600bps
  • ME2|=UTXE1; //UART1发送使能
  • ME2|=URXE1; //UART1接收使能
  • U1CTL&=~SWRST;
  • IE2|=URXIE1; //接收中断使能位
  • P3SEL|= BIT6; //设置IO口为特殊功能模块
  • P3DIR|= BIT6; //设置P3.4为输入,P3.5为输出口
  • P3SEL|= BIT7; //设置IO口为外围功能模块
  • }
  • //*************************************************************************
  • // 串口1发送数据函数
  • //*************************************************************************
  • void Send_Byte(uchar data)
  • {
  • U1TXBUF=data;
  • while ((IFG2 & UTXIFG1)==0);
  • }
  • //*************************************************************************
  • // 处理来自串口1的发送中断,预留
  • //*************************************************************************
  • #pragma vector=UART1TX_VECTOR
  • __interrupt void UART1_TX_ISR(void)
  • {
  • }
  • //*************************************************************************
  • // 定时器中断服务程序
  • //*************************************************************************
  • #pragma vector = TIMERA0_VECTOR
  • __interrupt void Timer_A(void)
  • {
  • }
  • //*************************************************************************
  • // ADC中断服务程序
  • //*************************************************************************
  • #pragma vector=ADC12_VECTOR
  • __interrupt void ADC12ISR (void)
  • {
  • if(count_f<10)
  • {temp = ADC12MEM0;
  • sum+=temp;
  • sum/=2;
  • count_f++;
  • }
  • Send_Byte(sum);
  • P2OUT |= ~0xFE; // LED on
  • count_f=0;
  • _BIC_SR_IRQ(CPUOFF); // Clear CPUOFF bit from 0(SR)
  • }
  • //*************************************************************************
  • // 主程序
  • //*************************************************************************
  • void main(void)
  • {
  • WDTCTL = WDTPW + WDTHOLD; // Stop watchdog
  • UART_Init();
  • Clock_Init();
  • P2OUT = 0x00; // Clear P1
  • P2DIR = 0xFF; // P1.0 as output
  • ADC12CTL1 = SHS_1 + SHP + CONSEQ_2; // TA trig., rpt conv.
  • ADC12MCTL0 = SREF_1 + INCH_10; // Channel A10, Vref+
  • ADC12IE = 0x01; // Enable ADC12IFG.0
  • ADC12CTL0 = SHT0_8 + REF2_5V + REFON + ADC12ON + ENC; // Config ADC12
  • TACCTL1 = OUTMOD_4; // Toggle on EQU1 (TAR = 0)
  • CCR0=32768;
  • CCTL0 = CCIE;
  • TACTL = TASSEL_1 + MC_1; // AMCLK
  • _EINT();
  • while(1)
  • {
  • ADC12CTL0 |= ADC12SC; // Sampling and conversion start
  • _BIS_SR(LPM0_bits + GIE); // LPM0 with interrupts enabled
  • }
  • }


复制代码

ADC_cpu.zip (26.74 KB, 下载次数: 20)

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表