1、基于基于MSP430上温度传上温度传感器的设计感器的设计第五组第五组第五组成员组长:申琪组长:申琪组员:李明扬组员:李明扬 付涛涛付涛涛 郑珍迪郑珍迪 熊宇龙熊宇龙温度传感器介绍 图2 DS18B20的引脚 1.GND:地 2.DQ:数字输入输出 3.VDD:可选的+5V电源DSl8B20 数字温度计提供9位(二进制)温度读数指示器件的温度信息经过单线接口送 入 DSl8B20 或从 DSl8B20 送出因此从主机 CPU 到 DSl8B20 仅需一条线(和地线)DSl8B20 的电源可以由数据线本身提供而不需要外部电源因为每一个 DSl8B20 在出厂时已经给定了唯一的序号因此任意多个 DS
2、l8B20 可以存放在同一条单线总线上这允许在许多不同的地方放置温度敏感器件 DSl8B20的测量范围从-55到+125增量值为 0.5可在 l s(典型值)内把温度变换成数字。每个DSl8B20包括一个唯一的64位长的序号,该序号值存放在 DSl8B20 内部的 ROM(只读存贮器)中开始8 位是产品类型编码(DSl8B20 编码均为 10H)接着的 48位是每个器件唯一的序号最后8位是前面56位的CRC(循环冗余校验)码DSl8B20中还有用于贮存测得的温度值的两个8位存贮器 RAM 编号为0号和号1号存贮器存放温度值的符号如果温度为负()则1号存贮器8位全为1否则全为0。0号存贮器用于存
3、放温度值的补码LSB(最低位)的1表示0.5将存贮器中的二进制数求补再转换成十进制数并除以2就得到被测温度(-550125)DSl820 的引脚如图 2所示。每只 D518B20 都可以设置成两种供电方式,即数据总线供电方式和外部供电方式 采取数据总线供电方式可以节省一根导线。但完成温度测量的时间较长采取外部供电方式则多用一根导线但测量速度较快。温度传感器与单片机的连接 温度传感器的单总线(1-Wire)与单片机的P20连接,P20是单片机的高位地址线A8。P2端口是一个带内部上拉电阻的8位双向IO,其输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对该端口写“1”,可通过内部上拉电阻
4、将其端口拉至高电平,此时可作为输入口使用,这是因为内部存在上拉电阻,某一引脚被外部信号拉低时会输出一个电流。在访问外部程序存储器或16位地址的外部数据存储器时。如执行MOVX DPTR指令,则表示P2端口送出高8位的地址数据。在访问8位地址的外部数据存储器时,可执行MOVX RI指令,P2端口内容即为特殊功能寄存器(SFR)区中R2寄存器内容,整个访问期间不改变。在Flash编程和程序校验时,P2端口也接收高位地址和其他控制信号。仿真与实物图程序代码DS18B20 温度测量实验/功能:在数码管上显示当前DS18B20 测到的温度/小数部分为4 位,温度为负时,最高位显示-/测量范围:-55 +
5、125#include msp430 x14x.h#define uint unsigned int#define uchar unsigned char#define DQ_OUT P1DIR|=BIT0#define DQ_IN P1DIR&=BIT0#define DQ_LOW P1OUT&=BIT0#define DQ_HIGH P1OUT|=BIT0#define DQ_DATA P1IN&BIT0/共阳数码管编码表uint Code18=0 x3f,0 x06,0 x5b,0 xB4f,/0,1,2,30 x66,0 x6d,0 x7d,0 x07,/4,5,6,70 x7f,0
6、x6f,0 x77,0 x7c,/8,9,A,b0 x39,0 x5e,0 x79,0 x71,/C,d,E,F0 x40,0 x00;/-,全灭uchar Bit4=0,0,0,17;/数码管各位显示的数字uchar BitCode=0 x0e,0 x0d,0 x0b,0 x07;/数码管位码初值/uchar wei=0 x01,0 x02,0 x04,0 x08;uint j=0;uint l=0;uchar MSB;/温度高字节uchar LSB;/温度低字节int t1=0;/温度整数部分数值float t2=0;/温度小数部分数值uchar flag;/负温度标志/时钟初始化函数vo
7、id InitClock(void)BCSCTL1=RSEL2+RSEL1+RSEL0;/XT2 开启 LFXT1 工作在低频模式 ACLK/不分频 最高的标称频率DCOCTL=DCO2+DCO1+DCO0;/DCO 为最高频率doIFG1&=OFIFG;/清除振荡器失效标志for(uint i=255;i0;i-);while(IFG1&OFIFG);/判断XT2 是否起振BCSCTL2=SELM1+SELS;/MCLK SMCLK 时钟源为TX2CLK 不分频/端口初始化函数void InitPort(void)P2SEL=0 x00;/P2 口所有引脚设置为一般的IO 口P4SEL=0
8、x00;/P4 口所有引脚设置为一般的IO 口P2DIR=0 xFF;/P2 口所有引脚设置为输出方向P4DIR=0 xFF;/P4 口所有引脚设置为输出方向P2OUT=0 x00;/P2 口先输出低电平P4OUT=0 x0E;/P4 口先输出低电平/P5SEL&=BIT7;/P5.设7置为一般的IO 口/P5DIR|=BIT7;/P5.7 设置为输出方向/P5OUT&=BIT7;/P5.7 输出低电平来使能74HC573 来驱动数码管/ms 级延时子程序void DelayMs(uint ms)while(ms-)for(uint i=0;i800;i+);/数码管扫描显示程序void Di
9、splay(void)for(uchar i=0;i=1;/位码右移一位/if(BitCode=0 x00)BitCode=0 x0e;DelayMs(3);/延时1msP2OUT=0 x00;/10us 级延时子程序void Delayus(uint us)while(us-)_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP()
10、;_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP(
11、);_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP
12、();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();/初始化DS18B20void DS18B20Init(void)DQ_OUT;/设置为输出方向DQ_LOW;/拉低总线Delayus(50);DQ_HIGH;/释放总线Delayus(6);DQ_IN;/设置为输入方向elseDQ_LOW;Delayus(5);DQ_HIGH;/温度计算程序void GetT()if(MSB&0 xF0)0)/判断是否为负温度flag=1;elseflag=0;if(flag)/如果为负温度取反加1M
13、SB=MSB;LSB=LSB+1;t1=MSB4);t2=(LSB&0 x0F)*0.0625*10000;/得到温度小数部分并扩大10000 倍/计算各位数码管要显示的数值if(flag)Bit1=16;/如果为负温度则显示-elseBit1=t1/100;Bit2=t1%100/10;Bit3=t1%10;/Bit4=t2/1000;/Bit5=t2%1000/100;/Bit6=t2%100/10;/Bit7=t2%10;while(DQ_DATA);/等待应答信号while(DQ_DATA);/等待释放总线/读一个字节uchar ReadByte(void)uchar i;uchar
14、ReadData=0;for(i=0;i=1;DQ_HIGH;Delayus(1);DQ_IN;if(DQ_DATA)ReadData|=0 x80;Delayus(6);return ReadData;/写一个字节void WriteByte(uchar WriteData)uchar i;uchar tmpData;for(i=0;i=1;DQ_OUT;DQ_LOW;if(tmpData)DQ_HIGH;void main()WDTCTL=WDTPW+WDTHOLD;/关闭看门狗InitClock();InitPort();_DINT();/关闭中断/j=0;l=0;while(1)DS1
15、8B20Init();WriteByte(0 xCC);/跳过ROM 配置WriteByte(0 x44);/启动温度转换DS18B20Init();WriteByte(0 xCC);WriteByte(0 xBE);/读温度寄存器LSB=ReadByte();/读温度数据低字节MSB=ReadByte();/读温度数据高字节GetT();/计算温度Display();实验总结 要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机有哪些资源;要有一个清晰的思路和一个完整的软件流程图;在设计程序时,不能妄想一次将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,这样为资料的保留和交流提供了方便;在设计中遇到的问题要记录,以免下次遇到同样的问题。在这次的课程设计中,我真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单片机更是如此,程序只有在经常写与读的过程中才能提高,这就是这次课程设计的最大收获。谢谢观赏