MSP430单片机实验报告(共25页).docx
精选优质文档-倾情为你奉上MSP430单片机课程设计一 设计要求数字温度计(1)用数码管(或LCD)显示温度和提示信息;(2)通过内部温度传感器芯片测量环境温度;(3)有手动测量(按测量键单次测量)和自动测量(实时测量)两种工作模式;(4)通过按键设置工作模式和自动测量的采样时间(1秒1小时);(5) 具备温度报警功能,温度过高或过低报警。二 系统组成系统由G2Launch Pad及其拓展板构成,单片机为MSP430G2553。使用的通信方式对IO进行拓展,芯片为TCA6416A;使用HT1621控制LCD;三 系统流程拓展的四个按键key1、key2、key3、key4分别对应单次测量、定时测量、定时时间的增、减。定时时间分别为1s,5s,15s,30s,60s。在自动测量模式下,当温度超过设定温度上限即报警,报警时在LCD屏幕显示ERROR同时LED2闪烁,在5s后显示0。此时可重新开始手动或自动测量温度。系统示意图:四. 演示a) 手动测量温度b)自动测量温度c)报警显示ERROR同时LED闪烁d)设置时间界面五 代码部分#include "MSP430G2553.h"#include "TCA6416A.h"#include "LCD_128.h"#include "HT1621.h"#include "DAC8411.h"#define CPU_F (double)#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)static int t=0;long temp;long IntDeg;void ADC10_ISR(void);void ADC10_init(void);void LCD_Init();void LCD_Display();void GPIO_init();void I2C_IODect();void Error_Display();void WDT_Ontime(void);void LCD_Init_AUTO();void LCD1S_Display();void LCD5S_Display();void LCD15S_Display();void LCD30S_Display();void LCD60S_Display();void main(void) WDTCTL = WDTPW + WDTHOLD;/关狗 BCSCTL1 = CALBC1_8MHZ; /* 设定系统时钟频率,使程序定时精准 */ DCOCTL = CALDCO_8MHZ; /-提示初始化成功- GPIO_init(); LCD_Init(); ADC10_init(); LCD_Display(); _enable_interrupt(); /使能总中断 while(1) PinIN(); _bis_SR_register(LPM3_bits);/休眠 /*/* * 名 称:GPIO_Init() * 功 能:设定按键和LED控制IO的方向 * 入口参数:无 * 出口参数:无 * 说 明:无 * 范 例:无 */void GPIO_init() /-设定P1.0和P1.6的输出初始值-P1DIR |= BIT0;/设定P1.0和P1.6为输出P1OUT |= BIT0;/设定P1.0初值/-启用内部上拉电阻-P2REN |= BIT3; /启用P2.3内部上下拉电阻P2OUT |= BIT3; /将电阻设置为上拉 P1REN |= BIT3; /启用P1.3内部上下拉电阻P1OUT |= BIT3; /将电阻设置为上拉/-配置P2.3中断参数-P2DIR &= BIT3; / P2.3设为输入(可省略)P2IES |= BIT3; / P2.3设为下降沿中断P2IE |= BIT3 ; / 允许P1.3中断 P1DIR &= BIT3; / P1.3设为输入(可省略)P1IES |= BIT3; / P1.3设为下降沿中断P1IE |= BIT3 ; / 允许P1.3中断/* * 名 称:PORT2_ISR() * 功 能:响应P1口的外部中断服务 * 入口参数:无 * 出口参数:无 * 说 明:P2.0P2.8共用了PORT1中断,所以在PORT2_ISR()中必须查询标志位P1IFG才能知道 * 具体是哪个IO引发了外部中断。P1IFG必须手动清除,否则将持续引发PORT1中断。 * 范 例:无 */#pragma vector = PORT2_VECTOR_interrupt void PORT2_ISR(void)/-启用Port2事件检测函数-I2C_IODect();/检测通过,则会调用事件处理函数 P2IFG=0; /退出中断前必须手动清除IO口中断标志 _bic_SR_register_on_exit(LPM0_bits );/* * 名 称: I2C_IO10_Onclick() * 功 能:TCA6416A的扩展IO1.0的按下事件处理函数 * 入口参数:无 * 出口参数:无 * 说 明:无 * 范 例:无 */void I2C_IO10_Onclick() ADC10CTL0 |= ENC + ADC10SC; / Sampling and conversion start / _bis_SR_register(CPUOFF + GIE); / LPM0 with interrupts enabled _delay_cycles(1000); /-ADC转换完成中断唤醒CPU后才执行以下代码- temp = ADC10MEM;/读取AD采样值 IntDeg= temp*4225/1024 - 2777;/转换为摄氏度,并10倍处理 LCD_Init(); LCD_Display(); return;/* * 名 称: I2C_IO11_Onclick() * 功 能:TCA6416A的扩展IO1.1的按下事件处理函数 * 入口参数:无 * 出口参数:无 * 说 明:无 * 范 例:无 */void I2C_IO11_Onclick() /_enable_interrupt(); /使能总中断 /PinIN(); /_bis_SR_register(LPM3_bits);/休眠 LCD_Init_AUTO(); LCD_Display(); while(1) TCA6416A_InputBuffer=0; ADC10CTL0 |= ENC + ADC10SC; /Sampling and conversion start /-ADC转换完成中断唤醒CPU后才执行以下代码- temp = ADC10MEM;/读取AD采样值 IntDeg= temp*4225/1024 - 2777;/转换为摄氏度,并10倍处理 LCD_Display(); if(IntDeg>380) while(1) for(int j=0;j<5;j+) PinOUT(1,1); Error_Display(); delay_ms(500); PinOUT(1,0); delay_ms(500); IntDeg=0; main(); /DAC8411_Init(); /P1DIR |= BIT1; /write2DAC8411(Datai); /write2DAC8411(65535); /write2DAC8411(Datai); /i+; /if(i>SAMPLENUM) / i=0; / break; LCD_Display(); switch(t) case 0:delay_ms(1000);break;/1s case 1: delay_ms(5000);break;/5s case 2: delay_ms(15000);break;/15s case 3: delay_ms(30000);break;/30s case 4: delay_ms(60000);break;/60s /* * 名 称: I2C_IO12_Onclick() * 功 能:TCA6416A的扩展IO1.2的按下事件处理函数 * 入口参数:无 * 出口参数:无 * 说 明:无 * 范 例:无 */void I2C_IO12_Onclick() t=t+1; if(t>4) t=4; switch(t) case 0:LCD1S_Display();break; case 1: LCD5S_Display();break; case 2: LCD15S_Display();break; case 3: LCD30S_Display();break; case 4: LCD60S_Display();break; /* * 名 称: I2C_IO13_Onclick() * 功 能:TCA6416A的扩展IO1.3的按下事件处理函数 * 入口参数:无 * 出口参数:无 * 说 明:无 * 范 例:无 */void I2C_IO13_Onclick() t=t-1; if(t<0) t=0; switch(t) case 0:LCD1S_Display();break; case 1: LCD5S_Display();break; case 2: LCD15S_Display();break; case 3: LCD30S_Display();break; case 4: LCD60S_Display();break; /* * 名 称: I2C_IODect() * 功 能:TCA6416A的扩展IO事件检测函数 * 入口参数:无 * 出口参数:无 * 说 明:检测具体哪个扩展IO被按下 * 范 例:无 */void I2C_IODect() static unsigned char KEY_Now=0;unsigned char KEY_Past;KEY_Past=KEY_Now;/-判断I2C_IO10所连的KEY1按键是否被按下-if(TCA6416A_InputBuffer&BIT8) = BIT8)KEY_Now |=BIT0;elseKEY_Now &=BIT0;if(KEY_Past&BIT0)=BIT0)&&(KEY_Now&BIT0)=0) I2C_IO10_Onclick(); /-判断I2C_IO11所连的KEY2按键是否被按下-if(TCA6416A_InputBuffer&BIT9)= BIT9)KEY_Now |=BIT1;elseKEY_Now &=BIT1;if(KEY_Past&BIT1)=BIT1)&&(KEY_Now&BIT1)=0) I2C_IO11_Onclick(); /-判断I2C_IO12所连的KEY3按l键是否被按下-if(TCA6416A_InputBuffer&BITA) = BITA)KEY_Now |=BIT2;elseKEY_Now &=BIT2;if(KEY_Past&BIT2)=BIT2)&&(KEY_Now&BIT2) =0)I2C_IO12_Onclick();/-判断I2C_IO13所连的KEY4按键是否被按下-if(TCA6416A_InputBuffer&BITB) = BITB)KEY_Now |=BIT3;elseKEY_Now &=BIT3;if(KEY_Past&BIT3) = BIT3)&& (KEY_Now&BIT3) = 0)I2C_IO13_Onclick();/* * 名 称:LCD_Init() * 功 能:初始化LCD显示相关的硬件,并预设固定不变的显示内容 * 入口参数:无 * 出口参数:无 * 说 明:预设显示内容包括摄氏度oC,以及小数点。 * 范 例:无 */void LCD_Init() TCA6416A_Init(); HT1621_init(); LCD_Clear();/-显示固定不变的LCD段-LCD_DisplaySeg(_LCD_TI_logo);LCD_DisplaySeg(_LCD_QDU_logo); LCD_DisplaySeg(_LCD_RUN);LCD_DisplaySeg(_LCD_DOT2);/温度小数点/-减法构造“o”-LCD_DisplayDigit(9,5);LCD_ClearSeg(_LCD_5D);LCD_ClearSeg(_LCD_5C);/-减法构造“C”-LCD_DisplayDigit(0,6);LCD_ClearSeg(_LCD_6B);LCD_ClearSeg(_LCD_6C); LCD_DisplayDigit(0,2); LCD_DisplayDigit(0,3); LCD_DisplayDigit(0,4);void LCD_Init_AUTO() TCA6416A_Init(); HT1621_init();/-显示固定不变的LCD段-LCD_DisplaySeg(_LCD_TI_logo);LCD_DisplaySeg(_LCD_QDU_logo); LCD_DisplaySeg(_LCD_AUTO);LCD_DisplaySeg(_LCD_DOT2);/温度小数点/-减法构造“o”-LCD_DisplayDigit(9,5);LCD_ClearSeg(_LCD_5D);LCD_ClearSeg(_LCD_5C);/-减法构造“C”-LCD_DisplayDigit(0,6);LCD_ClearSeg(_LCD_6B);LCD_ClearSeg(_LCD_6C);/* * 名 称:LCD_Displaly() * 功 能:将温度值显示出来 * 入口参数:无 * 出口参数:无 * 说 明:包括对负温度的处理、拆分数字等几部分 * 范 例:无 */void LCD_Display() if( IntDeg>=0) LCD_ClearSeg(_LCD_1G);/正温度,则清除负号 else IntDeg=-IntDeg;/负温度,则做绝对值处理 LCD_DisplaySeg(_LCD_1G);/负温度,添加负号 /-清除3位显示数字- LCD_DisplayDigit(LCD_DIGIT_CLEAR,2); LCD_DisplayDigit(LCD_DIGIT_CLEAR,3); LCD_DisplayDigit(LCD_DIGIT_CLEAR,4); /-拆分3位并显示数字- LCD_DisplayDigit(IntDeg/100,2); LCD_DisplayDigit(IntDeg%100)/10,3); LCD_DisplayDigit(IntDeg%100)%10,4); /-更新缓存,真正显示- HT1621_Reflash(LCD_Buffer);/* * 名 称:ADC10_init(void) * 功 能:初始化ADC10采集内部温度传感器,单次手动采样 * 入口参数:无 * 出口参数:无 * 说 明:直接从CCS的Example中移植过来 * 范 例:无 */void ADC10_init(void)ADC10CTL0 &= ENC;ADC10CTL0 = ADC10IE + ADC10ON + REFON + ADC10SHT_3 + SREF_1; ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3 + SHS_0 + INCH_10; _delay_cycles(10000); ADC10CTL0 |= ENC;/* * 名 称:ADC10_ISR_HOOK * 功 能:ADC转换完成后唤醒CPU * 入口参数:无 * 出口参数:无 * 说 明:直接从CCS的Example中移植过来 * 范 例:无 */#pragma vector=ADC10_VECTOR_interrupt void ADC10_ISR_HOOK(void)_bic_SR_register_on_exit(LPM4_bits);void Error_Display() TCA6416A_Init(); HT1621_init(); LCD_ClearSeg(_LCD_DOT2); LCD_ClearSeg(_LCD_1G);/-显示固定不变的LCD段-LCD_DisplaySeg(_LCD_TI_logo);LCD_DisplaySeg(_LCD_QDU_logo); /-构造ERROR-LCD_DisplayDigit(6,2); LCD_ClearSeg(_LCD_2C);LCD_DisplayDigit(8,3);LCD_ClearSeg(_LCD_3D); LCD_DisplayDigit(8,4);LCD_ClearSeg(_LCD_4D); LCD_DisplayDigit(0,5); LCD_DisplayDigit(8,6);LCD_ClearSeg(_LCD_6D);/-更新缓存,真正显示-HT1621_Reflash(LCD_Buffer);void LCD1S_Display() LCD_ClearSeg(_LCD_DOT2);/温度小数点 /-清除3位显示数字- LCD_DisplayDigit(LCD_DIGIT_CLEAR,2); LCD_DisplayDigit(LCD_DIGIT_CLEAR,3); LCD_DisplayDigit(LCD_DIGIT_CLEAR,4); LCD_DisplayDigit(LCD_DIGIT_CLEAR,5); LCD_DisplayDigit(LCD_DIGIT_CLEAR,6); LCD_DisplayDigit(LCD_DIGIT_CLEAR,7); /-显示数字- LCD_DisplayDigit(0,4); LCD_DisplayDigit(1,5); LCD_DisplayDigit(5,6); /-更新缓存,真正显示- HT1621_Reflash(LCD_Buffer);void LCD5S_Display() LCD_ClearSeg(_LCD_DOT2);/温度小数点 /-清除3位显示数字- LCD_DisplayDigit(LCD_DIGIT_CLEAR,2); LCD_DisplayDigit(LCD_DIGIT_CLEAR,3); LCD_DisplayDigit(LCD_DIGIT_CLEAR,4); LCD_DisplayDigit(LCD_DIGIT_CLEAR,5); LCD_DisplayDigit(LCD_DIGIT_CLEAR,6); LCD_DisplayDigit(LCD_DIGIT_CLEAR,7); /-显示数字- LCD_DisplayDigit(0,4); LCD_DisplayDigit(5,5); LCD_DisplayDigit(5,6); /-更新缓存,真正显示- HT1621_Reflash(LCD_Buffer);void LCD15S_Display() LCD_ClearSeg(_LCD_DOT2);/温度小数点 /-清除3位显示数字- LCD_DisplayDigit(LCD_DIGIT_CLEAR,2); LCD_DisplayDigit(LCD_DIGIT_CLEAR,3); LCD_DisplayDigit(LCD_DIGIT_CLEAR,4); LCD_DisplayDigit(LCD_DIGIT_CLEAR,5); LCD_DisplayDigit(LCD_DIGIT_CLEAR,6); LCD_DisplayDigit(LCD_DIGIT_CLEAR,7); /-显示数字- LCD_DisplayDigit(1,4); LCD_DisplayDigit(5,5); LCD_DisplayDigit(5,6); /-更新缓存,真正显示- HT1621_Reflash(LCD_Buffer);void LCD30S_Display() LCD_ClearSeg(_LCD_DOT2);/温度小数点 /-清除3位显示数字- LCD_DisplayDigit(LCD_DIGIT_CLEAR,2); LCD_DisplayDigit(LCD_DIGIT_CLEAR,3); LCD_DisplayDigit(LCD_DIGIT_CLEAR,4); LCD_DisplayDigit(LCD_DIGIT_CLEAR,5); LCD_DisplayDigit(LCD_DIGIT_CLEAR,6); LCD_DisplayDigit(LCD_DIGIT_CLEAR,7); /-显示数字- LCD_DisplayDigit(3,4); LCD_DisplayDigit(0,5); LCD_DisplayDigit(5,6); /-更新缓存,真正显示- HT1621_Reflash(LCD_Buffer);void LCD60S_Display() LCD_ClearSeg(_LCD_DOT2);/温度小数点 /-清除3位显示数字- LCD_DisplayDigit(LCD_DIGIT_CLEAR,2); LCD_DisplayDigit(LCD_DIGIT