温度测量与通信系统设计
利用MSP430G2口袋实验平台(需焊接32.768kHz晶振并使用外部晶振)的相应模块,基于MSP430G2553 MCU,CCS6.2例程进行调试,实现以下功能:
(1)开机LCD先显示AA2019三秒,123456三秒,然后在LCD显示MCU芯片温度信息xx.x℃。
(2)同时与PC进行RS232通信,05作为握手信号(PC发送,MSP430实验平台接收),当握手信号正确时,蜂鸣器响一声(1000Hz、响2秒),回送温度给PC机,格式为“测量的温度为xx.x摄氏度”;不正确时蜂鸣器响三声(2000Hz、响1秒停1秒重复三次),回送字符串给PC机,格式为“序号是05”。
通信参数设置为:波特率4800bps,校验位N,数据位8,停止位1。
参考例程
(1) http://www.hpati.com/ay_source_download/action_download_116.html
5_Interrupt_Key_LED 中断按键(文献 [1] ch5)
7_2_Timer_Key_LED 定时查询按键(文献 [1] ch7)
8_1_TouchPad_LED 电容触摸按键(文献 [1] ch8)
10_UART_KeyBoard 串口键盘(文献 [1] ch10)
14_LCD_SelfScan_Hard_or_Soft_I2C LCD显示自检(文献 [1] ch14)
19_ADC10_Temperature 温度测量(文献 [1] ch19)
(2) http://www.ti.com/lit/sw/slac435f/slac435f.zip
MSP-EXP430G2 Software Examples (Rev. F)
cpp警告:由于G2 LaunchPad上的LED2使用了P1.6(I2C引脚),所以所有涉及到I2C的实验都必须把P1.6跳线拔除,包含本例程!
*
*
* P1.1接串口模块的TX P1.2接串口模块的RX
*
* 程序上电后显示 AA2019 三秒钟
*
* 然后显示123456 三秒钟
*
*
* 然后进入温度的实时刷新,使用ADC10读取芯片内部温度传感器,换算成摄氏度显示
*
*
* 串口4800,8位数据,1位停止
* 接受到05时,返回温度数值,并且让蜂鸣器1000HZ响3秒钟
*
* 接收到的不是05,返回警告,并且让蜂鸣器响一秒停一秒,三次,2000HZ
cpp //显示AA2019
LCD_DisplayDigit(8, 1);
LCD_DisplayDigit(8, 2);
LCD_DisplayDigit(2, 3);
LCD_DisplayDigit(0, 4);
LCD_DisplayDigit(1, 5);
LCD_DisplayDigit(9, 6);
LCD_ClearSeg(4);
LCD_ClearSeg(12);
HT1621_Reflash(LCD_Buffer);
TACTL = TASSEL_1 + MC_1 + TACLR; /* 打开定时器 */
//等待3s
delay_ms(3000);
//显示123456
LCD_DisplayDigit(1, 1);
LCD_DisplayDigit(2, 2);
LCD_DisplayDigit(3, 3);
LCD_DisplayDigit(4, 4);
LCD_DisplayDigit(5, 5);
LCD_DisplayDigit(6, 6);
HT1621_Reflash(LCD_Buffer);
TACTL = TASSEL_1 + MC_1 + TACLR; /* 打开定时器 */
//等待3s
delay_ms(3000);
/* 定时器0 检测按键的 */
CCTL0 = CCIE;
TACCR0 = 20000; /* 10MS */
TACTL = TASSEL_2 + MC_0 + ID_3; //2MHZ
_EINT();
//初始化显示芯片内部温度
dis_num_6(275);
while (1)
{
if (ifg == 1)
{
ifg = 0;
cycaaa = 2000; //响声2s
while (cycaaa--)
{
//一个周期是6个数字给蜂鸣器 6个166us就是1ms 1000HZ的声音
for (numasa = 0; numasa < 6; numasa++)
{
write2DAC8411(Data[numasa]);
delay_us(166);
}
}
}
else if (ifg == 2)
{
for (xunhuan = 0; xunhuan < 3; xunhuan++)
{
cycaaa = 800; //响声1s应该是cycaaa=2000 太难听 适当减少点
while (cycaaa--)
{
//一个周期是6个数字给蜂鸣器 6个83us就是0.5ms 2000HZ的声音
for (numasa = 0; numasa < 6; numasa++)
{
write2DAC8411(Data[numasa]);
delay_us(83);
}
}
delay_ms(500); //停1s 适当减少了
}
ifg = 0;
}
init_ad_rxtx();
//Print_Str("测量的温度为");
ADC10CTL0 |= ENC + ADC10SC; //开始转换
while (ADC10IFG == 0)
; //等待 ADC10IFG 标志变高(转换完成)
temp = ADC10MEM;
IntDegC = (int) ((((float) temp - 673.0) / 1024.0) * 4230.0);
if ((IntDegC < 1000) && (IntDegC > 0))
{
init_banzi();
dis_num_6(IntDegC);
init_ad_rxtx();
}
TACTL = TASSEL_1 + MC_1 + TACLR; /* 打开定时器 */
LPM0;
}
}
/* Timer A0 interrupt service routine */
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
//正常刷新温度
time_c++;
if (time_c == 10)
{
time_c = 0;
TACTL = TASSEL_1 + MC_0 + TACLR; /* 停下时钟 */
//bofang(); /* 播放嘟 */
LPM0_EXIT;
}
}
char xianshia[6];
char count_xianshia = 0;
// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
//while (!(IFG2 & UCA0TXIFG))
// ; // USCI_A0 TX buffer ready?
//UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
if (UCA0RXBUF == 0x05)
{
count_xianshia = 0;
xianshia[count_xianshia++] = IntDegC % 1000 / 100 + '0';
xianshia[count_xianshia++] = IntDegC % 100 / 10 + '0';
xianshia[count_xianshia++] = '.';
xianshia[count_xianshia++] = IntDegC % 10 + '0';
xianshia[count_xianshia++] = 0;
Print_Str("测量的温度为");
Print_Str(xianshia);
Print_Str("摄氏度\r\n");
ifg = 1; //控制蜂鸣器
}
else
{
Print_Str("序号是05\r\n");
ifg = 2; //控制蜂鸣器
}
}
cpphttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!