基于msp430温度数码管显示.docx
./*程序功能:用DS18B20 测量室温并在数码管上显示。-测试说明:观察显示温度数值。*/#include <msp430x14x.h>#include "DS18B20.h"#include "DS18B20.c"#define wei_h P5OUT|= BIT5#define wei_l P5OUT&= BIT5#define duan_lP6OUT &= BIT6#define duan_hP6OUT |= BIT6/要显示的6 位温度数字uchar dN6;/数码管七段码;0-fuchar scandata16 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/数码管位选变量uchar cnt = 0;void Disp_Numb(uint temper);/*主函数 */void main(void)/* 下面六行程序关闭所有的IO 口 */P5DIR = 0xff;P5OUT = 0xff;P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0XFF;uchar i;WDTCTL=WDTPW+WDTHOLD;/*- 选择系统主时钟为8MHz-*/BCSCTL1 &= XT2OFF;/ 打开 XT2 高频晶体振荡器doIFG1 &= OFIFG;/ 清除晶振失败标志.for (i = 0xFF; i > 0; i-);/等待 8MHz 晶体起振while (IFG1 & OFIFG);/晶振失效标志仍然存在?BCSCTL2 |= SELM_2 + SELS;/MCLK和 SMCLK选择高频晶振P6DIR |= BIT6;P6OUT |= BIT6;/ 关闭电平转换P5DIR |= BIT5;P5OUT |= BIT5;/关闭电平转换P6DIR |= BIT7;P6OUT |= BIT7; /关闭蜂鸣器/ 设置看门狗定时器,初始化控制数码管的IOWDTCTL = WDT_ADLY_1_9;IE1 |= WDTIE;/ P4DIR = 0xff;/ P5DIR = 0xFF;/ P5OUT = 0xff; /P4OUT = 0xff; /P6DIR = 0xff; /P6OUT = 0xFF;/计数时钟选择SMLK=8MHz , 1/8 分频后为1MHzTACTL |= TASSEL_2 + ID_3;/打开全局中断_EINT();/循环读数显示while(1)Disp_Numb(Do1Convert();/ 不停地转换显示/*函数名称: watchdog_timer功能:看门狗定时器中断服务函数,进行数码管动态扫描参数:无返回值:无*/#pragma vector = WDT_VECTOR_interrupt void watchdog_timer(void)/ P4OUT = 0xFF;/ wei_h;/ wei_l;P4OUT = scandatadN5-cnt;.if(cnt=1) P4OUT |= BIT7;/ 在第二位显示小数点duan_h;duan_l;P4OUT = (1<<cnt);wei_h;wei_l;cnt+;if(cnt = 6) cnt = 0;/*函数名称: Disp_Numb功能:将从DS18B20 读取的 11bit 温度数据转换成数码管显示的温度数字参数: temper-11bit 温度数据返回值:无*/void Disp_Numb(uint temper)uchar i;for(i = 0;i < 6;i+) dNi = 0; /初始化显示变量/数值转换if(temper & BIT0)dN0 = 5;dN1 = 2;dN2 = 6;if(temper&BIT1)dN1 += 5;dN2 += 2;dN3 += 1;if(temper & BIT2)dN2 += 5;dN3 += 2;if(dN2 >= 10)dN2 -= 10;.dN3 += 1;if(temper&BIT3)dN3 += 5;if(temper & BIT4)dN4 += 1;if(temper & BIT5)dN4 += 2;if(temper & BIT6)dN4 += 4;if(temper & BIT7)dN4 += 8;if(dN4 >= 10)dN4 -= 10;dN5 += 1;if(temper & BIT8)dN4 += 6;dN5 += 1;if(dN4 >= 10)dN4 -= 10;dN5 += 1;if(temper & BIT9)dN4 += 2;dN5 += 3;if(dN4 >= 10).dN4 -= 10;dN5 += 1;if(temper & BITA)dN4 += 4;dN5 += 6;if(dN4 >= 10)dN4 -= 10;dN5 += 1;if(dN5 >= 10)dN5 -= 10;/ /*18b20.C*/ #include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned intuint;#define DQ1 P1OUT |= BIT6#define DQ0 P1OUT &= BIT6#define DQ_inP1DIR &= BIT6#define DQ_outP1DIR |= BIT6#define DQ_val(P1IN & BIT6)/*函数名称: DelayNus功能:实现 N 个微秒的延时参数: n- 延时长度返回值:无说明:定时器 A 的计数时钟是1MHz ,CPU 主频 8MHz所以通过定时器延时能够得到极为精确的us 级延时*/void DelayNus(uint n)CCR0 = n;.TACTL |= MC_1;/ 增计数到CCR0while(!(TACTL & BIT0);/ 等待TACTL &= MC_1;/ 停止计数TACTL &= BIT0;/ 清除中断标志/*函数名称: Init_18B20功能:对 DS18B20 进行复位操作参数:无返回值:初始化状态标志:1- 失败, 0-成功*/uchar Init_18B20(void)uchar Error;DQ_out;/ 拉高_DINT();/ 关闭中断DQ0;/ 拉低DelayNus(500);DQ1;/ 拉高DelayNus(55);DQ_in;/ 方向设置输入_NOP();if(DQ_val)/输入值为1Error = 1;/初始化失败else/输入值为0Error = 0;/初始化成功DQ_out;/ 设为输出DQ1;/拉高_EINT();/ 中断使能DelayNus(400);return Error;/*函数名称: Write_18B20功能:向 DS18B20 写入一个字节的数据参数: wdata-写入的数据返回值:无.*/void Write_18B20(uchar wdata)uchar i;_DINT();for(i = 0; i < 8;i+)DQ0;DelayNus(6);/ 延时 6usif(wdata & 0X01)DQ1;elseDQ0;wdata >>= 1;DelayNus(50);/ 延时 50usDQ1;DelayNus(10);/ 延时 10us_EINT();/*函数名称: Read_18B20功能:从 DS18B20 读取一个字节的数据参数:无返回值:读出的一个字节数据*/uchar Read_18B20(void)uchar i;uchar temp = 0;_DINT();for(i = 0;i < 8;i+)temp >>= 1;DQ0;DelayNus(6);/ 延时 6usDQ1;DelayNus(8);/ 延时 9usDQ_in;_NOP();if(DQ_val)temp |= 0x80;DelayNus(45);/ 延时 45usDQ_out;DQ1;.DelayNus(10);/ 延时 10us_EINT();returntemp;/读到的一个字节/*函数名称: Skip功能:发送跳过读取产品ID 号命令参数:无返回值:无*/void Skip(void)Write_18B20(0xcc);/*函数名称: Convert功能:发送温度转换命令参数:无返回值:无*/void Convert(void)Write_18B20(0x44);/*函数名称: Read_SP功能:发送读ScratchPad命令参数:无返回值:无*/void Read_SP(void)Write_18B20(0xbe);/*函数名称: ReadTemp功能:从 DS18B20 的 ScratchPad 读取温度转换结果参数:无返回值:读取的温度数值*/uint ReadTemp(void).uchar temp_low;uinttemp;temp_low = Read_18B20();/ 读低位temp = Read_18B20();/ 读高位temp = (temp<<8) | temp_low;returntemp;/读取的温度数值/*函数名称: ReadTemp功能:控制DS18B20 完成一次温度转换参数:无返回值:测量的温度数值*/uint Do1Convert(void)uchar i;doi = Init_18B20();while(i);/初始化是否完成Skip();/ 送跳过读取产品ID 号命令Convert();/发送温度转换命令for(i = 20;i > 0;i-)DelayNus(60000); / 延时 800ms 以上doi = Init_18B20();while(i);Skip();Read_SP();/ 发送读 ScratchPad 命令return ReadTemp();/ 读取的温度数值/*/*18b20.h*/void DelayNus(unsigned int n);unsigned char Init_18B20(void);void Write_18B20(unsigned char wdata);.unsigned char Read_18B20(void);void Skip(void);void Convert(void);void Read_SP(void);unsigned int ReadTemp(void);unsigned int Do1Convert(void);.