主题中讨论的其他器件:MSP430G2553
工具/软件:Code Composer Studio
大家好。
我正在使用 MSP430G2553 Launchpad 的 ADC10转换内部温度传感器并通过 UART 发送转换结果。
我使用 TeraTerm 读取 PC 上的 UART 数据、并将跳线切换至 HW 位置。
问题是 TeraTerm 上未显示数据。
这是我的代码、感谢您的宝贵支持。
//
//此程序使用带有 ADC10模块的 MSP430内部温度传感器
//
//使用 Code Composer Studio v6.2构建
//
#include
#include
#include
长 ADCDATA; //ADCDATA 变量、用于存储 ADC10MEM 中的 ADC 数据
长 tempInDeg;
字符串 Temp[]={};
//函数原型
void itoa (long unsigned int value、char* result、int base);
//void itoa();//函数原型
void UART_TX (char * TX_DATA);
void clock_init (){
//时钟校准为1MHz -------------------------------------------------------
DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
BCSCTL1 = CALBC1_1MHz;//设置 DCO
DCOCTL = CALDCO_1MHz;
}
void GPIO_init(){
//尽管 P1.0和 P1.6已初始化,但不使用它们
P1DIR |=0x41;
P1OUT &=~ 0x41;
}
void ADC10_init(){
// ADC 初始化
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE;//内部电压(VR+= VREF+和 VR-= VSS);SHT= 64*ADC10CLK;ref on;ADC10 on;启用中断
ADC10CTL1 = INCH_10 + ADC10SSEL_2;//输入通道10-->内部温度传感器;MCLK
_delay_cycles (50);
}
void UART_init(){
/*
//即使我尝试使用以下两行代码,它也不起作用
P1DIR |= 0x02 + 0x04; //将 P1.1 + P1.2 UART 引脚设置为输出方向
P1OUT &=~ 0x02 + 0x04; //清除 P1.1 + P1.2 UART 引脚
*
//---- 设置 P1.1和 P1.2的 UART 功能--- //
P1SEL |= BIT1 + BIT2; // P1.1 UCA0RXD 输入
P1SEL2 |= BIT1 + BIT2; // P1.2 UCA0TXD 输出
//------ 配置 UART (USCI_A0)--- //
UCA0CTL1 = UCSSEL_2 + UCSWRST;// SMCLK;在进行任何更改之前软件复位(USCI_A0被禁用)
//选择9600波特率
UCA0BR0 = 104; //从数据表表中删除了104 -
UCA0BR1 = 0; //-选择波特率=9600、clk = SMCLK
UCA0MCTL = UCBRS_1; 数据表中的//调制值= 1
UCA0CTL1 &=~Ω UCSWRST; //清除 UCSWRST 以启用 USCI_A0
///-------- 使能中断--- //
IE2 |= UCA0TXIE; //启用发送中断
// IE2 |= UCA0RXIE; //启用接收 中断 //我们不需要此操作,因为我们只发送
_BIS_SR (GIE); //启用全局中断
}
//主要功能---
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器
//函数调用----------------
clock_init();
GPIO_init();
ADC10_INIT();
UART_INIT();
_bis_SR_register (GIE);//全局中断使能
while (1)
{
ADC10CTL0 |= ENC + ADC10SC; //启用转换;采样和转换开始
_bis_SR_register (CPUOFF); //在 ADC 转换时转至 LPM_0
ADCDATA = ADC10MEM; //读取 ADC 值
//使用公式 ADCDATA =(1024*(Vtemp/Vref)以度数转换为单位的温度
tempInDeg =((ADCDcData - 673)* 423)/ 1024;
//tempInDeg =((ADCDATA * 1500)/1024 - 986.6)/3.55;
itoa (tempInDeg、stringTemp、10);//将 tempInDeg 转换为字符串
// TeraTerm 上未显示以下数据
UART_TX ("MSP430正在启动\n");
UART_TX ("配置时钟正常\n");
UART_TX ("温度为\n"\});
UART_TX (stringTemp);
_DELAY_CYCLES (10000);//延迟
ADC10CTL0 &=~ENC; //停止转换
}
}
//中断服务例程-------------------------------------------------------
#pragma vector= ADC10_vector
_interrupt void ADC10_ISR (){
_BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM_0
}
#pragma vector = USCIAB0TX_vector
_interrupt void 传输中断(void)
{
}
//函数通过 UART 发送数据
void UART_TX (char * TX_DATA)//定义接受指向数组的字符指针的函数
{
unsigned int i=0;
while (TX_DATA[i])//通过数组递增、在字符串末尾查找空指针(0)
{
while (((UCA0STAT 和 UCBUSY));//如果线路 TX/RX 模块忙于处理数据则等待
UCA0TXBUF = TX_DATA[i];//发送 UART 总线上 TX_DATA 数组的元素 I
i++;//递增数组地址的变量
}
}
// C 语言函数将整数转换为字符串
void itoa (long unsigned int 值、char*结果、int base)
{
//检查底座是否有效
if (base < 2 || base > 36){* result ='\0';}
char* ptr =结果、*ptr1 =结果、tmp_char;
int tmp_value;
执行{
tmp_value =值;
值/=基值;
* PTR++="zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 +(tmp_value - value * base)];
} while (value);
//应用负号
如果(tmp_value < 0)*ptR++='-';
*PTR-='\0';
while (ptr1 < ptr){
tmp_char =* ptr;
*ptr--=*ptr1;
*ptr1++= tmp_char;
}
}