MSP430单片机课程设计 - 图文 下载本文

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

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

#define DQ_CLR P1OUT &= ~BIT6 //置低电平 #define DQ_SET P1OUT |= BIT6 //置高电平 #define DQ_R P1IN & BIT6 //读电平

#define wei_h P5OUT |=BIT5 //置高电平 #define wei_l P5OUT &=~BIT5 //置低电平 #define duan_h P6OUT |=BIT6 //置高电平 #define duan_l P6OUT &=~BIT6 //置低电平 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; //P4口初始设置为FF P6DIR = 0xFF; }

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

// 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);