这个代码的时序调整的比较好,抗干扰能力强
晶振24Mhz
针对ds18b20时序的问题,完美解决,什么单片机都可以参考以下程序,每一部分的延时都很明确
#include <STC15F2K60S2.H>
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 24000000L //系统频率
#define BAUD 9600 //串口波特率
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验
#define PARITYBIT EVEN_PARITY //定义校验位
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
sbit DQ = P4^2;
//********************
bit new_data;
//*******************
bit busy;
void SendData(BYTE dat);
void SendString(char *s);
//---------函数声明-------------------------------------------------
u16 get_temp();//获取温度值
void start_temp();//启动温度转换
void DS18b20_reset();//18B20初始化
void write_byte(u8 num);//向18B20写数据
u8 read_byte();//向18B20读数据
void delay_ms(u8 ms);
void Delay600us() ; //@24.000MHz
void Delay70us(); //@24.000MHz
void Delay64us(); //@24.000MHz
void Delay60us(); //@24.000MHz
void Delay30us(); //@24.000MHz
void Delay24us(); //@24.000MHz
void Delay14us(); //@24.000MHz
void Delay10us(); //@24.000MHz
void Delay9us(); //@24.000MHz
void Delay6us(); //@24.000MHz
void Delay3us(); //@24.000MHz
void Delay2us(); //@24.000MHz
void Delay1us(); //@24.000MHz
void main()
{
unsigned int t_val;
unsigned char t_valH8,t_valL4;
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9位可变波特率,校验位初始为0
#endif
T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
ES = 1; //使能串口1中断
EA = 1;
//*****************
DS18b20_reset();//DS18b20初始化
晶振24Mhz
针对ds18b20时序的问题,完美解决,什么单片机都可以参考以下程序,每一部分的延时都很明确
#include <STC15F2K60S2.H>
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 24000000L //系统频率
#define BAUD 9600 //串口波特率
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验
#define PARITYBIT EVEN_PARITY //定义校验位
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
sbit DQ = P4^2;
//********************
bit new_data;
//*******************
bit busy;
void SendData(BYTE dat);
void SendString(char *s);
//---------函数声明-------------------------------------------------
u16 get_temp();//获取温度值
void start_temp();//启动温度转换
void DS18b20_reset();//18B20初始化
void write_byte(u8 num);//向18B20写数据
u8 read_byte();//向18B20读数据
void delay_ms(u8 ms);
void Delay600us() ; //@24.000MHz
void Delay70us(); //@24.000MHz
void Delay64us(); //@24.000MHz
void Delay60us(); //@24.000MHz
void Delay30us(); //@24.000MHz
void Delay24us(); //@24.000MHz
void Delay14us(); //@24.000MHz
void Delay10us(); //@24.000MHz
void Delay9us(); //@24.000MHz
void Delay6us(); //@24.000MHz
void Delay3us(); //@24.000MHz
void Delay2us(); //@24.000MHz
void Delay1us(); //@24.000MHz
void main()
{
unsigned int t_val;
unsigned char t_valH8,t_valL4;
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9位可变波特率,校验位初始为0
#endif
T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
ES = 1; //使能串口1中断
EA = 1;
//*****************
DS18b20_reset();//DS18b20初始化