请教大侠AT89C51单片机延时问题

2019-07-16 07:14发布

哪位大侠给我讲讲AT89C51单片机延时问题,12MHZ的,用C语言编写!最好写一下DS18B20的复位,读,写程序,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
assingle
1楼-- · 2019-07-16 08:33
延时我就不多说了,可以参考下这个帖子:http://bbs.elecfans.com/jishu_179340_1_1.html,百度谷歌下
DS18B20的程序ds18b20.h
#ifndef _DS18B20_H_
#define _DS18B20_H_
bit DS18B20_INIT (void) ;
unsigned char DS18B20_R (void);
void DS18B20_W (unsigned char dat);
#endif

DS18b20.c
#include <reg51.h>
#include <intrins.h>
#include "main.h"
#include "ds18b20.h"
sbit DQ = P3 ^ 4;    //定义通信端口         
/********************************************************
DS18B20_INIT(void)
主机发送复位脉冲最少480US,DS18B20等待15~60US
返回:1:失败 0:成功
********************************************************/
bit DS18B20_INIT (void)
{
bit tmp;

DQ = 1;      //DQ复位   
_nop_ ();     //稍做延时   
DQ = 0;      //单片机将DQ拉低   
_delay_us(500); //延时 480us-960us之间   
DQ = 1;      //拉高总线   

_delay_us(60); //delay  60us
tmp = DQ;
_delay_us(240); //delay  240us
return tmp;
}
//读一个字节   
unsigned char DS18B20_R (void)
{
unsigned char i = 0;
unsigned char dat = 0;
for (i = 8; i > 0; i--)
{
  DQ = 0;     // 给脉冲信号   
  dat >>= 1;
  DQ = 1;     // 给脉冲信号   
  if (DQ)
   dat |= 0x80;
  _delay_us(60);   //延时60us
}
return (dat);
}
//写一个字节   
void DS18B20_W (unsigned char dat)
{
unsigned char i = 0;
for (i = 8; i > 0; i--)
{
  DQ = 0;
  DQ = dat & 0x01;
  _delay_us(80);   //延时80us   
  DQ = 1;
  dat >>= 1;
}
_delay_us(100);    //延时100us
}

一周热门 更多>