DS18B20--MSP430--4位数码管显示温度 联系客服

发布时间 : 星期四 文章DS18B20--MSP430--4位数码管显示温度更新完毕开始阅读444991416e85ec3a87c24028915f804d2b168795

DS18B20 MSP430 4位数码管显示温度

//实验材料:MSP430F149开发板,DS18B20一个,杜邦线15条,3元普通4位共阴极数码管一个

//由于本人没有排阻,没有采用灌电流方式给4位共阴极数码管供电,MSP430的I/O口直接接4位共阴极数码管的12个脚

//接线说明:DS18B20数据口接P17,电源接3.3V直流;P40~P47接数码管a、b、c、d、e、f、g、dp // P50~P53接位1、位2、位3,位4,数码管接线图请百度 //Made By Zhong Sir From Wuhan University #include //延时函数

#define CPU_F ((double)8000000) //外部高频晶振8MHZ

//#define CPU_F ((double)32768) //外部低频晶振32.768KHZ

#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)) //自定义数据结构

#define uchar unsigned char #define uint unsigned int #define ulong unsigned long //DS18B20控制脚,单脚控制

#define DQ_IN P1DIR &= ~BIT7 // DS18B20接单片机P17口 #define DQ_OUT P1DIR |= BIT7 //设置输出

#define DQ_CLR P1OUT &= ~BIT7 //置低电平 #define DQ_SET P1OUT |= BIT7 //置高电平 #define DQ_R P1IN & BIT7 //读电平 int temp_value;

int temp; //定义的变量,显示数据处理 int A1,A2,A3;

//*********************************************************************** // 系统时钟初始化,外部8M晶振

//*********************************************************************** void Clock_Init() {

uchar i;

BCSCTL1&=~XT2OFF; //打开XT2振荡器

BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{

IFG1&=~OFIFG; //清楚振荡器错误标志 for(i=0;i<100;i++) _NOP(); }

while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待 IFG1&=~OFIFG; }

//*********************************************************************** // MSP430内部看门狗初始化

//***********************************************************************

void WDT_Init() {

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 }

//************************************************************************* // 初始化IO口子程序

//************************************************************************* void Port_Init() {

P5DIR = 0xFF; //设置IO口方向为输出 P4DIR = 0xFF; //P2口初始设置为FF }

//************************************************************************* // DS18B20初始化

//************************************************************************* unsigned char DS18B20_Reset(void) //初始化和复位 {

unsigned char i; DQ_OUT; DQ_CLR;

delay_us(500); //延时500uS(480-960) DQ_SET; DQ_IN;

delay_us(80); //延时80uS i = DQ_R;

delay_us(500); //延时500uS(保持>480uS)

if (i) {

return 0x00; } else {

return 0x01; } }

//************************************************************************* // DS18B20读一个字节函数

//*************************************************************************

unsigned char ds1820_read_byte(void) {

unsigned char i;

unsigned char value = 0; for (i = 8; i != 0; i--) {

value >>= 1;

DQ_OUT; DQ_CLR;

delay_us(4); //*延时4uS DQ_SET; DQ_IN;

delay_us(10); //*延时10uS if (DQ_R) {

value|=0x80; }

delay_us(60); //*延时60uS }

return(value); }

//************************************************************************* // 向18B20写一个字节函数

//*************************************************************************

/*DS18B20字节写入函数*/

void ds1820_write_byte(unsigned char value) {

unsigned char i;

for (i = 8; i != 0; i--) {

DQ_OUT; DQ_CLR;

delay_us(4); //延时4uS if (value & 0x01) {

DQ_SET; }

delay_us(80); //延时80uS DQ_SET; //位结束 value >>= 1; } }

//************************************************************************* // 发送温度转换命令

//*************************************************************************

/*启动ds1820转换*/

void ds1820_start(void) {

DS18B20_Reset();

ds1820_write_byte(0xCC); //勿略地址 ds1820_write_byte(0x44); //启动转换 }

//************************************************************************* // DS8B20读取温度信息

//*************************************************************************

unsigned int ds1820_read_temp(void) {

unsigned int i;

unsigned char buf[9];

DS18B20_Reset();

ds1820_write_byte(0xCC); //勿略地址 ds1820_write_byte(0xBE); //读取温度 for (i = 0; i < 9; i++) {

buf[i] = ds1820_read_byte(); }

i = buf[1]; i <<= 8; i |= buf[0]; temp_value=i;

temp_value=(uint)(temp_value*0.625);

//不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据 return i; }

//************************************************************************* // 温度数据处理函数

//************************************************************************* void data_do(int temp_d) {

int A2t;

A1=temp_d/100; //分出百,十,和个位 A2t=temp_d0; A2=A2t/10; A3=A2t; }

//*********************************************************************** // 主程序

//*********************************************************************** void main(void) {

const unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; const unsigned char zww[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; uchar j;

WDT_Init(); //看门狗初始化 Clock_Init(); //时钟初始化

Port_Init(); //端口初始化,用于控制IO口输入或输出 DS18B20_Reset(); //复位D18B20