MSP430单片机实验报告v3.0.doc_第1页
MSP430单片机实验报告v3.0.doc_第2页
MSP430单片机实验报告v3.0.doc_第3页
MSP430单片机实验报告v3.0.doc_第4页
MSP430单片机实验报告v3.0.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MSP430单片机课程设计1 设计要求数字温度计(1)用数码管(或LCD)显示温度和提示信息;(2)通过内部温度传感器芯片测量环境温度;(3)有手动测量(按测量键单次测量)和自动测量(实时测量)两种工作模式;(4)通过按键设置工作模式和自动测量的采样时间(1秒1小时);(5) 具备温度报警功能,温度过高或过低报警。2 系统组成系统由G2Launch Pad及其拓展板构成,单片机为MSP430G2553。使用的通信方式对IO进行拓展,芯片为TCA6416A;使用HT1621控制LCD;3 系统流程拓展的四个按键key1、key2、key3、key4分别对应单次测量、定时测量、定时时间的增、减。定时时间分别为1s,5s,15s,30s,60s。在自动测量模式下,当温度超过设定温度上限即报警,报警时在LCD屏幕显示ERROR同时LED2闪烁,在5s后显示0。此时可重新开始手动或自动测量温度。系统示意图:4. 演示a) 手动测量温度b)自动测量温度c)报警显示ERROR同时LED闪烁d)设置时间界面5 代码部分#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.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(IntDeg380) while(1) for(int j=0;jSAMPLENUM) / 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(t4) 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) 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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论