搜索
bottom↓
回复: 3

发一个C8051F021的DS18b20测温示例程序

[复制链接]

出0入0汤圆

发表于 2011-3-25 23:03:36 | 显示全部楼层 |阅读模式
#include<c8051f020.h>
#include < intrins.h >
#include <absacc.h>
#include <stdio.h>

#define SYSCLK       22118400          // SYSCLK frequency in Hz


sbit DataPortDS1820=P0^4;

void SYSCLK_Init (void);
void PORT_Init (void);


void SYSCLK_Init (void)
{
           int i;                              // delay counter
           OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.118400crystal
           for (i=0; i < 256; i++) ;           // Wait for osc. to start up
           while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
           OSCICN = 0x88;                      // select external oscillator as SYSCLK
}                                      // source and enable missing clock   
void PORT_Init (void)
{
        XBR2=0x40;                     // Enable crossbar and weak pull-ups
        P0MDOUT |=0xf0;
        P1MDOUT |=0xff;
        P2MDOUT |=0x0f;                        //P2低位弱上拉
//        P3MDOUT |=0xff;
}
void Delay1us(unsigned char us)
{
        while (us)
        {
          _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
          --us;
        }
}
void Delay15us(void)  
{
        Delay1us(15);
}


void Delay10us(void)
{       
        Delay1us(10);
}

bit RstDS1820(void)  //返回0-有设备连接1-无设备连接
{
unsigned char i;
bit RstFlag;
        RstFlag=1;       
        DataPortDS1820=0;
        for (i=0;i<100/*40*/;i++)        //480us
                Delay15us();
        DataPortDS1820=1;
        for (i=0;i<4;i++)        //15us-60us
        {
                Delay15us();
        }
        for (i=0;i<16;i++)        //60us-240us
        {
                Delay15us();
                if (DataPortDS1820==0) RstFlag=0;
        }
        for (i=0;i<16;i++)        //240us
        {
                Delay15us();
        }
        return RstFlag;       
}

void WriteDS1820(unsigned char ch)
{
unsigned char i;
        DataPortDS1820=1;
        Delay1us(1);
        for (i=0;i<8;i++)
        {
                EA=0;
                DataPortDS1820=0;
                Delay15us();
                DataPortDS1820=ch&0x1;
                EA=1;
                Delay15us();Delay15us();Delay15us();
                DataPortDS1820=1;
                ch=ch>>1;
                Delay1us(1);
        }       
}

unsigned char ReadDS1820(void)
{
unsigned char i,ch;
        ch=0;
        DataPortDS1820=1;
        Delay1us(1);
        for (i=0;i<8;i++)
        {
                EA=0;
                DataPortDS1820=0;
                Delay10us();
                DataPortDS1820=1;
                Delay1us(2);
                ch=ch>>1;
                if (DataPortDS1820==1)
                {
                        ch=ch+0x80;
                }
                EA=1;
                Delay15us();Delay15us();Delay15us();
        }       
        return ch;
}
void SkipROMCode(void)
{
        RstDS1820();
        WriteDS1820(0xcc);
}
void StartADC(void)
{

        RstDS1820();                //复位
        WriteDS1820(0xcc);  //广播
        WriteDS1820(0x44);         //启动AD转换 12bit700ms
}

unsigned int GetTempValue(void)
{
unsigned char i,j;
unsigned int T;
        SkipROMCode();
        WriteDS1820(0xBE);
        i=ReadDS1820();
        j=ReadDS1820();
        StartADC();
        T=i+j*256;
        if (T==0xffff) return 0xffff;
        if (T>0x8000)
        {
                T=-T;
                return (0x8000+T*5/8);
        }
        else
                return (T*5/8);
}
void main(void)
{
        unsigned int w;
        WDTCN = 0xde;
        WDTCN = 0xad;
    SYSCLK_Init();
        PORT_Init();
//        w= GetTempValue();
        while(1)
        {
                Delay1us(100);
                w= GetTempValue();
        }
}


点击此处下载 ourdev_625495FHXCE4.txt(文件大小:3K) (原文件名:temp_display.txt)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-3-25 23:53:16 | 显示全部楼层
顶你,

出0入0汤圆

发表于 2012-6-11 10:32:26 | 显示全部楼层
  1. void Delay1us(unsigned char us)
  2. {
  3.          while (us)
  4.          {
  5.            _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  6.            --us;
  7.          }
复制代码
这个是1us吗?

出0入0汤圆

发表于 2012-6-11 20:56:53 | 显示全部楼层
程序非常好
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表