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

2023-04-09

这个程序可以实现通过温度的变化对电扇的转速进行控制。如果采纳答案还有追加分数
急、急、急!!! 给你一个DS18B20的温度采集程序!
//ICC-AVR application builder : 2009-10-25 10:43:39
// Target : M16
// Crystal: 16.000Mhz

#include <iom16v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
#include "xianshi.c"
#include "delay.h"

#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 <iom16v.h>
#include <macros.h>

#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);



程序我都调试过的,都是好的,有不会再问我。可以给分了吗?嘿嘿
参考知识1 帮做。98010052《基于DS18B20温度控制系统》本回答被提问者采纳

相似知识
请问单片机温湿度采集编程的思路 参考知识1;TAO.ASMV8.0;-40--+120T;0--100H;2005;SCKBITP3.1;SHT11DATAIBITP3.0;SHT11; ORG 0000H CLR EA AJMP
求单片机(的温湿度采集)外文资料(带中文翻译),谢谢! 参考知识1给你个思路吧,温度用DS1260与单片机通讯或用温敏电阻分压AD采样计算。湿度用湿度电容,单片机测电容值,再进行计算得到湿度
基于51单片机及RS485总线的温湿度变送模块设计 :基于AT89C51单片机,用DS18B20温度传感器和湿敏传感器设计大棚温建议使用JCJ100N数字式温湿度变送器,工业级产品,精度高,温度、湿度参考知识1问题补充:基于AT89C51单片机,用DS
用单片机实现119报警器的程序(最好用汇编语言或C语言) 参考知识1不知道你发现没有,普通有限电话都有两种拨号模式,即音频拨号和脉冲拨号。一般来讲脉冲拨号较容易,容差性好一些。你上网查一下就可以。程序很简单。语音部分可以用现成的语音模块。当然整个电路还得自制
stc15单片机 我在用dht11采集温湿度,然后通过串口1发送到电脑的时候 你改为P1^7(包括接线)估计就好了,如果是标准51的模式,用P0口做IO要加上拉电阻参考知识1这是我的程序,希望可以给你参考链接:https://pan.baidu.com/s/1c22FLUo密码
一个温湿度自动控制系统都由啥硬件组成?? 控制芯片(单片机、DSP或ARM均可,这个比较简单,51单片机就OK),温度湿度采集装置(也就是温湿度传感器),加湿除湿装置软件部分主要是控制主控制芯片读取温度湿度数据,并根据情况去控制加湿除湿升温降
液晶显示器320240,C语言 1引言图形点阵液晶显示模块由于具有显示信息丰富、功耗低、体积小、重量轻、寿命长、不产生电磁辐射污染等优点而成为单片机系统中理想的显示器件,并被广泛应用于单片机控制的智能仪器仪表、工业控制领域、通信器材
单片机实现4位一体数码管显示0000—FFFF的16进制(C语言编程) /*四个数码管的动态显示*/#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitdu=P2^6;sbitw