MSP430单片机课程设计一.设计要求数字温度计(1)用数码管(或LCD)显示温度和提示信息;(2)通过内部温度传感器芯片测量环境温度;(3)有手动测量(按测量键单次测量)和自动测量(实时测量)两种工作模式;(4)通过按键设置工作模式和自动测量的采样时间(1秒~1小时);(5)具备温度报警功能,温度过高或过低报警。
二.系统组成系统由G2Launch Pad及其拓展板构成,单片机为MSP430G2553。
I2的通信方式对IO进行拓展,芯片为TCA6416A;使用C使用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)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)) 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.0~P2.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(Data[i]);//write2DAC8411(65535);//write2DAC8411(Data[i]);//i++;//if(i>SAMPLENUM)// i=0;// break;}}LCD_Display();switch(t){case 0: delay_ms(1000); break;//1scase 1: delay_ms(5000); break;//5scase 2: delay_ms(15000);break;//15scase 3: delay_ms(30000);break;//30scase 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,以及小数点。