基于单片机的温湿度采集与控制程序(C语言)

基于单片机的温湿度采集与控制程序(C语言),第1张

给你一个DS18B20的温度采集程序!

//ICC-AVR application builder : 2009-10-25 10:43:39

// Target : M16

// Crystal: 16000Mhz

#include <iom16vh>

#include <macrosh>

#define uint unsigned int

#define uchar unsigned char

#include "xianshic"

#include "delayh"

#define CLR_DIR_1WIRE DDRD&=~BIT(4) //只要修改这里的参数就可以了

#define SET_DIR_1WIRE DDRD|=BIT(4) //里面什么都不用该!

#define CLR_OP_1WIRE PORTD&=~BIT(4)

#define SET_OP_1WIRE PORTD|=BIT(4)

#define CHECK_IP_1WIRE (PIND&0x10) //检测

unsigned char wmh,wml;

void init_1820()

{

SET_DIR_1WIRE; //设置PD4 为输出

SET_OP_1WIRE;

CLR_OP_1WIRE;

delay_nus(480); //480us以上

SET_OP_1WIRE;

CLR_DIR_1WIRE;

delay_nus(20); //15~60us

while(CHECK_IP_1WIRE);

SET_DIR_1WIRE;

SET_OP_1WIRE;

delay_nus(140); //60~240us

}

void write_1820(unsigned char x)

{

unsigned char m;

for(m=0;m<8;m++)

{

CLR_OP_1WIRE;

if(x&(1<<m)) //写数据了,先写低位的!

SET_OP_1WIRE;

else

{CLR_OP_1WIRE;}

delay_nus(40); //15~60us

SET_OP_1WIRE;

}

SET_OP_1WIRE;

}

unsigned char read_1820()

{

unsigned char temp,k,n;

temp=0;

for(n=0;n<8;n++)

{

CLR_OP_1WIRE;

SET_OP_1WIRE;

CLR_DIR_1WIRE;

k=(CHECK_IP_1WIRE); //读数据,从低位开始

if(k)

temp|=(1<<n);

else

temp&=~(1<<n);

delay_nus(50); //60~120us

SET_DIR_1WIRE;

}

return (temp);

}

unsigned int gettemp() //读取温度值

{

unsigned char temh,teml,wm0,wm1,wm2,wm3;

init_1820(); //复位18b20

write_1820(0xcc); // 发出转换命令

write_1820(0x44);

// delay_nms(800); //不延时也好使,不知道怎么回事!

init_1820();

write_1820(0xcc); //发出读命令

write_1820(0xbe);

teml=read_1820(); //读数据

temh=read_1820();

wm0=teml>>4; //只要高8位的低四位和低8位的高四位,温度范围0~99啦!

wm1=temh<<4;

wm2=wm1+wm0; //16进制转10进制

return wm2;

}

void main()

{

uint tem,ad[4],i;

port_init();

while(1)

{

tem = gettemp();

for(i=0;i<4;i++)

{

ad[3-i]=tem%10;

tem=tem/10;

}

for(i=0;i<4;i++)

{

show1(ad[i],i);

delay(5);

}

}

}

显示函数:

#include <iom16vh>

#include <macrosh>

#define uint unsigned int

#define uchar unsigned char

#pragma data:code

const uint tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}; //共阳数码管代码表

const uint tab2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00};//共阴数码管代码表

void port_init(void)

{

DDRA = 0xFF;

DDRB = 0xFF;

DDRC = 0xFF;

DDRD = 0x00;

}

void delay(uint ms)

{

uint i,j;

for(i=0;i<ms;i++)

{

for(j=0;j<1141;j++);

}

}

void show1(uchar j,uchar k)//显示函数

{

PORTB = ~BIT(k);

PORTA = tab2[j];

delay(1);

}

void show(uint ada)

{

uint i,ad[4];

for(i=0;i<4;i++)

{

ad[3-i]=ada%10;

ada = ada/10;

}

while(1)

{

for(i=0;i<4;i++)

{

show1((ad[i]),i);

delay(100);

}

}

}

程序我都调试过的,都是好的,有不会再问我。可以给分了吗?嘿嘿

我这里刚好有,不过是用的串口现实的,能正确测试温度

/

#include <reg51h>

#include <intrinsh>

sbit DQ=P1^0;

void usart_init();

void send_str(char read_data);

void delayms(unsigned char ms);

void send_char(unsigned char txd);

unsigned char readbata[8];

unsigned char readTem[4];

//

/经过测试:timer=6i+11 /

//

void delay(unsigned char i) //ds18b20的延时程序

{

while(i--);

}

unsigned char resetds() //DS18B20初始化

{

unsigned char i=0;

unsigned char flag=0;

DQ=0; //拉低总线

delay(81); //精确延时 497us

DQ=1; //释放总线

delay(20);

flag=DQ;

delay(60); //

return flag;

}

unsigned char re_one_byte()//读取一个字节的数据

{

unsigned char i=0;

unsigned char dat=0;

for(i=8;i>0;i--)

{

dat>>=1;//让从总线上读到的位数据,依次从高位移动到低位。

DQ=0;//总线拉低

_nop_();

_nop_();

DQ=1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上

delay(0);

if(DQ)//控制器进行采样

{

dat|=0x80;//若总线为1,即DQ为1,就把dat的最高位置1;若为0,则不进行处理,保持为0

}

delay(10);//此延时不能少,确保读时序的长度60us。

DQ=1; //释放总线

delay(1);

}

return(dat);

}

void wr_one_byte(unsigned char dat)

{

unsigned char i=0;

for(i=8;i>0;i--)

{

DQ=0; //拉低总线

_nop_();

_nop_(); //2us

DQ=dat&0x01;//从字节的最低位开始传输

//指令dat的最低位赋予给总线,必须在拉低总线后的15us内,

//因为15us后DS18B20会对总线采样。

delay(10);//必须让写时序持续至少60us 65us

DQ=1;//释放总线

dat>>=1;

delay(1);

}

}

void read_rom()

{

unsigned char i=0;

while(resetds());

wr_one_byte(0x33);

for(i=0;i<8;i++)

{

readbata[i]=re_one_byte();

}

}

void read_temp()/璇诲彇娓╁害鍊煎苟杞崲/

{

unsigned char a1,b1;

unsigned int avalue;

resetds();

wr_one_byte(0xcc);

wr_one_byte(0x44);

delay(1);

resetds();

wr_one_byte(0xcc);//璺宠绷璇诲簭鍒楀佛/

wr_one_byte(0xbe);//璇诲彇娓╁害/

a1=re_one_byte();

// send_char(a1);

b1=re_one_byte();

// send_char(b1);

avalue=(b1<<8);

avalue+=a1;

avalue=avalue0062510; //保留一位小数

readTem[0]=avalue/1000; //百位

readTem[1]=avalue%1000/100; //十位

readTem[2]=avalue%100/10; //各位

readTem[3]=avalue%10; //小数位

}

void main()

{

unsigned char i=0;

delay(9);

while(resetds());

usart_init();

while(1)

{

// read_rom();

// for(i=0;i<8;i++)

// send_char(readbata[i]);

// for(i=0;i<6;i++)

// send_char(readbata1[i]);

read_temp();

for(i=0;i<4;i++)

send_char(readTem[i]);

delayms(1000);

}

}

#include <stdioh>int main(){    double c, f;    printf ("请输入华氏温度:");    scanf ("%lf", &f);    c=50/9(f-32);    printf ("%g华氏温度是%2f摄氏温度\n", f, c);    return 0;}

扩展资料:

#include<iostream>

using namespace std;

int main()

{

float f,c;

cout<<"请输入华氏温度:";    

cin>>f;  

c=5(f-32)/9;

cout<<"摄氏温度为:"<<c<<endl;

return 0;

}

以上就是关于基于单片机的温湿度采集与控制程序(C语言)全部的内容,包括:基于单片机的温湿度采集与控制程序(C语言)、我需要stc89c52单片机ds18b20温度控制的c语言程序,要求可显示当前温度,并且在达到温度上限时会产生报警、C语言编程:输入一个华氏温度,要求输出摄氏温度,公式为:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9418395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存