2024-09-01
售卖作品
00

目录

功能
部分程序
全部程序

功能

温度测量与通信系统设计

利用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读取芯片内部温度传感器,换算成摄氏度显示 * * * 串口48008位数据,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; //控制蜂鸣器 } }

全部程序

cpp
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!