📄 程序sdfsdfsdfs.txt
字号:
#include <msp430x14x.h>
#define CPU_F ((double)8000000)
#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 DQ BIT5
#define USART_DIR P3DIR
#define USART_SEL P3SEL
#define USART_IN P3IN
//#define P1IN
#define USART_OUT P3OUT
#define UTXD0 BIT4
#define URXD0 BIT5
#ifndef __DF_UART
#define __DF_UART
void UartInit();
void SendUart(int pBuffer);
#endif
char DS18B20_Reset(void);
char DS18B20_ReadByte(void);
void DS18B20_WriteByte(char dat);
int Read_Temperature(void);
void Init_CLK(void);
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0X00; //将寄存器的内容清零
BCSCTL1 = 0XC0; //XT2震荡器关闭
//LFTX1工作在高频模式
//ACLK的分频因子为1
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志(振荡器失效标志)
for (i = 0x20; i > 0; i--); //
}
while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1(振荡器失效标志存在)
BCSCTL2 = 0X00; //将寄存器的内容清零
BCSCTL2 += SELM1+SELM0; //MCLK的时钟源为LFTX1,分频因子为1
//SMCLK的时钟源默认为DCOCLK
}
void UartInit()
{
UCTL0 = 0X00; //将寄存器的内容清零
UCTL0 = CHAR+SWRST; // 8-bit character
UTCTL0 = 0X00; //将寄存器的内容清零
UTCTL0 += SSEL0; // UCLK = ACLK
UBR00 = 0x41; // 8MHz 9600
UBR10 = 0x03; // 8MHz 9600
UMCTL0 = 0x00; // 8MHz 9600 modulation
UCTL0 &= ~SWRST; //设置完毕,将控制位置0
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
IE1 |= URXIE0; // Enable USART0 RX interrupt
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
P3DIR |= 0x10; // P3.4 output direction
}
void SendUart(int pBuffer)
{
while((IFG1&UTXIFG0)==0); //查询是否发送完毕
TXBUF0=pBuffer;
}
char DS18B20_Reset(void)
//复位
{
unsigned char x=0;
P1DIR |= DQ; // 设定管脚为输出方向
P1OUT &= ~(DQ); // 将DQ管脚拉低
delay_us(480); // 延时480us
P1OUT |= DQ; // 将DQ管脚拉高
delay_us(90); // 延时60us
P1DIR &= ~(DQ); // 设定管脚为输入方向
x = (char)(P1IN & DQ); // 读取数据
delay_us(100); // 延时60us
//return(presence);//如果0则初始化成功 1则初始化失败
if(x)
{
return 0;
}
else
{
P1OUT |= DQ;
return 1;
}
}
void DS18B20_WriteByte(char dat) //写字节
{
unsigned char i = 0;
for (i=8; i>0; i--)
{
P1DIR |= DQ; // 设定管脚为输出方向
P1OUT &= ~(DQ); // 将DQ管脚拉低
delay_us(5);
//延时13us 左右
if ((dat & 0x01)== 0x01) //如果当前要写的字节为1
{
P1OUT |= DQ;
delay_us(30);
}
else
{
P1OUT &= ~(DQ);
delay_us(30);
}
delay_us(60);
dat=dat>>1; // 延时50us
P1OUT |= DQ; // 将DQ管脚拉高
}
delay_us(5); // 延时5us
}
char DS18B20_ReadByte(void) //读字节
{
int i=0;
char temp = 0;
for (i = 8;i > 0;i--)
{
temp=temp>>1;
P1DIR |= DQ; // 设定管脚为输出方向
P1OUT &= ~(DQ); // 将DQ管脚拉低
// delay_us(1);//延时1us
// P1OUT |= DQ; // 将DQ管脚拉高
delay_us(1); // 延时5us
P1DIR &= ~(DQ); // 设定管脚为输入方向
// presence = (char)(P1IN & DQ); // 读取数据
if((char)(P1IN&DQ)==0)
{
temp=temp&0x7F;
}
else
{
temp=temp|0x80;
}
delay_us(60);//延时40us
}
return temp;
}
int Read_Temperature(void) //读取温度值
{
int temperature = 0;
int temper = 0;
unsigned char temp_low = 0;
unsigned char temp_high = 0;
if(DS18B20_Reset())
{
DS18B20_WriteByte(0xCC); //跳过读序列号的操作 //单片跳过rom编码
DS18B20_WriteByte(0x7F); //9(12)位
DS18B20_Reset();
DS18B20_WriteByte(0xCC); //跳过读序列号的操作 //单片跳过rom编码
DS18B20_WriteByte(0x44); //启动温度转换
delay_ms(1000) ; //根据转换时间延时1s以上
DS18B20_Reset();
DS18B20_WriteByte(0xCC); //单片跳过rom编码
DS18B20_WriteByte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
temp_low=DS18B20_ReadByte();
temp_high=DS18B20_ReadByte();
if(temp_low == 0xFF)//((temp_high == 0xFF) && (temp_low == 0xFF))
{
return(99);
}
else
{
temperature = (temp_high & 0x0F);
temperature <<=8;
temperature |= temp_low;
temper = temperature * 0.0625;
return(temper);
}
}
else
{
return(99);
}
}
void main()
{
int tempsample;
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
Init_CLK(); //初始化时钟
P1DIR |= DQ;
UartInit(); //初始化串口0
while(1)
{
tempsample=Read_Temperature();
SendUart(tempsample);
delay_ms(1000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -