| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4435 人关注过本帖
标题:您们看看这程序对不对?还请各位指教
只看楼主 加入收藏
Michael_Lu
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-6-7
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
您们看看这程序对不对?还请各位指教
我做一个智能风扇,用了51,ds18b20,但是这个程序总达不到我的理想效果,还请各位指教


#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit IN1=P2^1;
sbit IN2=P2^2;
sbit ds=P2^0;
uint temp;              //定义整形温度数据
float f_temp;           //定义浮点型的温度数据
uint warn_11=250;       //定义温度下限制  是温度乘以10后的结果
uint warn_12=50;       //定义温度下限值
uint warn_h1=500;       //定义温度上限值
uint warn_h2=750;       //定义温度上限值
uchar t;


void delay (uint z)     //延时函数
{
    uint x,y;
    for (x=z;x>0;x--)
        for (y=110;y>0;y--);
}


void dsreset (void)     //DS18B20复位,初始化函数
{
    uint i;
    ds=0;
    i=103;
    while (i>0)i--;
    ds=1;
    i=4;
    while (i>0)i--;
}


bit tempreadbit (void)  //读一位数据函数
{
    uint i;
    bit dat;
    ds=0;i++;           //i++起延时作用
    ds=1;i++;i++;
    dat=ds;
    i=8;while(i>0)i--;
    return (dat);
}


uchar tempread (void)    //读一个字节数据函数
{
    uchar i,j,dat;
    dat=0;
    for (i=1;i<=8;i++)
    {
        j=tempreadbit();
        dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
    }
    return(dat);
}


void tempwritebyte (uchar dat)   //向DS18B20写一个字节数据函数
{
    uint i;
    uchar j;
    bit testb;
    for (j=1;j<=8;j++)
    {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)               //写1
        {
            ds=0;
            i++;i++;
            ds=1;
            i=8;while(i>0)i--;
        }
        else
        {
            ds=0;                //写0
            i=8;while(i>0)i--;
            ds=1;
            i++;i++;
        }
    }
}


void tempchange (void)            //DS18B20 开始获取温度并转换
{
    dsreset();
    delay(1);
    tempwritebyte(0xcc);          //写跳过读ROM指令
    tempwritebyte(0x44);          //写温度转换指令
}


uint get_temp()                   //读取寄存器中存储的温度数据
{
    uchar a,b;
    dsreset();
    delay(1);
    tempwritebyte(0xcc);
    tempwritebyte(0xbe);
    a=tempread();                 //读低8位
    b=tempread();                 //读高8位
    temp=b;
    temp<<=8;                     //两个字节组合为一个字
    temp=temp|a;
    f_temp=temp*0.0625;           //温度在寄存器中为12位,分辨率为0.0625
    temp=f_temp*10+0.5;           //乘以10表示小数点后面只取 1位,加0.5是四舍五入
    f_temp=f_temp+0.05;
    return temp;                  //temp是整型
}
void deal (uint t)                  //温度处理函数
{
    if((t>warn_12)&&(t<=warn_11))  //大于5度小25
    {
        while (1)
        {
            IN1=0;
            IN2=1;
            delay (2000);
            IN1=1;
            IN2=1;
            delay (2000);
        }
    }
    else if(t<=warn_12)            //小于5度
    {
            while (1)
        {
            IN1=0;
            IN2=1;
            delay (3000);
            IN1=1;
            IN2=1;
            delay (3000);
        }
    }
    else if((t<warn_h2)&&(t>=warn_h1))        //小于75度大于50度
    {
            while (1)
        {
            IN1=0;
            IN2=1;
            delay (500);
            IN1=1;
            IN2=1;
            delay (500);
        }
    }
    else if(t>=warn_h2)                       //大于75度
    {
            IN1=0;
            IN2=1;
    }

}


void init_com(void)                           //串口初始化函数
{
    TMOD=0x20;
    PCON=0x00;
    SCON=0x50;
    TH1=0xfd;                                 //波特率9600
    TL1=0xfd;
    TR1=1;
}
void comm (char *parr)                        //串口数据发送函数
{
    do
    {
        SBUF=*parr++;                         //发送数据
        while (!TI);                          //等待发送完成标志为1
        TI=0;                                 //标志清零
    }
    while(*parr);                             //保持循环直到字符为'\0'
}
void main ()                                  //主函数
{
    uchar buff[4],i;

    init_com();
    while(1)
    {
        tempchange();                          //温度转换函数
        
        deal(temp);                            //进行温度处理
        sprintf(buff,"%f",f_temp);             //将 浮点型温度格式 化为字符型
        
        comm(buff);                            //串口发送数据
        
    }
}
      
搜索更多相关主题的帖子: include 智能 
2013-06-07 16:39
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:7 
/

DO IT YOURSELF !
2013-06-07 17:47
S311070111
Rank: 2
等 级:论坛游民
帖 子:18
专家分:33
注 册:2013-6-13
收藏
得分:7 
前一个贴子也是你发的吧,感觉程序变多了
2013-06-13 23:13
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:7 
你想要什么效果,另外DS18B20已经很常见了,网上很多类似的代码,结合你的硬件改一下IO口就可以了。

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-06-15 07:47
快速回复:您们看看这程序对不对?还请各位指教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025583 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved