📄 main.c
字号:
#include "config.h"
#include "string.h"
#include <stdio.h>
#define DQPin (1<<2) //P0.2
#define PullUpDQ(void) {IO0DIR |= DQPin;IO0SET |= DQPin;}
#define PullDownDQ() {IO0DIR |= DQPin;IO0CLR |= DQPin;}
#define DQdirIN() IO0DIR &= (~DQPin)
#define UART_BAUD 115200
unsigned char tempL,tempH;
//串口初始化程序
void UARTInit(void)
{
uint16 uiFdiv;
PINSEL0=PINSEL0&(~0X0F);
PINSEL0=PINSEL0|0X05;
U0LCR = 0x83; /*允许设置波特率 字符长度为8*/
uiFdiv = (Fpclk/16)/UART_BAUD; /*设定波特率*/
U0DLM = uiFdiv/256;
U0DLL = uiFdiv%256;
U0LCR = 0x03; /*锁定波特率*/
}
//向串口发送字节
void UART0SendByte(char uiDat)
{
U0THR=uiDat;
while((U0LSR&0x40)==0);
}
//向串口发送字符串
void UART0SendStr(char const *uiStr)
{
while(1)
{
if(*uiStr=='\0')break;
UART0SendByte(*uiStr++);
}
}
/**********************************************************************
*延时1us的延时程序,晶振 11.0592MHz
***********************************************************************/
void delay(uint32 uidly)
{
uint32 i;
for(;uidly>0;uidly--)
{
for(i=0;i<8;i++);
}
}
/***********************************************************************/
//读存在脉冲
uint32 get_owPin(void)
{
DQdirIN();
return(IO0PIN&00000004);
}
/***********************************************************************/
//复位,存在脉冲子程序
/***********************************************************************/
int DS18B20reset(void)
{
uint32 i,t;
i=5;
while(i--)
{
PullDownDQ();
delay(500);
DQdirIN();
delay(60);
t=!(get_owPin());
if(t)
{
PullUpDQ(void);
delay(450);
return 1;
}
delay(500);
}
return 0;
}
/***********************************************************************
**写位操作程序
************************************************************************/
void WriteBit(unsigned char val)
{ delay(10);
PullDownDQ();
if(val)
{
delay(5);
PullUpDQ();
delay(70);
}
else
{
delay(80);
DQdirIN();
}
}
/***********************************************************************
**写字节程序
***********************************************************************/
void WriteByte(unsigned char data)
{
unsigned char i=8;
unsigned char tmp;
while(i--)
{
tmp=(data&0x01)>0;
WriteBit(tmp);
data=data>>1;
}
}
/***********************************************************************
**读位程序
***********************************************************************/
unsigned char ReadBit()
{
unsigned char temp;
PullDownDQ();
delay(5);
DQdirIN();
delay(15);
temp=(get_owPin());
// PullUpDQ();
delay(60);
return temp;
}
/***********************************************************************
**读字节程序
***********************************************************************/
unsigned char ReadByte()
{
unsigned char Rdata=0;
unsigned char i=8;
while(i--)
{
Rdata=Rdata>>1;
if (ReadBit())
Rdata=Rdata|0x80;
}
return Rdata;
}
/***********************************************************************
**读温度函数
***********************************************************************/
unsigned char gettempreture()
{
unsigned int temp;
if(DS18B20reset())
{
WriteByte(0xcc);
WriteByte(0x44);
delay(10);
while(ReadByte()==0xff);
DS18B20reset();
delay(10);
WriteByte(0xcc);
WriteByte(0xbe);
tempL=ReadByte();
tempH=ReadByte();
temp=( ((unsigned int)tempH<<8) + (unsigned int)tempL )/16;
DS18B20reset();
}
return temp;
}
/***********************************************************************
**主函数
***********************************************************************/
int main (void)
{
char uiBuf[20];
unsigned char tempreture;
PINSEL0=0x00000000;
PINSEL1=0x00000000;
UARTInit();
while(1)
{
delay(100000);
tempreture=gettempreture();
sprintf(uiBuf,"%d 摄氏度 ",tempreture);
UART0SendStr(uiBuf);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -