给你一个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语言编程:输入一个华氏温度,要求输出摄氏温度,公式为:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)