温度计2953460712_第1页
温度计2953460712_第2页
温度计2953460712_第3页
温度计2953460712_第4页
温度计2953460712_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、ADC16.h#include "msp430X42X.h"extern char ADC16_Init(char ADC,char Channel,char Sign,char Gain);extern unsigned int ADC16_Sample(char ADC,unsigned int AverageNum);extern void ADC16_Sample3(unsigned int *Result0,unsigned int *Result1, unsigned int *Result2,unsigned int AverageNum);extern vo

2、id ADC16_VrefOn();extern void ADC16_VrefOff();extern void Analog_On();extern void Analog_Off();ADC16.c/* MSP430F42X系列单片机16位ADC通用程序库 说明:该驱动程序库包含了常用的16位ADC操作与控制功能函数,如选择通道、 设置信号放大倍数、设置数据格式、基准源输出开关等,以及常用采样 函数,包括单通道采样、平均采样、多通道同时采样等。可以作为各种 程序的底层驱动使用。 要使用该库函数,需要将本文件(ADC16.c)添加进工程,并在需要 调用ADC函数的文件开头处包含"

3、ADC16.h" (C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/02 */ MSP430FE425/ +-+/ | |/ Vin->100:1->| A0+ XIN|-/ -10+60V | (ADC0) | 32kHz/ GND->| A0- XOUT|-/ | |/ 1/2Vref | |/ | | | / |-| | P2.2 |->向外部模拟电路供电/ W1 | |<->| A1+ |/ |_| | (ADC1) |/ +->| A1- VREF |-+->基准输出/ GND | | |/ | |

4、- / 1/2Vref | | - 1nF/ | | | |/ |-| | AVss |-+/ W2 | |<->| A2+ | |/ |_| | (ADC2) | |/ +->| A2- | GND / GND | |/ +-+#include "msp430X42X.h"unsigned int ADC_Result3;char ADC_Flag=0;char GRP_Flag=0;/* 名 称:ADC16_Init()* 功 能:ADC初始化设置函数* 入口参数:ADC: 选择当前被设置的ADC(03): 0=ADC0 1=ADC1 2=ADC2 C

5、hannel:设置通道号(07) 每个ADC有7个通道可选择,42X单片机只用了 其中3个:通道0=外部电压输入 通道6=温度传感器 通道7=短路(0V) Sign:ADC输出数据格式选择: 'U'表示无符号格式,'S'表示有符号格式 无符号格式下,-Vref/2输入时,ADC输出数据 0 0V输入时,ADC输出数据 32768 +Vref/2输入时,ADC输出数据 65535 有符号格式下,-Vref/2输入时,ADC输出数据 -32768 0V输入时,ADC输出数据 0 +Vref/2输入时,ADC输出数据 32767 Gain:内部放大器增益(1/2/4/

6、8/16/32) 设置被测信号进入ADC之前的放大 倍数。用该功能可以方便的改变量程。* 出口参数:1表示设置成功,0表示参数错误,设置失败。* 说 明: 在主程序调用ADC采样函数之前,需要调用该函数设置ADC工作模式和参数。* 范 例: ADC16_Init(2,0,'S',1);将ADC2设为电压输入,有符号格式,增益=1 ADC16_Init(1,6,'U',1);将ADC1输入接到内部温度传感器,无符号格式,增益=1 ADC16_Init(0,7,'S',1);将ADC0输入短路(0V),有符号格式,增益=1 ADC16_Init(1,

7、0,'S',16);将ADC0设为电压输入,有符号格式,信号放大16倍*/char ADC16_Init(char ADC,char Channel,char Sign,char Gain) unsigned int *SD16CCTL; /ADCx控制寄存器选择指针 unsigned int *SD16INCTL; /ADCx输入寄存器选择指针 SD16CTL|=SD16SSEL0+SD16DIV_1; /设置ADC时钟SMCLK/2(524KHz) /试验发现500KHz左右采样效果较好,频率高噪声变大,频率低采样速度慢/- switch(ADC) /选择当前设置哪个ADC

8、。 case 0 : /如果选择设置ADC0 SD16CCTL =(unsigned int *)&SD16CCTL0; /指针指向ADC0控制寄存器 SD16INCTL=(unsigned int *)&SD16INCTL0;/指针指向ADC0输入寄存器 break; case 1 : /如果选择设置ADC1 SD16CCTL =(unsigned int *)&SD16CCTL1; /指针指向ADC1控制寄存器 SD16INCTL=(unsigned int *)&SD16INCTL1;/指针指向ADC1输入寄存器 break; case 2 : /如果选择

9、设置ADC2 SD16CCTL =(unsigned int *)&SD16CCTL2; /指针指向ADC2控制寄存器 SD16INCTL=(unsigned int *)&SD16INCTL2;/指针指向ADC2输入寄存器 break; default: return(0); /选择了不存在的ADC,返回错误标志 /- if(Channel<=7) /设置ADCx的输入通道号 *SD16INCTL &= (BIT0+BIT1+BIT2); /清除上一次设置 *SD16INCTL |=Channel; /设置新的通道号 else return(0); /选择了不存

10、在的通道,返回错误标志 /- if (Sign='S')|(Sign='s') *SD16CCTL |= SD16DF; /有符号(双极性) else if (Sign='U')|(Sign='u') *SD16CCTL &=SD16DF; /无符号(单极性) else return(0); /设置了不存在的参数,返回错误标志/- *SD16INCTL&=(SD16GAIN0+SD16GAIN1+SD16GAIN2);/清除上一次设置的增益 switch(Gain) /根据参数设置新的增益 case 1 : *SD

11、16INCTL|=SD16GAIN_1; break; /1倍 case 2 : *SD16INCTL|=SD16GAIN_2; break; /2倍 case 4 : *SD16INCTL|=SD16GAIN_4; break; /4倍 case 8 : *SD16INCTL|=SD16GAIN_8; break; /8倍 case 16: *SD16INCTL|=SD16GAIN_16;break; /16倍 case 32: *SD16INCTL|=SD16GAIN_32;break; /32倍 default: return(0); /设置了不存在的增益,返回错误标志 /- retur

12、n(1); /设置成功,返回1/* 名 称:ADC16_Sample()* 功 能:单个ADC采样函数。* 入口参数:ADC: 选择当前采样用的ADC(03): 0=ADC0 1=ADC1 2=ADC2 AverageNum:采样平均次数(165535) 设为1即为单次采样。* 出口参数:平均采样值。* 说 明: 返回值是无符号数,如果ADC设置成有符号模式,返回值需强整成有符 号数。或赋给int型变量。* 范 例: val=ADC16_Sample(0,30); 返回ADC0连续采样30次的平均值,赋给val val=ADC16_Sample(1,1) ; 返回ADC1单次采样值,赋给val

13、*/unsigned int ADC16_Sample(char ADC,unsigned int AverageNum)unsigned long int ADC_SumU=0;/无符号模式的累加值 signed long int ADC_SumS=0;/有符号模式的累加值 unsigned int *SD16CCTL; /ADCx控制寄存器选择指针 int i; if(AverageNum=0) AverageNum=1; /至少要采样1次 switch(ADC) /选择采样ADC case 0:SD16CCTL=(unsigned int *)&SD16CCTL0;break;/

14、指针指向ADC0控制寄存器 case 1:SD16CCTL=(unsigned int *)&SD16CCTL1;break;/指针指向ADC1控制寄存器 case 2:SD16CCTL=(unsigned int *)&SD16CCTL2;break;/指针指向ADC2控制寄存器 *SD16CCTL |=SD16IE; /打开选中的ADC的中断 _EINT(); /开总中断 *SD16CCTL |= SD16SC; /向选中的ADC发出"开始采样"命令 for(i=0;i<AverageNum;i+) /循环连续采样 while(ADC_Flag=0

15、) LPM0; /等待一次采样结束 ADC_Flag=0; if(*SD16CCTL&SD16DF) /如果该ADC设为有符号数据格式 ADC_SumS+=(int)ADC_ResultADC; /按有符号模式累加 else /如果该ADC设为无符号数据格式 ADC_SumU+=ADC_ResultADC; /按无符号模式累加 /采样次数达到 *SD16CCTL &= SD16SC; /向选中的ADC发出"停止采样"命令 *SD16CCTL &= SD16IE; /关闭相应ADC的中断 if(*SD16CCTL&SD16DF) return(

16、ADC_SumS/AverageNum); /有符号数据格式平均值 else return(ADC_SumU/AverageNum); /无符号数据格式平均值/* 名 称:ADC16_Sample3()* 功 能:三个ADC同时采样函数。* 入口参数:Result0: ADC0采样结果存放地址 Result1: ADC1采样结果存放地址 Result2: ADC2采样结果存放地址 AverageNum:采样平均次数(165535) 设为1即为单次采样。* 出口参数:无。* 范 例: ADC16_Sample3(&a,&b,&c,30); 3个ADC同时采样30次,采样结

17、果的平均值 存于a,b,c三个unsigned int型变量内。ADC16_Sample3(unsigned int*)&a,(unsigned int*)&b,(unsigned int*)&c,10); 3个 ADC同时采样10次,采样结果的平均值存于a,b,c三个int型变量内。*/void ADC16_Sample3(unsigned int *Result0,unsigned int *Result1, unsigned int *Result2,unsigned int AverageNum) unsigned long int ADC_SumU3;/无符号

18、模式的累加值 signed long int ADC_SumS3; /有符号模式的累加值 int i; if(AverageNum=0) AverageNum=1; /至少要采样1次 for(i=0;i<3;i+)ADC_SumUi=0;ADC_SumSi=0;/累加值清零 SD16CCTL0 |=SD16GRP; /ADC0编组 SD16CCTL1 |=SD16GRP; /ADC1编组 /ADC0/1/2已经被编为同一组,对ADC2的操作将同时作用于ADC0与ADC1 SD16CCTL2 |=SD16IE; /开启ADC2中断 GRP_Flag=1; /设置同时采样模式标志(中断内判断

19、用) _EINT(); /开总中断 SD16CCTL2 |= SD16SC; /向ADC0/1/2同时发出"开始采样"命令 for(i=0;i<AverageNum;i+) /循环连续采样 while(ADC_Flag=0) LPM0; /等待一次采样结束 ADC_Flag=0; if(SD16CCTL0&SD16DF) ADC_SumS0+=(int)ADC_Result0; /按有符号模式累加 else ADC_SumU0+=ADC_Result0; /按无符号模式累加 if(SD16CCTL1&SD16DF) ADC_SumS1+=(int)AD

20、C_Result1; /按有符号模式累加 else ADC_SumU1+=ADC_Result1; /按无符号模式累加 if(SD16CCTL2&SD16DF) ADC_SumS2+=(int)ADC_Result2; /按有符号模式累加 else ADC_SumU2+=ADC_Result2; /按无符号模式累加 /采样次数达到 SD16CCTL2 &= SD16SC; /向ADC0/1/2同时发出"停止采样"命令 SD16CCTL0 &= SD16GRP; /解除ADC0编组 SD16CCTL1 &= SD16GRP; /解除ADC1编组

21、 SD16CCTL2 &= SD16IE; /关闭ADC2中断 GRP_Flag=0; /清除同时采样模式标志(中断内判断用) if(SD16CCTL0&SD16DF) *Result0=ADC_SumS0/AverageNum; /有符号数据格式平均值 else *Result0=ADC_SumU0/AverageNum; /无符号数据格式平均值 if(SD16CCTL1&SD16DF) *Result1=ADC_SumS1/AverageNum; /有符号数据格式平均值 else *Result1=ADC_SumU1/AverageNum; /无符号数据格式平均值

22、if(SD16CCTL2&SD16DF) *Result2=ADC_SumS2/AverageNum; /有符号数据格式平均值 else *Result2=ADC_SumU2/AverageNum; /无符号数据格式平均值 /* 名 称:SD16ISR() ADC采样结束产生的中断* 功 能:保存ADC采样结果,并唤醒CPU。* 入口参数:无* 出口参数:无*/#pragma vector=SD16_VECTOR_interrupt void SD16ISR(void) switch (SD16IV) /判断中断类型 case 2: / SD16MEM Overflow break;

23、case 4: / ADC0 采样结束 ADC_Result0=SD16MEM0;break; / 保存ADC0采样结果 case 6: / ADC1 采样结束 ADC_Result1=SD16MEM1;break; / 保存ADC1采样结果 case 8: / ADC2 采样结束 if(GRP_Flag) / 若在同时采样模式下 ADC_Result0=SD16MEM0; ADC_Result1=SD16MEM1; /保存3个ADC的采样结果 ADC_Result2=SD16MEM2; else ADC_Result2=SD16MEM2; /普通模式下,保存ADC2采样结果 break; A

24、DC_Flag=1; /ADC中断已执行标志 _low_power_mode_off_on_exit(); /唤醒CPU/* 名 称:ADC16_VrefOn() * 功 能:打开内部基准源,并对外输出* 入口参数:无* 出口参数:无* 说 明: 打开基准源会增加250uA左右耗电,所以ADC采样结束之后要及时关闭。 如果采用外部基准,请关闭内部基准以免冲突。 基准开启后,需要2ms左右的时间稳定,应略延迟再启动ADC采样。*/void ADC16_VrefOn() SD16CTL |= (SD16REFON+SD16VMIDON); /开启内部基准源,开启输出缓冲器/* 名 称:ADC16_

25、VrefOff() * 功 能:关闭内部基准源* 入口参数:无* 出口参数:无*/void ADC16_VrefOff() SD16CTL &= (SD16REFON+SD16VMIDON); /开启内部基准源,开启输出缓冲器/* 名 称:Analog_On() * 功 能:向外部模拟电路供电(P2.2输出高电平)* 入口参数:无* 出口参数:无* 说 明: 如果单片机测控系统设计中含有模拟电路,将带来额外的连续耗电。为了 降低功耗,42X系列单片机管脚排列在ADC附近安排了一个IO口:P2.2,方便 用它来控制模拟部分的电源。采样间隙关闭模拟部分以节省电流。如果模 拟部分耗电<

26、5mA,可以直接用P2.2口供电。也可用P2.2控制模拟部分的电 源开关,获得更大驱动能力。*/void Analog_On() P2DIR|=BIT2; P2OUT|=BIT2;/* 名 称:Analog_Off() * 功 能:关闭外部模拟电路的供电(P2.2输出低电平)* 入口参数:无* 出口参数:无*/void Analog_Off() P2DIR|=BIT2; P2OUT&=BIT2;BasicTimer.hextern char BT_Init(int Div_Sec);extern void Cpu_SleepDelay(int BT_Time);extern void

27、Cpu_SleepWaitBT();BasicTimer.c/* MSP430F4XX系列BasicTimer定时器通用程序库 说明:该程序库包含了BasiTimer(基础定时器)常用的功能,如设置溢出频率、 休眠延时等,可以作为各种程序的底层驱动使用。 要使用该库函数,需要将本文件(BasiTimer.c)添加进工程,并在 需要调用显示函数的文件开头处包含"BasiTimer.h" (C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/02 */ MSP430F4XX/ +-+ / | |/ | XOUT|-/ | | 32.768KHz Watch

28、 Crystal/ | XIN|-/ | |/ +-+#include "msp430x42x.h" /*单片机寄存器头文件*/char BT_Flag=0;/* 名 称:BT_Init()* 功 能:对BasicTimer进行初始化设置* 入口参数:Div_Sec: 定时器每秒产生中断次数。* 出口参数:无* 说 明: 如需使用后面的函数,在主循环之前必须先调用该初始化函数*/char BT_Init(int Div_Sec) switch(Div_Sec) case 20: BTCTL = BTDIV+BT_fCLK2_DIV256;break; / 2s BT Int

29、 case 1: BTCTL = BTDIV+BT_fCLK2_DIV128;break; / 1s BT Int case 2: BTCTL = BTDIV+BT_fCLK2_DIV64;break; / 1/2s BT Int case 4: BTCTL = BTDIV+BT_fCLK2_DIV32;break; / 1/4s BT Int case 8: BTCTL = BTDIV+BT_fCLK2_DIV16;break; / 1/8s BT Int case 16: BTCTL = BTDIV+BT_fCLK2_DIV8;break; / 1/16s BT Int case 32:

30、BTCTL = BTDIV+BT_fCLK2_DIV4;break; / 1/32s BT Int case 64: BTCTL = BTDIV+BT_fCLK2_DIV2;break; / 1/64s BT Int case 128:BTCTL = BT_fCLK2_DIV256;break; / 1/128s BT Int case 256:BTCTL = BT_fCLK2_DIV128;break; / 1/256s BT Int case 512:BTCTL = BT_fCLK2_DIV64;break; / 1/512s BT Int case 1024:BTCTL = BT_fCL

31、K2_DIV32;break; / 1/1024s BT Int case 2048:BTCTL = BT_fCLK2_DIV16;break; / 1/2048s BT Int case 4096:BTCTL = BT_fCLK2_DIV8;break; / 1/4096s BT Int case 8192:BTCTL = BT_fCLK2_DIV4;break; / 1/8192s BT Int case 16384:BTCTL =BT_fCLK2_DIV2;break; / 1/16384s BT Int default : return(0); IE2 |= BTIE; / Enabl

32、e Basic Timer interrupt _EINT(); return(1);/* 名 称:Cpu_SleepDelay()* 功 能:靠CPU休眠实现延迟。* 入口参数:BT_Time: BasicTimer中断次数* 出口参数:无* 说 明: 需要设置BasicTimer定时器,并开启中断。该延迟函数极省电*/void Cpu_SleepDelay(int BT_Time) for(;BT_Time>0;BT_Time-) BT_Flag=0; while(BT_Flag=0) LPM3; /只有BT中断才能唤醒CPU BT_Flag=0; /* 名 称:Cpu_SleepW

33、aitBT()* 功 能:CPU休眠,等待BT中断唤醒。* 入口参数:无* 出口参数:无* 说 明: 需要设置BasicTimer定时器,并开启中断。该函数极省电*/void Cpu_SleepWaitBT() BT_Flag=0; while(BT_Flag=0) LPM3; /只有BT中断才能唤醒CPU BT_Flag=0; /* 名 称:BT_ISR()* 功 能:定时唤醒CPU。* 入口参数:无* 出口参数:无*/#pragma vector = BASICTIMER_VECTOR_interrupt void BT_ISR(void) / 1/Div_Sec 秒一次中断(由Basic

34、Timer所产生) BT_Flag=1; /* 在这里写中断服务程序,如扫描键盘等。*/ _low_power_mode_off_on_exit(); /唤醒CPULCD_Display.hextern void LCD_Init();extern void LCD_DisplayDecimal( int Number, char DOT);extern void LCD_DisplayLongDecimal(long int Number, char DOT);extern void LCD_DisplayNumber ( int Number);extern void LCD_Displa

35、yLongNumber (long int Number);extern void LCD_DisplayChar (char ch,char Location);extern void LCD_InsertChar(char ch);extern void LCD_ON();extern void LCD_OFF();extern void LCD_Clear();#define AA 10#define BB AA+1#define CC BB+1#define DD CC+1#define EE DD+1#define FF EE+1#define GG FF+1#define HH G

36、G+1#define II HH+1#define JJ II+1#define KK JJ+1#define LL KK+1#define mm LL+1#define NN mm+1#define nn NN+1#define oo nn+1#define OO oo+1#define PP OO+1#define QQ PP+1#define rr QQ+1#define SS rr+1#define tt SS+1#define TT tt+1#define UU TT+1#define VV UU+1#define WW VV+1#define YY WW+1#define ZZ YY+1#define BR ZZ+1 /* - */#define DT BR+1 /* ' */#define SP DT+1 /* 空白 */LCD_Display.c/* MSP430F4XX系列LCD显示通用驱动程序 说明:该驱动程序库包含了常用的LCD显示功能,如显示数字、字母等 可以作为各种程序的底层驱动使用。 要使用该库函数,需要将本文件(LCD_Display.c)添加进工程,并在 需要调用显示函数的文件开头处包含&q

温馨提示

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

评论

0/150

提交评论